<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.atalasoft.com/cs/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>Dan Barvitsky</title><link>http://www.atalasoft.com/cs/blogs/danbarvitsky/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Detecting SearchServer (and other services) in SharePoint farm</title><link>http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/21/detecting-searchserver-and-other-services-in-sharepoint-farm.aspx</link><pubDate>Mon, 21 Sep 2009 15:40:09 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:19321</guid><dc:creator>dbarvitsky</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/danbarvitsky/comments/19321.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/danbarvitsky/commentrss.aspx?PostID=19321</wfw:commentRss><description>&lt;p&gt;Jake and I just got into an interesting problem while working on search functions for &lt;a href="http://www.vizitsp.com"&gt;VizitSP&lt;/a&gt;. My code was using types from &lt;font size="2"&gt;Microsoft.Office.Server.Search, which is not available if SearchServer is not installed, so trying to access search functions results in “assembly cannot be loaded” exceptions. So, how do we detect the SearchServer in SharePoint?&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;a href="http://www.microsoft.com/enterprisesearch/en/us/products.aspx"&gt;SearchServer&lt;/a&gt; is part of Shared Services. If you want to make sure it is available you must at least do two things:&lt;/font&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;font size="2"&gt;Detect if SearchServer is installed on the farm;&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Make sure it is online&lt;/font&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;font size="2"&gt;Luckily, Microsoft provides access to all farm’s services using &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spfarm.aspx"&gt;SPFarm&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spservicecollection.aspx"&gt;SPServiceCollection&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spservice.aspx"&gt;SPService&lt;/a&gt; classes, so that you can browse farm’s services and check their status. Try following code:&lt;/font&gt;&lt;/p&gt;  &lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:650px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Microsoft.SharePoint.Administration;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;...
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;SPFarm farm = SPFarm.Local;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (SPService s &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; farm.Services)
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;{
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;    Console.Out.Write(
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;    String.Format(&amp;quot;&lt;span style="color:#8b0000;"&gt;{0}\t{1}\t{2}({3})\n&lt;/span&gt;&amp;quot;,
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;        s.Id,s.Status,s.DisplayName,s.TypeName));
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;}&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;This code lists all available services, their IDs and display names. It turns out we are looking for “OSearch”.&lt;/p&gt;

