<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Omar AL Zabir blog on ASP.NET Ajax and .NET 3.5 : misc</title><link>http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx</link><description>Tags: misc</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>How to convince developers and management to use automated unit test for AJAX websites</title><link>http://msmvps.com/blogs/omar/archive/2008/10/27/how-to-convince-developers-and-management-to-use-automated-unit-test-for-ajax-websites.aspx</link><pubDate>Mon, 27 Oct 2008 14:00:24 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1652113</guid><dc:creator>omar</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1652113</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/10/27/how-to-convince-developers-and-management-to-use-automated-unit-test-for-ajax-websites.aspx#comments</comments><description>&lt;p&gt;Everyone agrees that unit testing is a good thing, we should all write unit tests. We read articles and blogs to keep us up-to-date on what’s going on in the unit test world so that we can sound cool talking to peers at lunch. But when we really sit down and try to write unit tests ourselves – “Naaah, this is waste of time, let’s ask my QA to test it; that’s much more reliable and guaranteed way to test this. What’s the point testing these functions when there are so many other functions that we should unit test first?” Had such moment yourself or with someone else? Read on.&lt;/p&gt;  &lt;p&gt;I had a conversation with our development lead Mike (using a highly generic name since my &lt;a title="Tips and Tricks to rescue overdue projects" href="http://msmvps.com/blogs/omar/archive/2008/10/20/tips-and-tricks-to-rescue-overdue-projects.aspx"&gt;last post&lt;/a&gt; caused some trouble), who runs “the show” in our engineering team. As usual there was reservation in introducing unit test to regular development schedule. Mike also had valid points about lack of powerful tools for doing unit test on AJAX websites. He also had confusion on ‘what’ and ‘how’ to unit test our code so that we aren’t just testing database failures but real user actions that executes both business and rendering logics. So, the discussion has a lot of useful information, that will help you take the right decision when you want to sell unit test to your ASP.NET and/or AJAX development team and finally to higher management so that you can buy enough time for the effort.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Friday, Jan 2007 – hallway&lt;/u&gt;&lt;strong&gt;      &lt;br /&gt;Omar&lt;/strong&gt;: Hey Mike, we need to start doing unit testing at least on our web services. We are wasting way too much time on manual QA. Since we are an AJAX shop, unit testing all our web services should give us pretty well coverage. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Sure, that sounds fun. I will do some feasibility check and see how can we chip this in into our next sprint.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Friday, Feb 2007 – washroom&lt;/u&gt;&amp;#160; &lt;br /&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Hey Mike, let’s start doing unit tests. I haven’t seen any tests last month. Can we start from this sprint?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Sure, we can surely start from this sprint. Let me find out which tool is the right one for us.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Friday, March 2007 – meeting room&lt;/u&gt;     &lt;br /&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Hey Mike, haven’t seen any unit tests in the solution so far. Let’s seriously start writing unit tests. Did you make any plan how you want to start unit testing the webservices?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Yeah, I did some digging around and found some tools. But most of them are for non-AJAX sites where you can programmatically hit a URL or programmatically do HTTP POST on a URL. You can also record button clicks and form posts from the browser. There’s &lt;a title="Introduction to Visual Studio Web Test" href="http://msdn.microsoft.com/en-us/library/ms364077.aspx"&gt;Visual Studio’s Web Test&lt;/a&gt;, which does pretty good job recording regular ASP.NET site, but poor on AJAX sites. Moreover, you need to buy Team Suite edition to get that Web Test feature. Besides, recording tests and playing them back really does not help us because all those tests contain hard coded data. We can’t repeat a particular step many times with random data, at least not using any off-the-shelf tools. We need to test things carefully and systematically using random data set and sometimes use real data from database. For example, a common scenario is loading 100 random user accounts from database and programmatically log those users into their portal and test whether the portal shows those users’ personalized data. All these need to be done from AJAX, without using any browser redirect or form post, because there’s one page that allows user to login using Ajax call and then dynamically renders the portal on the same page after successful login. The UI is rendered by Javascript, so only a real browser can render it and we have to test the output looking at the browser.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: I see, so you can’t use Visual Studio Web Test to run unit tests on a browser because it does not let you access the html that browser renders. You can only test the html that’s returned by webserver. As we are AJAX website, most of our stuffs are done by Javascripts – they call Webservice and they render the UI. Hmm, thinking how we can do this using VS. We can at least hit the webservices and see if they are returning the right JSON. This way we can pretty much test the entire webservice, business and data access layer. But it does not really replace the need&amp;#160; for manual QA since there’s a lot of rendering logic in Javascript.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Now there’s a new project called &lt;a title="Watin - browser based web test" href="http://watin.sourceforge.net/"&gt;Watin&lt;/a&gt; that seems promising. You can write C# code to instruct a browser to do stuffs like click on a button, run some javascript and then you can check what the browser rendered in its DOM and run your tests. But still, it’s in its infancy. So, there’s really no good tool for unit testing AJAX sites. Let’s stick to manual QA, which is proven to be more accurate than anything developers can come up with. We can handover a set of data to QA and ask them to enter and check the result.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: We definitely need to figure out ways to reduce our dependency on manual QA. It simply does not scale. Every sprint, we have to freeze code and then hand over to QA. They run their gigantic test scripts for a whole day. Then next day, we get bug reports to fix. If there’s severe regression bug we have to either cancel sprint or work whole night to fix it and run overnight QA to meet deployment date. For last one year, every sprint we ended up having some bug that made dev and QA work over night. We have to empower our developers with automated unit test tool so that they can run the whole regression test script automatically.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: You are talking about a very long project then. Writing so many unit tests for complete regression test is going to be more than a month long project. We have to find the right set of tool, plan what areas to unit test and how, then engage both dev and QA to work together and prepare the right tests. And then we have to keep the test suite up-to-date after every sprint to catch the new bugs and features.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Yes, this is certainly a complex project. We have to get to a stage that can empower a developer to run automated unit tests and not ask QA to test every task for regression bugs. In fact, we should have automated build that runs all unit tests and does the regression test for us automatically after every checkin. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: We have automated build and deploy. So, that’s done. We need to add automated unit test to it. Seriously, given our product size, this is absolutely impossible to engage in writing so many unit tests so that we can do the entire regression test automatically. It’s not worth the time and money. Our QA team is doing fine. They can take one day leave after deployment when they do overnight work.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Actually QA team is at the edge of quitting. They seem to have endless work load. After deployment, they have to do manual regression test on production site to ensure nothing broke on production. While they are at it, they have to participate in sprint initiation meetings and write test plans. When they are about to complete that, devs checkin stuffs and ask for regression test of different modules. Before they can finish that , we reach code freeze and they have to finish all those task level tests as well as the entire regression test. So, they end up working round-the-clock several days every sprint. They simply can’t take it anymore.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: How is it different than our life? After spending sleepless night on the deployment date, next day we have to attend 8 hours long sprint planning meeting. Then we have to immediately start working on the tasks from the next day and have to reach code-freeze within a week. Then QA comes up with so many bugs at the last moment. We have to work round-the-clock last 3 days of sprint to get those bugs fixed. Then after a nerve wrecking deployment day, we have to stay up at night to wait for QA to report any critical bug and fix it immediately on production. We are at the brink of destruction as well.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: That’s understood. The whole team is surely getting pushed to their limit. So, that’s why we urgently need automated test so that it addresses the problems of both dev and QA team. Dev will get tests done at a faster rate so that they don’t get bug reports at the very end and then work over-night to fix them. Similarly, we offload QA team’s continuous overwork by letting the system do the bulk of their test. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: This is going to kill the team for sure. We have so many product features and bug fixes to do every sprint. Now, if we ask everyone to start writing unit tests for every task they do, it’s a lot of burden. We can’t do both at the same time.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Agree. We have to cut down product features or bug fixes. We have to make room in every sprint to write unit tests.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Good luck with that. Let’s see how you convince product team.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: First let me convince you. Are you convinced that we should do it.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Not yet. I don’t really see its fruit in near future, even after two months. There’s so many features we have to do and so many customers to ship to, we just can’t do enough unit tests that will really shed off QA load. It’ll just be a distraction and delay in every sprint, heck, in every task.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Let me show you a graph which I believe is going to make an impact:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Howtowriteusefulunittest.NETAJAXwebsites_5F00_A4C6/image_5F00_2.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="241" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Howtowriteusefulunittest.NETAJAXwebsites_5F00_A4C6/image_5F00_thumb.png" width="387" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So, you see the more automates test we write, the less time spent on Manual QA. That time can be spent on doing new tests or task level tests and increase quality of every new feature shipped and drastically reduce new bugs shipped to production. Thus we get less and less bugs after every successful sprint.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Ya, I get it, you don’t need to convince me for this. But I don’t see the benefit from overall gain perspective. Are we shipping better product faster over next two months? We aren’t. We are shipping less features and bug fixes by spending a lot of time on writing unit tests that has no impact on end-user. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Let me see if your assumption is correct:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Howtowriteusefulunittest.NETAJAXwebsites_5F00_A4C6/image_5F00_4.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="244" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Howtowriteusefulunittest.NETAJAXwebsites_5F00_A4C6/image_5F00_thumb_5F00_1.png" width="453" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You see here, the more automated tests kick in, the more time QA can spend on new features or new bugs. I agree that the speed of testing new features/bugs decrease first one or two sprints, but then they gradually get picked up and get even better. In the beginning, there’s a big overhead of getting started with automated test. But as sprints go by, the number of unit tests to write gradually gets stable and soon it becomes proportional to new features/bugs. No more time spent on writing tests for old stuff. So, the number of unit tests you write after four sprints is exactly what needed for the new tasks you did on that sprint.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Let’s see what if we just don’t do any automated test and keep things manual. How does the graph look like?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Howtowriteusefulunittest.NETAJAXwebsites_5F00_A4C6/image_5F00_10.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="277" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Howtowriteusefulunittest.NETAJAXwebsites_5F00_A4C6/image_5F00_thumb_5F00_4.png" width="423" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: The future looks quite gloomy. We will be spending so much time on regression test as we keep adding stuffs to the product that at some point QA will end up doing regression test full time. They will not spend time on new features and we will end up having a lot more new bugs slipped from QA to production due to lack of attention from QA.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: OK, how do we start?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: First step is to get the regression tests done so that we can get rid of that 24 hour long marathon QA period end of every sprint. Moreover, I see too many devs asking QA to do regression test here and there after they commit some tasks. So, QA is always doing regression tests from the beginning to the end of each sprint. They should only test new things for which automated test is not yet written and let the automated test do the existing tests. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: This will be hard to sell to management. We are going to say “Look for next one month, we will be half productive because we want to spend time automating our QA process so that from second month, we can do tests automatically and QA can have more free time.”&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: No, we say it like this, “We are going to spend 50% of our time automating QA for next oen month so that QA can spend 50% more time on testing new features. This will prevent 50% new bugs from occurring every sprint. This will give developers 50% more time to build new features after one month.” We show them this graph:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Howtowriteusefulunittest.NETAJAXwebsites_5F00_A4C6/image_5F00_12.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="279" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Howtowriteusefulunittest.NETAJAXwebsites_5F00_A4C6/image_5F00_thumb_5F00_5.png" width="406" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Seems like this will sell. But for first couple of sprints, we will be so dead slow that some of us might get fired. Think about it, from management point of view, the development team has suddenly become half productive. They aren’t building only few new features and bugs are not getting fixed as fast rate. Customer are screaming, investors asking for money back. It’s going to get really dirty. Do you want to take this risk? &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: I can see that this decision is a very hard decision to take. I know what CEO will say, “We need to be double productive from tomorrow, otherwise we might as well pack our bags and go home. Tell me something that will make us double productive from tomorrow, not half productive.” But you can see what will happen after couple of months. Situation will be so bad that doing this after couple of months will be out of question. We won’t be in a position to even propose this. Now, at least we can argue and they still have the mind to listen to long term ideas. But in future, when our QA team is doing full time regression test, new buggy features going to production, ratio of new bugs increasing after every release, more customers screaming, half baked features running on the production – we might have to shut down the company to save our life. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: We should have started doing automated tests from day one.&lt;/p&gt;  &lt;p&gt;Omar: Yes, unfortunately we haven’t and the more we delay, the harder it is going to get. I am sure we will write automated tests from day one in our next project, but we have to rescue this project.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: OK, I am sold. How do we start? We surely need to unit test the business and data access layer. Do we start writing unit test for every function in DAL and Business layer?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Writing unit test for DAL seems pointless to me. Remember, we have very little time. We will get max two sprints to automate unit tests. After that, we won’t get the luxury to spend half of our time writing unit tests. We will have to go back to our feature and bug fix mode. So, let’s spend the time wisely. How about we only test the business layer function?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: So, we test functions like CreateCustomer, EditCustomer, DeleteCustomer, AddNewOrder in business layer?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Is that the final layer in business layer? Is there another high level layer that aggregates such CRUD like functions?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: For many areas, it’s like CRUD, a dumb wrapper on DAL with some minor validation and exception handling. But there are places where there are complex functions that do a lot of different DAL call. For example, UpdateCustomerBalance – that calls a lot of DAL classes to figure out customer’s current balance. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Does webservices call multiple business classes? Do they act like another level that aggregates business layer?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Yes, webservices are called mostly from user actions and they generally call multiple business layer classes to get the job done.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Where’s the caching done?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Webservice layer.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: That sounds like a good place to start unit testing. We will write small number of unit tests and still test majority of business layer and data access classes and we ensure validation, caching, exception handling code are working fine.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: But there are other tools and services that call the business layer. For example, we have a windows service running that directly calls the business layer. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Can we refactor it to call webservices instead?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: No, that’ll be like creating 10 more webservices. A lot more development effort. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: OK, let’s write unit tests for those business layer classes separately then. I suppose there will be some overlap. Some webservice call will test those business classes as well. But that’s fine. We *should be* unit testing from business layer. But we don’t have time, so we are starting from one level up. Webservices aren’t really “unit” but you have to do what you have to do. At least testing webservices will give us guarantee that we covered all user actions under unit test.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Yes, testing webservices will at least ensure user actions are tested. The background windows service is not much of our headache. Now how do we test presentation logic? We have ASP.NET pages and there’s all those Javascript rendering code.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Let’s use Watin for that. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: How to make that part of a unit test suite?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Watin integrates nicely with NUnit, mbUnit. mbUnit is pretty good. I used it before. It has more test attributes and Assert functions than NUnit.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: OK, so how do we unit test UI? A test function will click on Login link, fill up the email, password box and click “OK”. Then wait for one sec and then see if Javascript has rendered the UI correctly?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Something like that. We can discuss later exactly how we test it. But how do you test if UI is rendered correctly?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: We check from browser’s DOM for user’s data like name, email, balance etc are available in browser’s HTML.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Does that really test presentation logic? What if the data is misplaced? What if due to CSS error, it does not render correctly.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Well, there’s really no way to figure it out if things are rendered correctly. We can ask the QA guys to keep watching the UI while Watin runs the tests on the browser. You can see on the browser what Watin is doing.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: OK, that’s one way and certainly faster than QA doing the whole step. But can it be done automatically like matching browser’s screen with some screenshot?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Yeah, we need AI for that.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Seriously, can we write a simple UI capture and comparison tool? Say we take a screenshot of correct output and then clear up some areas which can vary. Then Watin runs the test, it takes the screenshot of current browser’s view and then matches with some screenshot? Here’s the idea:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Howtowriteusefulunittest.NETAJAXwebsites_5F00_A4C6/image_5F00_14.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="308" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Howtowriteusefulunittest.NETAJAXwebsites_5F00_A4C6/image_5F00_thumb_5F00_6.png" width="586" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Say this is a template screenshot that we want to match with the browser. We are testing Google’s search result page to ensure the page always returns a particular result when we provide some predefined query. So, when Watin runs the test and takes browser to Google search result page, it takes a screenshot and ignores whatever is on those gray area. Then it does a pixel by pixel match on the rest of the template. So, no matter what the search query is and no matter what ad Google serves on top of results, as long as the first result is the one we are looking for, test passes.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: As I said, this is AI stuff. Some highly sophisticated being will be matching two screenshots to say, Yah, they more or less match, test pass.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: I think a pretty dumb bitmap matching will work in many cases. Just an idea, think about it. This way we can test if CSS is giving us pixel perfect result. QA takes a screenshot of expected output and then let the automated test to match with browser’s actual output.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: OK, all good ideas. Let’s see how much we can do. We will be starting from webservice unit testing. Then we will gradually move to Watin based testing. Now it’s time to sell this proposal to product team and then to management team.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Yep, at least get the webservices tested, that will catch a lot of bugs before QA spends time on testing. Goal is to get as much testing done by developers, really fast, automatically then letting QA spend time on them.&amp;#160; Also we can run those webservice unit tests in a load test suite and load test the entire webservice layer. That’ll give us guaranty our code is production quality and it can survive the high traffic.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Understood, see ya.&lt;/p&gt;  &lt;p&gt;. . .&lt;/p&gt;  &lt;p&gt;&lt;u&gt;March 2008, Friday - The Code Freeze Day&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Hey Mike, how are we doing this sprint?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike&lt;/strong&gt;: Pretty good. 3672 unit tests out of 3842 passed. We know why some of them failed. We can get them fixed pretty soon and run the complete regression tests once during lunch and once before we leave. QA has completed testing new features pretty well yesterday and they can check again today. We got some of the new features covered by unit tests as well. Rest we can finish next sprint, no worries. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Omar&lt;/strong&gt;: Excellent. Enjoy your weekend. See you on Monday.&lt;/p&gt;  &lt;p&gt;------------------------------&lt;/p&gt;  &lt;p&gt;Suggested Reading:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="Web Application testing in .Net - WatiN" href="http://watin.sourceforge.net/"&gt;Web Application testing in .Net - WatiN&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="Data Driven Web Testing With Visual Studio 2008 Team System" href="http://www.codeproject.com/KB/aspnet/VS08DataDrivenWebTests.aspx"&gt;Data Driven Web Testing With Visual Studio 2008 Team System&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="Sean Lumley’s blog on Visual Studio Web Test and Load Test" href="http://blogs.msdn.com/slumley/"&gt;Sean Lumley’s blog on Visual Studio Web Test and Load Test&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="Ed Gla’s Blog on VSTS Load Testing" href="http://blogs.msdn.com/edglas/"&gt;Ed Gla’s Blog on VSTS Load Testing&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="Bill Barnett’s Blog on Visual Studio Web Test and Load Test" href="http://blogs.msdn.com/billbar/"&gt;Bill Barnett’s Blog on Visual Studio Web Test and Load Test&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 4px 4px 4px;"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/omar/archive/2008/10/27/how-to-convince-developers-and-management-to-use-automated-unit-test-for-ajax-websites.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://msmvps.com/blogs/omar/archive/2008/10/27/how-to-convince-developers-and-management-to-use-automated-unit-test-for-ajax-websites.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" border="0/" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1652113" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/ideas/default.aspx">ideas</category><category domain="http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx">misc</category><category domain="http://msmvps.com/blogs/omar/archive/tags/ajax/default.aspx">ajax</category><category domain="http://msmvps.com/blogs/omar/archive/tags/unit+test/default.aspx">unit test</category></item><item><title>Tips and tricks to rescue overdue projects</title><link>http://msmvps.com/blogs/omar/archive/2008/10/20/tips-and-tricks-to-rescue-overdue-projects.aspx</link><pubDate>Mon, 20 Oct 2008 18:08:34 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1651416</guid><dc:creator>omar</dc:creator><slash:comments>18</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1651416</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/10/20/tips-and-tricks-to-rescue-overdue-projects.aspx#comments</comments><description>&lt;p&gt;One of my friends, who runs his own offshore development shop, was having nightmare situation with one of his customers. He&amp;#39;s way overdue on a release, the customer is screaming everyday, he&amp;#39;s paying his team from his own pocket, customer is sending an ever increasing list of changes and so on. Here&amp;#39;s how we discussed some ideas to get out of such a situation and make sure it does not repeat in future: &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Hey, can you help me? My customer is making us work for free for extra two months to fix bugs from our last delivery. We did what he said. But after he saw the output, he came up with hundred changes, which he somehow presents as bugs or missing features and make them look like they are all our fault and making us work for last two months for free. He is sending new changes every week. We have no idea when we will complete the iteration. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: I see. Did you get a signed list of requirements from customer before you started the development? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Of course, I did. He sent us a word document explaining what he wants and we sent him a task breakup with hour estimates and total duration of three months. Now after three months when we showed him the product, he said, it&amp;#39;s no where close to what he had expected. Then he sent a gigantic list of things to change. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: All of those are bugs? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Of course not. Most of them are new features. &lt;/p&gt;  &lt;p&gt;Omar: Then why don&amp;#39;t you say those are new features? You have the original word document to prove. Just ask him to show where in the word document did he said X needs to be done? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Well..., he&amp;#39;s tricky. He somehow makes things look like it is obvious that X needs to be done and he&amp;#39;s not going to accept a requirement as done until X is done. For example, he said there must be a complete login form in the homepage. So, we did a typical login form with user name, password and OK, Cancel button. Now he says where&amp;#39;s the email verification thing? We said, you did not ask for it. He said, &amp;quot;this is obvious, every login form has a forgot password and email verification; I said *complete* login form, not half-baked login form&amp;quot;. So, you see, we can&amp;#39;t really argue to keep our image. Then, we did the login form exactly how he said. Now he says, where the client side validations of proper email address, username length, password confirmation? We said, you never asked for it! He says, &amp;quot;come on, every single website nowadays has AJAX enabled client side validation, do I have to tell you every single thing? Aren&amp;#39;t you guys smart enough to figure this out? You are already doing this for the third time, can&amp;#39;t you do it really well this time?&amp;quot; &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: OK, stop. I see what&amp;#39;s your problem. Some customer will always try to make you work more for less money. They will try to squeeze out every bit of development they can for their bucks. So, you have to be extra careful on how much you commit to them and make sure they cannot chip in more requirements while development is going on or when you deliver a version. Mockups are one good way to make sure things are crystal clear between you and customer.&amp;#160; Did you not show him mockups of the features that you will be building and make him sign those mockups? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Yes, I made some mockups. But they were simple mockups. I did not show the validations or all those side jobs like sending verification emails. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: Did you run those mockups through your engineers? They could have told you about those details. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: No, I did not because developers don&amp;#39;t work on the project until I get a signoff from client. So, I prepare all the mockups myself to save cost.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: So, this is the first problem. The mockups were as ambiguous as the customer&amp;#39;s word document. Basically the mockups just reflected the sentences in word document. Mockups did not really show all possible navigations (ok, cancel, forgot, signup), system messages, system actions behind the scene, workflows etc. Are you getting what I am saying? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Yes. Come on, I am not a developer. I can&amp;#39;t think of every single details. That&amp;#39;s what developers do when they start working on it. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: But you provide estimates based on your mockups right? So, if mockup shows there&amp;#39;s only a simple login form and change password link, you charge 5 hours for it. But then when you realize you have to send email for change password, email needs to contain a tokenized URL, that URL needs to show a change password form, where you need to validate using CAPTCHA etc, it becomes 20 hours of work. Right? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Well yes. Generally I multiply all estimates by 1.5 just to be safe. But things have gone 3X to 10X off original estimate. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: Yes, I just gave you an example how a login form estimate can go 4X off when the mockup is not run through an engineer and the important issues are not addressed. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: So, you are saying I have to prepare all mockup with an engineer? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: In general, yes, since you aren&amp;#39;t good enough to figure those out yourself; no offence. You will get good enough after you build couple of products and get your a** kicked couple of times, like mine. Mine got kicked about 17 times. After that it became so hard that when I sit on it, I produce really good mockups. After some more kicks, I hope to get 100% perfect in my mockups. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Ok, so the process is, I get word doc from customer. I produce mockups from it. Then I run them through engineers to add more details to them. Then after review with customer, I run them through engineers again to estimate. Then I ask customer to sign-off on the mockups and the estimate, correct?&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: Well, first let me say, you don&amp;#39;t do a three month long iteration since you are far away from your customer. You do short two weeks sprints. Do you know SCRUM? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Yes, one of our team does it. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: I assume the team that got their a** kicked don&amp;#39;t do it? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: right, they don&amp;#39;t. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: OK, then first you start doing SCRUM. I won&amp;#39;t teach you details. You can study about SCRUM online. Now, you collect &amp;#39;user stories&amp;#39; from customer. If customer does not give you user stories, just vague paras of requirements, you break the requirements into small user stories. Understood? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: No, give example. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: OK, say customer wants a *complete* login form. You break it into couple of stories like: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;User clicks on &amp;quot;login&amp;quot; link from homepage so that user can login to the system      &lt;ul&gt;       &lt;li&gt;User enters username (min 5, max 255 chars, only alphanumeric) in the username text field &lt;/li&gt;        &lt;li&gt;User enters password (min 5, max 50 chars, only alphanumeric) in the password field &lt;/li&gt;        &lt;li&gt;User clicks on &amp;quot;OK&amp;quot; button after entering username and password. &lt;/li&gt;        &lt;li&gt;System validates username and password and shows the secure portal if credential is valid and user has permission to login and account is not locked. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Understood what user stories are? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Yes, but you are missing all the validations that we also overlooked and now we are working two months for free. This “user stories” do not help at all. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: Hold on, you just saw basic steps of a user story. Now you describe each user story with the following: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;All possible inputs of user and their valid format &lt;/li&gt;    &lt;li&gt;All possible system generated messages for invalid input &lt;/li&gt;    &lt;li&gt;All possible alternate navigation from the main user story. For example, while entering password, user can click on a help icon so that user can see what kind of passwords are allowed. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Got it? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Now it&amp;#39;s starting to make sense. Then what? Show these user stories to customers? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: No, show them to your lead engineer who has enough experience to identify if you missed something. Your Engr should point out all the alternative system actions at least. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: What if my Engr can&amp;#39;t figure them out? What if he&amp;#39;s just as dumb as me? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: Fire him. Get a pay cut for yourself. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Seriously, what do I do if that&amp;#39;s the case? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: Your engineers will *always* come up with issues with your mockups. You should always use another pair of eyes to verify your mockups and add more details to it. You aren&amp;#39;t the only smart guy in the world you know? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: I thought I was, ok. What&amp;#39;s next? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: File those user stories in your issue tracking system in some special category. Say &amp;quot;User Stories&amp;quot; category. What do you use for your issue tracking system? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Flyspray &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: Good enough. Create a new project in Filespray named &amp;quot;User Stories&amp;quot;. File tasks for user stories. Each story, one task. Attach the mockup to the tasks. Then create one account for your customer so that customer can login and see the user stories, make comments, suggest changes etc. You will get the conversation with your customer recorded as comments in the task. This comes handy for engineers and for resolving dispute later on. Moreover, get your customer to prioritize the tasks properly. Understood? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: I don&amp;#39;t think customer will go through that trouble. Customer will ask for some word document that has all the user stories and she will write in the document what are the changes. I will have to reflect them in Flyspray. Is it really necessary to file user stories in Flysrpay? Can&amp;#39;t I just maintain one word doc with customer? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: Absolutely not. Word documents suffer from versioning problem. You have one version, your customer has another version, your engineers have another version. it becomes a nightmare to move around with word docs which has many user stories in it and keep them in sync all the time. Moreover, referencing a particular use case also becomes a problem. Say at later stage of the project, there&amp;#39;s a bug which needs to refer to User Story #123. You will have to say User Story #123 in &lt;a&gt;\\centralserver\fileshare\user&lt;/a&gt; stories1.doc. Now if &lt;a&gt;\\centralserver&lt;/a&gt; dies, or you put it somewhere else, all these references are gone. Don&amp;#39;t go for word doc. Keep everything on the web that you can refer to it using a URL or small number. Another problem is numbering stories in Word Doc. Word won&amp;#39;t produce unique ID for you. You will end up with duplicate user story numbers. If you use Flyspray, it&amp;#39;s will generate unique ID for you. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: OK, let me see how I convince my customer to use Flyspray. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: Yes, you should. If Flyspray is hard for customers, use some simple issue tracking system that&amp;#39;s a no-brainer for non-engineers. Some fancy AJAX based todolist site will be good enough if it has picture attachment feature and auto task number feature. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: OK, I will find such a website. So, I got the user stories done. Now I show them to customer, review, make changes. Finally I get customer to sign off on User story #X to #Y for a two weeks sprint. Then what happens? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: On your first day of sprint, you do a sprint planning meeting where you present those user stories to your engineers and ask them to break each story into small tasks and estimate each task. Make sure no engineer put 1 day or 2 day for any task. Break them into even smaller tasks like 4 hours of tasks. This will force your engineers to give enough thought into the stories and identify possible problems upfront. Generally when someone says this is going to take a day or two, s/he has no idea how to do it. S/he has not thought about the steps need to be done to complete that task. Your are getting an estimate that&amp;#39;s either overestimated or underestimated. Forcing an engineer to allocate tasks in less than 4 hours slot makes an engineer think about the steps carefully.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: If engineers do this level of estimate, they will think about each task for at least an hour. This is going to take days to finish estimating so many tasks. How do you do it in a day? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: We do 4 hours Planning meeting where Product Owner explains the stories to engineers and then after 30 mins break, another 4 hours meeting where engineers pickup stories and breaks them into tasks and estimate on-the-fly. This 4 hours deadline is strictly maintained. If Product team cannot explain the tasks for a sprint in 4 hours, we don&amp;#39;t do the tasks in the sprint. If the tasks are so complex or there are so many tasks that they cannot be explained in 4 hours, engineers unlikely to do them within one/two week long sprint. Similarly if engineers cannot estimate the tasks in their 4 hours slot, the tasks are just too complex to estimate and thus have high probability of not getting done in the sprint. So, we drop them as well. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: This is impossible! No one&amp;#39;s going to attend 8 hours meeting on a day. Besides, telling them to estimate a task on the spot is super inefficient. They won&amp;#39;t produce more than 60% correct estimates. They will give some lump sum estimate and then go away. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: Incorrect, if engineers cannot make estimates of a task in 10 to 20 minutes, they don&amp;#39;t have the capability of estimating at all. If your engineers are habituated to take a task from you for estimating and then go to their office, talk to their friends on the phone, drink soda, walk around, gossip with colleagues and end of the day if they have the mood to sit and think about the estimate then open a new mail, write some numbers and email it to you; they better learn to do this on-demand, when requested, within time constraint. It&amp;#39;s a discipline that they need to learn and implement in their life. Estimates are something they do from the moment they wake up to the moment they go to sleep. Besides, the planning meeting is the best place to estimate tasks - all engineers are there, product team is there, your architects should be there, QA team is there. It&amp;#39;s easy to ask questions, get ideas and helps from others. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: I have engineers who just can&amp;#39;t do well under pressure. They need some undisturbed moment, where they can sit and think about tasks without anyone staring at them. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: Train them to learn how to keep their head cool and do their job in the midst of attention. Anyway, let&amp;#39;s stop talking about these auxiliary issues and talk about the most important issues. Where were we? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;:About dropping tasks, I already negotiated with customer that we are going to do story A, B, C in this sprint. Now after the sprint planning meetings, engineers say they can&amp;#39;t do B. Problem is I have already committed to deliver A, B, and C to customer within 2 weeks and sent him the invoice. How do I handle this? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: How do you commit when you don&amp;#39;t know how long A, B, and C are going to take? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Customer tells me to do A, B, C within two weeks. And after doing some preliminary discussion with engineers, I commit to customer and then do the sprint planning meeting. I can’t wait until the sprint meeting is done and developers have given me estimates of all the tasks.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: Wrong. You commit to customer after the sprint planning meeting is done. Before that, you give customer just a list of things that you believe you can try to do in following two weeks. Tell customer that you will be able to confirm after the sprint planning meeting. The time to do a sprint meeting is only 8 hours = a day. So, end of the day, you have some concrete stuff to commit to customer. From your model where you give engineers days to estimate, it won’t work. You have to finish planning within a day and end of the day, commit to customer. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: What if customer does not agree? What if he says, &amp;quot;I must get A, B and C in two weeks, otherwise I am going somewhere else?&amp;quot; &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: This is a hard situation. I am tempted to say that you tell your customer, &amp;quot;Go away!&amp;quot;, but in reality you can&amp;#39;t. You have to negotiate and come to a mutual agreement. You cannot just obey customer and say &amp;quot;Yes Mi Lord, we will do whatever you say&amp;quot; because you clearly cannot do it. The fact is, end of the sprint, you *will* get only A and C done and B not done. Then customer will Fedex you his shoes so that you can ask someone to kick you with it. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Correct, so what do I do? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: There are tricky solutions and non-tricky honest solutions to this. Tricky solution is, say you engaged 5 engineers in the project who can get A and C done in time. But you realize you need another engineer to do B, otherwise there&amp;#39;s no way you can finish A, B and C in two weeks. So, you invoice customer with 6 engineers and get A, B and C done. Now customer may not agree with you paying for the 6th engineer. Then you do a clever trick. You engage the 6th engineer free of cost in this sprint. Don&amp;#39;t tell customer that there&amp;#39;s an extra head working in the project. Or you can tell customer that out of good will, you want to engage another engineer free of cost to make sure customer gets a timely delivery. This boosts your image. Later on, when you get a sprint that&amp;#39;s more or less relaxed and 4 engineers can do the job, you secretly engage one engineer to some other project but still charge for 5 engineers to your customer. This way&amp;#160; you cover the cost for the 6th engineer that you secretly engaged earlier sprint. This is dirty. But when you have so hard a** customer who&amp;#39;s forcing you &amp;quot;what&amp;quot;, &amp;quot;when&amp;quot; and &amp;quot;how&amp;quot; all at the same time and not open to negotiation, you have no choice but to do these dirty tricks. You can also add extra one hour to every task for every engineer in a sprint or add some vague tasks like &amp;quot;Refactor User object to allow robust login&amp;quot;. This way you will get quite some amount of extra hours that will compensate for the hidden free engineer that you engage. You get the idea right? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Ingenious! And what&amp;#39;s the honest and clear way to do these? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: You negotiate with customer. You tell your customer that he or she can only have any two choices from Money-Scope-Time. This is called the project management triangle. Do you know about this? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Googling... &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: Read this article: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://office.microsoft.com/en-us/project/HA010211801033.aspx"&gt;http://office.microsoft.com/en-us/project/HA010211801033.aspx&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;It shows a triangle like this: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Whathappensbeforeasprintstarts_5F00_11338/clip_5F00_image002_5F00_2.gif"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="141" alt="clip_image002" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Whathappensbeforeasprintstarts_5F00_11338/clip_5F00_image002_5F00_thumb.gif" width="171" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So, your customer can specify any two. If customer specifies Scope and Time (&amp;quot;what&amp;quot; and &amp;quot;when&amp;quot;), then customer must be flexible on Money or &amp;quot;how&amp;quot; you do it within those two constraints. If customer specifies Money and Scope, then you are free to decide on time. You engage lower resource and take more time to get things done. Got the idea? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Yes, understood. Nice, I can show this to customer and educate him. Is there any book for the evil tricks that you just gave me? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: No, I might write one soon. I will name it &amp;quot;Customers are evil, so be you&amp;quot;. &lt;/p&gt;  &lt;p&gt;Raisul: Hey, I have fixed people engaged in a project. I can&amp;#39;t change the number of people sprint-to-sprint to compensate for change in money. So, the triangle does not work for me. What do I do here? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: Right. I also made a slightly different version of it. Here&amp;#39;s my take: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Whathappensbeforeasprintstarts_5F00_11338/image_5F00_10.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="196" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Whathappensbeforeasprintstarts_5F00_11338/image_5F00_thumb_5F00_4.png" width="260" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This is for situation where you have fixed resource engaged for a particular customer. In that case, you cannot reduce people on-demand because you cannot reassign them. Such a case requires different strategy. If customer forces you Quality and Time, customer must be willing to sacrifice Quantity. Customer cannot say, produce perfect login form in 2 weeks and add cool ajax effects to it. Customer has to sacrifice cool ajax effects, or sacrifice *perfection* of login form, or sacrifice number of days. &lt;/p&gt;  &lt;p&gt;From the above two triangles, which one&amp;#39;s more appropriate for you? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Second one because customer hires 5 engineers from me. I cannot take one away and engage in a different project. Well, not openly of course. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: OK, sounds fair. What else do you need from me? &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Kabir&lt;/u&gt;: Let me think about all these. This is definitely worth thinking. I have to figure out whether to play fair or play clever. End of the day, I need to produce great product, so that, I get good recommendation and future projects from customer. So, I need to do whatever it takes. It&amp;#39;s hard to run an offshore dev shop where we kinda have to work like slaves and like a bunch of zombies mumble every 10 mins - &amp;quot;Customer is always right&amp;quot;. You are very lucky to have your own company. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Omar&lt;/u&gt;: I had two offshore dev shops before &lt;a href="http://www.pageflakes.com"&gt;Pageflakes&lt;/a&gt;. I know how it feels. Wish you good luck. I have seen your product, you guys are building a great ASP.NET MVC+jQuery application. Release it. It&amp;#39;s worth showcasing. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Raisul&lt;/u&gt;: Thank you very much. See ya...&lt;/p&gt;  &lt;p&gt;(End of chat) &lt;/p&gt;  &lt;p&gt;This is the diagram my friend produced, which shows the steps to do before a sprint is started:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Whathappensbeforeasprintstarts_5F00_11338/image_5F00_2.png" target="_blank"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="399" alt="Workflow for Product Manager" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Whathappensbeforeasprintstarts_5F00_11338/image_5F00_thumb.png" width="620" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Handy for Product Managers. Enlightening for developers.&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f10%2f20%2ftips-and-tricks-to-rescue-overdue-projects.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f10%2f20%2ftips-and-tricks-to-rescue-overdue-projects.aspx" border="0" /&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1651416" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/ideas/default.aspx">ideas</category><category domain="http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx">misc</category></item><item><title>An Agile Developer's workflow when SCRUM is used</title><link>http://msmvps.com/blogs/omar/archive/2008/10/11/an-agile-developer-s-workflow-when-scrum-is-used.aspx</link><pubDate>Sat, 11 Oct 2008 07:21:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1650562</guid><dc:creator>omar</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1650562</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/10/11/an-agile-developer-s-workflow-when-scrum-is-used.aspx#comments</comments><description>&lt;p&gt;If you are planning to start SCRUM at your company, you might need to train developers and QA to get into the mindset of an Agile developer. SCRUM is only successful when the developers and QA get into the habit of following the principles of SCRUM by heart. So, sometimes you need to offer training or do trial sprints to give some room to your developers how to get used to the working fashion of SCRUM. Giving them a handy workflow diagram that shows how they should work helps soothe the steep learning curve required for non-super star developers. I made such a workflow while I was teaching SCRUM at my friend&amp;#39;s company. The following diagram was printed and hung over the desk of each and every developer to help them grasp the culture of SCRUM quickly:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.AnAgileDevelopersworkflowwhenSCRUMisused_5F00_10FF6/image_5F00_2.png"&gt;&lt;img border="0" width="604" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.AnAgileDevelopersworkflowwhenSCRUMisused_5F00_10FF6/image_5F00_thumb.png" alt="image" height="1045" style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We use Flyspray for issue tracking, so you will see the mention of it frequently. &lt;/p&gt;
&lt;p&gt;You will see the step to &amp;quot;Update Sprint backlog with remaining hours&amp;quot; is missing. This is done kinda verbally and scrum master (sometimes same person who is the product owner) keeps track of it.&lt;/p&gt;
&lt;p&gt;Hope you find this useful.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f10%2f11%2fan-agile-developer-s-workflow-when-scrum-is-used.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f10%2f11%2fan-agile-developer-s-workflow-when-scrum-is-used.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1650562" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/ideas/default.aspx">ideas</category><category domain="http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx">misc</category></item><item><title>ASP.NET website Continuous Integration+Deployment using CruiseControl.NET, Subversion, MSBuild and Robocopy</title><link>http://msmvps.com/blogs/omar/archive/2008/10/06/asp-net-website-continuous-integration-deployment-using-cruisecontrol-net-subversion-msbuild-and-robocopy.aspx</link><pubDate>Mon, 06 Oct 2008 06:59:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1649873</guid><dc:creator>omar</dc:creator><slash:comments>16</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1649873</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/10/06/asp-net-website-continuous-integration-deployment-using-cruisecontrol-net-subversion-msbuild-and-robocopy.aspx#comments</comments><description>&lt;p&gt;You can setup continuous integration and automated deployment for your web application using CruiseControl.NET, Subversion, MSBuild and Robocopy. I will show you how you can automatically build the entire solution, email build report to developers and QA, deploy latest code in IIS all using CruiseControl.NET every N minutes. &lt;/p&gt;
&lt;p&gt;First get the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ccnet.thoughtworks.com/"&gt;CruiseControl.NET&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="http://msmvps.com/controlpanel/blogs/posteditor.aspx/subversion.tigris.org"&gt;Subversion&lt;/a&gt; (install the command line tools and add the Subversion bin path to PATH environment variable)  &lt;/li&gt;
&lt;li&gt;Robocopy (Windows Vista/2008 has it built-in, here&amp;#39;s the link for &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd"&gt;Windows 2003&lt;/a&gt;)  &lt;/li&gt;
&lt;li&gt;Install .NET Framework. You need it for MSBuild. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You will learn how I have configured Continuous Integration and Deployment for my open source AJAX Portal project &lt;a href="http://www.Dropthings.com"&gt;www.Dropthings.com&lt;/a&gt;. The code is hosted at CodePlex. When some developer makes a commit, CruiseControl downloads the latest code, builds the entire solution, emails build report and then deploys the latest web site to IIS 6.0.&lt;/p&gt;
&lt;p&gt;After installing CruiseControl.NET, go to &lt;span style="text-decoration:underline;"&gt;Programs -&amp;gt; Cruise Control -&amp;gt; CruiseControl.NET Config&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Now keep copying and pasting the following XML blocks and make sure you understand each block and make necessary changes:&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:94.58%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;height:301px;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;cruisecontrol&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;project&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Dropthings&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;queue&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;DropthingsQueue&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;queuePriority&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;&amp;lt;!-- &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; &lt;span style="color:#008000;"&gt;        Path to the trunk folder where the full solution starts from. This is where&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; &lt;span style="color:#008000;"&gt;        subversion checkout and incremental update is performed &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt; &lt;span style="color:#008000;"&gt;        --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;d:\cc\dropthings\code\trunk\&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;&amp;lt;!-- Some path where CCNet writes its logs and stuffs. It can be outside the log folder --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;artifactDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;d:\cc\dropthings\artifact\&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;artifactDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;category&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Dropthings&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;category&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;&amp;lt;!-- CCNet installs a web dashboard. Enter the URL of that dashboard here --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;webURL&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;http://localhost/ccnet/&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;webURL&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;modificationDelaySeconds&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;60&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;modificationDelaySeconds&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;labeller&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;defaultlabeller&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;prefix&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;0.1.&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;prefix&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;incrementOnFailure&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;incrementOnFailure&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;labelFormat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;000&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;labelFormat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;labeller&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;state&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;state&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;directory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;State&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;First change the working directory. It needs to be the path of the folder where you will have the solution downloaded. I generally create folder structure like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;D:\CC - Root for all CC.NET enabled projects 
&lt;ul&gt;
&lt;li&gt;\ProjectName - Root project folder 
&lt;ul&gt;
&lt;li&gt;\Code - Code folder where code is downloaded from subversion &lt;/li&gt;
&lt;li&gt;\Artifact - CC.NET generates a lot of stuff. All goes here.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; Next comes the Subversion integration block:&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;sourcecontrol&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;svn&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;&amp;lt;!-- Subversion trunk repository to keep checking for latest code --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;trunkUrl&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;http://localhost:8081/tfs02.codeplex.com/dropthings/trunk&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;trunkUrl&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;username&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;***** SUBVERSION USER NAME *****&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;username&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;password&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;***** SUBVERSION PATH *****&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;password&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;sourcecontrol&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here specify the subversion location where you want to download code to the working folder. You should download the entire solution because you will be building the entire solution using MSBuild soon.&lt;/p&gt;
&lt;p&gt;I left &lt;span style="text-decoration:underline;"&gt;&amp;lt;workingDirectory&amp;gt;&lt;/span&gt; empty. This means whatever is specified earlier in the &lt;span style="text-decoration:underline;"&gt;&amp;lt;workingDirectory&amp;gt;&lt;/span&gt; is used. Otherwise you can put some relative folder path here or any absolute folder.&lt;/p&gt;
&lt;p&gt;Now we start building the tasks that CC.NET executes - Build, Email, and Deploy.&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;tasks&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;artifactcleanup&lt;/span&gt;   &lt;span style="color:#ff0000;"&gt;cleanUpMethod&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;KeepLastXBuilds&amp;quot;&lt;/span&gt;   &lt;span style="color:#ff0000;"&gt;cleanUpValue&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;5&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;modificationWriter&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filename&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;mods.xml&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;filename&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;path&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;path&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;modificationWriter&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;&amp;lt;!-- MSBuild task to build a .msbuild file that basically builds a .sln file --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;msbuild&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;C:\windows\Microsoft.NET\Framework64\v3.5\MSBuild.exe&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;projectFile&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Dropthings.msbuild&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;projectFile&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;targets&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Build&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;targets&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;timeout&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;300&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;timeout&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;logger&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;logger&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;msbuild&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This block first says, keep artifacts for last 5 build and remove olders. Artifacts are like build reports, logs etc. You can increase the value for longer history.&lt;/p&gt;
&lt;p&gt;Then the most important &lt;span style="text-decoration:underline;"&gt;&amp;lt;msbuild&amp;gt;&lt;/span&gt; task. The executable path is to the MSBuild.exe. I am using .NET 3.5 Framework 64bit edition. You might have .NET 2.0 and 32bit version. So, set the right path here for the MSbuild.exe.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;&amp;lt;projectFile&amp;gt;&lt;/span&gt; maps to a MSBuild file. It&amp;#39;s a skeleton MSBuild file which basically says build this Visual Studio solution file. Here&amp;#39;s how the msbuild file looks like:&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DefaultTargets&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Build&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Target&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Build&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#008000;"&gt;&amp;lt;!-- Rebuild entire solution --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;MSBuild&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Projects&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Dropthings.sln&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Targets&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Rebuild&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Target&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;span style="text-decoration:underline;"&gt;Dropthings.msbuild&lt;/span&gt; and &lt;span style="text-decoration:underline;"&gt;Dropthings.sln&lt;/span&gt; file exists in the same trunk folder. This file says - build Dropthings.sln and do a rebuild.&lt;/p&gt;
&lt;p&gt;Now you got the build done. Next is to deploy it. You will be using robocopy to copy files from the code folder to a destination folder which is mapped in IIS to a website. Robocopy will do a synchronization of the directories. It will add new files, overwrite old files and removes files from destination folder which no longer exists in the source folder. &lt;/p&gt;
&lt;p&gt;Before you can deploy, you need to stop the website or restart IIS. Otherwise some files may be in use and you will not be able to delete or overwrite the files. Here&amp;#39;s how to stop IIS using the &lt;span style="text-decoration:underline;"&gt;iisreset&lt;/span&gt; command line tool:&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!-- &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;Stop IIS before copying over the latest web project files so that there&amp;#39;s no write lock and IIS does not&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;start restarting the site half way through&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;iisreset&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;/stop&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you do not want to stop the entire IIS, instead just stop a website and recycle an application pool, you can use the iisweb.vbs script for stopping a website and iisapp.vbs script for recycling application pool. Here&amp;#39;s an example:&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;iisweb&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;/stop &amp;quot;Dropthings&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;iisapp&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; /a &amp;quot;Dropthings&amp;quot; /r&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You need to first register &lt;span style="text-decoration:underline;"&gt;cscript&lt;/span&gt; as the default script runtime. In order to do this, go to command line and enter iisweb. It will tell you that it cannot use wscript to run this script and it needs to make cscript default. Let it make cscript as default.&lt;/p&gt;
&lt;p&gt;Now the time to do the deployment of latest web site files. The following task launches robocopy to do the deployment:&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;Sync the web project folder with the deployment folder. The deployment folder is where IIS&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;is mapped to serve the site. The deployment folder is at the buildArgs node. The robocopy &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;utility does an exact sync, adding new files, updating old files, deleting files that no longer&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;exist.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#008000;"&gt;&amp;lt;!--&amp;lt;executable&amp;gt;C:\Program Files (x86)\Windows Resource Kits\Tools\robocopy.exe&amp;lt;/executable&amp;gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;robocopy.exe&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;baseDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Dropthings\&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;baseDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;.\ d:\cc\Dropthings\Deploy *.* /E /XA:H /PURGE /XO /XD &amp;quot;.svn&amp;quot; /NDL /NC /NS /NP&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildTimeoutSeconds&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;60&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildTimeoutSeconds&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;successExitCodes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1,0&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;successExitCodes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;First you need to correct the robocopy.exe path. For Windows Vista/Windows 2008, keep it as it is. For Windows 2003, you need to specify the full path. You also need to remove the (x86) from the path if you have 32bit OS.&lt;/p&gt;
&lt;p&gt;Next is the &lt;span style="text-decoration:underline;"&gt;&amp;lt;baseDirectory&amp;gt;.&lt;/span&gt; This is relative to the working directory. It&amp;#39;s the path of the website folder. Dropthings website folder is located under the Dropthings folder under trunk. So, I have specified Dropthings\ as the subfolder where the website files are located. You need to specify your project&amp;#39;s website folder&amp;#39;s relative path here form the &lt;span style="text-decoration:underline;"&gt;&amp;lt;workingDirectory&amp;gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Next change the path in the &lt;span style="text-decoration:underline;"&gt;&amp;lt;buildArgs&amp;gt;&lt;/span&gt; node. First one is the source &amp;quot;.\&amp;quot; which you keep as it is. It means copy files from the &lt;span style="text-decoration:underline;"&gt;baseDirectory&lt;/span&gt;. Next is the absolute path to the deployment folder where the web site is mapped in IIS. You can use both relative or absolute path here. While using relative path, just keep in mind the robocopy is running from the &amp;lt;workingDirectory&amp;gt;\&amp;lt;baseDirectory&amp;gt; folder.&lt;/p&gt;
&lt;p&gt;After the path keep the *.* and the remaining flags intact. The flags mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Copy all subdirectories /E&lt;/li&gt;
&lt;li&gt;Copy hidded files /XA:H&lt;/li&gt;
&lt;li&gt;Do not copy old files /XO&lt;/li&gt;
&lt;li&gt;Exclude .svn directory while copying files /XD &amp;quot;.svn&amp;quot;&lt;/li&gt;
&lt;li&gt;Do not show list of files and directories being copie /NDL, /NC, /NP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After the deployment, you need to turn IIS back on or start the website that you stopped:&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!-- Turn IIS back on --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;iisreset&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;/start&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;lt;exec&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;    &amp;lt;executable&amp;gt;iisweb&amp;lt;/executable&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;    &amp;lt;buildArgs&amp;gt;/start &amp;quot;Dropthings&amp;quot;&amp;lt;/buildArgs&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;lt;/exec&amp;gt;            &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now we got the build and deployment done. Next is to email a nice report to developers and QA. If build succeeds, email both developers and QA so that they can check out the latest build. But if build fails, email only developers.&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;publishers&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;rss&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xmllogger&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;statistics&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#008000;"&gt;&amp;lt;!-- Email build report to development and QA team --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;email&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;from&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;admin@yourcompany.com&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;mailhost&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;localhost&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;mailport&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;25&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;includeDetails&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;TRUE&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;           &lt;span style="color:#ff0000;"&gt;mailhostUsername&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;mailhostPassword&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;useSSL&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;FALSE&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;users&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;user&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Developer1&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;group&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;devs&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;dev1@yourcompany.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;user&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Developer2&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;group&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;devs&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;dev2@yourcompany.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;user&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Developer3&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;group&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;devs&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;dev3@yourcompany.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            &lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;user&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;QA1&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;group&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;qa&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;qa1@yourcompany.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;user&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;QA2&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;group&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;qa&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;qa2@yourcompany.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;user&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;QA3&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;group&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;qa&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;qa3@yourcompany.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;                    &lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            &lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;users&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;groups&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;group&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;devs&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;notification&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Always&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;group&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;qa&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;notification&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Success&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;groups&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;converters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#008000;"&gt;&amp;lt;!--&amp;lt;regexConverter find=&amp;quot;$&amp;quot; replace=&amp;quot;@dropthings.com&amp;quot; /&amp;gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;converters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;modifierNotificationTypes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;NotificationType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Always&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;NotificationType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;modifierNotificationTypes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;email&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;modificationHistory&lt;/span&gt;  &lt;span style="color:#ff0000;"&gt;onlyLogWhenChangesFound&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;publishers&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;First you need to change the &lt;span style="text-decoration:underline;"&gt;&amp;lt;email&amp;gt;&lt;/span&gt; tab where you specify the from address, mail server name, and optionally a user account for the email address that you need to use to send out emails.&lt;/p&gt;
&lt;p&gt;Then edit the &lt;span style="text-decoration:underline;"&gt;&amp;lt;users&amp;gt;&lt;/span&gt; node and put your developers and QA.&lt;/p&gt;
&lt;p&gt;That&amp;#39;s it! You got the configuration file done. Next step is to launch the CruiseControl.NET from Programs -&amp;gt; CruiseControl.NET -&amp;gt; CruiseControl.NET. It will launch a process that will execute the tasks according to the configuration. On Windows Vista, you will have to run it with Administrative privilege.&lt;/p&gt;
&lt;p&gt;There&amp;#39;s also a Windows Service that gets installed. It&amp;#39;s named CruiseControl.NET. You can start the service as well on a server and go to sleep. It will do continuous integration and automated deployment for you.&lt;/p&gt;
&lt;p&gt;There&amp;#39;s also a web based Dashboard that you can use to force a build or stop a build or see detail build reports.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.SetupASP.NETwebs.NETSubversionandMSBuild_5F00_D35/image_5F00_2.png"&gt;&lt;img border="0" width="604" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.SetupASP.NETwebs.NETSubversionandMSBuild_5F00_D35/image_5F00_thumb.png" alt="image" height="272" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;You can create multiple projects. You can have one project to build trunk code only, but do no deployment. Then you can create another project to build, deploy some branch that&amp;#39;s ready for production. You can create another project to build and deploy on QA server and so on. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/ccnet.zip"&gt;Here&amp;#39;s the full configuration file&lt;/a&gt; that you can use as your baseline.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;" id="scid:B3E14793-948F-49af-A347-D19C374A7C4F:f699e682-0ab4-4a9d-97ad-c7aa1944438d" class="wlWriterSmartContent"&gt;
&lt;script type="text/javascript"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="http://digg.com/tools/diggthis.js"&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f10%2f06%2fasp-net-website-continuous-integration-deployment-using-cruisecontrol-net-subversion-msbuild-and-robocopy.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f10%2f06%2fasp-net-website-continuous-integration-deployment-using-cruisecontrol-net-subversion-msbuild-and-robocopy.aspx" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1649873" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx">misc</category><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category></item><item><title>Using multiple broadband connections without using any special router or software</title><link>http://msmvps.com/blogs/omar/archive/2008/10/05/using-multiple-broadband-connections-without-using-any-special-router-or-software.aspx</link><pubDate>Sun, 05 Oct 2008 10:29:18 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1649771</guid><dc:creator>omar</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1649771</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/10/05/using-multiple-broadband-connections-without-using-any-special-router-or-software.aspx#comments</comments><description>&lt;p&gt;I have two broadband connections. One cheap connection, which I mostly use for browsing and downloading. Another very expensive connection that I use for voice chat, remote desktop connection etc. Now, using these two connections at the same time required two computers before. But I figured out a way to use both connections at the same time using the same computer. Here&amp;#39;s how:&lt;/p&gt; &lt;p&gt;Connect the cheap internet connection that is used mostly for non-critical purpose like downloading, browsing to a wireless router.&lt;/p&gt; &lt;p&gt;Connect the expensive connection that is used for network latency sensitive work like Voice Conference, Remote Desktop directly via LAN.&lt;/p&gt; &lt;p&gt;When you want to establish a critical connection like starting voice conf app (Skype) or remote desktop client, momentarily disconnect the wireless. This will make your LAN connection the only available internet. So, all the new connections will be established over the LAN. Now you can start Skype and initiate a voice conference or use Remote Desktop client and connect to a computer. The connection will be established over LAN.&lt;/p&gt; &lt;p&gt;Now turn on wireless. Wireless will now become the first preference for Windows to go to internet. So, now you can start Outlook, browser etc and they will be using the wireless internet connection. During this time, Skype and Terminal Client is still connected over the LAN connection. As they use persisted connection, they keep using the LAN connection and do not switch to the wireless. &lt;/p&gt; &lt;p&gt;This way you get to use two broadband connections simultaneously.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Usingmultiplebroadbandconnectionswithout_5F00_E7D0/image_5F00_2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="267" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Usingmultiplebroadbandconnectionswithout_5F00_E7D0/image_5F00_thumb.png" width="162" border="0" /&gt;&lt;/a&gt;&amp;nbsp; &lt;/p&gt; &lt;p&gt;Here you see I have data transfer going on through two different connection. The bottom one is the LAN which is maintaining a continuous voice data stream. The upper one is the wireless connection that sometimes consumes bandwidth when I browse.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Usingmultiplebroadbandconnectionswithout_5F00_E7D0/image_5F00_4.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="304" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.Usingmultiplebroadbandconnectionswithout_5F00_E7D0/image_5F00_thumb_5F00_1.png" width="343" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Using Sysinternal&amp;#39;s TCPView, I can see some connection is going through LAN and some through Belkin router. The selected ones - the terminal client and the MSN Messenger is using LAN where the Internet Explorer and Outlook is working over Wireless connection. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1649771" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/performance/default.aspx">performance</category><category domain="http://msmvps.com/blogs/omar/archive/tags/ideas/default.aspx">ideas</category><category domain="http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx">misc</category></item><item><title>Desktop RSS Feed Aggregator client with Outlook Integration</title><link>http://msmvps.com/blogs/omar/archive/2008/02/05/desktop-rss-feed-aggregator-client-with-outlook-integration.aspx</link><pubDate>Tue, 05 Feb 2008 13:10:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1497209</guid><dc:creator>omar</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1497209</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/02/05/desktop-rss-feed-aggregator-client-with-outlook-integration.aspx#comments</comments><description>&lt;p&gt;Back in 2005, I built an open source RSS Feed Aggregator Desktop client which has been quite popular since its release. It has 48,672 downloads so far. From the activity I see on sourceforge statistics, it&amp;#39;s being used about 20,000 times per day.&lt;/p&gt; &lt;p&gt;&lt;a href="http://rssfeederdotnet.sourceforge.net/"&gt;http://rssfeederdotnet.sourceforge.net/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;What is RSS Feeder.NET&lt;/b&gt;&lt;/p&gt; &lt;p&gt;RSS Feeder.NET is a free open source desktop RSS feed aggregator which downloads feeds from web sources and stores locally for offline viewing, searching and processing. It is also a rich blogging tool which you can use to blog to variety of blog engines including WordPress, B2Evolution, .Text, Community Server etc. You can be fully MS Outlook® dependent or can run fully standalone. You can also use both at the same time whichever you find comfortable to work with. It does not increase Outlook load time, nor does it make Outlook slow frequently or prevent from closing properly. It is a Smart Client that makes best use of both Local Resource and Distributed Web Information sources.&lt;/p&gt; &lt;p&gt;&lt;a href="http://prdownloads.sourceforge.net/rssfeederdotnet/RSSFeederSetup_3_3.msi?download" target="_blank"&gt;Download Installer ver 3.3 (Nov 10, 2005)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://prdownloads.sourceforge.net/rssfeederdotnet/RSSFeeder_src_3_3.zip?download" target="_blank"&gt;Download Source Code ver 3.3 (Nov 10, 2005)&lt;/a&gt;&lt;/p&gt;Here’s an Article which explains how it is developed: &lt;br /&gt;&lt;a href="http://www.codeproject.com/smartclient/rssfeeder.asp"&gt;A RSS Feed Aggregator &amp;amp; Blog Smart Client&lt;/a&gt;  &lt;p&gt;Features:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;b&gt;Newspaper mode. &lt;/b&gt;You can read feeds in a more readable newspaper mode called “Blogpaper”  &lt;/li&gt;&lt;li&gt;&lt;b&gt;Auto Discovery&lt;/b&gt;. Drag any hyper link and I will find out whether there is any RSS Feed in that page  &lt;/li&gt;&lt;li&gt;&lt;b&gt;Outlook integration&lt;/b&gt;. You can store feeds in Outlook folders  &lt;/li&gt;&lt;li&gt;&lt;b&gt;Blogging. &lt;/b&gt;It provides you a Outlook 2003 style convenient workspace to manage your blog accounts and write rich posts  &lt;/li&gt;&lt;li&gt;&lt;b&gt;Blog from Outlook.&lt;/b&gt; You can specify an Outlook folder for a weblog account. All the posts from that folder is automatically posted to the weblog during synchronization. You can write posts as HTML using Word editor. Post content (HTML markup) is cleaned rigorously before posting to the weblog.  &lt;/li&gt;&lt;li&gt;&lt;b&gt;Outlook View. &lt;/b&gt;It uses a customized view to present a more readable list of feeds in Outlook Folders. The standard Post view is not easy to browse through quickly. The view puts the subject first in bold and an excerpt of the post under the subject.  &lt;/li&gt;&lt;li&gt;&lt;b&gt;Optimized Startup&lt;/b&gt;. You can safely put RSS Feeder at startup and it won’t make your Windows® start slower. A clever lazy loading process puts no effort on Windows® during startup instead starts the app when Windows® has finally regained its strength after the long boot up struggle.  &lt;/li&gt;&lt;li&gt;&lt;b&gt;Newsgator Import. &lt;/b&gt;Newsgator users can use RSS Feeder to import all the subscriptions and seamlessly replace Newsgator without any modification to Outlook folder locations. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;b&gt;Browse Mode&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;img src="http://rssfeederdotnet.sourceforge.net/screenshots/MainView.JPG" alt="Main View" /&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;Blogpaper mode&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;img src="http://rssfeederdotnet.sourceforge.net/screenshots/BlogPaper.JPG" alt="Blogpaper mode" /&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;Outlook 2003 View&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;img src="http://rssfeederdotnet.sourceforge.net/screenshots/OutlokView.JPG" alt="Outlook 2003 View" /&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;Tray Application&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;img src="http://rssfeederdotnet.sourceforge.net/screenshots/RSS%20Server.JPG" alt="RSS Server" /&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;Blog Module&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;img src="http://rssfeederdotnet.sourceforge.net/screenshots/Blog.JPG" alt="Blog" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1497209" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx">misc</category><category domain="http://msmvps.com/blogs/omar/archive/tags/.net/default.aspx">.net</category></item><item><title>Live OneCare - don't try this at home</title><link>http://msmvps.com/blogs/omar/archive/2007/03/16/live-onecare-don-t-try-this-at-home.aspx</link><pubDate>Fri, 16 Mar 2007 08:56:43 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:685251</guid><dc:creator>omar</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=685251</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2007/03/16/live-onecare-don-t-try-this-at-home.aspx#comments</comments><description>&lt;p&gt;I honestly and sincerely tried to use Windows Live OneCare for a month. It made my computer crawl to death, I still insisted on using it. It made Visual Studio Build process 5x slower, I still kept it on. It made my every day email check at least 40 mins longer than before, I still stubbornly kept using it for my sincere love for Microsoft Products. But no more. I had enough of it. This is the most crap product Microsoft has ever released and will ever release (I bet, otherwise I am switching to Linux/Java platform). I am so shockingly surprised how Microsoft can produce such a low quality mass consumer product, release it and keep shouting every where about its praise. If you go to Microsoft forums, you will be surprised how badly everyone has rejected this product. If Microsoft is really honest about their products, they should have withdrawn&amp;nbsp;OneCare from the market after so much negative feedback.&amp;nbsp;&lt;/p&gt; &lt;p&gt;Here are some of the major problems I have faced:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;I had to spend at least 30 to 40 mins more in Outlook 2007 since I installed it. Every single click, swtching folders, downloading emails was so slow that it felt like I am using a 386 PC.  &lt;li&gt;Almost whole day whenever I look at CPU meter, it shows MsMpEng is taking 50% CPU. I have dual core, so it&amp;#39;s occupying one core at 100%.  &lt;li&gt;Visual Studio build was like hell. I can make a cup of tea, drink it, chat with my friends while my solution builds.  &lt;li&gt;It will not cancel Virus scan no matter how many times I tell it to stop. It will again start within a minute. There is simply no way to return to workable condition until you disable the Virus &amp;amp; Spyware scanning feature.  &lt;li&gt;Every morning, I tried to tolerate it for an hour or so, then I disable the Virus &amp;amp; Spyware scanning and go back to normal working mode. OneCare leaves no room for anyone to work on PC when it&amp;#39;s installed.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Every single person I have seen so far installing OneCare, has gone back to some other product. There was not a single person who could continue with it. So, unless Microsoft makes major fix in this product and releases it under a different name, I will never use it. I strongly suggest you also never use it. &lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=685251" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx">misc</category></item><item><title>MVP Award</title><link>http://msmvps.com/blogs/omar/archive/2006/11/04/MVP-Award.aspx</link><pubDate>Sat, 04 Nov 2006 05:04:13 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:244654</guid><dc:creator>omar</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=244654</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2006/11/04/MVP-Award.aspx#comments</comments><description>&lt;p&gt;I have been awarded MVP Award 2007 on Visual C# again. This is my second year. This time the gifts are realy nice. This program is getting better and better every year. The level of support and appreciation MVPs receive from Microsoft by this award is phenomenal. Free MSDN Universal Susbcription, Visual Studio Team System, TechEd 2006 DVDs, woohoo!&lt;/p&gt; &lt;p&gt;You might be thinking, you did nothing for the community! How come you get this award?&lt;/p&gt; &lt;p&gt;Here&amp;#39;s what I did:&lt;/p&gt; &lt;p&gt;Ajax Series&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/09/18/Beginning-Atlas-series_3A00_-Why-Atlas_3F00_.aspx"&gt;Beginning Atlas series: Why Atlas?&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/09/22/Atlas-1_3A00_-Try-not-to-use-page-methods.aspx"&gt;Atlas 1: Try not to use page methods&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/09/22/Atlas-2_3A00_-HTTP-POST-is-slower-and-it_2700_s-default-in-Atlas.aspx"&gt;Atlas 2: HTTP POST is slower and it&amp;#39;s default in Atlas&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/09/23/Atlas-3_3A00_-Atlas-batch-calls-are-not-always-faster.aspx"&gt;Atlas 3: Atlas batch calls are not always faster&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/09/23/Atlas-4_3A00_-Only-2-calls-at-a-time-and-don_2700_t-expect-any-order.aspx"&gt;Atlas 4: Only 2 calls at a time and don&amp;#39;t expect any order&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/09/23/Atlas-5_3A00_-Bad-calls-make-good-calls-timeout.aspx"&gt;Atlas 5: Bad calls make good calls timeout&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/09/23/Atlas-6_3A00_-When-_2700_this_2700_-is-not-really-_2700_this_2700_.aspx"&gt;Atlas 6: When &amp;#39;this&amp;#39; is not really &amp;#39;this&amp;#39;&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/09/23/Atlas-7_3A00_-Caching-web-service-response-on-browser-and-save-bandwidth-significantly.aspx"&gt;Atlas 7: Caching web service response on browser and save bandwidth significantly&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;ASP.NET 2.0&amp;nbsp;Series&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/08/10/107226.aspx"&gt;IIS 6 Compression - quickest and effective way to do it for ASP.NET compression&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/08/10/107254.aspx"&gt;Client side Page Fragment Output cache, reduce page download time significantly&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/08/11/107353.aspx"&gt;Web Application performance optimization tips&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/08/17/107967.aspx"&gt;Optimize ASP.NET 2.0 Profile Provider before you go live&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/08/18/108000.aspx"&gt;How to use ASP.NET 2.0 Profile object from web service code&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/08/18/108003.aspx"&gt;How to change user name in ASP.NET 2.0 Membership Provider&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/08/20/108307.aspx"&gt;Forms authentication failed for the request. Reason: The ticket supplied was invalid. (Solution)&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/08/27/110061.aspx"&gt;Redirect Traffic from old to new server when you change hosting service&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/08/27/110064.aspx"&gt;Things you must do for ASP.NET 2.0 Membership Provider before going live&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2006/09/14/Careful-when-querying-on-aspnet_5F00_users_2C00_-aspnet_5F00_membership-and-aspnet_5F00_profile-tables-used-by-ASP.NET-2.0-Membership-and-Profile-provider.aspx"&gt;Careful when querying on aspnet_users, aspnet_membership and aspnet_profile tables used by ASP.NET 2.0 Membership and Profile provider&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;You say, &amp;quot;Huh, big deal, I can write such simple artlcles everyday&amp;quot;. Then read this:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msdn.microsoft.com/library/en-us/dnwinforms/html/stickout.asp?frame=true"&gt;StickOut - .NET 2.0, VSTS, Outlook Addin, MS Word/Excel integration&lt;/a&gt;&lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=244654" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx">misc</category></item><item><title>My university life</title><link>http://msmvps.com/blogs/omar/archive/2006/09/24/My-university-life.aspx</link><pubDate>Sun, 24 Sep 2006 17:40:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:138833</guid><dc:creator>omar</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=138833</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2006/09/24/My-university-life.aspx#comments</comments><description>&lt;p&gt;When I was in univerisity, from day 1 at my first semester, I looked for oppotunities not to attend classes or do homeworks instead go and work at my office more. Attending classes, taking class tests, collecting lecture notes, paying dues in long queues, doing course registration all seemed like a waste of my valuable time. I could do so many things if I were not doing those things. So, I was thinking about automating all these so that I can do them over the web from my office or home and thus save going to university. This resulted in a state-of-the-art web based, smart client powered univerisity automation and collaboration system which now runs at my univeristy web site &lt;a href="http://www.aiub.edu"&gt;www.aiub.edu&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It created a lot of buzz in the country because it was the first ever complete implementation of such a system not only in Bangladesh but also in many other countries. You will hardly find such feature rich automated system in Universites in US, Europe or Australia. We got so many proposals from famous universities in US who wanted to buy this&amp;nbsp;project.&amp;nbsp;This project was also praised in many daily newspapers. There&amp;#39;s a recent review published in a daily which suddenly brought back old memories and made it to this post:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.thedailystar.net/campus/2006/09/04/academic.htm"&gt;http://www.thedailystar.net/campus/2006/09/04/acad...&lt;/a&gt;&lt;/p&gt;&lt;p&gt;It was also the first ever .NET project completed in my country.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Here&amp;#39;s what a student sees when logged in:&lt;/p&gt;&lt;p&gt;&lt;img height="472" src="http://omar.mvps.org/images/Myuniversitylife_14CEA/VUES13.png" width="640" alt="" /&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Here&amp;#39;s details of a course:&lt;/p&gt;&lt;p&gt;&lt;img height="344" src="http://omar.mvps.org/images/Myuniversitylife_14CEA/VUES21.png" width="640" alt="" /&gt;&lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=138833" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx">misc</category></item><item><title>Blogging Tools</title><link>http://msmvps.com/blogs/omar/archive/2006/08/15/blogging-tools.aspx</link><pubDate>Tue, 15 Aug 2006 10:41:08 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:107679</guid><dc:creator>omar</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=107679</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2006/08/15/blogging-tools.aspx#comments</comments><description>&lt;p&gt;Today I am trying to use Windows Live Writer Beta. Previously I have tried using One Note 2007, MS Word 2007, InfoPath template. None of these were good enough. Although MS Word 2007 is really good for writing and quick publishing, but it generates bloated html, makes you page heavy and also codes look horrible. None of these have the feature to upload pictures with post. So, you have to go to the blog website, upload pictures and then edit the post using the web editor and insert pictures in it. If you do all these from the web, then the desktop blogging experience does not improve at all.&lt;/p&gt; &lt;p&gt;Now Windows Live Writer seems to have solved all these problems. Let&amp;#39;s try publishing a picture:&lt;/p&gt; &lt;p&gt;&lt;a href="http://omar.mvps.org/images/BloggingTools_DE59/CPU10017.gif"&gt;&lt;img height="156" src="http://omar.mvps.org/images/BloggingTools_DE59/CPU100_thumb9.gif" width="240" alt="" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;It&amp;#39;s a pretty interesting picture. For last one week, our servers running &lt;a href="http://www.pageflakes.com"&gt;Pageflakes&lt;/a&gt; were almost dying with super high CPU and IO usage. Here you see a 64bit Dual Core Dual Xeon DELL server is at its knees. We finally resolved the problem last night. It was a near death experience for us. I will soon write about it. I tried a long time to put some picture. Did not find any. So, just testing with this.&lt;/p&gt; &lt;p&gt;Let&amp;#39;s try the Google Map embedding. This is my country and Dhaka is the city where I live.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="84E294D0-71C9-4bd0-A0FE-95764E0368D9:39b73634-2aa0-4246-9bed-9facc32a6e66" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;a href="http://local.live.com/default.aspx?v=2&amp;amp;cp=23.70725~90.40826&amp;amp;lvl=6&amp;amp;style=r" id="map-30a08452-4f9c-44d5-a3eb-757fed690012" title="Click to view this map on Live.com"&gt;&lt;img src="http://omar.mvps.org/images/BloggingTools_DE59/map8b6462a0f7a4.jpg" width="320" height="240" alt="" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Let&amp;#39;s try some codes from Visual Studio:&lt;/p&gt; &lt;div style="border-right:lightgrey 1px solid;padding-right:10px;border-top:lightgrey 1px solid;padding-left:10px;font-size:10pt;background:white;padding-bottom:10px;border-left:lightgrey 1px solid;color:black;padding-top:10px;border-bottom:lightgrey 1px solid;font-family:courier new;"&gt;&lt;pre style="padding-bottom:0px;margin:0px;"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;color:teal;padding-top:0px;"&gt;WebMethod&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-bottom:0px;margin:0px;"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;color:teal;padding-top:0px;"&gt;WebOperationAttribute&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;(&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;color:blue;padding-top:0px;"&gt;true&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;, &lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;color:teal;padding-top:0px;"&gt;ResponseFormatMode&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;.Json, &lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;color:blue;padding-top:0px;"&gt;false&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;)]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-bottom:0px;margin:0px;"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;color:blue;padding-top:0px;"&gt;public&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt; &lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;color:blue;padding-top:0px;"&gt;int&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt; GetPageVersionNo(&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;color:blue;padding-top:0px;"&gt;int&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt; pageId)&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-bottom:0px;margin:0px;"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-bottom:0px;margin:0px;"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;color:blue;padding-top:0px;"&gt;using&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt; (&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;color:teal;padding-top:0px;"&gt;TheFacade&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt; facade = &lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;color:blue;padding-top:0px;"&gt;new&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt; &lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;color:teal;padding-top:0px;"&gt;TheFacade&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;())&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-bottom:0px;margin:0px;"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-bottom:0px;margin:0px;"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;color:blue;padding-top:0px;"&gt;return&lt;/span&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt; facade.ThePageflakes.GetPageVersionNo(pageId, Profile.UserName);&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-bottom:0px;margin:0px;"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-bottom:0px;margin:0px;"&gt;&lt;span style="padding-right:0px;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;OK, here&amp;#39;s a catch. You cannot paste&amp;nbsp;html to this editor. You need to&amp;nbsp;switch to Html View in order to paste the html. But this is much better than&amp;nbsp;going to web editor and doing it. &lt;/p&gt;
&lt;p&gt;So, far it really felt the best editing experiencing. Going to publish it now. Hope it works...&amp;nbsp;&lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=107679" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx">misc</category></item><item><title>Blogging from InfoPath</title><link>http://msmvps.com/blogs/omar/archive/2006/08/10/blogging-from-infopath.aspx</link><pubDate>Thu, 10 Aug 2006 15:10:10 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:107261</guid><dc:creator>omar</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=107261</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2006/08/10/blogging-from-infopath.aspx#comments</comments><description>&lt;div&gt;I&amp;#39;m trying to Blog from InfoPath. There&amp;#39;s a fantastic InfoPath template available here:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href="http://gqwu.members.winisp.net/blogeditor/"&gt;http://gqwu.members.winisp.net/blogeditor/&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;I have tried Word 2007&amp;#39;s new blogging feature. It works fine for posts without code. But if you insert code, the code looks super horrible when the blog gets published. Even the &amp;quot;Copy as HTML&amp;quot; can&amp;#39;t give you good output. Also no image upload support.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;I am thinking what if there was a nice addin for MS Word which can make a document publish as blog by automatically uploading pictures in it and nicely formatting code blocks, it could make us so productive. Mankind has invented so many great tools, but a really good Blogging tool that works for all is still missing. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div id="CSBloggerSig"&gt;&lt;div&gt; &lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=107261" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx">misc</category></item><item><title>Mac OSX vs. Windows Vista</title><link>http://msmvps.com/blogs/omar/archive/2006/08/07/mac-osx-vs-windows-vista.aspx</link><pubDate>Mon, 07 Aug 2006 16:59:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:106977</guid><dc:creator>omar</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=106977</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2006/08/07/mac-osx-vs-windows-vista.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msmvps.com/photos/omar/picture106974.aspx" target="_blank"&gt;&lt;img src="http://msmvps.com/photos/omar/images/106974/640x400.aspx" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Today we purchased an iMac (Intel Dual Core) in order to test Safari 2.0 support for &lt;a href="http://www.pageflakes.com/"&gt;Pageflakes&lt;/a&gt;. My first impression, I am totally blown away by its performance. The UI is unbelievable well done and the visual effects you see are 10 years ahead of time. I was comparing OS features of Mac OS X 10.4.X.X with Windows Vista. To be honest, I am suffering from inferiority complex now. Windows Vista is so lame compared to Mac OS X. Vista copied all OS X&amp;#39;s concepts for which at least I feel ashamed whether Microsoft feels or not. But it did not make anything better after copying. Normally Microsoft copies others ideas and makes them really better in all possible ways. But Mac OS X is so seriously better than any other OS. The widgets you see with the OS X are mind blowing.&amp;nbsp;Vista side bar goes nowhere near to it. Also the concept of switching to regular mode and widget mode is by far the best idea. We normally don&amp;#39;t want to occupy desktop space with widgets. That&amp;#39;s why in OS X, the whole screen switches to widget view when you press middle button. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/photos/omar/picture106979.aspx" target="_blank"&gt;&lt;img src="http://msmvps.com/photos/omar/images/106979/640x400.aspx" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/photos/omar/picture106974.aspx" target="_blank"&gt;&lt;/a&gt;OSX kernel is made from Unix. So, it&amp;#39;s seriously powerful and stable. The command line tools are very feature rich. Those who love *nix command line, will feel at home in OSX. Vista still offers those poor command line tools from Windows XP/2003. Nothing improved much. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/photos/omar/picture106976.aspx" target="_blank"&gt;&lt;img src="http://msmvps.com/photos/omar/images/106976/thumb.aspx" border="0" alt="" /&gt;&lt;/a&gt;&lt;a href="http://msmvps.com/photos/omar/picture106975.aspx" target="_blank"&gt;&lt;img src="http://msmvps.com/photos/omar/images/106975/thumb.aspx" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If somehow OSX can run Windows apps like Visual Studio, MS Word etc, I will undoubtedly switch to OSX. Even Windows Vista won&amp;#39;t be able to compromise me. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/photos/omar/picture106973.aspx" target="_blank"&gt;&lt;img src="http://msmvps.com/photos/omar/images/106973/thumb.aspx" border="0" alt="" /&gt;&lt;/a&gt;&lt;a href="http://msmvps.com/photos/omar/picture106979.aspx" target="_blank"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Best of all, you can buy an iMac with Intel Processor and use dual boot to run both Windows and Mac OSX. So, when you work, boot on Windows. When you want to have fun, go to OSX. &lt;/p&gt;&lt;a href="http://msmvps.com/photos/omar/picture106974.aspx" target="_blank"&gt;&lt;/a&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=106977" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx">misc</category></item><item><title>Testing blogging from Word 2007</title><link>http://msmvps.com/blogs/omar/archive/2006/08/06/testing-blogging-from-word-2007.aspx</link><pubDate>Sun, 06 Aug 2006 16:09:59 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:106888</guid><dc:creator>omar</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=106888</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2006/08/06/testing-blogging-from-word-2007.aspx#comments</comments><description>&lt;p&gt;Does it work? Looks like it does. I can now blog directly from MS Word! Amazing new feature!
&lt;/p&gt;&lt;p&gt;But beware about the configuration. I pulled out my hair trying to configure the Community Server configuration with MS Word. But nothing work and I repeatedly got the endless dialog box for user name and password which cannot be canceled but to terminate the process. Interestingly, everything started working after couple days. &lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=106888" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx">misc</category></item><item><title>New Model-Driven RAD Tool Generates up to 95% of a Custom Application</title><link>http://msmvps.com/blogs/omar/archive/2005/11/04/new-model-driven-rad-tool-generates-up-to-95-of-a-custom-application.aspx</link><pubDate>Fri, 04 Nov 2005 13:46:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:74421</guid><dc:creator>omar</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=74421</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2005/11/04/new-model-driven-rad-tool-generates-up-to-95-of-a-custom-application.aspx#comments</comments><description>&lt;p&gt;Model-Driven Development is a hot topic in the developer community, but many still don&amp;#39;t know how to make it work in real-life projects. By offering developers built-in guidance, tangible architect makes Model-Driven Development finally accessible to everyone. I have been working on a new custom UML designer for making the design process a lot easier than using generic UML designer. It will be released soon. Check out the cool app:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.tangible.de/"&gt;&lt;font color="#23598c"&gt;www.tangible.de&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=74421" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx">misc</category></item></channel></rss>