&lt;p&gt;SPServiceCollection provides GetValue method, which looks up service by GUID or name. Unfortunately, GUIDs appear to be system-dependent, and lookup by name does not seem to work (we tried Name, TypeName, DisplayName – nothing worked). As result, we had to loop through all SharePoint services and check either Name property or actual service type:&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:650px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; String TypeName = @&amp;quot;&lt;span style="color:#8b0000;"&gt;Microsoft.Office.Server.Search.Administration.SearchService&lt;/span&gt;&amp;quot;;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; String ServiceName = @&amp;quot;&lt;span style="color:#8b0000;"&gt;OSearch&lt;/span&gt;&amp;quot;;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;...
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;( SPService s &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; farm.Services ) {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (s.GetType().FullName == TypeName || s.Name == ServiceName ) {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; s.Status == SPObjectStatus.Online;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;    }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;}
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;We do not use typeof(…) because that will prevent our assembly from loading if SearchServer is not installed. We also do not rely on service name alone or type name alone, since either might change in future. For other services, like Excel Calculation Services or Forms Service, the name may actually be empty, so you will have to go by type alone.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/21/detecting-searchserver-and-other-services-in-sharepoint-farm.aspx&amp;amp;;subject=Detecting+SearchServer+(and+other+services)+in+SharePoint+farm" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/21/detecting-searchserver-and-other-services-in-sharepoint-farm.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/21/detecting-searchserver-and-other-services-in-sharepoint-farm.aspx&amp;amp;;title=Detecting+SearchServer+(and+other+services)+in+SharePoint+farm" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/21/detecting-searchserver-and-other-services-in-sharepoint-farm.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/21/detecting-searchserver-and-other-services-in-sharepoint-farm.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/21/detecting-searchserver-and-other-services-in-sharepoint-farm.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/21/detecting-searchserver-and-other-services-in-sharepoint-farm.aspx&amp;amp;title=Detecting+SearchServer+(and+other+services)+in+SharePoint+farm" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/21/detecting-searchserver-and-other-services-in-sharepoint-farm.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/21/detecting-searchserver-and-other-services-in-sharepoint-farm.aspx&amp;amp;;title=Detecting+SearchServer+(and+other+services)+in+SharePoint+farm" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/21/detecting-searchserver-and-other-services-in-sharepoint-farm.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/21/detecting-searchserver-and-other-services-in-sharepoint-farm.aspx&amp;amp;;title=Detecting+SearchServer+(and+other+services)+in+SharePoint+farm&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/21/detecting-searchserver-and-other-services-in-sharepoint-farm.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=19321" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Best+practices/default.aspx">Best practices</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Development/default.aspx">Development</category></item><item><title>Steve’s wisdom</title><link>http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/14/steve-s-wisdom.aspx</link><pubDate>Mon, 14 Sep 2009 15:52:30 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:19302</guid><dc:creator>dbarvitsky</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/danbarvitsky/comments/19302.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/danbarvitsky/commentrss.aspx?PostID=19302</wfw:commentRss><description>&lt;p&gt;Just got off the 5-why meeting following the &lt;a href="http://www.vizitsp.com/blog/September-2009/Vizit-SP-1-6-Available-for-Download"&gt;VizitSP 1.6 release&lt;/a&gt;. Besides usual &lt;a href="http://en.wikipedia.org/wiki/5_Whys"&gt;5-why stuff&lt;/a&gt; dotImage’s senior architect &lt;a href="http://www.atalasoft.com/cs/blogs/stevehawley/default.aspx"&gt;Steve Hawley&lt;/a&gt; shared some interesting thoughts on estimates and the arguing in general. I sort of instinctively wrote that down. So here it is. Smart things belong to Steve everything else is my comment.&lt;/p&gt;  &lt;h2&gt;Top problems people should consider while doing estimates&lt;/h2&gt;  &lt;p&gt;Suppose you are estimating a feature and came up with say 20 hours. Now it is time to multiply it by some magical constant. Some people multiply by &lt;a href="http://en.wikipedia.org/wiki/Pi"&gt;PI&lt;/a&gt;, some multiply by &lt;a href="http://en.wikipedia.org/wiki/E_(mathematical_constant)"&gt;e&lt;/a&gt;, some multiply by &lt;a href="http://www.google.com/search?hl=en&amp;amp;source=hp&amp;amp;q=(PI%2Be)/2%3D&amp;amp;aq=f&amp;amp;oq=&amp;amp;aqi="&gt;(PI+e)/2&lt;/a&gt;, some come up with some formulae. Here are some driving factors which should increase your estimate:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Unusual hardware or complex environment&lt;/strong&gt; (what you build for): the environment where the product is going to be deployed is complex, non-standardized or volatile. This will increase number for test cases you will have to carry out, which results in more time. I’d probably go by number of typical configurations you are going to test. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Novel problems&lt;/strong&gt; (things nobody did before): you are taking a step into unknown, you may face unpredicted obstacles, maybe even &lt;a href="http://en.wikipedia.org/wiki/Cthulhu"&gt;Cthulhu&lt;/a&gt; himself. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Other people's code&lt;/strong&gt; (things you don't have control over): could actually be worse than Chtulhu. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Complex infrastructure&lt;/strong&gt; (things you use to build your product): you need to bring your test rigs and build infrastructure up-to-speed with your codebase, if you mess them up, you are dead in the water till you fix them. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Poor communication&lt;/strong&gt; (how you talk to each other): if you communicate everything to anybody this is considerable overhead. If you limit informational wave to certain audience some people may fell off the transmission. Either way it is good to have it written somewhere like wiki. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Many assumptions &lt;/strong&gt;(e.g. of successful integration testing or undocumented features): you should question-and-proof most assumptions you make, which adds time &lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;Five ways how people argue&lt;/h2&gt;  &lt;p&gt;&lt;span style="font-family:'Calibri','sans-serif';font-size:11pt;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-font-family:'Times New Roman';mso-bidi-theme-font:minor-bidi;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;Estimations usually have some sort of negotiations/arguing involved. In general there are only five ways people can argue&lt;/span&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;span style="font-family:'Calibri','sans-serif';font-size:11pt;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-font-family:'Times New Roman';mso-bidi-theme-font:minor-bidi;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&lt;strong&gt;Logic&lt;/strong&gt; (because a or not a is true)&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-family:'Calibri','sans-serif';font-size:11pt;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-font-family:'Times New Roman';mso-bidi-theme-font:minor-bidi;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&lt;strong&gt;Experience&lt;/strong&gt; (I've done this before, I know)&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-family:'Calibri','sans-serif';font-size:11pt;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-font-family:'Times New Roman';mso-bidi-theme-font:minor-bidi;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&lt;strong&gt;Emotion&lt;/strong&gt; (because I will stab you)&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-family:'Calibri','sans-serif';font-size:11pt;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-font-family:'Times New Roman';mso-bidi-theme-font:minor-bidi;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&lt;strong&gt;Evidence&lt;/strong&gt; (look here, see how this works?)&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="font-family:'Calibri','sans-serif';font-size:11pt;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-font-family:'Times New Roman';mso-bidi-theme-font:minor-bidi;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&lt;strong&gt;Authority&lt;/strong&gt; (because customer/boss/book says so)&lt;/span&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;span style="font-family:'Calibri','sans-serif';font-size:11pt;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-font-family:'Times New Roman';mso-bidi-theme-font:minor-bidi;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;In engineering I’d probably consider (1), (2) and (4) to be &lt;em&gt;positive&lt;/em&gt; and (3),(5) to be &lt;em&gt;negative&lt;/em&gt;. When in argument, both parties should be in the same mode to be able to resolve an issue. You take on logic with logic, on experience with experience and on armor with armor. Therefore, when you counterpart picks a mode you should either switch to it or drag them into the mode you want. Remember that the goal is not to win the debate, but to come up with a solution. It is always wise to keep conversation creative and friendly, or you may spiral into (3). &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:'Calibri','sans-serif';font-size:11pt;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-font-family:'Times New Roman';mso-bidi-theme-font:minor-bidi;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;For example, suppose there is a negotiation around “the big three options” AKA “the holy trinity of software planning”: we sprint is overstuffed, we can either (a) lose a feature, (b) accept lower quality or (c) extend deadline (which is equivalent of killing sprint and starting over in scrum). X, the product owner, wants (b) and Y, the architect, wants (c). The wrong way would be for Y to say “lower quality means more problems in future, I do not recommend that”. It is not friendly, since Y is engaging in direct fight with X by using (2) and (3). The right way would be “suppose we accept lower quality, how should we prepare tech support for that?”. This makes X think of unpleasant consequences of their decision, which might be acceptable workaround in certain situations. Y shoud try to ask “if (a), (b) or (c) acceptable in current situation” rather than forcing their opinion on opponents.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:'Calibri','sans-serif';font-size:11pt;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-font-family:'Times New Roman';mso-bidi-theme-font:minor-bidi;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt; Upd: I totally messed up the numbers and references. Thanks &lt;a href="http://www.atalasoft.com/cs/blogs/support/default.aspx"&gt;Elaine&lt;/a&gt;!&lt;/span&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/14/steve-s-wisdom.aspx&amp;amp;;subject=Steve%e2%80%99s+wisdom" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/14/steve-s-wisdom.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/14/steve-s-wisdom.aspx&amp;amp;;title=Steve%e2%80%99s+wisdom" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/14/steve-s-wisdom.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/14/steve-s-wisdom.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/14/steve-s-wisdom.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/14/steve-s-wisdom.aspx&amp;amp;title=Steve%e2%80%99s+wisdom" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/14/steve-s-wisdom.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/14/steve-s-wisdom.aspx&amp;amp;;title=Steve%e2%80%99s+wisdom" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/14/steve-s-wisdom.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/14/steve-s-wisdom.aspx&amp;amp;;title=Steve%e2%80%99s+wisdom&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/09/14/steve-s-wisdom.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=19302" width="1" height="1"&gt;</description></item><item><title>A word of praise for relevant error messages</title><link>http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/29/a-word-of-praise-for-relevant-error-messages.aspx</link><pubDate>Sat, 29 Aug 2009 19:24:30 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:19221</guid><dc:creator>dbarvitsky</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/danbarvitsky/comments/19221.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/danbarvitsky/commentrss.aspx?PostID=19221</wfw:commentRss><description>&lt;p&gt;What do you think about the following code:&lt;/p&gt;  &lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:650px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] privateParams, publicParams;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (var rsa = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Security.Cryptography.RSACryptoServiceProvider())
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;            {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;                privateParams = rsa.ExportCspBlob(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;                publicParams = rsa.ExportCspBlob(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;            }
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (var rsa = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Security.Cryptography.RSACryptoServiceProvider())
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;            {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;                rsa.ImportCspBlob(privateParams);
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;            }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Should work, right? Sure. Copy-paste, make a unit test and check for yourself – this works as a charm on your local machine. However, shall you run it under SharePoint it does this:&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:650px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;Access is denied.
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;   at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;   at System.Security.Cryptography.Utils._CreateCSP(CspParameters param, Boolean randomKeyContainer, SafeProvHandle&amp;amp; hProv)
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;   at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;   at System.Security.Cryptography.Utils.ImportCspBlobHelper(CspAlgorithmType keyType, Byte[] keyBlob, Boolean publicOnly, CspParameters&amp;amp; parameters, Boolean randomKeyContainer, SafeProvHandle&amp;amp; safeProvHandle, SafeKeyHandle&amp;amp; safeKeyHandle)
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;   at System.Security.Cryptography.RSACryptoServiceProvider.ImportCspBlob(Byte[] keyBlob)
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;...&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;After some noodling in Google I found this &lt;a href="http://www.derkeiler.com/Newsgroups/microsoft.public.dotnet.security/2005-06/0221.html"&gt;post about .NET implementation adding some bytes to the CSP blob&lt;/a&gt;, as well as this &lt;a href="http://www.codeproject.com/KB/security/Neat_License.aspx?display=Print"&gt;CodeProject post, which does the same trick to initialize CSP from blob&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;What happened? A good question. First, I thought that .NET code propagated some low-level exception, which, may I suggest, has been constructed from a result code, which, perhaps, was&amp;#160; not &lt;em&gt;too relevant&lt;/em&gt; to the problem itself. I applied the “rip those 12 bytes off” fix and it did not work. So I went to &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider.importcspblob.aspx"&gt;MSDN&lt;/a&gt; and finally noticed that ImportCspBlob requires &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.permissions.keycontainerpermissionaccessentrycollection.aspx"&gt;KeyContainerPermissionAccessEntryCollection&lt;/a&gt; permission. Pardon me? Digging more in MSDN reveals the following details:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;I am loading a public key. .NET code for RSACryptoServiceProvider wraps CSP implementation of RSA. &lt;/li&gt;

  &lt;li&gt;CSP wants keys in server’s key container to work. &lt;/li&gt;

  &lt;li&gt;When you “import” the public key from Blob, .NET class attempts to drop it in the server’s key container. &lt;/li&gt;

  &lt;li&gt;In order to access server’s key container assembly needs the permission I mentioned above. &lt;/li&gt;

  &lt;li&gt;Local code (unit tests) have that permissions, so everything runs just fine. &lt;/li&gt;

  &lt;li&gt;SharePoint code does not have that permission, so this is where “Access is Denied” is coming from. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now it makes sense. Apparently this problem is &lt;a href="http://forums.asp.net/t/983896.aspx"&gt;rather popular&lt;/a&gt;. I could save myself some 5 hours if the error message was something along the lines “Cannot add key to server key container, because this assembly does not have … permission to access server key store”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note to self:&lt;/strong&gt; when dealing with exceptions, don’t hesitate to create individual exception classes for particular types of exceptions. Create a generic exception class, make it abstract and throw concrete implementations. If you are dealing with and underlying layer (native code, COM, web service), which does not provide informative exceptions, don’t just wrap-and-throw. Try using &lt;strong&gt;smart exceptions&lt;/strong&gt; (pattern?) instead. First, create a base exception class (normally one per library or subsystem):&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:650px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;abstract&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; MyLibException : Exception
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;        {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;            ...
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;        }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Now if something bad happens you cannot just throw MyLibException, it is abstract. You will have to create a concrete exception class for &lt;em&gt;that particular type of problem&lt;/em&gt;:&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:650px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ConcreteException: MyLibException
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;        {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ConcreteException( Exception cause ) 
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;            {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;            }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;        }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Note that I do not propagate “message” parameter – concrete exceptions should come up with their own descriptions as necessary. Well, unless there is an external information, such as message, error code, parameter reference, etc, which has to be included in the exception message. This is an indication of the fact that you need to refactor your concrete exception into “smart” exception:&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:650px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; SmartException: MyLibException
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;        {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; SmartException( &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; resultCode, String responseText, Exception cause ) {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;                &lt;span style="color:#008000;"&gt;// Come up with reasonable diagnostics message here&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;            }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;        }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Now your smart exception can come up with an informative message on its own. With a bit of effort, you can make smart exceptions localized&amp;#160; and still be able to identify exceptions by stack trace (because of the class names).&lt;/p&gt;

&lt;p&gt;Strengths of smart exception pattern:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;If you do it right (i.e. thinking of support engineers, third party developers, consultants, IT professionals, etc. who will have to figure out the cause of problem by your exception), you are making your product easier to troubleshoot.&lt;/li&gt;

  &lt;li&gt;Exceptions can be localized and still be identified by class names.&lt;/li&gt;

  &lt;li&gt;Documentation. Long ago, when trees were short and mountains were young, software engineers would have to document error codes, because it was the only way to troubleshoot applications besides of reading logs.&amp;#160; Now we have comment annotations for “throws”, but, let us face it, how many people really provide detailed error messages? And even if they do it all stays in the code documentation. Now you can write code documentation for your concrete exception class, which can be added to the troubleshooting guide. Because, unlike method documentation, it does not expose your code structure. &lt;em&gt;Automatically&lt;/em&gt;.&lt;/li&gt;

  &lt;li&gt;Your diagnostics logic can be broken apart from your “main” code.&lt;/li&gt;

  &lt;li&gt;Easier to write unite tests.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Weaknesses of smart exception pattern:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;More code to write&lt;/li&gt;

  &lt;li&gt;Not too clear when exception classes can be re-used.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/29/a-word-of-praise-for-relevant-error-messages.aspx&amp;amp;;subject=A+word+of+praise+for+relevant+error+messages" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/29/a-word-of-praise-for-relevant-error-messages.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/29/a-word-of-praise-for-relevant-error-messages.aspx&amp;amp;;title=A+word+of+praise+for+relevant+error+messages" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/29/a-word-of-praise-for-relevant-error-messages.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/29/a-word-of-praise-for-relevant-error-messages.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/29/a-word-of-praise-for-relevant-error-messages.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/29/a-word-of-praise-for-relevant-error-messages.aspx&amp;amp;title=A+word+of+praise+for+relevant+error+messages" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/29/a-word-of-praise-for-relevant-error-messages.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/29/a-word-of-praise-for-relevant-error-messages.aspx&amp;amp;;title=A+word+of+praise+for+relevant+error+messages" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/29/a-word-of-praise-for-relevant-error-messages.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/29/a-word-of-praise-for-relevant-error-messages.aspx&amp;amp;;title=A+word+of+praise+for+relevant+error+messages&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/29/a-word-of-praise-for-relevant-error-messages.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=19221" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Toolbox/default.aspx">Toolbox</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/System+internals/default.aspx">System internals</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Best+practices/default.aspx">Best practices</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Development/default.aspx">Development</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Patterns/default.aspx">Patterns</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Exceptions/default.aspx">Exceptions</category></item><item><title>ILMerge and ConfigurationSection</title><link>http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/25/ilmerge-and-configurationsection.aspx</link><pubDate>Tue, 25 Aug 2009 21:25:22 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:19201</guid><dc:creator>dbarvitsky</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/danbarvitsky/comments/19201.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/danbarvitsky/commentrss.aspx?PostID=19201</wfw:commentRss><description>&lt;p&gt;Note to self: dearest Dan! If you happen to use &lt;a href="http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx"&gt;ILMerge&lt;/a&gt; with an exe file, &lt;strong&gt;&lt;u&gt;please&lt;/u&gt;&lt;/strong&gt; make sure you check the app.config file. Why?&amp;#160; Well, suppose you have a custom settings section in your app.config, just like this:&lt;/p&gt;  &lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:650px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;configSections&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;sectionGroup&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Atalasoft&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;		&lt;span style="color:#008000;"&gt;&amp;lt;!-- Converter service settings section: --&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;section&lt;/span&gt; 
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;			&lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;TransformServer&amp;quot;&lt;/span&gt; 
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;			&lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Atalasoft.OO.Service.Settings, Atalasoft.OO.Service&amp;quot;&lt;/span&gt; 
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;			&lt;span style="color:#ff0000;"&gt;allowLocation&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; 
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;			&lt;span style="color:#ff0000;"&gt;allowDefinition&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Everywhere&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;sectionGroup&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;configSections&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;As you might notice, the “type” parameter references Atalasoft.OO.Service.Settings class, which extends System.Configuration.ConfigurationSection by introducing custom configuration properties for your WCF service. The “type” parameter consists of two parts – the type name and assembly name. After you ILMerge your service into a solid executable, guess what happens with Atalasoft.OO.Service assembly? Yes, Dan, it is &lt;strong&gt;gone&lt;/strong&gt;! Which means that:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;all your unit tests will pass as usual, &lt;/li&gt;

  &lt;li&gt;your debug (non-merged) service will run just fine, &lt;/li&gt;

  &lt;li&gt;but your newly installed windows service will start up to the point where it needs to read configuration file and then will fail with a random exception. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Which is such a bucket of &lt;em&gt;joy&lt;/em&gt; to debug, as you just have experienced. &lt;/p&gt;

&lt;p&gt;To work this around you need to update the app.config and change the name of assembly:&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:650px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;configSections&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;sectionGroup&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Atalasoft&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;		&lt;span style="color:#008000;"&gt;&amp;lt;!-- Converter service settings section: --&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;section&lt;/span&gt; 
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;			&lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;TransformServer&amp;quot;&lt;/span&gt; 
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;			&lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Atalasoft.OO.Service.Settings, Atalasoft.Transform.SelfHostedService&amp;quot;&lt;/span&gt; 			
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;			&lt;span style="color:#ff0000;"&gt;allowDefinition&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Everywhere&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;sectionGroup&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;configSections&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;OK, now you wonder where did Atalasoft.Transform.SelfHostedService come from? This is the name of the primary assembly you used for ILMerge. No “exe” at the end, please. &lt;/p&gt;

&lt;p&gt;And don’t forget the obfuscation.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/25/ilmerge-and-configurationsection.aspx&amp;amp;;subject=ILMerge+and+ConfigurationSection" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/25/ilmerge-and-configurationsection.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/25/ilmerge-and-configurationsection.aspx&amp;amp;;title=ILMerge+and+ConfigurationSection" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/25/ilmerge-and-configurationsection.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/25/ilmerge-and-configurationsection.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/25/ilmerge-and-configurationsection.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/25/ilmerge-and-configurationsection.aspx&amp;amp;title=ILMerge+and+ConfigurationSection" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/25/ilmerge-and-configurationsection.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/25/ilmerge-and-configurationsection.aspx&amp;amp;;title=ILMerge+and+ConfigurationSection" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/25/ilmerge-and-configurationsection.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/25/ilmerge-and-configurationsection.aspx&amp;amp;;title=ILMerge+and+ConfigurationSection&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/08/25/ilmerge-and-configurationsection.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=19201" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Toolbox/default.aspx">Toolbox</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Deployment/default.aspx">Deployment</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Whining/default.aspx">Whining</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/ILMerge/default.aspx">ILMerge</category></item><item><title>Which formats does OpenOffice support?</title><link>http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/09/which-formats-does-openoffice-support.aspx</link><pubDate>Thu, 09 Jul 2009 17:10:14 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:18814</guid><dc:creator>dbarvitsky</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/danbarvitsky/comments/18814.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/danbarvitsky/commentrss.aspx?PostID=18814</wfw:commentRss><description>&lt;p&gt;What can you extract from the following dialogue between &lt;strong&gt;P&lt;/strong&gt;rospect and &lt;strong&gt;E&lt;/strong&gt;mployee? &lt;/p&gt;  &lt;p&gt;&lt;em&gt;P: Which formats does &amp;lt;application name&amp;gt; support?      &lt;br /&gt;E: Which one are you interested in?       &lt;br /&gt;P: Err… Give me all you have!       &lt;br /&gt;E: We support many formats, including… which one you were interested in again?&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;One can, with certain level of confidence, say that:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Prospect does not fully know/understand what he/she wants; &lt;/li&gt;    &lt;li&gt;Employee does not remember from top of his/her head which formats their product supports and does not have a list handy; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;If you imagine that employer itself relies on 3rd party components, you may very well end up with #3: employer is not 100% sure which formats are supported by components they use.&lt;/p&gt;  &lt;p&gt;It is not a huge secret in ECM world that OpenOffice supports huge variety of formats and has more-or-less appealing API for converting documents; so some people use it to “convert the unconvertible” under the hood of their applications. &lt;/p&gt;  &lt;p&gt;Since we are looking into OpenOffice support as well, here is a big question: which formats does the OpenOffice support? &lt;/p&gt;  &lt;p&gt;OpenOffice has extendible architecture, so it is hard to say which formats are there. You sure can use the “Open” file command, but, here is a dirty secret, not all stuff OpenOffice can support really is there. Since googling did not give a good answer, so I decided to ask the source. The source code.&lt;/p&gt;  &lt;p&gt;Luckily, OpenOffice.org has a common mechanism for registering filters. Namely there is a bunch of XCU files in filter/source/config/fragments/filters. I figured I could use the filter definitions to extract the list of formats I need. So I wrote a simple extraction tool and here is the list I’ve got:&lt;/p&gt;  &lt;table cellspacing="0"&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;     &lt;tr&gt;       &lt;td align="left"&gt;&lt;strong&gt;&lt;u&gt;Title&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td align="left"&gt;&lt;strong&gt;&lt;u&gt;Read&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td align="left"&gt;&lt;strong&gt;&lt;u&gt;Write&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td align="left"&gt;&lt;strong&gt;&lt;u&gt;Type&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ODF Chart&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Chart&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarOffice Chart&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Chart&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarOffice Report Chart&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Chart&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarChart 3.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Chart&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarChart 4.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Chart&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarChart 5.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Chart&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ODF Database&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Database&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;BMP - Windows Bitmap&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;BMP - Windows Bitmap&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;DXF - AutoCAD Interchange Format&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;EMF - Enhanced Metafile&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;EMF - Enhanced Metafile&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;EPS - Encapsulated PostScript&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;EPS - Encapsulated PostScript&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;GIF - Graphics Interchange Format&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;GIF - Graphics Interchange Format&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;HTML Document (product Draw)&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;JPEG - Joint Photographic Experts Group&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;JPEG - Joint Photographic Experts Group&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Macromedia Flash (SWF)&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;MET - OS/2 Metafile&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;MET - OS/2 Metafile&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ODF Drawing&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ODF Drawing Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PBM - Portable Bitmap&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PBM - Portable Bitmap&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PCD - Kodak Photo CD (192x128)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PCD - Kodak Photo CD (384x256)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PCD - Kodak Photo CD (768x512)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PCT - Mac Pict&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PCT - Mac Pict&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PCX - Zsoft Paintbrush&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PDF - Portable Document Format&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PGM - Portable Graymap&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PGM - Portable Graymap&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PNG - Portable Network Graphic&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PNG - Portable Network Graphic&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PPM - Portable Pixelmap&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PPM - Portable Pixelmap&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;product format Drawing&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;product format Drawing Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PSD - Adobe Photoshop&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;RAS - Sun Raster Image&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;RAS - Sun Raster Image&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;SGF - StarWriter Graphics Format&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;SGV - StarDraw 2.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarDraw 3.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarDraw 3.0 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarDraw 5.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarDraw 5.0 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;SVG - Scalable Vector Graphics&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;SVM - StarView Metafile&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;SVM - StarView Metafile&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;TGA - yesvision Targa&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;TIFF - Tagged Image File Format&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;TIFF - Tagged Image File Format&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WMF - Windows Metafile&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WMF - Windows Metafile&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XBM - X Bitmap&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XHTML&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XPM - X PixMap&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XPM - X PixMap&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Drawing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;MathML 1.01&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Formula&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;MathType3.x&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Formula&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ODF Formula&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Formula&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PDF - Portable Document Format&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Formula&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;product format Formula&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Formula&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarMath 2.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Formula&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarMath 3.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Formula&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarMath 4.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Formula&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarMath 5.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Formula&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;HTML (Writer/Global)&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Global&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;HTML Document (product Master Document)&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Global&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ODF Master Document&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Global&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ODF Text Document&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Global&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PDF - Portable Document Format&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Global&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;product format Master Document&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Global&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;product format Text Document&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Global&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 3.0&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Global&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 4.0&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Global&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 4.0 Master Document&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Global&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 5.0&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Global&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 5.0 Master Document&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Global&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Text Encoded (product Master Document)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Global&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;BMP - Windows Bitmap&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;CGM - Computer Graphics Metafile&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;EMF - Enhanced Metafile&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;EPS - Encapsulated PostScript&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;GIF - Graphics Interchange Format&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;HTML Document (product Impress)&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;JPEG - Joint Photographic Experts Group&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Macromedia Flash (SWF)&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;MET - OS/2 Metafile&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft PowerPoint 2007 XML&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft PowerPoint 2007 XML Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft PowerPoint 97/2000/XP&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft PowerPoint 97/2000/XP Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ODF Drawing (Impress)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ODF Presentation&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ODF Presentation Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PBM - Portable Bitmap&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PCT - Mac Pict&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PDF - Portable Document Format&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PGM - Portable Graymap&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PNG - Portable Network Graphic&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PPM - Portable Pixelmap&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;product format Drawing (product Impress)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;product format Presentation&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;product format Presentation Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PWP - PlaceWare&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;RAS - Sun Raster Image&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarDraw 3.0 (product Impress)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarDraw 3.0 Template (product Impress)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarDraw 5.0 (product Impress)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarDraw 5.0 Template (product Impress)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarImpress 4.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarImpress 4.0 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarImpress 5.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarImpress 5.0 Packed&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarImpress 5.0 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;SVG - Scalable Vector Graphics&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;SVM - StarView Metafile&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;TIFF - Tagged Image File Format&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Unified Office Format presentation&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WMF - Windows Metafile&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XHTML&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XPM - X PixMap&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Presentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ODF Database Report&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Report&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Data Interchange Format&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;dBASE&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;HTML Document (product Calc)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Lotus 1-2-3&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Excel 2003 XML&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Excel 2007 Binary&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Excel 2007 XML&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Excel 2007 XML Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Excel 4.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Excel 4.0 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Excel 5.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Excel 5.0 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Excel 95&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Excel 95 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Excel 97/2000/XP&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Excel 97/2000/XP Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;MiniCalc (Palm)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ODF Spreadsheet&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ODF Spreadsheet Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PDF - Portable Document Format&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Pocket Excel&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;product format Spreadsheet&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;product format Spreadsheet Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Quattro Pro 6.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Rich Text Format (product Calc)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarCalc 1.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarCalc 3.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarCalc 3.0 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarCalc 4.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarCalc 4.0 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarCalc 5.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarCalc 5.0 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;SYLK&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Text CSV&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Unified Office Format spreadsheet&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Web Page Query (product Calc)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XHTML&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Spreadsheet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Ami Pro 1.x-3.1&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;AportisDoc (Palm)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;BibTeX&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Claris Works&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;CTOS DEF&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;DataGeneral CEO Write&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;DCA Revisable Form Text&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;DCA with Display Write 5&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;DCA/FFT-Final Form Text&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;DEC DX&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;DEC WPS-PLUS&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;DisplayWrite 2.0-4.x&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;DisplayWrite 5.x&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;DocBook&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;EBCDIC&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Enable&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Frame Maker MIF 3.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Frame Maker MIF 4.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Frame Maker MIF 5.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Frame Work III&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Frame Work IV&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Hangul WP 97&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;HP AdvanceWrite Plus&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;HTML Document (product Writer)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ICL Office Power 6&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ICL Office Power 7&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Interleaf&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Interleaf 5 - 6&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;LaTeX 2e&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Legacy Winstar onGO&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Lotus 1-2-3 1.0 DOS (product Writer)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Lotus 1-2-3 1.0 WIN (product Writer)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Lotus Manuscript&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Mac Write 4.x 5.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Mac Write II&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Mac Write Pro&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;MASS 11 Rel. 8.0-8.3&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;MASS 11 Rel. 8.5-9.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;MediaWiki&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Excel 4.0 (product Writer)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Excel 5.0 (product Writer)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Excel 95 (product Writer)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft MacWord 3.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft MacWord 4.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft MacWord 5.x&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft WinWord 1.x&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft WinWord 2.x&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft WinWord 5&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Word 2003 XML&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Word 2007 XML&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Word 2007 XML Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Word 3.x&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Word 4.x&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Word 5.x&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Word 6.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Word 6.x&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Word 95&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Word 95 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Word 97/2000/XP&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Word 97/2000/XP Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Works 2.0 DOS&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Works 3.0 Win&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Microsoft Works 4.0 Mac&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;MultiMate 3.3&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;MultiMate 4&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;MultiMate Adv. 3.6&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;MultiMate Adv. II 3.7&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;NAVY DIF&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ODF Text Document&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;ODF Text Document Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;OfficeWriter 4.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;OfficeWriter 5.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;OfficeWriter 6.x&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PDF - Portable Document Format&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Peach Text&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PFS First Choice 1.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PFS First Choice 2.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PFS First Choice 3.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PFS Professional Write 1.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PFS Professional Write 2.x&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PFS Professional Write Plus&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PFS Write&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Pocket Word&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;product format Text Document&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;product format Text Document Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Q&amp;amp;A Write 1.0-3.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Q&amp;amp;A Write 4.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Rapid File 1.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Rapid File 1.2&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Rich Text Format&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Samna Word IV-IV Plus&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 1.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 2.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 3.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 3.0 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 4.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 4.0 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 5.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 5.0 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter DOS&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;T602 Document&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Text&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Text Encoded&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Total Word&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Unified Office Format text&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Uniplex onGO&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Uniplex V7-V8&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;VolksWriter 3 and 4&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;VolksWriter Deluxe&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Wang II SWP&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Wang PC&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Wang WP Plus&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Win Write 3.x&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WITA&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WiziWord 3.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordPerfect (Win) 5.1-5.2&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordPerfect (Win) 6.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordPerfect (Win) 6.1&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordPerfect (Win) 7.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordPerfect 4.1&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordPerfect 4.2&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordPerfect 5.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordPerfect 5.1&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordPerfect 6.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordPerfect 6.1&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordPerfect Document&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordPerfect Mac 1&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordPerfect Mac 2&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordPerfect Mac 3&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordStar (Win) 1.x-2.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordStar 2000 Rel. 3.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordStar 2000 Rel. 3.5&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordStar 3.3x&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordStar 3.45&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordStar 4.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordStar 5.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordStar 5.5&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordStar 6.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WordStar 7.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;WriteNow 3.0 (Macintosh)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Writing Assistant&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XEROX XIF 5.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XEROX XIF 5.0 (Illustrator)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XEROX XIF 6.0 (Color Bitmap)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XEROX XIF 6.0 (Res Graphic)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XHTML&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XyWrite (Win) 1.0&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XyWrite III&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XyWrite III+&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XyWrite IV&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XyWrite Sig. (Win)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;XyWrite Signature&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Help content&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;Web&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;HTML Document&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Web&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;HTML Document Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Web&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;MediaWiki&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Web&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;PDF - Portable Document Format&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Web&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;product format HTML Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Web&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;product format Text Document (product Writer/Web)&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Web&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;product Text (product Writer/Web)&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Web&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 3.0 (product Writer/Web)&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Web&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 4.0 (product Writer/Web)&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Web&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter 5.0 (product Writer/Web)&lt;/td&gt;        &lt;td align="left"&gt;no&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Web&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter/Web 4.0 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Web&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;StarWriter/Web 5.0 Template&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Web&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Text (product Writer/Web)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Web&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td align="left"&gt;Text Encoded (product Writer/Web)&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;yes&lt;/td&gt;        &lt;td align="left"&gt;Web&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;The tool and result files (TXT,OpenOffice and Excel) can be downloaded &lt;a href="http://dan.barvitsky.org/articles/OOFMTExtract/"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Needless to say, this list will change from release to release. In order to generate it you will need to download the source code from &lt;a href="http://download.openoffice.org/3.1.0/source.html"&gt;OpenOffice.org source code download page&lt;/a&gt; or directly from their &lt;a href="http://tools.openoffice.org/svn_checkout.html"&gt;SVN&lt;/a&gt; (&lt;a href="http://svn.services.openoffice.org/opengrok/xref/"&gt;browse&lt;/a&gt;). You will minimally need the &lt;a href="http://svn.services.openoffice.org/opengrok/xref/OOO310_13/filter/source/config/fragments/filters/"&gt;filter/source/config/fragments/filters&lt;/a&gt; folder.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/09/which-formats-does-openoffice-support.aspx&amp;amp;;subject=Which+formats+does+OpenOffice+support%3f" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/09/which-formats-does-openoffice-support.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/09/which-formats-does-openoffice-support.aspx&amp;amp;;title=Which+formats+does+OpenOffice+support%3f" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/09/which-formats-does-openoffice-support.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/09/which-formats-does-openoffice-support.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/09/which-formats-does-openoffice-support.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/09/which-formats-does-openoffice-support.aspx&amp;amp;title=Which+formats+does+OpenOffice+support%3f" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/09/which-formats-does-openoffice-support.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/09/which-formats-does-openoffice-support.aspx&amp;amp;;title=Which+formats+does+OpenOffice+support%3f" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/09/which-formats-does-openoffice-support.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/09/which-formats-does-openoffice-support.aspx&amp;amp;;title=Which+formats+does+OpenOffice+support%3f&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/09/which-formats-does-openoffice-support.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=18814" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/ECM/default.aspx">ECM</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Formats/default.aspx">Formats</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/OpenOffice/default.aspx">OpenOffice</category></item><item><title>Bitten by Kerberos</title><link>http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/07/bitten-by-kerberos.aspx</link><pubDate>Tue, 07 Jul 2009 17:34:10 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:18790</guid><dc:creator>dbarvitsky</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/danbarvitsky/comments/18790.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/danbarvitsky/commentrss.aspx?PostID=18790</wfw:commentRss><description>&lt;p&gt;The Kerberos, or &lt;a href="http://en.wikipedia.org/wiki/Cerberus"&gt;Cerberus&lt;/a&gt; in Latin, a&lt;strike&gt; multithreaded&lt;/strike&gt; multi-headed dog with tail of serpent heads, the hellhound, who used to guard the gates of Hades behind the river of Styx to keep the dead ancient Greek people dead in the kingdom of Shadows.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/danbarvitsky/800pxhercules_capturing_cerberus_17042CEE.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="800px-hercules_capturing_cerberus" border="0" alt="800px-hercules_capturing_cerberus" src="http://www.atalasoft.com/cs/blogs/danbarvitsky/800pxhercules_capturing_cerberus_thumb_5FC03663.jpg" width="442" height="309" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Once Kerberos was captured by Hercules and then brought to Eurystheus, where his DNA has been extracted and printed on an amphora. Somewhere around 1980 the amphora got into the hands of MIT researchers, who deciphered the inscriptions and reverse-engineered them into &lt;a href="http://en.wikipedia.org/wiki/Kerberos_(protocol)"&gt;an authentication protocol&lt;/a&gt;. There is a legend, that time-to-time spirit of Cerberus comes to life, raises from the informational space and tortures the developers and architects, who did not pay enough attention to his persona back in the college.&lt;/p&gt;  &lt;p&gt;To my greater sorrow, I can hereby confirm the above legend and provide the links for those in brave spirit who dare to repeat my path:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa480609.aspx"&gt;Kerberos Technical Supplement for Windows&lt;/a&gt; – start here&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/martinkearn/archive/2007/04/23/configuring-kerberos-for-sharepoint-2007-part-1-base-configuration-for-sharepoint.aspx"&gt;Configuring Kerberos for SharePoint 2007&lt;/a&gt; – this is how I got into it&lt;/li&gt;    &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/907272"&gt;Kerberos authentication and troubleshooting delegation issues&lt;/a&gt; – read this next for clarification on different names and short tool reference&lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc773257(WS.10).aspx"&gt;Overview of setspn command&lt;/a&gt; – a very useful tool to deal with Kerberos config, part of &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=9D467A69-57FF-4AE7-96EE-B18C4790CFFD&amp;amp;displaylang=en"&gt;Windows Server 2003 Resource Kit tools&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://eventid.net"&gt;EventID.NET&lt;/a&gt; to help troubleshoot Kerberos errors in Windows log&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Here are some tricks to ease the pain of the Kerberos bite:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;To see what the hell is going on in your Active Directory, use the &lt;font face="Courier New"&gt;ldifde -f export.txt&lt;/font&gt; command. It will save entries of your AD into a semi-readable file. To narrow down the search you may use various options, such as “–d” to specify the root of directory or “-r” to filter the entries;&lt;/li&gt;    &lt;li&gt;Use “klist tickets” or kerbtray tool to display current Kerberos tickets on your desktop (or server). Note that tool only shows tickets for the desktop it runs on. It is located in C:\Program Files\Windows Resource Kits\Tools directory, if you need to copy it;&lt;/li&gt; &lt;/ul&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/07/bitten-by-kerberos.aspx&amp;amp;;subject=Bitten+by+Kerberos" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/07/bitten-by-kerberos.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/07/bitten-by-kerberos.aspx&amp;amp;;title=Bitten+by+Kerberos" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/07/bitten-by-kerberos.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/07/bitten-by-kerberos.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/07/bitten-by-kerberos.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/07/bitten-by-kerberos.aspx&amp;amp;title=Bitten+by+Kerberos" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/07/bitten-by-kerberos.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/07/bitten-by-kerberos.aspx&amp;amp;;title=Bitten+by+Kerberos" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/07/bitten-by-kerberos.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/07/bitten-by-kerberos.aspx&amp;amp;;title=Bitten+by+Kerberos&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/07/07/bitten-by-kerberos.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=18790" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Toolbox/default.aspx">Toolbox</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Deployment/default.aspx">Deployment</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Whining/default.aspx">Whining</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/System+internals/default.aspx">System internals</category></item><item><title>Joining SharePoint server to a different domain</title><link>http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/29/joining-sharepoint-server-to-a-different-domain.aspx</link><pubDate>Mon, 29 Jun 2009 19:33:56 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:18752</guid><dc:creator>dbarvitsky</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/danbarvitsky/comments/18752.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/danbarvitsky/commentrss.aspx?PostID=18752</wfw:commentRss><description>&lt;p&gt;Once upon a time I had to join a workgroup-based SharePoint test server to a domain. SharePoint wonderland is like 4th dimension – it is full of unexpected and no task is trivial for naive 3D creature. Jake and Dave referred me to a magical “15-step” process to move SharePoint to different domain, but Google’s links are dead and so are my hopes for quick-and-easy migration. So far I came up with &lt;a href="http://www.sharepointassist.com/2009/05/30/restoring-a-sharepoint-site-collection-to-a-new-domai/"&gt;“Restoring a SharePoint Site collection to a new domain”&lt;/a&gt; and &lt;a href="http://blogs.objectsharp.com/CS/blogs/max/archive/2009/03/11/join-sharepoint-server-to-the-active-directory-domain.aspx"&gt;“Join SharePoint server to the Active Directory domain”&lt;/a&gt; posts, which I am trying to follow. Basically it is like if you want to sign your home to your spouse, you both should move everything out, blast the house, have your spouse hire a contractor, re-build it from scratch and move everything back in. I sort of missing old good times when one could just edit bunch of files in /etc/ to get the job done…&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/29/joining-sharepoint-server-to-a-different-domain.aspx&amp;amp;;subject=Joining+SharePoint+server+to+a+different+domain" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/29/joining-sharepoint-server-to-a-different-domain.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/29/joining-sharepoint-server-to-a-different-domain.aspx&amp;amp;;title=Joining+SharePoint+server+to+a+different+domain" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/29/joining-sharepoint-server-to-a-different-domain.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/29/joining-sharepoint-server-to-a-different-domain.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/29/joining-sharepoint-server-to-a-different-domain.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/29/joining-sharepoint-server-to-a-different-domain.aspx&amp;amp;title=Joining+SharePoint+server+to+a+different+domain" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/29/joining-sharepoint-server-to-a-different-domain.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/29/joining-sharepoint-server-to-a-different-domain.aspx&amp;amp;;title=Joining+SharePoint+server+to+a+different+domain" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/29/joining-sharepoint-server-to-a-different-domain.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/29/joining-sharepoint-server-to-a-different-domain.aspx&amp;amp;;title=Joining+SharePoint+server+to+a+different+domain&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/29/joining-sharepoint-server-to-a-different-domain.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=18752" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Toolbox/default.aspx">Toolbox</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Deployment/default.aspx">Deployment</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Whining/default.aspx">Whining</category></item><item><title>My solution for unit testing concurrent code in NUnit</title><link>http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/15/my-solution-for-unit-testing-concurrent-code-in-nunit.aspx</link><pubDate>Mon, 15 Jun 2009 17:45:21 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:18665</guid><dc:creator>dbarvitsky</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/danbarvitsky/comments/18665.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/danbarvitsky/commentrss.aspx?PostID=18665</wfw:commentRss><description>&lt;p&gt;I blogged recently about testing parallel code in NUnit. I think I settled with requirements:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;I want to use threads; &lt;/li&gt;    &lt;li&gt;I want to use assertions in threads; &lt;/li&gt;    &lt;li&gt;I want to control how threads step on each other; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Too bad that solutions I tested did not fit 100%. So I came up with a small (200 lines of code) tool called “Sync” that meets my requirements. My test looks as follows:&lt;/p&gt;  &lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        [Test]
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; MonitorTest()
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (var sync = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Sync())
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                List&amp;lt;String&amp;gt; result = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;String&amp;gt;();
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                sync
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                    .Add(&amp;quot;&lt;span style="color:#8b0000;"&gt;A&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;one&lt;/span&gt;&amp;quot;)
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                    .Add(&amp;quot;&lt;span style="color:#8b0000;"&gt;B&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;one&lt;/span&gt;&amp;quot;)
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                    .Add(&amp;quot;&lt;span style="color:#8b0000;"&gt;B&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;two&lt;/span&gt;&amp;quot;)
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                    .Add(&amp;quot;&lt;span style="color:#8b0000;"&gt;A&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;two&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                ThreadStart main = &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;()
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                    result.Add(Thread.CurrentThread.Name + &amp;quot;&lt;span style="color:#8b0000;"&gt;: before 'one'&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                    sync.Point(&amp;quot;&lt;span style="color:#8b0000;"&gt;one&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                    result.Add(Thread.CurrentThread.Name + &amp;quot;&lt;span style="color:#8b0000;"&gt;: after  'one'&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                    result.Add(Thread.CurrentThread.Name + &amp;quot;&lt;span style="color:#8b0000;"&gt;: before 'two'&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                    sync.Point(&amp;quot;&lt;span style="color:#8b0000;"&gt;two&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                    result.Add(Thread.CurrentThread.Name + &amp;quot;&lt;span style="color:#8b0000;"&gt;: after  'two'&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                };
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                sync.Start(&amp;quot;&lt;span style="color:#8b0000;"&gt;A&lt;/span&gt;&amp;quot;, main);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                sync.Start(&amp;quot;&lt;span style="color:#8b0000;"&gt;B&lt;/span&gt;&amp;quot;, main);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                sync.AssertEnd();
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; n1 = result.IndexOf(&amp;quot;&lt;span style="color:#8b0000;"&gt;A: after  'one'&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; n2 = result.IndexOf(&amp;quot;&lt;span style="color:#8b0000;"&gt;B: after  'one'&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                Assert.Greater(n1, 0);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                Assert.Greater(n2, 0);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                Assert.Greater(n2, n1);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                Sync.AssertOrder(result, 
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                    &amp;quot;&lt;span style="color:#8b0000;"&gt;A: after  'one'&lt;/span&gt;&amp;quot;,
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                    &amp;quot;&lt;span style="color:#8b0000;"&gt;B: after  'two'&lt;/span&gt;&amp;quot;,
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                    &amp;quot;&lt;span style="color:#8b0000;"&gt;B: after  'one'&lt;/span&gt;&amp;quot;,
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                    &amp;quot;&lt;span style="color:#8b0000;"&gt;A: after  'two'&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (String s &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; result) Console.Out.WriteLine(s);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            }
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;The tool does not care how you run the code – it wraps delegates and propagates exceptions when you call sync.AssertEnd(). It is entirely up to you how to call the code – separate thread, external queue, asynchronous calls – does not matter. &lt;/p&gt;

&lt;p&gt;You can (optionally) provide synchronization points (similar to “barriers” in PUnit). Here is how it is done. You insert the synchronization points (unfortunately this is done in code , I wish I could modify assembly on the fly):&lt;/p&gt;

&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;sync.Point(&amp;quot;&lt;span style="color:#8b0000;"&gt;one&lt;/span&gt;&amp;quot;);&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Then you configure the Sync object:&lt;/p&gt;

&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;sync.Add(&amp;quot;&lt;span style="color:#8b0000;"&gt;A&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;one&lt;/span&gt;&amp;quot;).Add(&amp;quot;&lt;span style="color:#8b0000;"&gt;B&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;one&lt;/span&gt;&amp;quot;)&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;It defines in which order threads “A” and “B” (these are actual thread names) pass the synchronization point. If thread “B” gets there first, it will wait till thread “A” gets there. This way you can control how race conditions happen by inserting synchronization point prior to it.&lt;/p&gt;

&lt;p&gt;All exceptions are thrown when you either call sync.AssertEnd() or when sync object is disposed (this is why you want to put it into the “using” clause). When you call AssertEnd() or Wait(), sync object waits for all wrapped code to complete, so that test won’t exit before all of it is code is done.&lt;/p&gt;

&lt;p&gt;Ironically, I am not 100% sure the synchronization code is flawless, though. My concern is that synchronization points can potentially prevent race conditions on different machines/architecture. The situation where you resume two threads simultaneously near the race condition section is very unpredictable. Will they race? Who will get there first? You can’t tell.&lt;/p&gt;

&lt;p&gt;As an exercise, I am going to look into Typemock Racer tool and see if my tests are comparable to what it does.&lt;/p&gt;

&lt;p&gt;The Sync source code can be downloaded &lt;a href="http://www.barvitsky.org/sync/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/15/my-solution-for-unit-testing-concurrent-code-in-nunit.aspx&amp;amp;;subject=My+solution+for+unit+testing+concurrent+code+in+NUnit" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/15/my-solution-for-unit-testing-concurrent-code-in-nunit.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/15/my-solution-for-unit-testing-concurrent-code-in-nunit.aspx&amp;amp;;title=My+solution+for+unit+testing+concurrent+code+in+NUnit" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/15/my-solution-for-unit-testing-concurrent-code-in-nunit.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/15/my-solution-for-unit-testing-concurrent-code-in-nunit.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/15/my-solution-for-unit-testing-concurrent-code-in-nunit.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/15/my-solution-for-unit-testing-concurrent-code-in-nunit.aspx&amp;amp;title=My+solution+for+unit+testing+concurrent+code+in+NUnit" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/15/my-solution-for-unit-testing-concurrent-code-in-nunit.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/15/my-solution-for-unit-testing-concurrent-code-in-nunit.aspx&amp;amp;;title=My+solution+for+unit+testing+concurrent+code+in+NUnit" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/15/my-solution-for-unit-testing-concurrent-code-in-nunit.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/15/my-solution-for-unit-testing-concurrent-code-in-nunit.aspx&amp;amp;;title=My+solution+for+unit+testing+concurrent+code+in+NUnit&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/15/my-solution-for-unit-testing-concurrent-code-in-nunit.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=18665" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Unit+testing/default.aspx">Unit testing</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/TDD/default.aspx">TDD</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Parallelism/default.aspx">Parallelism</category></item><item><title>Techniques for testing concurrent code in NUnit</title><link>http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/12/techniques-for-testing-concurrent-code-in-nunit.aspx</link><pubDate>Fri, 12 Jun 2009 15:33:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:18635</guid><dc:creator>dbarvitsky</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/danbarvitsky/comments/18635.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/danbarvitsky/commentrss.aspx?PostID=18635</wfw:commentRss><description>&lt;p&gt;Last time I blogged about a way to make concurrent unit tests deterministic. This time I’d like to focus on the technical aspects, namely &lt;a href="http://www.nunit.org/index.php"&gt;NUnit&lt;/a&gt;. Let us start with the following test:&lt;/p&gt;  &lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        [Test]
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; TestThread()
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; n = 0;
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            var thread1 = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Thread(() =&amp;gt;
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                n = 10;
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                Assert.Fail(&amp;quot;&lt;span style="color:#8b0000;"&gt;This should fail!&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                n = 20;
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            });
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            thread1.Name = &amp;quot;&lt;span style="color:#8b0000;"&gt;Broken thread&lt;/span&gt;&amp;quot;;
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            thread1.Start();
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            thread1.Join();
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            Assert.AreEqual(10, n);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        }
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Can you tell what will happen when you run it? When you start a thread, it will execute lambda function code,&amp;#160; assign 10 to n, and then… Fail? Nope. Assert.Fail(“This should fail”) will only throw an exception. Who is going to catch it? How NUnit can relate that exception to the unit tests running in another thread or, strictly speaking, not running any longer (in case you forgot to join() to it)? So the correct answer is test will print some warnings and will eventually pass:&lt;/p&gt;

&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;Thread Name: Broken thread
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;NUnit.Framework.AssertionException: This should fail!
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;   at NUnit.Framework.Assert.Fail(String message, Object[] args)
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;   at NUnit.Framework.Assert.Fail(String message)
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;	...
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;   at System.Threading.ThreadHelper.ThreadStart()
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;1 passed, 0 failed, 0 skipped, took 0.89 seconds (NUnit 2.5).&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Any solutions? Sure:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Use &lt;a href="http://www.codicesoftware.com/opdownloads2/oppnunit.aspx"&gt;PNUnit&lt;/a&gt;, available as part of &lt;a href="http://nunit.org/index.php?p=releaseNotes&amp;amp;r=2.5"&gt;NUnit as of 2.5.0.9117&lt;/a&gt;. It allows you to run parallel (and even distributed!) tests, while capturing exceptions properly. The downside of this approach is that you cannot really use threads, instead you have to break your test into separate tests and make them synchronize to each other using PNUnit services. I am not a huge fan of this approach, since it introduces dependencies between tests and the whole rig becomes a bit more complex. &lt;/li&gt;

  &lt;li&gt;Use &lt;a href="http://www.peterprovost.org/blog/post/NUnit-and-Multithreaded-Tests-CrossThreadTestRunner.aspx"&gt;CrossThreadTestRunner&lt;/a&gt; by Peter Provost. It simply starts a delegate in a thread, waits for the thread to complete, captures any exceptions thrown by the thread and then uses a neat trick to re-throw an exception in unit test’s primary thread. Here is an example: 

    &lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        [Test]
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; TestThread()
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; n = 0;
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            CrossThreadTestRunner c = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CrossThreadTestRunner(()=&amp;gt;
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                n = 10;
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                Assert.Fail(&amp;quot;&lt;span style="color:#8b0000;"&gt;This should fail!&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                n = 20;
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            });
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            c.Run();
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            Assert.AreEqual(10, n);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        }&lt;/pre&gt;&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;Use &lt;a href="http://mikeperetz.blogspot.com/2008/06/testing-concurrency-with-nunit.html"&gt;Mike Peretz’s&lt;/a&gt; solution. Mike suggests using &lt;a href="http://msdn.microsoft.com/en-us/library/22t547yb(VS.71).aspx"&gt;asynchronous delegate calls&lt;/a&gt; instead of threads to test parallel code. The example: 

    &lt;br /&gt;

    &lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        [Test]
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; TestThread()
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; n = 0;
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            ThreadStart main = () =&amp;gt; 
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                n = 10;
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                Assert.Fail(&amp;quot;&lt;span style="color:#8b0000;"&gt;This should fail!&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                n = 20;
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            };
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            var asyncResult = main.BeginInvoke(&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            main.EndInvoke(asyncResult);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            Assert.AreEqual(10, n);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;        }&lt;/pre&gt;&lt;/pre&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In both cases results are the same – test fails where it should fail, NUnit produces reasonable stack trace. In case of CrossThreadTestRunner the stack is more readable, though. &lt;/p&gt;

&lt;p&gt;Back to the subject, CrossThreadTestRunner blocks the test’s execution so I cannot use it for parallel code testing. Mike Peretz’s way looks more appealing for testing parallel processes. Unfortunately it comes with a catch: .NET actually uses the thread pool behind the scenes when invoking delegates asynchronously, so it is not guaranteed to run threads in parallel. Here is a sample code to confirm this concern:&lt;/p&gt;

&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; T(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; n);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;        [Test]
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; TestMany()
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;        {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            T main = (n) =&amp;gt;
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                Console.Out.WriteLine(&amp;quot;&lt;span style="color:#8b0000;"&gt;Thread &lt;/span&gt;&amp;quot; + n + &amp;quot;&lt;span style="color:#8b0000;"&gt; starting&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                Thread.Sleep(1000);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                Console.Out.WriteLine(&amp;quot;&lt;span style="color:#8b0000;"&gt;Thread &lt;/span&gt;&amp;quot; + n + &amp;quot;&lt;span style="color:#8b0000;"&gt; about to fail&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                Assert.Fail(&amp;quot;&lt;span style="color:#8b0000;"&gt;This should fail!&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                Console.Out.WriteLine(&amp;quot;&lt;span style="color:#8b0000;"&gt;Thread &lt;/span&gt;&amp;quot; + n + &amp;quot;&lt;span style="color:#8b0000;"&gt;: you should never see this&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            };
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            IAsyncResult[] results = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; IAsyncResult[100];
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 100; i++)
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                results[i] = main.BeginInvoke(i,&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            }
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            Thread.Sleep(1000);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 100; i++)
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                main.EndInvoke(results[i]);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            }
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Here I start 100 concurrent delegates, each prints first line, waits 1 second, prints the second line and fails. After starting all delegates I wait for 1 second and end the invocations. Can you tell how many threads will run? If you said 100 you are wrong, here is the test output: 
  &lt;br /&gt;&lt;/p&gt;

&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;Thread 0 starting
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;Thread 2 starting
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;Thread 3 starting
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;Thread 1 starting
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;Thread 4 starting
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;Thread 5 starting
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;Thread 3 about to fail
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;Thread 0 about to fail
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;Thread 2 about to fail
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;Thread 1 about to fail
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;Thread 6 starting
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;Thread 7 starting
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;Thread 8 starting
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;Thread 9 starting
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;TestCase 'TestMany' failed: This should fail!
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;	
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;	Server stack trace: 
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;	...
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;0 passed, 1 failed, 0 skipped, took 1.91 seconds (NUnit 2.5).&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Reading Thread.CurrentThread.IsThreadPoolThread inside the delegate returns true, so I’d suggest we are running 6 threads at a time here. This is not good for parallel code testing, since it can eliminate race conditions. In practice you barely run 3+ threads scenarios, but load tests may actually use many threads. Still, this prevents tests to run in predictable manner.&lt;/p&gt;

&lt;p&gt;Another sad side effect of this technique: your test will only fail if you call EndInvoke for all delegates you started. If you forget to do it, you may end up in a situation where NUnit thread already finished executing the test, but some asynchronous delegate calls are still sitting in the queue.&lt;/p&gt;

&lt;p&gt;So it looks like I need a mixture of both approaches, but this is a topic for a separate post.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/12/techniques-for-testing-concurrent-code-in-nunit.aspx&amp;amp;;subject=Techniques+for+testing+concurrent+code+in+NUnit" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/12/techniques-for-testing-concurrent-code-in-nunit.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/12/techniques-for-testing-concurrent-code-in-nunit.aspx&amp;amp;;title=Techniques+for+testing+concurrent+code+in+NUnit" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/12/techniques-for-testing-concurrent-code-in-nunit.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/12/techniques-for-testing-concurrent-code-in-nunit.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/12/techniques-for-testing-concurrent-code-in-nunit.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/12/techniques-for-testing-concurrent-code-in-nunit.aspx&amp;amp;title=Techniques+for+testing+concurrent+code+in+NUnit" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/12/techniques-for-testing-concurrent-code-in-nunit.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/12/techniques-for-testing-concurrent-code-in-nunit.aspx&amp;amp;;title=Techniques+for+testing+concurrent+code+in+NUnit" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/12/techniques-for-testing-concurrent-code-in-nunit.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/12/techniques-for-testing-concurrent-code-in-nunit.aspx&amp;amp;;title=Techniques+for+testing+concurrent+code+in+NUnit&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/12/techniques-for-testing-concurrent-code-in-nunit.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=18635" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Unit+testing/default.aspx">Unit testing</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/TDD/default.aspx">TDD</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/NUnit/default.aspx">NUnit</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Parallelism/default.aspx">Parallelism</category></item><item><title>Thinking aloud: concurrent Unit tests</title><link>http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/11/thinking-aloud-concurrent-unit-tests.aspx</link><pubDate>Thu, 11 Jun 2009 20:42:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:18629</guid><dc:creator>dbarvitsky</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/danbarvitsky/comments/18629.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/danbarvitsky/commentrss.aspx?PostID=18629</wfw:commentRss><description>&lt;p&gt;While working on conversion service for &lt;a href="http://vizitsp.com/"&gt;VizitSP&lt;/a&gt;, I run once again into unit testing the concurrent code. The problem is not new, yet I did not see 100% solution yet. The difficulty is coming from the fact that unit tests are deterministic to the bone (i.e. they rely on the fact, that code behaves the same way every time you run it). Concurrent scenarios, however, can behave differently depending on when particular thread gained access to shared resource. &lt;/p&gt;  &lt;p&gt;Suppose you have something like this:&lt;/p&gt;  &lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; HairyBug&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;        {&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; List&amp;lt;String&gt; messages = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;String&gt;();&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; PostMessage(String message)&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            {&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.messages.Add(String.Format("&lt;span style="color:#8b0000;"&gt;{0}: {1}&lt;/span&gt;",messages.Count,message));&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            }&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; String[] GetMessages() { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; messages.ToArray&amp;lt;String&gt;(); }&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;        }&lt;/pre&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;Can you spot a bug? The problem is two threads can read the messages count simultaneously prior to adding messages to the array:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/danbarvitsky/image_19523C45.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="327" alt="image" width="665" border="0" src="http://www.atalasoft.com/cs/blogs/danbarvitsky/image_thumb_502F213C.png"&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Let us do a unit test:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        [Test]&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; FindHairyBug()&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        {&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            var bug = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HairyBug();&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            Thread[] threads = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Thread[10];&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; threads.Length; i++)&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            {&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                threads[i] = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Threading.Thread(()=&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                {&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                    bug.PostMessage("&lt;span style="color:#8b0000;"&gt;Passed&lt;/span&gt;");&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                });&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                &lt;span style="color:#008000;"&gt;//threads[i].Priority = i % 2 == 0 ? ThreadPriority.AboveNormal : ThreadPriority.BelowNormal;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                threads[i].Name = "&lt;span style="color:#8b0000;"&gt;Thread &lt;/span&gt;"+i.ToString();&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                threads[i].Start();&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            }&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (var i = 0; i &amp;lt; threads.Length; i++) threads[i].Join();&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (String n &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; bug.GetMessages()) Console.Out.WriteLine(n);&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            Assert.AreEqual(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; String[]{&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                "&lt;span style="color:#8b0000;"&gt;0: Passed&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;1: Passed&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;2: Passed&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;3: Passed&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;4: Passed&lt;/span&gt;", &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                "&lt;span style="color:#8b0000;"&gt;5: Passed&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;6: Passed&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;7: Passed&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;8: Passed&lt;/span&gt;","&lt;span style="color:#8b0000;"&gt;9: Passed&lt;/span&gt;"},&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            bug.GetMessages());&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        }&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Is it a good test? Well, let us see:&lt;/p&gt;&lt;ol&gt;  &lt;li&gt;Is it deterministic? Yes. &lt;/li&gt;  &lt;li&gt;Does it depend on other tests? No. &lt;/li&gt;  &lt;li&gt;Does it check the result? Yes. &lt;/li&gt;  &lt;li&gt;Does it maintain the state between executions? No. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;When I run this test it passes on my laptop. Why? Because it is fairly old and has single CPU. Once I move it to my desktop (TADA) it still passes &lt;i&gt;inconsistently&lt;/i&gt;. If I uncomment priority setting line it messes everything up badly. It turns out threading introduces some randomization which makes test non-deterministic. Bad test. We’d better fix it:&lt;/p&gt;&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        [Test]&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; FindHairyBug2()&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        {&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            var bug = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HairyBug();&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            Thread[] threads = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Thread[10];&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; threads.Length; i++)&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            {&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                threads[i] = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Threading.Thread(() =&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                {&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                    bug.PostMessage("&lt;span style="color:#8b0000;"&gt;Passed&lt;/span&gt;");&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                });&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                &lt;span style="color:#008000;"&gt;//threads[i].Priority = i % 2 == 0 ? ThreadPriority.AboveNormal : ThreadPriority.BelowNormal;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                threads[i].Name = "&lt;span style="color:#8b0000;"&gt;Thread &lt;/span&gt;" + i.ToString();&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            }&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (var i = 0; i &amp;lt; threads.Length; i++)&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            {&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                &lt;span style="color:#008000;"&gt;// Make sure threads do not step on each other:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                threads[i].Start();&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                threads[i].Join();&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            }&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (String n &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; bug.GetMessages()) Console.Out.WriteLine(n);&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            Assert.AreEqual(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; String[]{&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                "&lt;span style="color:#8b0000;"&gt;0: Passed&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;1: Passed&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;2: Passed&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;3: Passed&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;4: Passed&lt;/span&gt;", &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                "&lt;span style="color:#8b0000;"&gt;5: Passed&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;6: Passed&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;7: Passed&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;8: Passed&lt;/span&gt;","&lt;span style="color:#8b0000;"&gt;9: Passed&lt;/span&gt;"},&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            bug.GetMessages());&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        }&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Now Unit test is good (from unit testing prospective), but it does not catch the bug, because the code is, well,  not concurrent anymore. Threads should step on each other, but they must do it in consistent matter. How do you do this exactly? Perhaps one could add some synchronization points in code, like this:&lt;/p&gt;&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; HairyBug&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;        {&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; List&amp;lt;String&gt; messages = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;String&gt;();&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; PostMessage(String message)&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            {&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                Sync.point("&lt;span style="color:#8b0000;"&gt;getting count&lt;/span&gt;");&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; count = messages.Count;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                Sync.point("&lt;span style="color:#8b0000;"&gt;adding message&lt;/span&gt;");&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.messages.Add(count,messages.Count,message));&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            }&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;            &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; String[] GetMessages() { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; messages.ToArray&amp;lt;String&gt;(); }&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;        }&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Then you could do something like this in unit tests:&lt;/p&gt;&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            Sync.Scenario&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                .Clear()&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                .Add("&lt;span style="color:#8b0000;"&gt;Thread 1&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;getting count&lt;/span&gt;")&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                .Add("&lt;span style="color:#8b0000;"&gt;Thread 2&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;getting count&lt;/span&gt;")&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;                .Add("&lt;span style="color:#8b0000;"&gt;Thread 1&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;adding message&lt;/span&gt;")&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;                .Add("&lt;span style="color:#8b0000;"&gt;Thread 2&lt;/span&gt;", "&lt;span style="color:#8b0000;"&gt;adding message&lt;/span&gt;");&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;            FindHairyBug();&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;So when code enters the Sync.point(“getting count”) method, it checks the current thread name and synchronization point’s name. Then it passes those two parameters to Sync.Scenario object, which decides should the thread proceed or not, waits for notification from Sync.Scenario and returns once notification is received. Now threads step on each other in semi-predictable manner, and you can specify how exactly that should happen before running a unit test.&lt;/p&gt;&lt;p&gt;The payback, however, is horrible: you have to embed instrumentization into your code. Moreover, stuffing your code with dozens of synchronization points requires thousands of tests to cover possible combinations. This is not cool. Any other ideas? &lt;/p&gt;&lt;p&gt;Resources worth looking into:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;TypeMock racer - (thanks, &lt;a href="http://www.atalasoft.com/cs/blogs/loufranco/"&gt;Lou&lt;/a&gt;): &lt;a href="http://www.typemock.com/learn_about_typemock_racer.php"&gt;http://www.typemock.com/learn_about_typemock_racer.php&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;ConTest – IMHO correct but very complex approach (Java): &lt;a href="http://www.ibm.com/developerworks/java/library/j-contest.html"&gt;http://www.ibm.com/developerworks/java/library/j-contest.html&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;Advanced Unit Tests, Part V – two, IMHO, semi-usable patterns for concurrent testing: &lt;a href="http://www.codeproject.com/KB/architecture/autp5.aspx"&gt;&lt;font color="#0000ff"&gt;http://www.codeproject.com/KB/architecture/autp5.aspx&lt;/font&gt;&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Coming up next: technical difficulties specific to NUnit.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/11/thinking-aloud-concurrent-unit-tests.aspx&amp;amp;;subject=Thinking+aloud%3a+concurrent+Unit+tests" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/11/thinking-aloud-concurrent-unit-tests.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/11/thinking-aloud-concurrent-unit-tests.aspx&amp;amp;;title=Thinking+aloud%3a+concurrent+Unit+tests" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/11/thinking-aloud-concurrent-unit-tests.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/11/thinking-aloud-concurrent-unit-tests.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/11/thinking-aloud-concurrent-unit-tests.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/11/thinking-aloud-concurrent-unit-tests.aspx&amp;amp;title=Thinking+aloud%3a+concurrent+Unit+tests" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/11/thinking-aloud-concurrent-unit-tests.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/11/thinking-aloud-concurrent-unit-tests.aspx&amp;amp;;title=Thinking+aloud%3a+concurrent+Unit+tests" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/11/thinking-aloud-concurrent-unit-tests.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/11/thinking-aloud-concurrent-unit-tests.aspx&amp;amp;;title=Thinking+aloud%3a+concurrent+Unit+tests&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/11/thinking-aloud-concurrent-unit-tests.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=18629" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Deployment/default.aspx">Deployment</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Unit+tests/default.aspx">Unit tests</category></item><item><title>STSADMIN tasks in NAnt</title><link>http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/17/stsadmin-tasks-in-nant.aspx</link><pubDate>Tue, 17 Feb 2009 16:55:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:18323</guid><dc:creator>dbarvitsky</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/danbarvitsky/comments/18323.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/danbarvitsky/commentrss.aspx?PostID=18323</wfw:commentRss><description>&lt;p align="right"&gt;&lt;i&gt;A Unix admin would spend 2 hours to create a script that does in 5 minutes what a user would do in 1 hour.&lt;/i&gt;&lt;/p&gt;  &lt;p align="left"&gt;Recently I ran across &lt;a href="http://peelmeagrape.net"&gt;Peel me a grape’s&lt;/a&gt; wonderful &lt;a href="http://peelmeagrape.net/projects/nant_macrodef"&gt;NAnt Macrodef&lt;/a&gt; and &lt;a href="http://blog.peelmeagrape.net/2008/1/6/nant-plus-pstools-equals-remote-nant"&gt;Remote NAnt&lt;/a&gt; posts, and it really moved me to extend my user build scripts with automatic deployment. Indeed, wouldn’t it be neat it my solution could be deployed to the test server automatically after I build it in Visual Studio? So I came up with several NAnt macros for the STSADMIN deployments, namely:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="left"&gt;stsadm command wrapper&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;sp-reset, which either re-sets application pool or entire IIS, depending on the arguments&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;sp-clean, which removes the solution completely&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;sp-deploy, which does the full-blown deployment of Vizit’s WSP&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;and my favorite one sp-refresh, which registers new version of assemblies, synchronizes the files and restarts the IIS server/application pool.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="left"&gt;I packaged all definitions into stsadm-include.xml, which is copied over to the test server and executed via remote NAnt hack. I’m not 100% happy with this solution, really. I think my remote NAnt implementation could be better. It needs to add pick up properties on caller side instead of using hardcoded values in the script… Anyways, here are some NAnt snippets:&lt;/p&gt;  &lt;p align="left"&gt;This one is fairly straightforward – a wrapper for STSADM command. I’d rather call STSADM programmatically, but this will work for me too.&lt;/p&gt;  &lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;	&lt;span style="color:#008000;"&gt;&amp;lt;!-- Invoke STSADM command --&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;	&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;macrodef&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"stsadm"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attributes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"action"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"failonerror"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;default&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"true"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"arg1"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;property&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"stsadm_arg1"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;default&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;""&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"arg2"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;property&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"stsadm_arg2"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;default&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;""&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"arg3"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;property&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"stsadm_arg3"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;default&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;""&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"arg4"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;property&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"stsadm_arg4"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;default&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;""&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"arg5"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;property&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"stsadm_arg5"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;default&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;""&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"arg6"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;property&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"stsadm_arg6"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;default&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;""&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;attributes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;sequential&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&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:#ff0000;"&gt;program&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${Target.Stsadm.Path}"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;failonerror&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${failonerror}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-o"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${action}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${stsadm_arg1}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${stsadm_arg2}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${stsadm_arg3}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${stsadm_arg4}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${stsadm_arg5}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${stsadm_arg6}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&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;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;sequential&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;	&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;macrodef&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;This one is a bit trickier. It resets either application pool or whole IIS:&lt;/p&gt;&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;	&lt;span style="color:#008000;"&gt;&amp;lt;!-- Resets IIS application pool or entire IIS server --&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;	&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;macrodef&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"sp-reset"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attributes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"application-pool"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;property&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"application-pool"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;attributes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;sequential&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;test&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${not property::exists('application-pool')}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Recycling IIS..."&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&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:#ff0000;"&gt;program&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"iisreset"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;test&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${property::exists('application-pool')}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Recycling application pool ${application-pool}..."&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&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:#ff0000;"&gt;program&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"cscript.exe"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;						&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"//B"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;						&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"C:\Windows\System32\iisapp.vbs"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;						&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"/a"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;						&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${application-pool}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;						&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"/r"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&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;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;sequential&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;	&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;macrodef&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;These two are a bit more complex. They do deployment and clean up for given solution file.&lt;/p&gt;&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;	&lt;span style="color:#008000;"&gt;&amp;lt;!-- Clean up SharePoint --&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;	&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;macrodef&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"sp-clean"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attributes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"url"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"admin-url"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"solution"&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"feature"&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;attributes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;sequential&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;test&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${property::exists('feature') and property::exists('url')}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Deactivating feature ${feature} on ${url}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"deactivatefeature"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg1&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-name"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;arg2&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${feature}"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg3&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-url"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;arg4&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${url}"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg5&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-force"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;failonerror&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"false"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;test&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${property::exists('feature') and property::exists('admin-url')}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Deactivating feature ${feature} on ${admin-url}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"deactivatefeature"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg1&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-name"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;arg2&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${feature}"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg3&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-url"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;arg4&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${admin-url}"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg5&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-force"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;failonerror&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"false"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;test&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${property::exists('solution') and property::exists('url')}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Retracting solution ${solution} from ${url}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"retractsolution"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg1&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-name"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;arg2&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${solution}"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg3&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-url"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;arg4&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${url}"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg5&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-immediate"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;failonerror&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"false"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Executing service admin jobs"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"execadmsvcjobs"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;failonerror&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"false"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;test&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${property::exists('solution') and property::exists('admin-url')}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Retracting solution ${solution} from ${admin-url}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"retractsolution"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg1&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-name"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;arg2&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${solution}"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg3&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-url"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;arg4&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${admin-url}"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg5&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-immediate"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;failonerror&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"false"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;			&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Executing service admin jobs"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"execadmsvcjobs"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;failonerror&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"false"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;			&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;test&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${property::exists('solution')}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Deleting solution ${solution}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"deletesolution"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg1&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-name"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;arg2&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${solution}"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg3&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-override"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;failonerror&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"false"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Cleanup completed. List of solutions:"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;			&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"enumsolutions"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;failonerror&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"false"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;sequential&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;	&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;macrodef&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;	&lt;span style="color:#008000;"&gt;&amp;lt;!-- Deploy solution to given URLs --&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;	&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;macrodef&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"sp-deploy"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attributes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"solution-file"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"url"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"admin-url"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"feature"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;attributes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;sequential&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;fail&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;message&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Build solution file ${solution-file} does not exist"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#ff0000;"&gt;if&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${not file::exists(solution-file)}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;		&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"solution"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${path::get-file-name(solution-file)}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Adding solution ${solution} to server"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"addsolution"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg1&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-filename"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg2&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${solution-file}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;test&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${property::exists('url')}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Deploying solution ${solution} to ${url}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt;		&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"deploysolution"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg1&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-name"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg2&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${solution}"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg3&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-immediate"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg4&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-allowGacDeployment"&lt;/span&gt; &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;arg5&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-url"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg6&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${url}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Executing administrative jobs..."&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"execadmsvcjobs"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Activating Vizit feature on ${url}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"activatefeature"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg1&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-name"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg2&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${feature}"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg3&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-url"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg4&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${url}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;test&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${property::exists('admin-url')}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Deploying solution ${solution} to ${admin-url}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt;		&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"deploysolution"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;					&lt;span style="color:#ff0000;"&gt;arg1&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-name"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg2&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${solution}"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg3&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-immediate"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg4&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-allowGacDeployment"&lt;/span&gt; &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;					&lt;span style="color:#ff0000;"&gt;arg5&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-url"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg6&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${admin-url}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Executing administrative jobs..."&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"execadmsvcjobs"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Activating Vizit feature on ${admin-url}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;				&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"activatefeature"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg1&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-name"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg2&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${feature}"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg3&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-url"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;arg4&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${admin-url}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;if&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;log&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;msg&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"Deployment completed:"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;			&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;stsadm&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;action&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"enumsolutions"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt;		&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;		&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;sequential&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;	&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;	&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;macrodef&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;I wonder if anybody did a fully functional STSADM wrapper in NAnt… In particular some post-install checks, such as enumerating solutions, would be very nice. In case someone is interested in the build scripts, please drop me an e-mail.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/17/stsadmin-tasks-in-nant.aspx&amp;amp;;subject=STSADMIN+tasks+in+NAnt" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/17/stsadmin-tasks-in-nant.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/17/stsadmin-tasks-in-nant.aspx&amp;amp;;title=STSADMIN+tasks+in+NAnt" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/17/stsadmin-tasks-in-nant.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/17/stsadmin-tasks-in-nant.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/17/stsadmin-tasks-in-nant.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/17/stsadmin-tasks-in-nant.aspx&amp;amp;title=STSADMIN+tasks+in+NAnt" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/17/stsadmin-tasks-in-nant.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/17/stsadmin-tasks-in-nant.aspx&amp;amp;;title=STSADMIN+tasks+in+NAnt" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/17/stsadmin-tasks-in-nant.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/17/stsadmin-tasks-in-nant.aspx&amp;amp;;title=STSADMIN+tasks+in+NAnt&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/17/stsadmin-tasks-in-nant.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=18323" width="1" height="1"&gt;</description></item><item><title>Deploying debug assemblies in the GAC</title><link>http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/08/deploying-debug-assemblies-in-the-gac.aspx</link><pubDate>Sun, 08 Feb 2009 16:31:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:18322</guid><dc:creator>dbarvitsky</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/danbarvitsky/comments/18322.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/danbarvitsky/commentrss.aspx?PostID=18322</wfw:commentRss><description>&lt;p&gt;Don’t ask me why, but at some point I ended up with the necessity of having debug assemblies in the GAC. OK, if you still ask, it is about SharePoint remote debugging. After dragging-and-dropping PDBs and DLLs for 651th time I almost started feeling an imprint in my desk surface, which mouse carved out while travelling back and forth. Sounds like it is time for another tool in my toolbox.&lt;/p&gt;  &lt;p&gt;Technically C:\Windows\Assembly is just a folder:&lt;/p&gt;  &lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;C:\WINDOWS\assembly&gt;dir&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt; Volume in drive C has no label.&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt; Volume Serial Number is 4C18-31DE&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt; Directory of C:\WINDOWS\assembly&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;02/06/2009  10:32 AM    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DIR&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;          GAC&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;03/30/2009  10:32 AM    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DIR&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;          GAC_32&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;03/30/2009  10:32 AM    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DIR&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;          GAC_MSIL&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;01/05/2009  05:43 PM    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DIR&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;          NativeImages1_v1.1.4322&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;03/19/2009  03:28 AM    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DIR&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;          NativeImages_v2.0.50727_32&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;03/30/2009  10:32 AM    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DIR&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;          temp&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;03/30/2009  06:16 PM    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DIR&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;          tmp&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;               0 File(s)              0 bytes&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;               7 Dir(s)  34,519,719,936 bytes free&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Assembly DLLs are located in folders. Each assembly has a separate folder for every version:&lt;/p&gt;&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt; Directory of C:\WINDOWS\assembly\GAC_MSIL\System.Xml\2.0.0.0__b77a5c561934e089&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;01/06/2009  01:01 PM    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DIR&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;          .&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;01/06/2009  01:01 PM    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DIR&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;          ..&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;01/06/2009  01:01 PM         2,068,480 System.XML.dll&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Apparently, dropping a PDB file next to the assembly DLL picks up the debugging symbols just fine! Even better, there is a very simple way to deploy debug assemblies in GAC programmatically. Here is how you deploy an assembly:&lt;/p&gt;&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; dll_path = ...;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;var publish = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.EnterpriseServices.Internal.Publish();&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;publish.GacInstall(dll_path);&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Here is how you deploy PDB file:&lt;/p&gt;&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;&lt;span style="color:#008000;"&gt;// This is the path to PDB file:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;String source_pdb = ...;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;&lt;span style="color:#008000;"&gt;// Getting a DLL path for assembly:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;AssemblyName name = Assembly.LoadFile(assembly).GetName();&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;String dll_path = name.CodeBase.TrimStart(@"&lt;span style="color:#8b0000;"&gt;file:///&lt;/span&gt;".ToCharArray());&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;&lt;span style="color:#008000;"&gt;// In GAC PDB files are sitting next to DLLs:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;String target_pdb = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(dll_path),&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;    System.IO.Path.GetFileNameWithoutExtension(dll_path) + "&lt;span style="color:#8b0000;"&gt;.pdb&lt;/span&gt;");&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;&lt;span style="color:#008000;"&gt;// Delete PDB file if it is there:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (System.IO.File.Exists(target_pdb)) System.IO.File.Delete(target_pdb);&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;&lt;span style="color:#008000;"&gt;// Copy PDB over&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (System.IO.File.Exists(database)) System.IO.File.Copy(source_pdb, target_pdb)&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;It is a bit hacky to figure out the actual DLL path, though, but it guarantees your PDBs get copied in the right folder.&lt;/p&gt;&lt;p&gt;Based on the code above I wrote NAnt task and a command line tool, which can be downloaded &lt;a href="http://dan.barvitsky.org/tools/AtalaGAC/"&gt;here&lt;/a&gt;. Now my build script picks up DLLs and registers them on the SharePoint server automatically, so whenever I attach to W3P process, it always picks correct PDB files. Well, almost ;-)&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/08/deploying-debug-assemblies-in-the-gac.aspx&amp;amp;;subject=Deploying+debug+assemblies+in+the+GAC" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/08/deploying-debug-assemblies-in-the-gac.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/08/deploying-debug-assemblies-in-the-gac.aspx&amp;amp;;title=Deploying+debug+assemblies+in+the+GAC" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/08/deploying-debug-assemblies-in-the-gac.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/08/deploying-debug-assemblies-in-the-gac.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/08/deploying-debug-assemblies-in-the-gac.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/08/deploying-debug-assemblies-in-the-gac.aspx&amp;amp;title=Deploying+debug+assemblies+in+the+GAC" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/08/deploying-debug-assemblies-in-the-gac.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/08/deploying-debug-assemblies-in-the-gac.aspx&amp;amp;;title=Deploying+debug+assemblies+in+the+GAC" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/08/deploying-debug-assemblies-in-the-gac.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/08/deploying-debug-assemblies-in-the-gac.aspx&amp;amp;;title=Deploying+debug+assemblies+in+the+GAC&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/02/08/deploying-debug-assemblies-in-the-gac.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=18322" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/NAnt/default.aspx">NAnt</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Toolbox/default.aspx">Toolbox</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Deployment/default.aspx">Deployment</category><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Once again about remote debugging</title><link>http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/15/once-again-about-remote-debugging.aspx</link><pubDate>Thu, 15 Jan 2009 20:46:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:18320</guid><dc:creator>dbarvitsky</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/danbarvitsky/comments/18320.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/danbarvitsky/commentrss.aspx?PostID=18320</wfw:commentRss><description>&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;This is a follow-up article for Jacob Lauzier’s &lt;/font&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/01/cross-domain-remote-debugging.aspx"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;Cross-Domain remote debugging&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;. Here I will discuss one particular scenario, which, in my mind, should be extremely popular in virtualized environments but, for some reason, is least straight forward to &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/9y5b4b4f.aspx"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;setup&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;My development desktop is a Windows XP with Visual Studio 2008 on it. I debug against several virtual machines, my typical setup is Windows 2003 R2 server with WSS on it. Virtual machine obviously is NOT on the domain, because I want to manage my own VMs myself; my desktop obviously IS on the domain, because I use TFS and all other cool things available at Atalasoft. I think this configuration makes sense, since development VMs are normally insecure and disposable, and should not be exposed to company’s production infrastructure. And it feels like I am not the only one adhering to this path, since lots of people run into numerous problems with setting up a remote debugger in similar configuration. Typical issues one will encounter here:&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l0 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;1.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;You cannot attach to the remote process due to authentication issues (“The Microsoft Visual Studio Remote Debugging Monitor (MSVSMON.EXE) does not appear to be running on the remote computer”, &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms164726.aspx"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;);&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l0 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;2.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Remote debugger cannot connect back due to firewall issues or different authentication issues (“The Visual Studio Remote Debugger service on the target computer cannot connect back to this computer”, &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms164725.aspx"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;);&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l0 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;3.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Publishing your solution (we do SharePoint development) on the target server is not trivial task;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l0 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;4.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Remote debugging does not pick up debugger databases, so you cannot step through your code (“The breakpoint will not currently be hit. No symbols have been loaded for this document.”, &lt;/font&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/vbide/thread/557fdedb-268e-48a8-9944-29b2b4e0dec2/"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;, &lt;/font&gt;&lt;a href="http://www.bokebb.com/dev/english/1966/posts/196665531.shtml"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt; and &lt;/font&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en/vsdebug/thread/7629caf9-34bb-4033-981c-d067203fbb2f/"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;);&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l0 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;5.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;…or will find them but will refuse to load them (“The symbol file XXX.pdb does not match the module”, &lt;/font&gt;&lt;a href="http://social.msdn.microsoft.com/forums/en-US/vsdebug/thread/86125819-426b-4794-948d-d2252f46aedf/"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;);&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l0 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;6.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;…or will skip loading because of “Just My Code” debugging settings;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="margin:0in 0in 10pt 0.5in;text-indent:-0.25in;mso-list:l0 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;7.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;…or different &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/2ys11ead.aspx"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;debugger errors&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Here is some information on how to get this thing to work…&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;You run debugger on remote server and local desktop. Remote server, as I mentioned above, is not on domain (in my case it is a virtual machine in “Debug” workgroup), and local desktop belongs to Atalasoft domain. According to MSDN, &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb384458(VS.85).aspx"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;CLR does not provide explicit remote debugging capabilities&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;, so the debugging is done through a proxy application called “&lt;/font&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=440ec902-3260-4cdc-b11a-6a9070a2aaab&amp;amp;displaylang=en"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;Visual Studio Remote Debugging Monitor&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;”.&lt;span style="mso-spacerun:yes;"&gt;  &lt;/span&gt;Your IDE (Visual Studio) talks to that remote debugging monitor, which interacts with the process you want to debug. The way communication is happening is controlled by &lt;i style="mso-bidi-font-style:normal;"&gt;transport&lt;/i&gt;. Default transport is DCOM-based two-way protocol with Windows authentication on top of it. For CLR it is pretty much the only way of remote debugging (the other way is called “Remote” and it is suitable for native code only). Debugging happens in the following way:&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l2 level1 lfo2;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;1.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;First, you deploy assemblies on the target machine;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l2 level1 lfo2;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;2.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Then you start the process you want to debug on the remote machine. For SharePoint the process is already running (w3wp.exe, WWW worker process), for other applications you may either &lt;/font&gt;&lt;a href="http://www.codeproject.com/KB/cs/Remote_Process_using_WMI_.aspx"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;use WMI to start it remotely&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt; or use &lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/sysinternals/default.aspx"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;Sysinternals&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;’ &lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;psexec&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l2 level1 lfo2;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;3.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Attach to the remote process from Visual studio (this is done in two directions: first your visual studio connects to visual studio remote debugging monitor, then visual studio remote debugger monitor connects back to your visual studio, and this is where 50% of troubles are);&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l2 level1 lfo2;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;4.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Have your debugging symbols database (PDB) files loaded&lt;span style="mso-spacerun:yes;"&gt;  &lt;/span&gt;(this is where remainder 50% of troubles are);&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="margin:0in 0in 10pt 0.5in;text-indent:-0.25in;mso-list:l2 level1 lfo2;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;5.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Enjoy your remote debugging&lt;/font&gt;&lt;/p&gt;  &lt;h2&gt;Setting up&lt;/h2&gt;  &lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;MSDN has number of &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bt727f1t.aspx"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;articles on this subject&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;. For this particular scenario you will need:&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l5 level1 lfo6;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;1.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;On remote machine:&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 1in;text-indent:-0.25in;mso-list:l5 level2 lfo6;mso-add-space:auto;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;a.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Install remote debugger (it can be downloaded &lt;/font&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=440ec902-3260-4cdc-b11a-6a9070a2aaab&amp;amp;displaylang=en"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;). In my case running installer from desktop did not work, so I had do copy it to the temp folder and bounce the server.&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 1in;text-indent:-0.25in;mso-list:l5 level2 lfo6;mso-add-space:auto;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;b.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Make sure the local security setting is set to “Classic” (look for Local Security Settings under Administrative tools):        &lt;br&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/danbarvitsky/remotedebugging1_063AC3D0.png"&gt;&lt;img title="remote-debugging-1" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="222" alt="remote-debugging-1" width="533" border="0" src="http://www.atalasoft.com/cs/blogs/danbarvitsky/remotedebugging1_thumb_55A74617.png"&gt;&lt;/a&gt;         &lt;br&gt;&lt;span style="mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 1in;text-indent:-0.25in;mso-list:l5 level2 lfo6;mso-add-space:auto;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;c.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Create an account on the remote machine. Visual Studio will use this account to connect to the remote machine. It must have the same user name and password as the user you running the Visual Studio as (i.e. your domain user name). In my case, my domain login is “dbarvitsky@atalasoft.lcl” and the user name I am creating on the target server is “dbarvitsky”. This must be the user local account, since Visual Studio will be logging in as DBARVITSKYLAB\dbarvitsky (where DBARVITSKYLAB is my virtual machine I use for debugging). User must have the same password as well. It also must be an administrator on the virtual machine.&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 1in;text-indent:-0.25in;mso-list:l5 level2 lfo6;mso-add-space:auto;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;d.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Create second account on the remote machine. This account will be running the remote debugging monitor. I use “Debugger” name on remote machine. &lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 1in;text-indent:-0.25in;mso-list:l5 level2 lfo6;mso-add-space:auto;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;e.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;If you are planning to run debugger as a service (so that you do not have to start it manually) make sure “Debugger” user has a permission to run as a service (look for Local Security Settings under Administrative tools or just run secpol.msc):        &lt;br&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/danbarvitsky/remotedebugging2_4BE1DE9F.png"&gt;&lt;img title="remote-debugging-2" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="270" alt="remote-debugging-2" width="540" border="0" src="http://www.atalasoft.com/cs/blogs/danbarvitsky/remotedebugging2_thumb_025290A2.png"&gt;&lt;/a&gt;         &lt;br&gt;&lt;span style="mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l5 level1 lfo6;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;2.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;On local machine:&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 1in;text-indent:-0.25in;mso-list:l5 level2 lfo6;mso-add-space:auto;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;a.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Create account on the local machine (where you have Visual Studio installed). It must be local user account with the same as the account you created on previous step (“Debugger”). The password must be identical to the “Debugger” account on the remote machine. Remote debugger will use this account to connect back to Visual Studio.&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="margin:0in 0in 10pt 1in;text-indent:-0.25in;mso-list:l5 level2 lfo6;mso-add-space:auto;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;b.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Alter firewall settings to allow inbound TCP 135 port (Remote Debugging DCOM) and grant Visual Studio permissions to create outbound connections:        &lt;br&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/danbarvitsky/remotedebugging3_267A7BE2.png"&gt;&lt;img title="remote-debugging-3" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="215" alt="remote-debugging-3" width="290" border="0" src="http://www.atalasoft.com/cs/blogs/danbarvitsky/remotedebugging3_thumb_6FA0279B.png"&gt;&lt;/a&gt;         &lt;br&gt;It normally makes sense to limit scope to “my network/subnet” only (assuming that your VMs are in the same subnet as your machine):         &lt;br&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/danbarvitsky/remotedebugging4_23D450E2.png"&gt;&lt;img title="remote-debugging-4" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="208" alt="remote-debugging-4" width="298" border="0" src="http://www.atalasoft.com/cs/blogs/danbarvitsky/remotedebugging4_thumb_05F5CCE1.png"&gt;&lt;/a&gt;         &lt;br&gt;&lt;span style="mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;h2&gt;Hints on deploying assemblies&lt;/h2&gt;  &lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;The first step, deploying assemblies (and content) to the remote server implies that you have them built locally and the target platform matches the virtual machine you deploy to. Getting the content on the target machine is not a problem and can easily be done with NAnt:&lt;/font&gt;&lt;/p&gt;  &lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;copy&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;todir&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${destination}"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;verbose&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"true"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;fileset&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;basedir&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${source}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;include&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"pattern\*.*"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;fileset&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;copy&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;For assemblies you have two options:&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpFirst" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l4 level1 lfo4;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;1.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Simply copy them to the C:\Inetpub\wwwroot\wss\VirtualDirectories\&amp;lt;port&gt;\bin on the target server with their PDBs (debugger database files, where your debugging symbols come from; Visual Studio needs them to relate point in compiled assembly back to the source code, variables, etc);&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpLast" style="margin:0in 0in 10pt 0.5in;text-indent:-0.25in;mso-list:l4 level1 lfo4;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;2.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Install assemblies with PDBs into GAC. You can use AtalaGAC.exe tool for it.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Choose the one that is closer to your production deployment. If you just drop the application in virtual folder and will have all assemblies in bin directory, choose the first option. If you are going to have some fancy installer and will require assemblies to be registered in GAC, go with the second one.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Either way, you will need to have your new assemblies reloaded. Again, there are two ways to do it:&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpFirst" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l1 level1 lfo5;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;1.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;If you are running in share environment (i.e. many people use the same server for debugging), recycling entire IIS is not nice. Instead you can reload only application pool you are working with. Running “iisapp /a ‘SharePoint - 80’ /r” remotely will do the trick (“SharePoint - 80” is the application pool name);&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpLast" style="margin:0in 0in 10pt 0.5in;text-indent:-0.25in;mso-list:l1 level1 lfo5;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;2.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;span style="mso-spacerun:yes;"&gt; &lt;/span&gt;If you can afford recycling entire IIS just run “iisreset” on remote system.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Example NAnt script:&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt; &lt;/p&gt;&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:650px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&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:#ff0000;"&gt;program&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"C:\Program Files\Sysinternals\PsUtils\psexec.exe"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"\\${target-server}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-u"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${target-server.login}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"-p"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"${target-server.password}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;arg&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;"iisreset"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&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;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h2&gt;Attaching to the remote process from Visual Studio&lt;/h2&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;This is a bit tricky part. In order to do this, you need to start remote debugger monitor. Again, two options: &lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpFirst" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l3 level1 lfo7;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;1.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Use “Run As…” and runs as Debugger:       &lt;br&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/danbarvitsky/remotedebugging5_5325C66C.png"&gt;&lt;img title="remote-debugging-5" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="110" alt="remote-debugging-5" width="147" border="0" src="http://www.atalasoft.com/cs/blogs/danbarvitsky/remotedebugging5_thumb_159868A3.png"&gt;&lt;/a&gt;       &lt;br&gt;&lt;span style="mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpLast" style="margin:0in 0in 10pt 0.5in;text-indent:-0.25in;mso-list:l3 level1 lfo7;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;2.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Use remote debugger’s configuration wizard to run it as a service:       &lt;br&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/danbarvitsky/remotedebugging6_02E36EEC.png"&gt;&lt;img title="remote-debugging-6" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="259" alt="remote-debugging-6" width="277" border="0" src="http://www.atalasoft.com/cs/blogs/danbarvitsky/remotedebugging6_thumb_0BD3012B.png"&gt;&lt;/a&gt;  &lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;After you started remote debugger, run your Visual Studio and run “Attach to process”.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;If you are running as a service, use DBARVITSKYLAB for qualifier and remember to check “Show process from all users”:       &lt;br&gt;&lt;span style="mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;If you are running remote debugger as application, use Debugger@DBARVITSKYLAB as qualifier:       &lt;br&gt;&lt;span style="mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Then select a process (w3wp.exe in my case) and click “Attach”. If you connected successfully, you should be able to see the list of remote modules (Debug, Windows then Modules or Ctrl+D, then M). You should be able to find your assemblies; assemblies must be loaded with symbols. If it is not the case, check your Visual Studio’s Tools\Debugging\General and disable “Just My Code” and make sure you have deployed your PDB files properly. Technically you do not have to have the PDB files on remote machine, but Visual Studio must be able to find them.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;Normally you will not have all PDBs loaded immediately after starting application pool, because assemblies did not have a chance to load as yet. All it takes is a single GET request, which I normally include in my Nant deployment script.&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;References:&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpFirst" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l6 level1 lfo3;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;1.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/jmstall/"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;http://blogs.msdn.com/jmstall/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l6 level1 lfo3;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;2.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blog.ray1.net/2008/04/debugging-sharepoint-gac-dlls.html"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;http://blog.ray1.net/2008/04/debugging-sharepoint-gac-dlls.html&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l6 level1 lfo3;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;3.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.belshe.com/2004/03/29/gacutil-gac-install/"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;http://www.belshe.com/2004/03/29/gacutil-gac-install/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l6 level1 lfo3;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;4.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.wictorwilen.se/Post/How-to-get-Remote-Debugging-work-properly.aspx"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;http://www.wictorwilen.se/Post/How-to-get-Remote-Debugging-work-properly.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l6 level1 lfo3;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;5.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.eggheadcafe.com/software/aspnet/30490153/the-symbol-mymodulepdb-d.aspx"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;http://www.eggheadcafe.com/software/aspnet/30490153/the-symbol-mymodulepdb-d.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;mso-list:l6 level1 lfo3;"&gt;&lt;span style="mso-bidi-font-family:calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:ignore;"&gt;&lt;font face="Calibri" size="3"&gt;6.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://forums.asp.net/t/1349247.aspx"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;http://forums.asp.net/t/1349247.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpLast" style="margin:0in 0in 10pt 0.5in;"&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Calibri" size="3"&gt; &lt;/font&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/15/once-again-about-remote-debugging.aspx&amp;amp;;subject=Once+again+about+remote+debugging" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/15/once-again-about-remote-debugging.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/15/once-again-about-remote-debugging.aspx&amp;amp;;title=Once+again+about+remote+debugging" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/15/once-again-about-remote-debugging.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/15/once-again-about-remote-debugging.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/15/once-again-about-remote-debugging.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/15/once-again-about-remote-debugging.aspx&amp;amp;title=Once+again+about+remote+debugging" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/15/once-again-about-remote-debugging.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/15/once-again-about-remote-debugging.aspx&amp;amp;;title=Once+again+about+remote+debugging" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/15/once-again-about-remote-debugging.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/15/once-again-about-remote-debugging.aspx&amp;amp;;title=Once+again+about+remote+debugging&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/15/once-again-about-remote-debugging.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=18320" width="1" height="1"&gt;</description></item><item><title>New to Atalasoft</title><link>http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/06/new-to-atalasoft.aspx</link><pubDate>Wed, 07 Jan 2009 02:34:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:18319</guid><dc:creator>dbarvitsky</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/danbarvitsky/comments/18319.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/danbarvitsky/commentrss.aspx?PostID=18319</wfw:commentRss><description>&lt;p&gt;I am proud to announce that as of January 6th 2009, I joined VizitSP team in Atalasoft. I am really excited about my new position, the team and the product. I’ll be working with &lt;a href="http://www.atalasoft.com/cs/blogs/jake"&gt;Jacob&lt;/a&gt;, &lt;a href="http://www.atalasoft.com/cs/blogs/dterrell"&gt;David&lt;/a&gt; and Rutherford. Woo-hoo!&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/06/new-to-atalasoft.aspx&amp;amp;;subject=New+to+Atalasoft" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/06/new-to-atalasoft.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/06/new-to-atalasoft.aspx&amp;amp;;title=New+to+Atalasoft" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/06/new-to-atalasoft.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/06/new-to-atalasoft.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/06/new-to-atalasoft.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/06/new-to-atalasoft.aspx&amp;amp;title=New+to+Atalasoft" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/06/new-to-atalasoft.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/06/new-to-atalasoft.aspx&amp;amp;;title=New+to+Atalasoft" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/06/new-to-atalasoft.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/06/new-to-atalasoft.aspx&amp;amp;;title=New+to+Atalasoft&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/01/06/new-to-atalasoft.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=18319" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/tags/Random/default.aspx">Random</category></item></channel></rss>