<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>SADev</title><link>http://www.sadev.co.za</link><description></description><language>en</language><feedburner:info uri="sadev" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>-26.0822</geo:lat><geo:long>27.9923</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by/2.5/</creativeCommons:license><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://www.sadev.co.za/rss.xml" /><feedburner:emailServiceId>Sadev</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Fwww.sadev.co.za%2Frss.xml" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fwww.sadev.co.za%2Frss.xml" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Fwww.sadev.co.za%2Frss.xml" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://www.sadev.co.za/rss.xml" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fwww.sadev.co.za%2Frss.xml" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fwww.sadev.co.za%2Frss.xml" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Fwww.sadev.co.za%2Frss.xml" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item><title>Why I like Visual Studio 2010? Undock Windows</title><link>http://feedproxy.google.com/~r/Sadev/~3/jH6Ig4sw84Y/why-i-visual-studio-2010-undock-windows</link><category>.NET</category><category>ALM</category><category>Development</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Wed, 28 Jul 2010 01:43:52 PDT</pubDate><guid isPermaLink="false">499 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_29.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="wlDisabledImage" title="image" border="0" alt="image" align="right" src="http://www.sadev.co.za/files/image_thumb_54.png" width="214" height="44" /&gt;&lt;/a&gt;Visual Studio 2010 has the ability to undock code windows by clicking and dragging on the code window tabs. This is a great feature and it is often touted for multi-monitor setups where you may want to have the form on one window and code on another window, or maybe two different code files open at the same time.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_30.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="wlDisabledImage" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_55.png" width="324" height="186" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;That is very useful, however that is not why I like this feature. I like the ability to undock the windows because it lets me view two different parts of the same file at the same time. Visual Studio 2010 and earlier have supported this using the split view option (&lt;a href="http://www.sadev.co.za/files/image_31.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="wlDisabledImage" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_56.png" width="32" height="38" /&gt;&lt;/a&gt;) but that means you lose half of your screen (like below).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_32.png"&gt;&lt;img style="border-right-width: 0px; margin: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="wlDisabledImage" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_57.png" width="324" height="214" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Using the undock windows in 2010 you can use the &lt;em&gt;Windows –&amp;gt; New Window&lt;/em&gt; option to duplicate the current window.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_33.png"&gt;&lt;img style="border-right-width: 0px; margin: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="wlDisabledImage" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_58.png" width="217" height="57" /&gt;&lt;/a&gt;&lt;a href="http://www.sadev.co.za/files/image_34.png"&gt;&lt;img style="border-right-width: 0px; margin: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="wlDisabledImage" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_59.png" width="291" height="60" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Then you can drag the second (or third, or forth) windows out and get a full screen side by side view which is GREAT for comparing code.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_35.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="wlDisabledImage" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_60.png" width="774" height="298" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=jH6Ig4sw84Y:xUC9D5k8YEQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=jH6Ig4sw84Y:xUC9D5k8YEQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=jH6Ig4sw84Y:xUC9D5k8YEQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=jH6Ig4sw84Y:xUC9D5k8YEQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=jH6Ig4sw84Y:xUC9D5k8YEQ:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=jH6Ig4sw84Y:xUC9D5k8YEQ:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=jH6Ig4sw84Y:xUC9D5k8YEQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=jH6Ig4sw84Y:xUC9D5k8YEQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=jH6Ig4sw84Y:xUC9D5k8YEQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=jH6Ig4sw84Y:xUC9D5k8YEQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/jH6Ig4sw84Y" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/why-i-visual-studio-2010-undock-windows</feedburner:origLink></item><item><title>Cannot open VS project if Blend is used?</title><link>http://feedproxy.google.com/~r/Sadev/~3/tPlfjPE96Yc/cannot-open-vs-project-if-blend-used</link><category>.NET</category><category>ALM</category><category>Annoyances</category><category>Development</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Tue, 27 Jul 2010 03:38:28 PDT</pubDate><guid isPermaLink="false">498 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;a href="http://www.sadev.co.za/files/1_0.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="wlDisabledImage" title="1" border="0" alt="1" align="right" src="http://www.sadev.co.za/files/1_thumb.png" width="324" height="149" /&gt;&lt;/a&gt;I ran into an issue recently after reinstalling my laptop, where I couldn’t open a C# (WPF) project in Visual Studio 2010. Every time I tried it just grimaced at me and said:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Unable to read the project file 'Rule18.csproj'. &lt;/p&gt;    &lt;p&gt;E:\Projects\Rule18\Rule18\Rule18.csproj(335,3): The imported project &amp;quot;C:\Program Files (x86)\MSBuild\Microsoft\Expression\Blend\3.1\WPF\Microsoft.Expression.Blend.WPF.targets&amp;quot; was not found. Confirm that the path in the &amp;lt;Import&amp;gt; declaration is correct, and that the file exists on disk.      &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Part of the cause is that previously I had Blend installed, and I had used it on this project to do some fairly complex things, in particular Font Embedding. However since reinstalling I had not installed Blend again. &lt;/p&gt;  &lt;p&gt;This is caused the build target file not to be installed, and that caused the error.&lt;/p&gt;  &lt;p&gt;How do you get around this?&lt;/p&gt;  &lt;p&gt;The best solution is to install the FREE Blend SDK because that will put the build targets on the machine. Links for the SDKs:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Blend 4 .NET SDK: &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=75e13d71-7c53-4382-9592-6c07c6a00207"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=75e13d71-7c53-4382-9592-6c07c6a00207&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Blend 4 Silverlight SDK: &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=d197f51a-de07-4edf-9cba-1f1b4a22110d"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=d197f51a-de07-4edf-9cba-1f1b4a22110d&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;However I didn’t have time to do this, so as a temporary solution (and definitely not a recommended solution): I opened the project file, and right near the bottom I found the &lt;em&gt;Import&lt;/em&gt; for CSharp and Blend. I removed the Blend one, saved and reloaded and worked.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/2_0.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" class="wlDisabledImage" title="2" border="0" alt="2" src="http://www.sadev.co.za/files/2_thumb.png" width="627" height="35" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=tPlfjPE96Yc:x-0Z0qUTITY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=tPlfjPE96Yc:x-0Z0qUTITY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=tPlfjPE96Yc:x-0Z0qUTITY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=tPlfjPE96Yc:x-0Z0qUTITY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=tPlfjPE96Yc:x-0Z0qUTITY:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=tPlfjPE96Yc:x-0Z0qUTITY:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=tPlfjPE96Yc:x-0Z0qUTITY:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=tPlfjPE96Yc:x-0Z0qUTITY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=tPlfjPE96Yc:x-0Z0qUTITY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=tPlfjPE96Yc:x-0Z0qUTITY:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/tPlfjPE96Yc" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/cannot-open-vs-project-if-blend-used</feedburner:origLink></item><item><title>VirtualBox UUID already in use</title><link>http://feedproxy.google.com/~r/Sadev/~3/VlVQTPHj8Jg/virtualbox-uuid-already-use</link><category>Annoyances</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Mon, 26 Jul 2010 02:58:40 PDT</pubDate><guid isPermaLink="false">497 at http://www.sadev.co.za</guid><description>&lt;p&gt;I am playing around with using VirtualBox to run virtual machines and I ran into an issue trying to use a clone (copy) of a VDI file. The VDI file is the hard disk drive and it has a unique identifier in it it (UUID) and so trying to use a clone of one gives you the error: &lt;em&gt;UUID of the hard disk is already exist in the media registry&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;To solve it you need to run the following command to change the UUID of the file:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;VBoxManage.exe internal commands sethduuid [VDI file]&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Example:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;c:\Program Files\Oracle\VirtualBox\VBoxManage.exe&amp;quot; internal commands sethduuid &lt;/p&gt;    &lt;p&gt;AppFabric.vdi&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=VlVQTPHj8Jg:VgfmFw_Cqnw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=VlVQTPHj8Jg:VgfmFw_Cqnw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=VlVQTPHj8Jg:VgfmFw_Cqnw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=VlVQTPHj8Jg:VgfmFw_Cqnw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=VlVQTPHj8Jg:VgfmFw_Cqnw:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=VlVQTPHj8Jg:VgfmFw_Cqnw:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=VlVQTPHj8Jg:VgfmFw_Cqnw:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=VlVQTPHj8Jg:VgfmFw_Cqnw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=VlVQTPHj8Jg:VgfmFw_Cqnw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=VlVQTPHj8Jg:VgfmFw_Cqnw:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/VlVQTPHj8Jg" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/virtualbox-uuid-already-use</feedburner:origLink></item><item><title>Announcing new sponsor for Visual Studio and TFS hands on lab event: Devexpress</title><link>http://feedproxy.google.com/~r/Sadev/~3/qTXEcUM3ov4/announcing-new-sponsor-visual-studio-and-tfs-hands-lab-event-devexpress</link><category>.NET</category><category>Development</category><category>Events</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Fri, 23 Jul 2010 00:50:14 PDT</pubDate><guid isPermaLink="false">496 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;a href="http://www.sadev.co.za/files/150x150URL.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="wlDisabledImage" title="150x150-URL" border="0" alt="150x150-URL" align="right" src="http://www.sadev.co.za/files/150x150URL_thumb.png" width="150" height="150" /&gt;&lt;/a&gt;I’m sure you know that in a week 50 talented and interested people will be getting together for a day of FREE hands on labs focused on Visual Studio 2010 and TFS 2010! If you didn’t know, have a look &lt;a href="http://www.sadev.co.za/content/free-visual-studio-2010-and-tfs-2010-training" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Today I am very proud to announce we have another sponsor for the event – &lt;a href="http://www.devexpress.com" target="_blank"&gt;Devexpress&lt;/a&gt;! Devexpress are makers of some FANTASTIC addon’s for Visual Studio and development. &lt;/p&gt;  &lt;p&gt;So what are they sponsoring? TWO licenses for their Visual Studio productivity add-on: &lt;a href="http://www.devexpress.com/Products/Visual_Studio_Add-in/Coding_Assistance/" target="_blank"&gt;CodeRush&lt;/a&gt;! &lt;/p&gt;  &lt;p&gt;These two licenses will be given away as prizes to two lucky people at the event (you must be there to win). &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=qTXEcUM3ov4:VMA6Umy2AGg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=qTXEcUM3ov4:VMA6Umy2AGg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=qTXEcUM3ov4:VMA6Umy2AGg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=qTXEcUM3ov4:VMA6Umy2AGg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=qTXEcUM3ov4:VMA6Umy2AGg:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=qTXEcUM3ov4:VMA6Umy2AGg:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=qTXEcUM3ov4:VMA6Umy2AGg:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=qTXEcUM3ov4:VMA6Umy2AGg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=qTXEcUM3ov4:VMA6Umy2AGg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=qTXEcUM3ov4:VMA6Umy2AGg:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/qTXEcUM3ov4" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/announcing-new-sponsor-visual-studio-and-tfs-hands-lab-event-devexpress</feedburner:origLink></item><item><title>ALM in 2010</title><link>http://feedproxy.google.com/~r/Sadev/~3/P2fzsIFaTZs/alm-2010</link><category>.NET</category><category>ALM</category><category>Development</category><category>Presentations, Posters &amp; Cheat Sheets</category><category>SharePoint</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Wed, 21 Jul 2010 23:35:29 PDT</pubDate><guid isPermaLink="false">495 at http://www.sadev.co.za</guid><description>&lt;p&gt;Here is the slides from my talk on Application Lifecycle Management in 2010 which I did for the &lt;a href="http://www.informationworker.co.za" target="_blank"&gt;Information Worker&lt;/a&gt; user group.&lt;/p&gt;  &lt;p&gt;Here is the blurb for the session&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Development is not just about writing code and pressing compile. It is a process, which starts long before code is written and extends long after the compile is done and this process includes a lot of management - this process is called Application Lifecycle Management (ALM).&lt;/p&gt;    &lt;p&gt;SharePoint development is not immune to this and this presentation looks at what the landscape and tools are like for ALM in 2010 and how it relates to SharePoint development.&lt;/p&gt; &lt;/blockquote&gt;  &lt;div style="width: 425px" id="__ss_4804471"&gt;&lt;object id="__sse4804471" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=cfakepathalmin2010-100721054959-phpapp02&amp;amp;stripped_title=alm-in-2010" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse4804471" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=cfakepathalmin2010-100721054959-phpapp02&amp;amp;stripped_title=alm-in-2010" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;

You can download the slides and the white paper from the &lt;a href="http://www.informationworker.co.za/Pages/Events.aspx"&gt;IW site&lt;/a&gt;.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=P2fzsIFaTZs:nk8gXyNnY38:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=P2fzsIFaTZs:nk8gXyNnY38:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=P2fzsIFaTZs:nk8gXyNnY38:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=P2fzsIFaTZs:nk8gXyNnY38:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=P2fzsIFaTZs:nk8gXyNnY38:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=P2fzsIFaTZs:nk8gXyNnY38:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=P2fzsIFaTZs:nk8gXyNnY38:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=P2fzsIFaTZs:nk8gXyNnY38:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=P2fzsIFaTZs:nk8gXyNnY38:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=P2fzsIFaTZs:nk8gXyNnY38:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/P2fzsIFaTZs" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/alm-2010</feedburner:origLink></item><item><title>HTTP Status Codes Cheat Sheet</title><link>http://feedproxy.google.com/~r/Sadev/~3/Vo5dX5v2x9c/http-status-codes-cheat-sheet</link><category>Development</category><category>Presentations, Posters &amp; Cheat Sheets</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Wed, 14 Jul 2010 10:22:01 PDT</pubDate><guid isPermaLink="false">494 at http://www.sadev.co.za</guid><description>&lt;p&gt;Today’s poster is for the variety of HTTP status codes which exist. Not only is there the 34 original HTTP v1.0 ones and the 6 new ones that came in with 1.1. There is also another 10 extensions from official RFC’s, and two special case ones. That is 52 in total, and it isn’t easy to remember what they are all are – so this poster is a cheat sheet to help with that.&lt;/p&gt;  &lt;p&gt;It is also related to my other &lt;a href="http://www.sadev.co.za/content/ldquohow-restful-are-your-servicesrdquondashthe-quick-reference-poster" target="_blank"&gt;REST cheat sheet&lt;/a&gt;, since good HTTP status code usage is important for good REST services.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/RestCheatSheet2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" class="wlDisabledImage" title="RestCheatSheet2" border="0" alt="RestCheatSheet2" src="http://www.sadev.co.za/files/RestCheatSheet2_thumb.png" width="397" height="299" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can download the high resolution XPS file below.&lt;/p&gt;&lt;table id="attachments" class="sticky-enabled"&gt;
 &lt;thead&gt;&lt;tr&gt;&lt;th&gt;Attachment&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt; &lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
 &lt;tr class="odd"&gt;&lt;td&gt;&lt;a href="http://www.sadev.co.za/files/RestCheatSheet2.xps"&gt;RestCheatSheet2.xps&lt;/a&gt;&lt;/td&gt;&lt;td&gt;2.38 MB&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Vo5dX5v2x9c:men2NDCw2oQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Vo5dX5v2x9c:men2NDCw2oQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=Vo5dX5v2x9c:men2NDCw2oQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Vo5dX5v2x9c:men2NDCw2oQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Vo5dX5v2x9c:men2NDCw2oQ:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=Vo5dX5v2x9c:men2NDCw2oQ:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Vo5dX5v2x9c:men2NDCw2oQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Vo5dX5v2x9c:men2NDCw2oQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=Vo5dX5v2x9c:men2NDCw2oQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Vo5dX5v2x9c:men2NDCw2oQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/Vo5dX5v2x9c" height="1" width="1"/&gt;</description><enclosure url="http://www.sadev.co.za/files/RestCheatSheet2.xps" length="2492090" type="application/vnd.ms-xpsdocument" /><feedburner:origLink>http://www.sadev.co.za/content/http-status-codes-cheat-sheet</feedburner:origLink></item><item><title>"How RESTful are your services?" - The quick reference poster</title><link>http://feedproxy.google.com/~r/Sadev/~3/jr6qOqwG1Gg/how-restful-are-your-services-the-quick-reference-poster</link><category>Development</category><category>Presentations, Posters &amp; Cheat Sheets</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Tue, 13 Jul 2010 10:39:03 PDT</pubDate><guid isPermaLink="false">493 at http://www.sadev.co.za</guid><description>&lt;p&gt;Today’s quick reference poster looks at REST services and gives a guide to how RESTful (or not) your services are, from level 0 (not restful) to level 4 (using everything). These are not a scientific levels, it is just a simple classification I devised to promote easy communication about the services. The idea for this is to promote thinking about what features to use and assist with communication in a team. It is not a a requirement to always have level 4, some times you just need level 1 and this fine – do not over engineer for the sake of saying you are level 99. &lt;/p&gt;  &lt;p&gt;&lt;a href="/files/RestfulCheatsheet1.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="wlDisabledImage" title="RestfulCheatsheet1" border="0" alt="RestfulCheatsheet1" src="/files/RestfulCheatsheet1_thumb.png" width="373" height="281" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you are in into classification of REST services, have a look at &lt;a title="http://www.innoq.com/blog/st/2010/07/rest_litmus_test_for_web_frame.html" href="http://www.innoq.com/blog/st/2010/07/rest_litmus_test_for_web_frame.html"&gt;http://www.innoq.com/blog/st/2010/07/rest_litmus_test_for_web_frame.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Download the high resolution XPS file below.&lt;/p&gt;&lt;table id="attachments" class="sticky-enabled"&gt;
 &lt;thead&gt;&lt;tr&gt;&lt;th&gt;Attachment&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt; &lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
 &lt;tr class="odd"&gt;&lt;td&gt;&lt;a href="http://www.sadev.co.za/files/RestfulCheatsheet1.xps"&gt;RestfulCheatsheet1.xps&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1.6 MB&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=jr6qOqwG1Gg:tf9ar30bjdA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=jr6qOqwG1Gg:tf9ar30bjdA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=jr6qOqwG1Gg:tf9ar30bjdA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=jr6qOqwG1Gg:tf9ar30bjdA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=jr6qOqwG1Gg:tf9ar30bjdA:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=jr6qOqwG1Gg:tf9ar30bjdA:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=jr6qOqwG1Gg:tf9ar30bjdA:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=jr6qOqwG1Gg:tf9ar30bjdA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=jr6qOqwG1Gg:tf9ar30bjdA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=jr6qOqwG1Gg:tf9ar30bjdA:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/jr6qOqwG1Gg" height="1" width="1"/&gt;</description><enclosure url="http://www.sadev.co.za/files/RestfulCheatsheet1.xps" length="1674710" type="application/vnd.ms-xpsdocument" /><feedburner:origLink>http://www.sadev.co.za/content/how-restful-are-your-services-the-quick-reference-poster</feedburner:origLink></item><item><title>Proven Practices in Threading Quick Reference Poster</title><link>http://feedproxy.google.com/~r/Sadev/~3/QvubxDsNE5A/proven-practices-threading-quick-reference-poster</link><category>.NET</category><category>Development</category><category>Presentations, Posters &amp; Cheat Sheets</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Mon, 12 Jul 2010 00:45:38 PDT</pubDate><guid isPermaLink="false">492 at http://www.sadev.co.za</guid><description>&lt;p&gt;This poster is based off my talk on .NET Threading, which I wrote about the entire process about the creation of that talk (see &lt;a href="http://www.sadev.co.za/content/how-i-build-presentations-series-index" target="_blank"&gt;here&lt;/a&gt;). This poster takes the key proven practices in the talk and groups them into six themes for easy consumption. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/ThreadingCheatSheet.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" class="wlDisabledImage" title="Threading Cheat Sheet" border="0" alt="Threading Cheat Sheet" src="http://www.sadev.co.za/files/ThreadingCheatSheet_thumb.png" width="324" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;High resolution XPS version below.&lt;/p&gt;&lt;table id="attachments" class="sticky-enabled"&gt;
 &lt;thead&gt;&lt;tr&gt;&lt;th&gt;Attachment&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt; &lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
 &lt;tr class="odd"&gt;&lt;td&gt;&lt;a href="http://www.sadev.co.za/files/Threading Cheat Sheet.xps"&gt;Threading Cheat Sheet.xps&lt;/a&gt;&lt;/td&gt;&lt;td&gt;824.48 KB&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=QvubxDsNE5A:BMrg77C29KE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=QvubxDsNE5A:BMrg77C29KE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=QvubxDsNE5A:BMrg77C29KE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=QvubxDsNE5A:BMrg77C29KE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=QvubxDsNE5A:BMrg77C29KE:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=QvubxDsNE5A:BMrg77C29KE:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=QvubxDsNE5A:BMrg77C29KE:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=QvubxDsNE5A:BMrg77C29KE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=QvubxDsNE5A:BMrg77C29KE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=QvubxDsNE5A:BMrg77C29KE:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/QvubxDsNE5A" height="1" width="1"/&gt;</description><enclosure url="http://www.sadev.co.za/files/Threading Cheat Sheet.xps" length="844271" type="application/vnd.ms-xpsdocument" /><feedburner:origLink>http://www.sadev.co.za/content/proven-practices-threading-quick-reference-poster</feedburner:origLink></item><item><title>Free Visual Studio 2010 and TFS 2010 training!</title><link>http://feedproxy.google.com/~r/Sadev/~3/i0sJtUn-xgg/free-visual-studio-2010-and-tfs-2010-training</link><category>.NET</category><category>ALM</category><category>ALM Rangers</category><category>Development</category><category>Events</category><category>Microsoft</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Thu, 08 Jul 2010 23:58:43 PDT</pubDate><guid isPermaLink="false">491 at http://www.sadev.co.za</guid><description>&lt;blockquote&gt;Update 13 July 2010: The event is fully booked now! If you want to add yourself to the waiting list in case a spot becomes free, please &lt;a href="/contact"&gt;contact me&lt;/a&gt;.&lt;/blockquote&gt;


&lt;p&gt;&lt;a href="http://www.sadev.co.za/files/trainingpic1.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="trainingpic[1]" border="0" alt="trainingpic[1]" align="right" src="http://www.sadev.co.za/files/trainingpic1_thumb.png" width="304" height="104" /&gt;&lt;/a&gt;I am very excited to announce that &lt;a href="http://zaydkara.spaces.live.com/" target="_blank"&gt;Zayd Kara&lt;/a&gt;, fellow Visual Studio ALM MVP, and myself have arranged a free hands on labs training for Visual Studio 2010 and TFS 2010. This is your opportunity to get some time learning about the new features in these products. &lt;/p&gt;  &lt;p&gt;The event will take place on Saturday, 31st July 2010 and will run from 9am to 1:30pm and is completely free, but it is limited to 50 people! &lt;/p&gt;  &lt;p&gt;You will be able to do the following labs:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Authoring and Running Manual Tests using Microsoft Test Manager 2010 &lt;/li&gt;    &lt;li&gt;Branching and Merging Visualization with Team Foundation Server 2010 &lt;/li&gt;    &lt;li&gt;Code Discovery using the Architecture Tools in Visual Studio 2010 Ultimate &lt;/li&gt;    &lt;li&gt;Debugging with IntelliTrace using Visual Studio 2010 Ultimate &lt;/li&gt;    &lt;li&gt;Introduction to Coded UI Tests with Visual Studio 2010 Ultimate &lt;/li&gt;    &lt;li&gt;Introduction to Test Case Management with Microsoft Test Manager 2010 &lt;/li&gt;    &lt;li&gt;Planning your Projects with Team Foundation Server 2010 &lt;/li&gt;    &lt;li&gt;Understanding Class Coupling with Visual Studio 2010 Ultimate &lt;/li&gt;    &lt;li&gt;Using the Architecture Explorer in Visual Studio 2010 Ultimate to Analyze Your Code &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://sadev.wufoo.com/forms/vs-2010-tfs-2010-hands-on-labs-july-2010/" target="_blank"&gt;Click here for more details and registration form.&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I would also like to take this opportunity to thank our sponsors for making this possible:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.bbd.co.za" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="BB&amp;amp;D CI Glyph_Top 25 Years_Top Small" border="0" alt="BB&amp;amp;D CI Glyph_Top 25 Years_Top Small" src="http://www.sadev.co.za/files/BBDCIGlyph_Top25Years_TopSmall.png" width="335" height="101" /&gt;&lt;/a&gt;&amp;#160; &amp;amp; &lt;a href="http://www.sadev.co.za/files/byteslogo.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="byteslogo" border="0" alt="byteslogo" src="http://www.sadev.co.za/files/byteslogo_thumb.png" width="230" height="80" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=i0sJtUn-xgg:-a3UAg3IFeQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=i0sJtUn-xgg:-a3UAg3IFeQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=i0sJtUn-xgg:-a3UAg3IFeQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=i0sJtUn-xgg:-a3UAg3IFeQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=i0sJtUn-xgg:-a3UAg3IFeQ:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=i0sJtUn-xgg:-a3UAg3IFeQ:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=i0sJtUn-xgg:-a3UAg3IFeQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=i0sJtUn-xgg:-a3UAg3IFeQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=i0sJtUn-xgg:-a3UAg3IFeQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=i0sJtUn-xgg:-a3UAg3IFeQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/i0sJtUn-xgg" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/free-visual-studio-2010-and-tfs-2010-training</feedburner:origLink></item><item><title>What's new in Visual Studio 2010 quick reference poster</title><link>http://feedproxy.google.com/~r/Sadev/~3/Qwd3WG4_7z0/whats-new-visual-studio-2010-quick-reference-poster</link><category>.NET</category><category>ALM</category><category>Development</category><category>Microsoft</category><category>Presentations, Posters &amp; Cheat Sheets</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Thu, 08 Jul 2010 23:52:14 PDT</pubDate><guid isPermaLink="false">490 at http://www.sadev.co.za</guid><description>&lt;p&gt;One of my favourite aspects of my work at &lt;a href="http://www.bbd.co.za" target="_blank"&gt;BB&amp;amp;D&lt;/a&gt;, is the creation of quick reference posters and cheat sheets for the &lt;a href="http://www.drp.co.za/" target="_blank"&gt;DRP site&lt;/a&gt; which is one of BB&amp;amp;D’s way of sharing knowledge outside the organisation. I have recently produced a bunch of new posters which I will be releasing over the next few days. First up is…&lt;/p&gt;  &lt;h3&gt;What’s new in Visual Studio 2010&lt;/h3&gt;  &lt;p&gt;A quick reference post which explains the edition changes, some new features (IntelliTrace and the architecture tools) and gives some hints about the IDE (docking of windows, search shortcuts, block selection and zooming).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/CheatSheet.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Cheat Sheet" border="0" alt="Cheat Sheet" src="http://www.sadev.co.za/files/CheatSheet_thumb.png" width="332" height="250" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can download the high definition XPS file below.&lt;/p&gt;&lt;table id="attachments" class="sticky-enabled"&gt;
 &lt;thead&gt;&lt;tr&gt;&lt;th&gt;Attachment&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt; &lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
 &lt;tr class="odd"&gt;&lt;td&gt;&lt;a href="http://www.sadev.co.za/files/VS 2010 Cheat Sheet.xps"&gt;VS 2010 Cheat Sheet.xps&lt;/a&gt;&lt;/td&gt;&lt;td&gt;665.35 KB&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Qwd3WG4_7z0:nR6tDl4Vq1c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Qwd3WG4_7z0:nR6tDl4Vq1c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=Qwd3WG4_7z0:nR6tDl4Vq1c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Qwd3WG4_7z0:nR6tDl4Vq1c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Qwd3WG4_7z0:nR6tDl4Vq1c:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=Qwd3WG4_7z0:nR6tDl4Vq1c:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Qwd3WG4_7z0:nR6tDl4Vq1c:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Qwd3WG4_7z0:nR6tDl4Vq1c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=Qwd3WG4_7z0:nR6tDl4Vq1c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Qwd3WG4_7z0:nR6tDl4Vq1c:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/Qwd3WG4_7z0" height="1" width="1"/&gt;</description><enclosure url="http://www.sadev.co.za/files/VS 2010 Cheat Sheet.xps" length="681320" type="application/vnd.ms-xpsdocument" /><feedburner:origLink>http://www.sadev.co.za/content/whats-new-visual-studio-2010-quick-reference-poster</feedburner:origLink></item><item><title>Presentation Dump - Mid 2010: VS2010, NDepend, RESTful Design, SSIS, EntLib 5, .NET Reflection, AppFabric, BDD, Sikuli &amp; Redmine</title><link>http://feedproxy.google.com/~r/Sadev/~3/A-IP4Rq81-I/presentation-dump-mid-2010</link><category>ALM</category><category>Development</category><category>Microsoft</category><category>Presentations, Posters &amp; Cheat Sheets</category><category>SQL</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Thu, 08 Jul 2010 03:12:06 PDT</pubDate><guid isPermaLink="false">489 at http://www.sadev.co.za</guid><description>&lt;p&gt;The past 6 months have been hectic from a presentation perspective for me, with 20 presentations and classes given this year so far. So instead of a single dump of presentations at the end of the year, as I did last year, I am doing a mid-year dump. &lt;/p&gt;  &lt;h3&gt;What is new in Visual Studio 2010&lt;/h3&gt;  &lt;p&gt;This presentation is the one I have given many times this year. It originally started as 10 on 10, which looked at 10 features in 20min for Dev4Dev’s last year. It then evolved into 12 on 10, which added two more features, still in 20min. It then evolved into ?? on 10 for &lt;a href="http://www.6degreesofcode.org/2010/04/what-new-in-visual-studio-2010-with.html" target="_blank"&gt;6 degrees of code&lt;/a&gt; where it became an hour and half presentation. It is demo heavy and really the slides are the very basics – the important is hidden slides and notes for the demos.&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_4692278"&gt;&lt;object id="__sse4692278" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=10on10-100706070539-phpapp01&amp;amp;stripped_title=what-is-new-in-visual-studio-2010" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse4692278" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=10on10-100706070539-phpapp01&amp;amp;stripped_title=what-is-new-in-visual-studio-2010" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;  &lt;h3&gt;NDepend&lt;/h3&gt;  &lt;p&gt;The tool that keeps on giving! For people working with taking over customer sites, reviewing code or anything else where you need to deal with other peoples code this tool is a must. This presentation was given to the architecture team at &lt;a href="http://www.bbd.co.za" target="_blank"&gt;BB&amp;amp;D&lt;/a&gt;.&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_4692284"&gt;&lt;object id="__sse4692284" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ndepend-100706070605-phpapp02&amp;amp;stripped_title=ndepend" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse4692284" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ndepend-100706070605-phpapp02&amp;amp;stripped_title=ndepend" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;  &lt;h3&gt;RESTful Design&lt;/h3&gt;  &lt;p&gt;RESTful design is an evolution of an earlier presentation I did, &lt;a href="http://www.slideshare.net/rmaclean/json-and-rest" target="_blank"&gt;REST &amp;amp; JSON&lt;/a&gt;, which drops the JSON stuff completely and also drops the heavy compare with SOAP/WS* parts which seemed to cause confusion. This revised presentation covers just REST and looks at it much more practically by covering the required HTTP knowledge and patterns for designing RESTful services.&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_4692550"&gt;&lt;object id="__sse4692550" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=restfuldesign-100706075833-phpapp01&amp;amp;stripped_title=restful-design-4692550" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse4692550" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=restfuldesign-100706075833-phpapp01&amp;amp;stripped_title=restful-design-4692550" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;  &lt;h3&gt;SQL Server Integration Services&lt;/h3&gt;  &lt;p&gt;Another upgrade in 2010 of an &lt;a href="http://www.slideshare.net/rmaclean/sql-server-integration-services-2631027" target="_blank"&gt;earlier presentation&lt;/a&gt; which not only cleans up some aspects but also goes into a lot more detail. &lt;/p&gt;  &lt;div style="width: 425px" id="__ss_4692532"&gt;&lt;object id="__sse4692532" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=sqlserverintegrationservices-100706075502-phpapp02&amp;amp;stripped_title=sql-server-integration-services-4692532" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse4692532" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=sqlserverintegrationservices-100706075502-phpapp02&amp;amp;stripped_title=sql-server-integration-services-4692532" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;  &lt;h3&gt;Enterprise Library&lt;/h3&gt;  &lt;p&gt;“The presentation that never was”, often I will spend time researching a technology or trend and preparing the presentation to come to the conclusion that it is just not worth the time of the attendee’s. Enterprise Library 5 is one of those, as the presentation covered what is new in it, and that is not very much. &lt;/p&gt;  &lt;div style="width: 425px" id="__ss_4692561"&gt;&lt;object id="__sse4692561" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=enterpriselibrary5-100706080036-phpapp02&amp;amp;stripped_title=enterprise-library-5-4692561" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse4692561" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=enterpriselibrary5-100706080036-phpapp02&amp;amp;stripped_title=enterprise-library-5-4692561" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;  &lt;h3&gt;.NET Reflection&lt;/h3&gt;  &lt;p&gt;This one is actually one from last year, but I had problems getting it onto SlideShare so it is only showing up now.&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_4693031"&gt;&lt;object id="__sse4693031" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=reflection-100706090443-phpapp02&amp;amp;stripped_title=net-reflection-4693031" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse4693031" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=reflection-100706090443-phpapp02&amp;amp;stripped_title=net-reflection-4693031" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;  &lt;h3&gt;Windows Server AppFabric&lt;/h3&gt;  &lt;p&gt;AppFabric, the local one – not the Azure one, was a great presentation I did for the BB&amp;amp;D architecture team. This is not the original presentation – it has been edited to remove customer info as a lot of analogies between a project BB&amp;amp;D did and AppFabric was in it (cause who hasn’t built a system similar to AppFabric).&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_4693046"&gt;&lt;object id="__sse4693046" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=windowsserverappfabric-100706090755-phpapp02&amp;amp;stripped_title=windows-server-appfabric-4693046" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse4693046" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=windowsserverappfabric-100706090755-phpapp02&amp;amp;stripped_title=windows-server-appfabric-4693046" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;  &lt;h3&gt;BDD&lt;/h3&gt;  &lt;p&gt;One of the presentations I spent the most time on this year, and one of the most exciting presentations. It really is a great methodology and I would love to see it used more.&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_4693078"&gt;&lt;object id="__sse4693078" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bdd-100706091146-phpapp02&amp;amp;stripped_title=bdd-4693078" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse4693078" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bdd-100706091146-phpapp02&amp;amp;stripped_title=bdd-4693078" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;  &lt;h3&gt;Sikuli&lt;/h3&gt;  &lt;p&gt;Another presentation which did not make the cut to actually be presented. It is an interesting project, but of limited scope and when compared to the Coded UI from Visual Studio 2010 it is really far behind.&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_4692740"&gt;&lt;object id="__sse4692740" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=sikuli-100706082555-phpapp01&amp;amp;stripped_title=sikuli-4692740" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse4692740" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=sikuli-100706082555-phpapp01&amp;amp;stripped_title=sikuli-4692740" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;  &lt;h3&gt;Redmine&lt;/h3&gt;  &lt;p&gt;Redmine is a bug tracking system, and being it’s not TFS may surprise you that an ALM MVP would do training on it. However for me to do training meant I head to learn it, which means I know the ALM landscape better and can point out which is better or not without uneducated bias (btw it still is TFS :)). This training was aimed not at developers but at call centre/power user people who would log initial bugs to then be managed in the system – so it was more of a ticketing system than a bug system in the end. &lt;/p&gt;  &lt;div style="width: 425px" id="__ss_4699007"&gt;&lt;object id="__sse4699007" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=cfakepathredmine-100707014122-phpapp02&amp;amp;stripped_title=redmine-4699007" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse4699007" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=cfakepathredmine-100707014122-phpapp02&amp;amp;stripped_title=redmine-4699007" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=A-IP4Rq81-I:71JZPgUZeSg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=A-IP4Rq81-I:71JZPgUZeSg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=A-IP4Rq81-I:71JZPgUZeSg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=A-IP4Rq81-I:71JZPgUZeSg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=A-IP4Rq81-I:71JZPgUZeSg:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=A-IP4Rq81-I:71JZPgUZeSg:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=A-IP4Rq81-I:71JZPgUZeSg:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=A-IP4Rq81-I:71JZPgUZeSg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=A-IP4Rq81-I:71JZPgUZeSg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=A-IP4Rq81-I:71JZPgUZeSg:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/A-IP4Rq81-I" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/presentation-dump-mid-2010</feedburner:origLink></item><item><title>TFS Integration Platform: Why the custom adapter format?</title><link>http://feedproxy.google.com/~r/Sadev/~3/JqwQsnpvUvQ/tfs-integration-platform-why-custom-adapter-format</link><category>ALM</category><category>ALM Rangers</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Tue, 06 Jul 2010 23:31:26 PDT</pubDate><guid isPermaLink="false">488 at http://www.sadev.co.za</guid><description>&lt;p&gt;Note: This is my personal opinion and not a view of Microsoft.&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://tfsintegration.codeplex.com/" target="_blank"&gt;TFS Integration Platform&lt;/a&gt; includes the ability to create and use custom adapters, however these are done using a custom adapter format. A question asked by many people, including myself, is why a custom adapter format? &lt;/p&gt;  &lt;p&gt;Microsoft has a few solutions in the adapter space already which could’ve been used:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SSIS: SQL Server Integration Services, Microsoft’s platform for ETL has the ability to build adapters which can read and/or write. &lt;/li&gt;    &lt;li&gt;WCF LOB Adapters: Microsoft has a very complete framework for building LOB adapters which can be used by custom code or products like BizTalk. &lt;/li&gt;    &lt;li&gt;BizTalk adapters: Native adapters for Microsoft BizTalk server. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So why reinvent the wheel? There are three compelling reasons I see for it:&lt;/p&gt;  &lt;h3&gt;Lightsaber vs. Gun&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/Vader__s_Lightsaber_by_adarklord.jpg" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="From http://boards.theforce.net/fan_art/b10020/27571607/p1/" border="0" alt="From http://boards.theforce.net/fan_art/b10020/27571607/p1/" src="http://www.sadev.co.za/files/Vader__s_Lightsaber_by_adarklord_thumb.jpg" width="303" height="229" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A weapon from a more civilised age, the lightsaber is a weapon with a number of purposes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Deflecting laser shots &lt;/li&gt;    &lt;li&gt;Melting doors &lt;/li&gt;    &lt;li&gt;Cutting off snow monster arms &lt;/li&gt;    &lt;li&gt;Slicing open the belly of a tauntaun. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;and it does all those well. &lt;/p&gt;  &lt;p&gt;A gun is completely different, it is a single minded point and click interface for killing and sometimes it is better to just get the job done as Indiana shows us:&lt;/p&gt; &lt;object width="500" height="405"&gt;&lt;param name="movie" value="http://www.youtube.com/v/4DzcOCyHDqc&amp;amp;hl=en_US&amp;amp;fs=1?rel=0&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6&amp;amp;border=1" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed src="http://www.youtube.com/v/4DzcOCyHDqc&amp;amp;hl=en_US&amp;amp;fs=1?rel=0&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6&amp;amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="405"&gt;&lt;/embed&gt;&lt;/object&gt;  &lt;p&gt;The other adapter templates are like lightsabers in that they are designed to deal with a variety of situations and so flexibility is key. They have the concept of data in/data out and do not care about the data is. The TFS Integration Platform adapters are like a gun, they are built precisely for a single purpose and so do that exceptionally well. &lt;/p&gt;  &lt;h3&gt;The Scotty Factor&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/startrekenterprisewallpaper.jpg" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="From http://www.wallpaper-network.com/science-fiction/star-trek-wallpapers/" border="0" alt="From http://www.wallpaper-network.com/science-fiction/star-trek-wallpapers/" src="http://www.sadev.co.za/files/startrekenterprisewallpaper_thumb.jpg" width="365" height="275" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Star Trek is about a group which has research and discovery vessels flying round space and dealing with what is encountered. The ships in Star Trek are not designed for warfare&lt;sup&gt;1&lt;/sup&gt;, but they do a lot of fighting. Why is it then that these peaceful ships can fight, because it is a reality of the situations they encounter, that they will need to be able to defend themselves. &lt;/p&gt;  &lt;p&gt;Knowing ahead the common scenarios that can arise, means that you can prepare better and the TFS Integration Platform is an indication of that. There is a lot of knowledge of work items and version control built into the platform, even some assumptions which are not true for all systems, and that means as a developer you write less code in your adapter to get it to work and it also means the platform is optimised for the job at hand. &lt;/p&gt;  &lt;h3&gt;All you need is a paper clip, a rubber band and a sugar cube&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image.jpg" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="From www.appart.com/Blog/2009/06/default.aspx" border="0" alt="From www.appart.com/Blog/2009/06/default.aspx" src="http://www.sadev.co.za/files/image_thumb.jpg" width="312" height="250" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A paper clip is meant to hold multiple pieces of paper together – that is it’s job. Introduce McGuyver and the edge case usage of a paper clip being able to control low orbiting satellites comes into play, however he will need a few other things to hack it together. When you work with a generic migration/integration system, those edge cases are very difficult to cater for. The TFS Integration Platform handles edge cases related to the task at hand very well because they aren’t edge cases – they are normal expected cases.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;There is one ship purpose built for fighting, the &lt;a href="http://en.wikipedia.org/wiki/USS_Defiant" target="_blank"&gt;Defiant&lt;/a&gt;. &lt;/li&gt; &lt;/ol&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=JqwQsnpvUvQ:ZX5Dm0O-pKU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=JqwQsnpvUvQ:ZX5Dm0O-pKU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=JqwQsnpvUvQ:ZX5Dm0O-pKU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=JqwQsnpvUvQ:ZX5Dm0O-pKU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=JqwQsnpvUvQ:ZX5Dm0O-pKU:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=JqwQsnpvUvQ:ZX5Dm0O-pKU:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=JqwQsnpvUvQ:ZX5Dm0O-pKU:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=JqwQsnpvUvQ:ZX5Dm0O-pKU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=JqwQsnpvUvQ:ZX5Dm0O-pKU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=JqwQsnpvUvQ:ZX5Dm0O-pKU:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/JqwQsnpvUvQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/tfs-integration-platform-why-custom-adapter-format</feedburner:origLink></item><item><title>What Office taught me about Visual Studio? A very cool toolbox trick.</title><link>http://feedproxy.google.com/~r/Sadev/~3/StNfFF3ivyU/what-office-taught-me-about-visual-studio-very-cool-toolbox-trick</link><category>.NET</category><category>ALM</category><category>Development</category><category>Microsoft</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Mon, 14 Jun 2010 01:52:55 PDT</pubDate><guid isPermaLink="false">487 at http://www.sadev.co.za</guid><description>&lt;p&gt;I spend a significant amount of time in PowerPoint and to get a constant look and feel in my slides, I often use the &lt;em&gt;Format Painter &lt;/em&gt;option. Using this tool you highlight some text/image/video, click the &lt;em&gt;Format Painter &lt;/em&gt;button and then paint some other text/image/video and it applies the format settings from the first group to the group you paint. &lt;/p&gt;  &lt;p&gt;What if you want to do this over and over? You may think you need to highlight → click → paint over and over again, but Office has a trick – double click the button! Then you can highlight → double click → paint → paint → paint&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_26.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_51.png" width="248" height="216" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So how does this help in Visual Studio? I am working with the UML diagrams at the moment and needed to connect a bunch of items and the first few times I did the following: Click the connector in the toolbox → click source item → click destination, repeat from start.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_27.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_52.png" width="289" height="89" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Suddenly I thought, maybe it works like Office and you know what? It does! You can double click a toolbox item, and then it becomes sticky and adding lots of them is easy!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_28.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_53.png" width="208" height="250" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=StNfFF3ivyU:tHPOlYgEUtQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=StNfFF3ivyU:tHPOlYgEUtQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=StNfFF3ivyU:tHPOlYgEUtQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=StNfFF3ivyU:tHPOlYgEUtQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=StNfFF3ivyU:tHPOlYgEUtQ:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=StNfFF3ivyU:tHPOlYgEUtQ:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=StNfFF3ivyU:tHPOlYgEUtQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=StNfFF3ivyU:tHPOlYgEUtQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=StNfFF3ivyU:tHPOlYgEUtQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=StNfFF3ivyU:tHPOlYgEUtQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/StNfFF3ivyU" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/what-office-taught-me-about-visual-studio-very-cool-toolbox-trick</feedburner:origLink></item><item><title>How to create an adapter for the TFS Integration Platform - Appendix 2: SimpleDictionary</title><link>http://feedproxy.google.com/~r/Sadev/~3/w5tpfXrO3-g/how-create-adapter-tfs-integration-platform-appendix-2-simpledictionary</link><category>.NET</category><category>ALM</category><category>ALM Rangers</category><category>Development</category><category>SharePoint</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Thu, 10 Jun 2010 03:34:52 PDT</pubDate><guid isPermaLink="false">486 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Note: This post is part of a series and you can find the rest of the parts in the &lt;a href="/content/how-create-adapter-tfs-integration-platform-series-index" target="_blank"&gt;series index&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;For my WI adapter I needed an implementation of &lt;em&gt;Dictionary&amp;lt;T,V&amp;gt;&lt;/em&gt; which could be serialised and unfortunately the .NET one can’t. So I threw together a simple implementation of one using two &lt;em&gt;List&amp;lt;T&amp;gt;. &lt;/em&gt;It is not perfect for every possible time you may need an alternative to &lt;em&gt;Dictionary&amp;lt;T,V&amp;gt;&lt;/em&gt;, for example the only item manipulation I have is to add an item and clear all items, but it is great for my needs in the case:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;[XmlRoot(&amp;quot;simpleDictionary&amp;quot;)]
public class SimpleDictionary&amp;lt;Key, Value&amp;gt; : IEnumerable, IXmlSerializable
{
    private List&amp;lt;Key&amp;gt; keys = new List&amp;lt;Key&amp;gt;();
    private List&amp;lt;Value&amp;gt; values = new List&amp;lt;Value&amp;gt;();

    public List&amp;lt;Key&amp;gt; Keys
    {
        get
        {
            return keys;
        }
    }

    public List&amp;lt;Value&amp;gt; Values
    {
        get
        {
            return values;
        }
    }

    public IEnumerator GetEnumerator()
    {
        return (IEnumerator)new SimpleDictionaryEnumerator(this);
    }

    public void Add(Key key, Value value)
    {
        keys.Add(key);
        values.Add(value);
    }

    public void Add(object o)
    {
        KeyValuePair&amp;lt;Key, Value&amp;gt;? keyValuePair = o as KeyValuePair&amp;lt;Key, Value&amp;gt;?;
        if (keyValuePair != null)
        {
            this.Add(keyValuePair.Value.Key, keyValuePair.Value.Value);
        }
    }

    public void Clear()
    {
        keys.Clear();
        values.Clear();
    }

    #endregion

    private class SimpleDictionaryEnumerator : IEnumerator
    {
        private SimpleDictionary&amp;lt;Key, Value&amp;gt; simpleDictionary;
        private int index = -1;

        public SimpleDictionaryEnumerator(SimpleDictionary&amp;lt;Key, Value&amp;gt; simpleDictionary)
        {
            this.simpleDictionary = simpleDictionary;
        }

        #region IEnumerator Members

        public object Current
        {
            get
            {
                return new KeyValuePair&amp;lt;Key, Value&amp;gt;(simpleDictionary.keys[index], simpleDictionary.values[index]);
            }
        }

        public bool MoveNext()
        {
            index++;
            return !(index &amp;gt;= simpleDictionary.keys.Count);

        }

        public void Reset()
        {
            index = -1;
        }
    }

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        if (reader.IsEmptyElement)
        {
            return;
        }

        XmlSerializer keySerialiser = new XmlSerializer(typeof(Key));
        XmlSerializer valueSerialiser = new XmlSerializer(typeof(Value));

        reader.Read();
        while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
        {
            reader.ReadStartElement(&amp;quot;keyValuePair&amp;quot;);

            reader.ReadStartElement(&amp;quot;key&amp;quot;);
            Key key = (Key)keySerialiser.Deserialize(reader);
            reader.ReadEndElement();

            reader.ReadStartElement(&amp;quot;value&amp;quot;);
            Value value = (Value)valueSerialiser.Deserialize(reader);
            reader.ReadEndElement();

            this.Add(key, value);

            reader.ReadEndElement(); // for keyvaluepair
            reader.MoveToContent();
        }

        reader.ReadEndElement(); // for root
    }

    public void WriteXml(XmlWriter writer)
    {
        XmlSerializer keySerialiser = new XmlSerializer(typeof(Key));
        XmlSerializer valueSerialiser = new XmlSerializer(typeof(Value));

        for (int counter = 0; counter &amp;lt; this.keys.Count; counter++)
        {
            writer.WriteStartElement(&amp;quot;keyValuePair&amp;quot;);

            writer.WriteStartElement(&amp;quot;key&amp;quot;);
            keySerialiser.Serialize(writer, this.keys[counter]);
            writer.WriteEndElement();

            writer.WriteStartElement(&amp;quot;value&amp;quot;);
            valueSerialiser.Serialize(writer, this.values[counter]);
            writer.WriteEndElement();

            writer.WriteEndElement();

        }
    }
}&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=w5tpfXrO3-g:dUBOal5UTDw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=w5tpfXrO3-g:dUBOal5UTDw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=w5tpfXrO3-g:dUBOal5UTDw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=w5tpfXrO3-g:dUBOal5UTDw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=w5tpfXrO3-g:dUBOal5UTDw:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=w5tpfXrO3-g:dUBOal5UTDw:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=w5tpfXrO3-g:dUBOal5UTDw:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=w5tpfXrO3-g:dUBOal5UTDw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=w5tpfXrO3-g:dUBOal5UTDw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=w5tpfXrO3-g:dUBOal5UTDw:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/w5tpfXrO3-g" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/how-create-adapter-tfs-integration-platform-appendix-2-simpledictionary</feedburner:origLink></item><item><title>Pro tips for the Visual Studio Pro Power Tools</title><link>http://feedproxy.google.com/~r/Sadev/~3/7LTsDtTK26c/pro-tips-visual-studio-pro-power-tools</link><category>.NET</category><category>ALM</category><category>Development</category><category>Microsoft</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Wed, 09 Jun 2010 05:48:04 PDT</pubDate><guid isPermaLink="false">485 at http://www.sadev.co.za</guid><description>&lt;blockquote&gt;The team has release a new version of the tools which solve a lot of the issues, and provide a bunch more great features. Please make sure you see and use &lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/d0d33361-18e2-46c0-8ff2-4adea1e34fef"&gt;the latest version&lt;/a&gt;.&lt;/blockquote&gt;
&lt;p&gt;At Tech·Ed North America on Monday the &lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/d0d33361-18e2-46c0-8ff2-4adea1e34fef" target="_blank"&gt;Visual Studio Pro Power Tools&lt;/a&gt; were announced, and they are fantastic. A full run down of them can be found on &lt;a href="http://blogs.msdn.com/b/bharry/archive/2010/06/07/announcing-the-first-visual-studio-pro-power-tools.aspx" target="_blank"&gt;Brian Harry’s blog&lt;/a&gt;. However there are some tips in the usage which may not be immediately obvious so this post will explain some additional tips.&lt;/p&gt;  &lt;h3&gt;Add Reference Dialog&lt;/h3&gt;  &lt;p&gt;&lt;a href="/files/image_17.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/files/image_thumb_42.png" width="432" height="250" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The new dialog is amazing and fits the UI experience of VS2010 way better than the out of the box one. One point to be aware of is that when you hit &lt;em&gt;Add &lt;/em&gt;that it does not close the dialog - it does mark the selected assembly and in the background it adds it. This is great for adding multiple assemblies. If you want to remove an assembly you can do it here too – just select an already added assembly (green tick) and the &lt;em&gt;Add&lt;/em&gt; button becomes a &lt;em&gt;Remove &lt;/em&gt;button.&lt;/p&gt;  &lt;h3&gt;Document Tab Well&lt;/h3&gt;  &lt;p&gt;This is one of the first things you will see, because the tabs are a variety of colours suddenly. How can you control this? Go to the &lt;em&gt;Tools &lt;/em&gt;menu –&amp;gt; &lt;em&gt;Options –&lt;/em&gt;&amp;gt; &lt;em&gt;Environment –&lt;/em&gt;&amp;gt; &lt;em&gt;Document Tab Well&lt;/em&gt; to customise the settings. Setting the preset to &lt;em&gt;Visual Studio 2010&lt;/em&gt; is the same as disabling it.&lt;/p&gt;  &lt;p&gt;&lt;a href="/files/image_18.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/files/image_thumb_43.png" width="427" height="250" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;As a side point, if you are thinking of disabling it – before you do disable it, try the &lt;em&gt;Dynamic Tab Well&lt;/em&gt; preset. It is very similar to the standard VS2010 tabs, but with more features added and should appeal without over killing it.&lt;/p&gt;  &lt;p&gt;The shortcut to get to that part of help is right click on any blank space in the tab well and click &lt;em&gt;Customize…&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="/files/image_19.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/files/image_thumb_44.png" width="411" height="70" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Highlight Current Line&lt;/h3&gt;  &lt;p&gt;Another one that is immediately obvious – the grey behind your current line of code. If this colour is not aligned to your colour scheme then you can tweak it using the &lt;em&gt;Tools &lt;/em&gt;menu –&amp;gt; &lt;em&gt;Options –&lt;/em&gt;&amp;gt; &lt;em&gt;Environment –&amp;gt; Fonts &amp;amp; Colours –&amp;gt; Display Items –&amp;gt; Current Line (Extension)&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;&lt;a href="/files/image_20.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/files/image_thumb_45.png" width="427" height="250" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;To “disable” it set the background to &lt;em&gt;Automatic&lt;/em&gt;.&lt;/p&gt;  &lt;h3&gt;Align Assignments&lt;/h3&gt;  &lt;p&gt;If this is not working for you, it could because your C# settings are stopping it. To , you must uncheck: &lt;em&gt;Tools&lt;/em&gt; menu –&amp;gt; &lt;em&gt;Options –&lt;/em&gt;&amp;gt; &lt;em&gt;Text Editor&lt;/em&gt; –&amp;gt; &lt;em&gt;C# –&lt;/em&gt;&amp;gt; &lt;em&gt;Formatting –&lt;/em&gt;&amp;gt; &lt;em&gt;Spacing –&lt;/em&gt;&amp;gt; &lt;em&gt;Ignore spaces in declaration statements&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="/files/image_21.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/files/image_thumb_46.png" width="427" height="250" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;h3&gt;Colourised Parameter Help&lt;/h3&gt;  &lt;p&gt;Don’t like the the colours of the new tool tips? Want them to match your theme?&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="/files/image_22.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/files/image_thumb_47.png" width="226" height="70" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You can do this via &lt;em&gt;Tools &lt;/em&gt;menu –&amp;gt; &lt;em&gt;Options –&lt;/em&gt;&amp;gt; &lt;em&gt;Environment –&amp;gt; Fonts &amp;amp; Colours –&amp;gt; Display Items –&amp;gt; Signature Help Tooltip Background&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="/files/image_23.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/files/image_thumb_48.png" width="427" height="250" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;strike&gt;&lt;p&gt;Important to not that the foreground colour cannot be changed, only the background colour.&lt;/p&gt;&lt;/strike&gt;  &lt;h3&gt;Move Line Up/Down Commands&lt;/h3&gt;  &lt;p&gt;Did you have something already on the Alt+↑ or Alt+↓ or maybe you want to bind to something else? You can do this in &lt;em&gt;Tool &lt;/em&gt;(menu) –&amp;gt; &lt;em&gt;Options –&lt;/em&gt;&amp;gt; &lt;em&gt;Environment –&lt;/em&gt;&amp;gt; &lt;em&gt;Keyboard. &lt;/em&gt;The commands are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;em&gt;Edit.MoveLineDown&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;&lt;em&gt;Edit.MoveLineUp&lt;/em&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="/files/image_24.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/files/image_thumb_49.png" width="427" height="250" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;strike&gt;&lt;h3&gt;The Hack&lt;/h3&gt;  &lt;p&gt;Should you really dislike an extension or a specific extension is conflicting (tab well for instance conflicts with another tab management extension available) there is a completely unsupported hack to remove a specific feature while keeping other features on. Note that you will need to do this for EVERY update and it is unsupported, so do not bother to ask for help. It may also cause side effects to Visual Studio which cannot be foreseen. In short you had better be desperate. &lt;/p&gt;  &lt;h4&gt;Hack #1&lt;/h4&gt;  &lt;p&gt;The VSIX file is just a ZIP file, which you can open in your favourite archive tool. From there you can see the assemblies for each extension and remove them if needed. &lt;/p&gt;  &lt;p&gt;&lt;a href="/files/image_25.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/files/image_thumb_50.png" width="357" height="250" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;Hack #2&lt;/h4&gt;  &lt;p&gt;When an extension is installed it is unpacked to &lt;em&gt;C:\Users\&amp;lt;Username&amp;gt;\AppData\Local\Microsoft\VisualStudio\10.0\Extensions\ &lt;/em&gt;in here you will find directories for the various authors and under those the extensions. To find the Pro Power Tools go to: &lt;em&gt;\Microsoft\Visual Studio 2010 Pro Power Tools\10.0.100525.1000&lt;/em&gt;&amp;#160; and you will see all the files, simply delete or move out the assembly of the feature you do not want that will disable it.&lt;/p&gt;&lt;/strike&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=7LTsDtTK26c:vM2Ae70qHB0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=7LTsDtTK26c:vM2Ae70qHB0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=7LTsDtTK26c:vM2Ae70qHB0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=7LTsDtTK26c:vM2Ae70qHB0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=7LTsDtTK26c:vM2Ae70qHB0:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=7LTsDtTK26c:vM2Ae70qHB0:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=7LTsDtTK26c:vM2Ae70qHB0:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=7LTsDtTK26c:vM2Ae70qHB0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=7LTsDtTK26c:vM2Ae70qHB0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=7LTsDtTK26c:vM2Ae70qHB0:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/7LTsDtTK26c" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/pro-tips-visual-studio-pro-power-tools</feedburner:origLink></item><item><title>How to create an adapter for the TFS Integration Platform - Appendix 1: Power Tips</title><link>http://feedproxy.google.com/~r/Sadev/~3/K1IYpDHF-2o/how-create-adapter-tfs-integration-platform-appendix-1-power-tips</link><category>.NET</category><category>ALM</category><category>ALM Rangers</category><category>Development</category><category>SharePoint</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Wed, 09 Jun 2010 05:38:33 PDT</pubDate><guid isPermaLink="false">484 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Note: This post is part of a series and you can find the rest of the parts in the &lt;a href="/content/how-create-adapter-tfs-integration-platform-series-index" target="_blank"&gt;series index&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Throughout the series I have share a bunch of power tips for making this easier and this is a quick cheat sheet of them all.&lt;/p&gt;  &lt;h3&gt;From Part II: Getting Started&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Power Tip&lt;/strong&gt;: Once you have completed the tools install, go into to SQL Server and backup the TFSIntegrationPlatform database immediately. There are not only a few odd bugs that roam around which may cause you to need it but if you want to test on a clean environment, a restore is quicker than a reinstall. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;Make a common root for the TFS code and yours (in my case I used RangersCode) and then create sub directories in there for platform and your code (so I had My Production and MS production folders under RangersCode). This helps keep the items close, which makes things easier later plus keeps them separate so you can identify them. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;From Part III: Overview of adapters&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;The TraceManager puts all information written to it in the log files, so please make sure you do not put any sensitive information in there. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;From Part IV: IProvider&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;Using Visual Studio 2010’s new &lt;a href="http://blogs.msdn.com/b/zainnab/archive/2010/04/15/the-best-of-visual-studio-2010-using-generate-from-usage.aspx" target="_blank"&gt;“Generation from usage”&lt;/a&gt; features makes this stage of development much easier.&amp;#160; &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;From Part V: Items (IMigrationItem &amp;amp; IMigrationItemSerializer)&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;VC stands for Version Control. This refers to an adapter that works with the source control aspects of the system. WI, work items, and WIT, work item tracking, are the same thing. File attachments in WI are NOT regarded as VC and must be handled by your WI adapter. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;When you are downloading files in the IMigrationItem, you are responsible for the creation of the path too. So make sure you are creating directories and also checking what directories exist too. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;From Part VIII: IMigrationProvider&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;In my implementation I used the very useful &lt;em&gt;Path.GetTempFileName()&lt;/em&gt; from the .NET framework to get a place to put the file. However this causes an empty temp file to be created automatically and the platform doesn’t like that, so I needed to delete the temp file after that, and then call &lt;em&gt;Download&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;For folders creation or for deletes of files/folders you can use the &lt;em&gt;Path &lt;/em&gt;property of the action to get the folder name. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;From Part IX: IServerPathTranslationService&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;The neutral path, or canonical path as it is correctly named, is a path that is “Unix like”, (I.e. /src/project/). However these do not follow all the same rules as true Unix paths. For example : is a valid character in the path. &lt;/li&gt; &lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=K1IYpDHF-2o:LQPm8CQCMLs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=K1IYpDHF-2o:LQPm8CQCMLs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=K1IYpDHF-2o:LQPm8CQCMLs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=K1IYpDHF-2o:LQPm8CQCMLs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=K1IYpDHF-2o:LQPm8CQCMLs:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=K1IYpDHF-2o:LQPm8CQCMLs:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=K1IYpDHF-2o:LQPm8CQCMLs:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=K1IYpDHF-2o:LQPm8CQCMLs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=K1IYpDHF-2o:LQPm8CQCMLs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=K1IYpDHF-2o:LQPm8CQCMLs:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/K1IYpDHF-2o" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/how-create-adapter-tfs-integration-platform-appendix-1-power-tips</feedburner:origLink></item><item><title>How to create an adapter for the TFS Integration Platform - Part X: Reflection on SharePoint</title><link>http://feedproxy.google.com/~r/Sadev/~3/zTKQU4jI8XE/how-create-adapter-tfs-integration-platform-part-x-reflection-sharepoint</link><category>.NET</category><category>ALM</category><category>ALM Rangers</category><category>Development</category><category>SharePoint</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Tue, 08 Jun 2010 07:09:59 PDT</pubDate><guid isPermaLink="false">483 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Note: This post is part of a series and you can find the rest of the parts in the &lt;a href="/content/how-create-adapter-tfs-integration-platform-series-index" target="_blank"&gt;series index&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;This post is not a technically heavy, like the most of the series, but more a reflection on what I learnt about integrating to SharePoint. This information will hold true for any type of work with SharePoint, not just if you are creating adapters. &lt;/p&gt;  &lt;h3&gt;What I used&lt;/h3&gt;  &lt;p&gt;For the WIT adapter I used on the &lt;em&gt;lists.asmx&lt;/em&gt; web service, which allows you to work with list items. While with the VC adapter I used both the &lt;em&gt;lists.asmx&lt;/em&gt; and &lt;em&gt;copy.asmx&lt;/em&gt; web service and I ended up using some WebDav methods too. You may be asking why I needed &lt;em&gt;lists.asmx&lt;/em&gt; with VC – because of SharePoint Rule #1 “Everything is a list” – even a document library. The copy web service allows for files to be uploaded to SharePoint. &lt;/p&gt;  &lt;p&gt;My goal was to use just web services, which are one of the three ways you can interact with SharePoint the other two being WebDav and the API. The API is better than web services in every aspect (it is faster and more feature complete) but has a serious limitation, you MUST run the application using the API on the same server as SharePoint is install on. It makes it really only useful for tools used by SharePoint admins or web components, like web parts. WebDav is a standard for talking to web services and is generally regarded as a poorer implementation compared to the web services because it does much less.&lt;/p&gt;  &lt;p&gt;In the end I had a bug with file deletion in the VC adapter when using the web services. After much fighting, I gave up and used WebDav for that one function.&lt;/p&gt;  &lt;h3&gt;What I learnt&lt;/h3&gt;  &lt;p&gt;If I rewrote these adapters I would use mostly WebDav and only use the &lt;em&gt;lists.asmx&lt;/em&gt; web service for meta information tasks rather than manipulation. This is because while the WebDav implementation does less, it does all the fundamentals (create, update, delete) and it does it faster and more reliable way than the list and copy web services. The &lt;em&gt;lists.asmx&lt;/em&gt; web service would be used only for getting item ID’s, lists of items, files and folders and maybe renaming since WebDav can’t rename. This would allow me to drop the copy web service would give me faster adapters and cleaner code in less time.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=zTKQU4jI8XE:VZ356bd32Ek:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=zTKQU4jI8XE:VZ356bd32Ek:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=zTKQU4jI8XE:VZ356bd32Ek:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=zTKQU4jI8XE:VZ356bd32Ek:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=zTKQU4jI8XE:VZ356bd32Ek:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=zTKQU4jI8XE:VZ356bd32Ek:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=zTKQU4jI8XE:VZ356bd32Ek:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=zTKQU4jI8XE:VZ356bd32Ek:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=zTKQU4jI8XE:VZ356bd32Ek:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=zTKQU4jI8XE:VZ356bd32Ek:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/zTKQU4jI8XE" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/how-create-adapter-tfs-integration-platform-part-x-reflection-sharepoint</feedburner:origLink></item><item><title>How to create an adapter for the TFS Integration Platform - Part IX: IServerPathTranslationService</title><link>http://feedproxy.google.com/~r/Sadev/~3/Lm6gM-RMcac/how-create-adapter-tfs-integration-platform-part-ix-iserverpathtranslationservice</link><category>.NET</category><category>ALM</category><category>ALM Rangers</category><category>Development</category><category>SharePoint</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Mon, 07 Jun 2010 04:04:46 PDT</pubDate><guid isPermaLink="false">482 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Note: This post is part of a series and you can find the rest of the parts in the &lt;a href="/content/how-create-adapter-tfs-integration-platform-series-index" target="_blank"&gt;series index&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;IServerPathTranslationService&lt;/em&gt; takes the path to your source control item and translates it into a platform neutral path and visa versa. An example for this is if you were moving files between Windows and Linux. On Windows your path may be c&lt;em&gt;:\RangersCode\My Production\&lt;/em&gt; while on Linux that path needs to become&lt;em&gt;/src/RangersCode/My Production/ &lt;/em&gt;to handle the differences you need to change it to a neutral path first. &lt;/p&gt;  &lt;p&gt;The amount of sleep that I lost on path translation is embarrassing because the concept is dead simple, applying it correctly is ridiculously hard. The de facto guide for how this should work can be found on &lt;a href="http://blogs.msdn.com/b/willy-peter_schaub/archive/2010/01/22/tfs-integration-platform-translation-service-how-does-it-work.aspx" target="_blank"&gt;Willy-Peter’s blog&lt;/a&gt;, however there is also an &lt;a href="http://blogs.msdn.com/b/willy-peter_schaub/archive/2010/03/14/tfs-integration-platform-translation-service-how-does-it-work-part-2.aspx" target="_blank"&gt;update&lt;/a&gt; based on a lot of question asking by me which you may want to read.&lt;/p&gt;  &lt;p&gt;This is only needed for VC adapters so if you just want a WI adapter you can skip this. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;The neutral path, or canonical path as it is correctly named, is a path that is “Unix like”, (I.e. /src/project/). However these do not follow all the same rules as true Unix paths. For example : is a valid character in the path. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The two methods you need to implement are:&lt;/p&gt;  &lt;h3&gt;TranslateToCanonicalPathCaseSensitive&lt;/h3&gt;  &lt;p&gt;This method requires you provide a neutral path for one of your paths. For me this is simply just putting a leading slash on the item’s URL:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;public string TranslateToCanonicalPathCaseSensitive(string serverPath)
{
    TraceManager.TraceInformation(&amp;quot;WSSVC:TranslationToCanonical - {0}&amp;quot;, serverPath);
    string localPath = string.Format(CultureInfo.CurrentCulture, &amp;quot;/{0}&amp;quot;, serverPath);
    
    TraceManager.TraceInformation(&amp;quot;WSSVC:New:{0} -&amp;gt; {1}&amp;quot;, serverPath, localPath);
    return localPath;
}&lt;/pre&gt;

&lt;h3&gt;TranslateFromCanonicalPath&lt;/h3&gt;

&lt;p&gt;This method is the reverse from TranslateToCanonicalPathCaseSensitive it takes a neutral path and provides one that applies to your adapter. In my case it meant dropping the first character and making sure I had an absolute URI:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public string TranslateFromCanonicalPath(string canonicalPath, string canonicalFilterPath)
{
    TraceManager.TraceInformation(&amp;quot;WSSVC:TranslationFromCanonical - {0} - {1}&amp;quot;, canonicalPath, canonicalFilterPath);
    string result = new Uri(canonicalPath.Substring(1)).AbsoluteUri;
    TraceManager.TraceInformation(&amp;quot;WSSVC:TranslationFromCanonical:Result {0}&amp;quot;, result);
    return result;
}&lt;/pre&gt;

&lt;h3&gt;First in the Platform’s Eyes&lt;/h3&gt;

&lt;p&gt;There is an interesting thing that the platform does when it comes to server path translation, it creates this class first. This is before anything else, like the configuration service, so you need to make sure this class relies on very little, if any ,outside information. During the creation it also takes the root path from the filter items in your configuration and passes it to &lt;em&gt;TranslateToCanonicalPathCaseSensitive&lt;/em&gt; to get the root neutral path. It needs to know this because it will want to strip this information out when it passes it to the other adapter and add it back when other adapters pass their paths to you.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Lm6gM-RMcac:E2lcMPekVK0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Lm6gM-RMcac:E2lcMPekVK0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=Lm6gM-RMcac:E2lcMPekVK0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Lm6gM-RMcac:E2lcMPekVK0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Lm6gM-RMcac:E2lcMPekVK0:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=Lm6gM-RMcac:E2lcMPekVK0:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Lm6gM-RMcac:E2lcMPekVK0:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Lm6gM-RMcac:E2lcMPekVK0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=Lm6gM-RMcac:E2lcMPekVK0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Lm6gM-RMcac:E2lcMPekVK0:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/Lm6gM-RMcac" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/how-create-adapter-tfs-integration-platform-part-ix-iserverpathtranslationservice</feedburner:origLink></item><item><title>How to create an adapter for the TFS Integration Platform - Part VIII: IMigrationProvider</title><link>http://feedproxy.google.com/~r/Sadev/~3/EGil4L-bofM/how-create-adapter-tfs-integration-platform-part-viii-imigrationprovider</link><category>.NET</category><category>ALM</category><category>ALM Rangers</category><category>Development</category><category>SharePoint</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Fri, 04 Jun 2010 00:50:36 PDT</pubDate><guid isPermaLink="false">479 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Note: This post is part of a series and you can find the rest of the parts in the &lt;a href="/content/how-create-adapter-tfs-integration-platform-series-index" target="_blank"&gt;series index&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The &lt;em&gt;IMigrationProvider&lt;/em&gt; interface is the sister to &lt;em&gt;IAnalysisProvider &lt;/em&gt;and handles the writing to your system. As with &lt;em&gt;IAnalysisProvider &lt;/em&gt;it include some methods you can ignore. &lt;/p&gt;  &lt;h3&gt;InitializeServices&lt;/h3&gt;  &lt;p&gt;As with &lt;em&gt;IAnalysisProvider&lt;/em&gt; the &lt;em&gt;InitializeServices &lt;/em&gt;method is what is called first and is used for all setup. In my implementation I do a lot of setup for SharePoint which may not apply to other implementations. One thing you must do though, is register your item serialiser with the platform as follows:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;changeGroupService.RegisterDefaultSourceSerilizer(new SharePointVCMigrationItemSerializer());&lt;/pre&gt;

&lt;h3&gt;ProcessChangeGroup&lt;/h3&gt;

&lt;p&gt;The &lt;em&gt;ProcessChangeGroup&lt;/em&gt; method is the most important method of &lt;em&gt;IMigrationProvider &lt;/em&gt;as it is called to do the write operation. You are provided a &lt;em&gt;ChangeGroup &lt;/em&gt;and the &lt;em&gt;Actions &lt;/em&gt;property of that &lt;em&gt;ChangeGroup&lt;/em&gt; contains each file/folder/item you need to write/update/delete to your system. The &lt;em&gt;ProcessChangeGroup &lt;/em&gt;needs to return a&amp;#160; log of what has happened so that the platform knows all the actions were performed and also so it can correctly tie up item unique ID’s in your system with the other system unique item ID’s. The log is done with a &lt;em&gt;ConversionResult&lt;/em&gt;&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;ConversionResult conversionResult = new ConversionResult(configurationService.MigrationPeer, configurationService.SourceId);&lt;/pre&gt;

&lt;p&gt;Each action has an &lt;em&gt;Action &lt;/em&gt;which tells you what you need to do with the item, be it an update or add or delete etc… &lt;/p&gt;

&lt;p&gt;Each action also has an &lt;em&gt;ItemTypeReferenceName &lt;/em&gt;which tells you what it is. For WIT this is not too important as you will be dealing with work items, but for VC this very important as it could be a concrete item file or folder or a more theoretical item like a branch or merge instruction. &lt;/p&gt;

&lt;p&gt;So you need to loop over all the actions and based on the action + type do the correct thing:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;foreach (MigrationAction action in changeGroup.Actions)
{
    if (action.Action == WellKnownChangeActionId.Add || action.Action == WellKnownChangeActionId.Edit)
    {
        if (action.ItemTypeReferenceName == WellKnownContentType.VersionControlledFile.ReferenceName)
        {&lt;/pre&gt;

&lt;p&gt;Once you have completed your action you need to add the information to the conversion result log. My two adapters do this very differently for no reason other than I wrote the VC adapter much earlier and when I write the WI adapter later I did a more refined generic implementation there. The key part of the adding the information though is below. The most important thing is to provide the ID (the third parameter) to the platform so it knows how to link your item in future which is needed for deletes and updates.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;conversionResult.ItemConversionHistory.Add(new ItemConversionHistory(sourceSystemId, string.Empty, newSharePointId.ToString(), string.Empty));&lt;/pre&gt;

&lt;h3&gt;Items and VC&lt;/h3&gt;

&lt;p&gt;With the VC adapter the way you request the actual file you want is using the &lt;em&gt;Download &lt;/em&gt;method on the source item and providing a path. &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;In my implementation I used the very useful &lt;em&gt;Path.GetTempFileName()&lt;/em&gt; from the .NET framework to get a place to put the file. However this causes an empty temp file to be created automatically and the platform doesn’t like that, so I needed to delete the temp file after that, and then call &lt;em&gt;Download&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;For folders creation or for deletes of files/folders you can use the &lt;em&gt;Path &lt;/em&gt;property of the action to get the folder name. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;Items and WIT&lt;/h3&gt;

&lt;p&gt;WIT is easier when it comes to writing because you do not need to worry about paths and files - you just need to do some XML parsing. All the information about the item will be provided to you in the &lt;em&gt;MigrationActionDescription &lt;/em&gt;property of the action and you need to parse that into an item. Since the mapping of field names is handled by the platform this is very simple. In my case the following small method was all I needed to build a list of fields:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;private static Dictionary&amp;lt;string, object&amp;gt; BuildFieldList(IMigrationAction action)
{
    Dictionary&amp;lt;string, object&amp;gt; fields = new Dictionary&amp;lt;string, object&amp;gt;();

    XmlNodeList columns = action.MigrationActionDescription.SelectNodes(&amp;quot;/WorkItemChanges/Columns/Column&amp;quot;);

    foreach (XmlNode columnData in columns)
    {
        string fieldValue = columnData.FirstChild.InnerText;
        string fieldName = columnData.Attributes[&amp;quot;ReferenceName&amp;quot;].Value;

        if (string.IsNullOrEmpty(fieldName) == false)
        {
            fields.Add(fieldName, fieldValue);
        }
    }

    return fields;
}&lt;/pre&gt;

&lt;h3&gt;Item ID&lt;/h3&gt;

&lt;p&gt;The platform handles the mapping of item ID’s too, so if you need to know what item needs to be updated or deleted it can be found in the &lt;em&gt;MigrationActionDescription&lt;/em&gt;. The following method will work regardless of what your system is:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;private string GetSharePointID(IMigrationAction action)
{
    TraceManager.TraceInformation(&amp;quot;WSSWIT:MP:GetSharePointID&amp;quot;);
    XmlNode workItemChangesNode = action.MigrationActionDescription.SelectSingleNode(&amp;quot;/WorkItemChanges&amp;quot;);
    string value = string.Empty;

    if (workItemChangesNode.Attributes[&amp;quot;TargetWorkItemID&amp;quot;] == null)
    {
        TraceManager.TraceInformation(&amp;quot;WSSWIT:MP:GetSharePointID:Cannot find work item id. XML is: {0}&amp;quot;, workItemChangesNode.OuterXml);
    }
    else
    {
        value = workItemChangesNode.Attributes[&amp;quot;TargetWorkItemID&amp;quot;].Value;
        TraceManager.TraceInformation(&amp;quot;WSSWIT:MP:GetSharePointID:Value {0}&amp;quot;, value);
    }

    return value;
}&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=EGil4L-bofM:kSb3Hnjxzug:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=EGil4L-bofM:kSb3Hnjxzug:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=EGil4L-bofM:kSb3Hnjxzug:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=EGil4L-bofM:kSb3Hnjxzug:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=EGil4L-bofM:kSb3Hnjxzug:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=EGil4L-bofM:kSb3Hnjxzug:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=EGil4L-bofM:kSb3Hnjxzug:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=EGil4L-bofM:kSb3Hnjxzug:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=EGil4L-bofM:kSb3Hnjxzug:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=EGil4L-bofM:kSb3Hnjxzug:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/EGil4L-bofM" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/how-create-adapter-tfs-integration-platform-part-viii-imigrationprovider</feedburner:origLink></item><item><title>How to create an adapter for the TFS Integration Platform - Part VII: WIT Conflict Handling</title><link>http://feedproxy.google.com/~r/Sadev/~3/NC5q6yhMMTM/how-create-adapter-tfs-integration-platform-part-vii-wit-conflict-handling</link><category>.NET</category><category>ALM</category><category>ALM Rangers</category><category>Development</category><category>SharePoint</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Thu, 03 Jun 2010 00:40:17 PDT</pubDate><guid isPermaLink="false">478 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Note: This post is part of a series and you can find the rest of the parts in the &lt;a href="/content/how-create-adapter-tfs-integration-platform-series-index" target="_blank"&gt;series index&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The WIT adapter needs a custom conflict type and a custom conflict handler, really for no reason other than the platform expects it.&lt;/p&gt;  &lt;h3&gt;Conflict Handler&lt;/h3&gt;  &lt;p&gt;If you have no reason for a custom conflict handler, a simple implementation which allows for manual resolution can be created, which is what I have below. &lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;public class SharePointWITGeneralConflictHandler : IConflictHandler
{
    public bool CanResolve(MigrationConflict conflict, ConflictResolutionRule rule)
    {
        return ConflictTypeHandled.ScopeInterpreter.IsInScope(conflict.ScopeHint, rule.ApplicabilityScope);
    }

    public ConflictResolutionResult Resolve(MigrationConflict conflict, ConflictResolutionRule rule, out List&amp;lt;MigrationAction&amp;gt; actions)
    {
        actions = null;

        if (rule.ActionRefNameGuid.Equals(new ManualConflictResolutionAction().ReferenceName))
        {
            return ManualResolve(out actions);
        }

        return new ConflictResolutionResult(false, ConflictResolutionType.Other);
    }

    public ConflictType ConflictTypeHandled
    {
        get;
        set;
    }

    private static ConflictResolutionResult ManualResolve(out List&amp;lt;MigrationAction&amp;gt; actions)
    {
        actions = null;
        return new ConflictResolutionResult(true, ConflictResolutionType.Other);
    }
}&lt;/pre&gt;

&lt;h3&gt;Conflict Type&lt;/h3&gt;

&lt;p&gt;If you have no reason for a custom conflict type, you can do what I did which is to re-implement the generic one with even less features namely only supporting &lt;em&gt;ManualConflictResolution&lt;/em&gt; and a very simple scope hint.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public class SharePointWITGeneralConflictType : ConflictType
{
    public static MigrationConflict CreateConflict(Exception exception)
    {
        return new MigrationConflict(
            new SharePointWITGeneralConflictType(),
            MigrationConflict.Status.Unresolved,
            exception.ToString(),
            CreateScopeHint(Guid.NewGuid().ToString()));
    }

    public static MigrationConflict CreateConflict(Exception exception, IMigrationAction conflictedAction)
    {
        return new SharePointWITGeneralConflictType().CreateConflict(exception.ToString(), CreateScopeHint(Guid.NewGuid().ToString()), conflictedAction);
    }

    public override Guid ReferenceName
    {
        get
        {
            return s_conflictTypeReferenceName;
        }
    }

    public override string FriendlyName
    {
        get
        {
            return s_conflictTypeFriendlyName;
        }
    }

    public override string Description
    {
        get
        {
            return s_conflictTypeDescription;
        }
    }

    public SharePointWITGeneralConflictType()
        : base(new SharePointWITGeneralConflictHandler())
    { }

    public static string CreateScopeHint(string sourceItemId)
    {
        return string.Format(CultureInfo.CurrentCulture, &amp;quot;/{0}/{1}&amp;quot;, sourceItemId, Guid.NewGuid().ToString());
    }

    protected override void RegisterDefaultSupportedResolutionActions()
    {
        AddSupportedResolutionAction(new ManualConflictResolutionAction());
    }

    private static readonly Guid s_conflictTypeReferenceName = new Guid(&amp;quot;{606531DF-231A-496B-9996-50F239481988}&amp;quot;);
    private const string s_conflictTypeFriendlyName = &amp;quot;TFS WIT general conflict type&amp;quot;;
    private const string s_conflictTypeDescription =
        &amp;quot;This conflict is detected when an unknown exception is thrown during Work Item data submission.&amp;quot;;
}&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=NC5q6yhMMTM:DbUzIplQUrA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=NC5q6yhMMTM:DbUzIplQUrA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=NC5q6yhMMTM:DbUzIplQUrA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=NC5q6yhMMTM:DbUzIplQUrA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=NC5q6yhMMTM:DbUzIplQUrA:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=NC5q6yhMMTM:DbUzIplQUrA:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=NC5q6yhMMTM:DbUzIplQUrA:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=NC5q6yhMMTM:DbUzIplQUrA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=NC5q6yhMMTM:DbUzIplQUrA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=NC5q6yhMMTM:DbUzIplQUrA:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/NC5q6yhMMTM" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/how-create-adapter-tfs-integration-platform-part-vii-wit-conflict-handling</feedburner:origLink></item><item><title>How to create an adapter for the TFS Integration Platform - Part VI: IAnalysisProvider</title><link>http://feedproxy.google.com/~r/Sadev/~3/KgiVGIHaYu4/how-create-adapter-tfs-integration-platform-part-vi-ianalysisprovider</link><category>.NET</category><category>ALM</category><category>ALM Rangers</category><category>Development</category><category>SharePoint</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Wed, 02 Jun 2010 07:22:08 PDT</pubDate><guid isPermaLink="false">477 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Note: This post is part of a series and you can find the rest of the parts in the &lt;a href="/content/how-create-adapter-tfs-integration-platform-series-index" target="_blank"&gt;series index&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;IAnalysisProvider&lt;/em&gt;, has a name that is a bit misleading, or was misleading to me because for a long time I thought it did some analysis of the environment as a pre-step and then real work happened elsewhere. The reality is the &lt;em&gt;IAnalysisProvider &lt;/em&gt;is the reader part of your adapter, it’s goal is to get data from your system and into a format and/or location that the platform can work with.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_2_25.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_41.png" width="463" height="106" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;IServiceProvider&lt;/h3&gt;  &lt;p&gt;&lt;em&gt;IAnalysisProvider&lt;/em&gt; inherits from &lt;em&gt;IServiceProvider &lt;/em&gt;which means you need to implement a method for that, &lt;em&gt;GetService&lt;/em&gt;, which just returns this object.&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;object IServiceProvider.GetService(Type serviceType)
{
    return (IServiceProvider)this;
}&lt;/pre&gt;

&lt;h3&gt;Misc Methods&lt;/h3&gt;

&lt;p&gt;I am not cover every method you need to implement from &lt;em&gt;IAnalysisProvider&lt;/em&gt;, because you seldom need to implement them all. For example in my implementation of &lt;em&gt;DetectConflicts&lt;/em&gt; is just does some logging:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;void IAnalysisProvider.DetectConflicts(ChangeGroup changeGroup)
{
    TraceManager.TraceInformation(&amp;quot;WSSVC:AP:DetectConflicts&amp;quot;);
}&lt;/pre&gt;

&lt;h3&gt;InitializeServices&lt;/h3&gt;

&lt;p&gt;The first method you must care about is &lt;em&gt;InitializeServices&lt;/em&gt;, this is the first method which is called by the platform and it does five key things in my scenario:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;void IAnalysisProvider.InitializeServices(IServiceContainer serviceContainer)
{
    TraceManager.TraceInformation(&amp;quot;WSSVC:AP:Initialize&amp;quot;);
    this.analysisServiceContainer = serviceContainer;

    supportedContentTypes = new Collection&amp;lt;ContentType&amp;gt;();
    supportedContentTypes.Add(WellKnownContentType.VersionControlledFile);
    supportedContentTypes.Add(WellKnownContentType.VersionControlledFolder);

    SharePointVCChangeActionHandler handler = new SharePointVCChangeActionHandler(this);
    supportedChangeActions = new Dictionary&amp;lt;Guid, ChangeActionHandler&amp;gt;();
    supportedChangeActions.Add(WellKnownChangeActionId.Add, handler.BasicActionHandler);
    supportedChangeActions.Add(WellKnownChangeActionId.Delete, handler.BasicActionHandler);
    supportedChangeActions.Add(WellKnownChangeActionId.Edit, handler.BasicActionHandler);

    configurationService = (ConfigurationService)analysisServiceContainer.GetService(typeof(ConfigurationService));

    highWaterMarkDelta = new HighWaterMark&amp;lt;DateTime&amp;gt;(Constants.HwmDelta);
    highWaterMarkChangeset = new HighWaterMark&amp;lt;int&amp;gt;(&amp;quot;LastChangeSet&amp;quot;);
    configurationService.RegisterHighWaterMarkWithSession(highWaterMarkDelta);
    configurationService.RegisterHighWaterMarkWithSession(highWaterMarkChangeset);
    changeGroupService = (ChangeGroupService)analysisServiceContainer.GetService(typeof(ChangeGroupService));
    changeGroupService.RegisterDefaultSourceSerilizer(new SharePointVCMigrationItemSerializer());
}&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;The first part is the setting up of what types of content we support (lines 6 to lines 8). You can see above I only care about files and folders. &lt;/li&gt;

  &lt;li&gt;The second part is the setting up of what actions we support for reading (lines 10 to 14), which in this case is Add, Delete and Edit. Delete is a bit of a lie since we do not actually support it but we say we do. &lt;/li&gt;

  &lt;li&gt;The third part is getting the configuration service which is important since we will use it later (line 16). &lt;/li&gt;

  &lt;li&gt;The forth part is getting the HWM, or high watermark information (lines 18 to 21) which I will explain in a moment. &lt;/li&gt;

  &lt;li&gt;Lastly we register the default item serialiser (line 23) so that the platform knows how to convert the items. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Registration&lt;/h3&gt;

&lt;p&gt;We setup the content types and actions we support and then we need to register those and the way to do that is with &lt;em&gt;RegisterSupportedChangeActions&lt;/em&gt;. What I did was to loop over the actions and then loop over the types finally calling &lt;em&gt;RegisterChangeAction&lt;/em&gt;. You could do this differently, for example if you only supported some actions on some types:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;void IAnalysisProvider.RegisterSupportedChangeActions(ChangeActionRegistrationService contentActionRegistrationService)
{
    TraceManager.TraceInformation(&amp;quot;WSSVC:AP:RegisterSupportedChangeActions&amp;quot;);
    this.changeActionRegistrationService = contentActionRegistrationService;
    foreach (KeyValuePair&amp;lt;Guid, ChangeActionHandler&amp;gt; supportedChangeAction in supportedChangeActions)
    {
        foreach (ContentType contentType in ((IAnalysisProvider)this).SupportedContentTypes)
        {
            changeActionRegistrationService.RegisterChangeAction(supportedChangeAction.Key, contentType.ReferenceName, supportedChangeAction.Value);
        }
    }
}&lt;/pre&gt;

&lt;h4&gt;ChangeActionHandler&lt;/h4&gt;

&lt;p&gt;The &lt;em&gt;ChangeActionHandler&lt;/em&gt; class is a separate class which is used in the &lt;em&gt;IAnalysisProvider&lt;/em&gt; during registration which provides the minimal functionality for figuring out how to register a new action (i.e. add file, update work item etc…).&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public abstract class ChangeActionHandlers
{
    protected ChangeActionHandlers(IAnalysisProvider analysisProvider)
    {
    }

    public virtual void BasicActionHandler(MigrationAction action, ChangeGroup group)
    {
        if (action == null)
        {
            throw new ArgumentNullException(&amp;quot;action&amp;quot;);
        }

        if (group == null)
        {
            throw new ArgumentNullException(&amp;quot;group&amp;quot;);
        }

        group.CreateAction(action.Action, 
            action.SourceItem, 
            action.FromPath, 
            action.Path, action.Version,
            action.MergeVersionTo,
            action.ItemTypeReferenceName, 
            action.MigrationActionDescription);
    }
}&lt;/pre&gt;

&lt;h3&gt;High Watermark&lt;/h3&gt;

&lt;p&gt;High watermarks are a very interesting feature of the platform, and they let you store a value in the database for the usage of identification of change groups. One aspect I liked of it’s construction is its use of generics, meaning you can work with the types that make the most sense, so I have Int and DateTime, and as you associate a name to it. &lt;/p&gt;

&lt;p&gt;To get the value from the database you called the &lt;em&gt;Reload &lt;/em&gt;method, to set the value and save call &lt;em&gt;Update&lt;/em&gt;.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;highWaterMarkDelta.Reload();
highWaterMarkDelta.Update(deltaTableStartTime);&lt;/pre&gt;

&lt;h3&gt;Conflict Types&lt;/h3&gt;

&lt;p&gt;I have mentioned conflict types briefly before and I have said that my VC adapter does not have a conflict type which is not 100% true. It does have one, the &lt;em&gt;GenericConflictType&lt;/em&gt;, which is base from the platform. Below is the code snippet from the WIT adapter which does have a custom conflict type. The only difference with the VC adapter is that last line does not exist.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public void RegisterConflictTypes(ConflictManager conflictManager)
{
    TraceManager.TraceInformation(&amp;quot;WSSWIT:AP:RegisterConflictTypes&amp;quot;);
    this.conflictManagerService = (ConflictManager)analysisServiceContainer.GetService(typeof(ConflictManager));
    this.conflictManagerService.RegisterConflictType(new GenericConflictType());
    this.conflictManagerService.RegisterConflictType(new SharePointWITGeneralConflictType(), SyncOrchestrator.ConflictsSyncOrchOptions.Continue);
}&lt;/pre&gt;

&lt;h3&gt;GenerateDeltaTable&lt;/h3&gt;

&lt;p&gt;The next method to cover, and the second most important is &lt;em&gt;GenerateDeltaTable &lt;/em&gt;which is responsible for actually getting the values from the source system. This is done below in two steps first &lt;em&gt;GetSharePointUpdates &lt;/em&gt;and second &lt;em&gt;PromoteDeltaToPending&lt;/em&gt;.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;void IAnalysisProvider.GenerateDeltaTable()
{
    TraceManager.TraceInformation(&amp;quot;WSSVC:AP:GenerateDeltaTable&amp;quot;);
    highWaterMarkDelta.Reload();
    TraceManager.TraceInformation(&amp;quot;\tWSSVC:AP:Initial HighWaterMark {0} &amp;quot;, highWaterMarkDelta.Value);
    deltaTableStartTime = DateTime.Now;
    TraceManager.TraceInformation(&amp;quot;\tWSSVC:AP:CutOff {0} &amp;quot;, deltaTableStartTime);
    GetSharePointUpdates();
    highWaterMarkDelta.Update(deltaTableStartTime);
    TraceManager.TraceInformation(&amp;quot;\tWSSVC:AP:Updated HighWaterMark {0} &amp;quot;, highWaterMarkDelta.Value);
    changeGroupService.PromoteDeltaToPending();
}&lt;/pre&gt;

&lt;h3&gt;GetSharePointUpdates&lt;/h3&gt;

&lt;p&gt;This is a huge method and does the heavily lifting and I will skip covering all the boring details of talking to SharePoint and focus covering what you need to do. First you need to identify what is new, this is done using the HWM and comparing the modified date. &lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;// item has been modified since HWM &amp;amp; before deltra table start time
if (item.Modified.CompareTo(highWaterMarkDelta.Value) &amp;gt; 0 &amp;amp;&amp;amp; item.Modified.CompareTo(deltaTableStartTime) &amp;lt; 0) &lt;/pre&gt;

&lt;p&gt;You also need to figure out if the file is new or an update. In my VC adapter I created a special system called the &lt;em&gt;ProcessLog&lt;/em&gt;. This was to cater with a situation caused by SharePoint and won’t apply to other systems. Once you done all of that you can tell the platform about it by creating an action and saving the action. The following code is for VC:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;TraceManager.TraceInformation(&amp;quot;\tChangeSet:{0} - {1} ({2})&amp;quot;, highWaterMarkChangeset.Value, item.Filename, item.AbsoluteURL);
string itemType = item.ItemType.ToWellKnownContentType().ReferenceName;
ChangeGroup cg = CreateChangeGroup(highWaterMarkChangeset.Value, 0);
cg.CreateAction(actionGuid, item, null, item.AbsoluteURL, item.Version, null, itemType, null);
cg.Save();
highWaterMarkChangeset.Update(highWaterMarkChangeset.Value + 1);&lt;/pre&gt;

&lt;p&gt;and this is the same logic for WIT:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;ChangeGroup changeGroup = CreateChangeGroup(highWaterMarkChangeSet.Value, 0);
changeGroup.CreateAction(actionGuid, task, string.Empty, listName, string.Empty, string.Empty,
    WellKnownContentType.WorkItem.ReferenceName, CreateFieldRevisionDescriptionDoc(task));
changeGroup.Save();
highWaterMarkChangeSet.Update(highWaterMarkChangeSet.Value + 1);&lt;/pre&gt;

&lt;h3&gt;Revision Description Doc&lt;/h3&gt;

&lt;p&gt;While the VC adapter is fairly easy, the downloading is done in the &lt;em&gt;SharePointItem -&lt;/em&gt; the WIT adapter doesn’t download anything. What it needs is a special XML file called a revision description document. You are responsible for the generation of this document as part of the creation of the action (you may have noticed that in the sample above). &lt;/p&gt;

&lt;p&gt;This is what actually makes the field mapping possible, if you do not understand field mapping you must read &lt;a href="http://blogs.msdn.com/b/willy-peter_schaub/archive/2009/12/14/tfs-integration-platform-mapping-work-item-fields-and-values-questions-answers-12.aspx" target="_blank"&gt;Willy-Peter’s post on it&lt;/a&gt;. You can see below how I create my document, which is created per SharePoint list item and how I can support all the columns, including custom ones:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;private static XmlDocument CreateFieldRevisionDescriptionDoc(SharePointListItem task)
{
    XElement columns = new XElement(&amp;quot;Columns&amp;quot;,
            new XElement(&amp;quot;Column&amp;quot;,
                new XAttribute(&amp;quot;DisplayName&amp;quot;, &amp;quot;Author&amp;quot;),
                new XAttribute(&amp;quot;ReferenceName&amp;quot;, &amp;quot;Author&amp;quot;),
                new XAttribute(&amp;quot;Type&amp;quot;, &amp;quot;String&amp;quot;),
                new XElement(&amp;quot;Value&amp;quot;, task.AuthorId)),
            new XElement(&amp;quot;Column&amp;quot;,
                new XAttribute(&amp;quot;DisplayName&amp;quot;, &amp;quot;DisplayName&amp;quot;),
                new XAttribute(&amp;quot;ReferenceName&amp;quot;, &amp;quot;DisplayName&amp;quot;),
                new XAttribute(&amp;quot;Type&amp;quot;, &amp;quot;String&amp;quot;),
                new XElement(&amp;quot;Value&amp;quot;, task.DisplayName)),
            new XElement(&amp;quot;Column&amp;quot;,
                new XAttribute(&amp;quot;DisplayName&amp;quot;, &amp;quot;Id&amp;quot;),
                new XAttribute(&amp;quot;ReferenceName&amp;quot;, &amp;quot;Id&amp;quot;),
                new XAttribute(&amp;quot;Type&amp;quot;, &amp;quot;String&amp;quot;),
                new XElement(&amp;quot;Value&amp;quot;, task.Id.ToString())));

    foreach (KeyValuePair&amp;lt;string, object&amp;gt; column in task.Columns)
    {
        columns.Add(new XElement(&amp;quot;Column&amp;quot;,
            new XAttribute(&amp;quot;DisplayName&amp;quot;, column.Key),
                new XAttribute(&amp;quot;ReferenceName&amp;quot;, column.Key),
                new XAttribute(&amp;quot;Type&amp;quot;, &amp;quot;String&amp;quot;),
                new XElement(&amp;quot;Value&amp;quot;, column.Value)));
    }

    XElement descriptionDoc = new XElement(&amp;quot;WorkItemChanges&amp;quot;,
        new XAttribute(&amp;quot;Revision&amp;quot;, &amp;quot;0&amp;quot;),
        new XAttribute(&amp;quot;WorkItemType&amp;quot;, &amp;quot;SharePointItem&amp;quot;),
        new XAttribute(&amp;quot;Author&amp;quot;, task.AuthorId),
        new XAttribute(&amp;quot;ChangeDate&amp;quot;, task.ModifiedOn.ToString(CultureInfo.CurrentCulture)),
        new XAttribute(&amp;quot;WorkItemID&amp;quot;, task.Id.ToString()),
        columns);

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(descriptionDoc.ToString());
    return doc;
}&lt;/pre&gt;

&lt;pre&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=KgiVGIHaYu4:QF-rGob42oo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=KgiVGIHaYu4:QF-rGob42oo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=KgiVGIHaYu4:QF-rGob42oo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=KgiVGIHaYu4:QF-rGob42oo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=KgiVGIHaYu4:QF-rGob42oo:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=KgiVGIHaYu4:QF-rGob42oo:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=KgiVGIHaYu4:QF-rGob42oo:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=KgiVGIHaYu4:QF-rGob42oo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=KgiVGIHaYu4:QF-rGob42oo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=KgiVGIHaYu4:QF-rGob42oo:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/KgiVGIHaYu4" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/how-create-adapter-tfs-integration-platform-part-vi-ianalysisprovider</feedburner:origLink></item><item><title>How to create an adapter for the TFS Integration Platform - Part V: Items (IMigrationItem &amp; IMigrationItemSerializer)</title><link>http://feedproxy.google.com/~r/Sadev/~3/bgdoTlucP9Y/how-create-adapter-tfs-integration-platform-part-v-items-imigrationitem-and-imigration</link><category>.NET</category><category>ALM</category><category>ALM Rangers</category><category>Development</category><category>SharePoint</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Tue, 01 Jun 2010 00:23:51 PDT</pubDate><guid isPermaLink="false">476 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Note: This post is part of a series and you can find the rest of the parts in the &lt;a href="/content/how-create-adapter-tfs-integration-platform-series-index" target="_blank"&gt;series index&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;An important class in your implementation is your item implementation, which is used to identify what an item (be that file, directory, list item, bug etc…) is. This class needs to implement &lt;em&gt;IMigrationItem&lt;/em&gt;. This class is more important for VC than WIT but in both cases you need to put in all the properties you need to know about. You must also make sure that all properties are serialisable by the default XML serialiser in .NET. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;VC stands for Version Control. This refers to an adapter that works with the source control aspects of the system. WI, work items, and WIT, work item tracking, are the same thing. File attachments in WI are NOT regarded as VC and must be handled by your WI adapter.&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;IMigrationItem &lt;/h3&gt;  &lt;h4&gt;WIT&lt;/h4&gt;  &lt;p&gt;The WIT adapter is slightly smaller than the VC one since it is just a set of properties. I do not care too much about the inherited &lt;em&gt;DisplayName property &lt;/em&gt;here either and the &lt;em&gt;Download&lt;/em&gt; method is just logging. The only interesting part is the &lt;em&gt;SimpleDictionary&amp;lt;T,V&amp;gt;&lt;/em&gt; I use. &lt;em&gt;SimpleDictionary&amp;lt;T,V&amp;gt;&lt;/em&gt; is just to store Key/Value pairs of column information from SharePoint (because you may have customised the columns in SharePoint, I cannot hard code them). The reason I use this rather the &lt;em&gt;Dictionary&amp;lt;T,V&amp;gt;&lt;/em&gt; which .NET provides, is because that class is not able to be serialised using the default XML serialiser. I will cover &lt;em&gt;SimpleDictionary&amp;lt;T,V&amp;gt;&lt;/em&gt; in a later post.&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;public class SharePointListItem : IMigrationItem
{
    public SharePointListItem()
    {
        this.Columns = new SimpleDictionary&amp;lt;string, object&amp;gt;();
    }

    public string Id { get; set; }
    public DateTime ModifiedOn { get; set; }
    public string AuthorId { get; set; }
    public SimpleDictionary&amp;lt;string, object&amp;gt; Columns { get; set; }    
    public string DisplayName { get; set; }

    public void Download(string localPath)
    {
        TraceManager.TraceInformation(&amp;quot;WSSWIT:MI:Download - {0}&amp;quot;, localPath);
    }
}&lt;/pre&gt;

&lt;h4&gt;VC&lt;/h4&gt;

&lt;p&gt;The VC adapter is a little more complex with more properties but the key difference is the &lt;em&gt;DisplayName &lt;/em&gt;property, which I return the filename. Even more important though it the &lt;em&gt;Download&lt;/em&gt; method which is used to get the actual file or folder to a specific location, provided by the &lt;em&gt;localpath &lt;/em&gt;parameter, on disk for the platform to use. &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;When you are downloading files in the IMigrationItem, you are responsible for the creation of the path too. So make sure you are creating directories and also checking what directories exist too.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;pre class="brush: csharp;"&gt;string IMigrationItem.DisplayName
{
    get { return Filename; }
}

void IMigrationItem.Download(string localPath)
{
    TraceManager.TraceInformation(&amp;quot;WSSVC:Item:Download:From {0} to {1}&amp;quot;, this.AbsoluteURL, localPath);
    if (this.ItemType == SharePointItemType.File)
    {
        TraceManager.TraceInformation(&amp;quot;\tType is file&amp;quot;);
        string targetDir = Path.GetDirectoryName(localPath);
        if (!Directory.Exists(targetDir))
        {
            TraceManager.TraceInformation(&amp;quot;\tCreating Directory for file - {0}&amp;quot;, targetDir);
            Directory.CreateDirectory(targetDir);
        }

        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(this.AbsoluteURL);
        webRequest.Credentials = this.Credentials;
        using (Stream responseStream = webRequest.GetResponse().GetResponseStream())
        {
            using (FileStream fileStream = new FileStream(localPath, FileMode.CreateNew, FileAccess.ReadWrite))
            {
                byte[] buffer = new byte[1024];
                int bytesRead;
                do
                {
                    // Read data (up to 1k) from the stream
                    bytesRead = responseStream.Read(buffer, 0, buffer.Length);

                    // Write the data to the local file
                    fileStream.Write(buffer, 0, bytesRead);
                } while (bytesRead &amp;gt; 0);
            }
        }

        TraceManager.TraceInformation(&amp;quot;\tFile downloaded successfully&amp;quot;);
    }

    if (this.ItemType == SharePointItemType.Directory)
    {
        TraceManager.TraceInformation(&amp;quot;\tType is directory&amp;quot;);
        if (!Directory.Exists(localPath))
        {
            TraceManager.TraceInformation(&amp;quot;\tCreating Directory - {0}&amp;quot;, localPath);
            Directory.CreateDirectory(localPath);
        }
    }
}&lt;/pre&gt;

&lt;h3&gt;IMigrationItemSerializer&lt;/h3&gt;

&lt;p&gt;The migration item serializer is just a way to get your item to XML using .NET serialisation. My implementation of this is the exact same for both VC and WIT.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public class SharePointWITMigrationItemSerializer : IMigrationItemSerializer
{
    public IMigrationItem LoadItem(string itemBlob, ChangeGroupManager manager)
    {
        TraceManager.TraceInformation(&amp;quot;WSSWIT:S:LoadItem&amp;quot;);
        if (manager == null)
        {
            throw new ArgumentNullException(&amp;quot;manager&amp;quot;);
        }

        if (string.IsNullOrEmpty(itemBlob))
        {
            throw new ArgumentNullException(&amp;quot;itemBlob&amp;quot;);
        }

        XmlSerializer serializer = new XmlSerializer(typeof(SharePointListItem));

        using (StringReader itemBlobStringReader = new StringReader(itemBlob))
        {
            using (XmlReader itemBlobXmlReader = XmlReader.Create(itemBlobStringReader))
            {
                return (SharePointListItem)serializer.Deserialize(itemBlobXmlReader);
            }
        }
    }

    public string SerializeItem(IMigrationItem item)
    {
        if (item == null)
        {
            throw new ArgumentNullException(&amp;quot;item&amp;quot;);
        }

        TraceManager.TraceInformation(&amp;quot;WSSWIT:S:SerializeItem - {0}&amp;quot;, item.DisplayName);

        XmlSerializer sharePointTaskSerializer = new XmlSerializer(item.GetType());

        using (MemoryStream memoryStream = new MemoryStream())
        {
            sharePointTaskSerializer.Serialize(memoryStream, item);
            memoryStream.Seek(0, SeekOrigin.Begin);
            using (StreamReader streamReader = new StreamReader(memoryStream))
            {
                return streamReader.ReadToEnd();
            }
        }
    }
}&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=bgdoTlucP9Y:0feMiyIdnTc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=bgdoTlucP9Y:0feMiyIdnTc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=bgdoTlucP9Y:0feMiyIdnTc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=bgdoTlucP9Y:0feMiyIdnTc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=bgdoTlucP9Y:0feMiyIdnTc:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=bgdoTlucP9Y:0feMiyIdnTc:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=bgdoTlucP9Y:0feMiyIdnTc:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=bgdoTlucP9Y:0feMiyIdnTc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=bgdoTlucP9Y:0feMiyIdnTc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=bgdoTlucP9Y:0feMiyIdnTc:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/bgdoTlucP9Y" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/how-create-adapter-tfs-integration-platform-part-v-items-imigrationitem-and-imigration</feedburner:origLink></item><item><title>How to create an adapter for the TFS Integration Platform - Part IV: IProvider</title><link>http://feedproxy.google.com/~r/Sadev/~3/Tos4Q4KyA7Y/how-create-adapter-tfs-integration-platform-part-iv-iprovider</link><category>.NET</category><category>ALM</category><category>ALM Rangers</category><category>Development</category><category>SharePoint</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Mon, 31 May 2010 00:10:13 PDT</pubDate><guid isPermaLink="false">474 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Note: This post is part of a series and you can find the rest of the parts in the &lt;a href="/content/how-create-adapter-tfs-integration-platform-series-index" target="_blank"&gt;series index&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;IProvider&lt;/em&gt; is the first class we will look at implementing for both adapters (WI and VC) as it provides the core information for the platform to talk to our adapter. The first thing you provider needs is the &lt;em&gt;ProviderDescriptionAttribute&lt;/em&gt;, which has three properties ID, Name and Version.&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;[ProviderDescription(&amp;quot;{7F3F91B2-758A-4B3C-BBA8-CE34AE1D48EE}&amp;quot;, &amp;quot;SharePoint TIP Adapter - Version Control&amp;quot;, &amp;quot;1.0.0.0&amp;quot;)]&lt;/pre&gt;
The ID must be unique and you will need a record of it somewhere as it is used in configuration for the platform. The name and version are potentially used to make it easier for users, but I have not seen them used anywhere (maybe in future/different tools). 

&lt;p&gt;The only&amp;#160; method in the provider is the &lt;em&gt;GetService &lt;/em&gt;method which is used to get the implementations of the interfaces/classes we will be building later. Put another way this allows the platform to request a class which implements a specific interface using this method:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;object IServiceProvider.GetService(Type serviceType)
{
    TraceManager.TraceInformation(&amp;quot;WSSVC:Adapter:GetService - {0}&amp;quot;, serviceType);

    if (serviceType == typeof(IAnalysisProvider))
    {
        if (analysisProvider == null)
        {
            analysisProvider = new SharePointVCAnalysisProvider();
        }
        return analysisProvider;
    }
    
    if (serviceType == typeof(IMigrationProvider))
    {
        if (migrationProvider == null)
        {
            migrationProvider = new SharePointVCMigrationProvider();
        }
        return migrationProvider;
    }

    if (serviceType == typeof(IServerPathTranslationService))
    {
        if (transalationProvider == null)
        {
            transalationProvider = new SharePointVCAdapterTranslation();
        }
        return transalationProvider;
    }        

    return null;
}&lt;/pre&gt;

&lt;p&gt;Above is the implementation is what I used in the SharePoint VC adapter, the WI adapter is the same except it does not have the server path translation service at the end. &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;Using Visual Studio 2010’s new &lt;a href="http://blogs.msdn.com/b/zainnab/archive/2010/04/15/the-best-of-visual-studio-2010-using-generate-from-usage.aspx" target="_blank"&gt;“Generation from usage”&lt;/a&gt; features makes this stage of development much easier.&amp;#160; &lt;/p&gt;&lt;/blockquote&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Tos4Q4KyA7Y:xrTtZlhx2aI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Tos4Q4KyA7Y:xrTtZlhx2aI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=Tos4Q4KyA7Y:xrTtZlhx2aI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Tos4Q4KyA7Y:xrTtZlhx2aI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Tos4Q4KyA7Y:xrTtZlhx2aI:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=Tos4Q4KyA7Y:xrTtZlhx2aI:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Tos4Q4KyA7Y:xrTtZlhx2aI:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Tos4Q4KyA7Y:xrTtZlhx2aI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=Tos4Q4KyA7Y:xrTtZlhx2aI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=Tos4Q4KyA7Y:xrTtZlhx2aI:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/Tos4Q4KyA7Y" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/how-create-adapter-tfs-integration-platform-part-iv-iprovider</feedburner:origLink></item><item><title>How to create an adapter for the TFS Integration Platform - Part III: Overview of adapters</title><link>http://feedproxy.google.com/~r/Sadev/~3/BT9NC8AsyqQ/how-create-adapter-tfs-integration-platform-part-iii-overview-adapters</link><category>.NET</category><category>ALM</category><category>ALM Rangers</category><category>Development</category><category>SharePoint</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Fri, 28 May 2010 01:42:16 PDT</pubDate><guid isPermaLink="false">473 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Note: This post is part of a series and you can find the rest of the parts in the &lt;a href="/content/how-create-adapter-tfs-integration-platform-series-index" target="_blank"&gt;series index&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://tfsintegration.codeplex.com/" target="_blank"&gt;TFS Integration Platform&lt;/a&gt; has two types of adapters, a WI (for work items, tasks,&amp;#160; bugs etc…) and a VC (version control) adapter and they are nothing more than a .NET assembly made up of a number of classes which, mostly, you will inherit from interfaces in the Toolkit project. For both adapters the key interfaces you need to implement are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;em&gt;IProvider&lt;/em&gt;: Gives the platform the way to invoke your adapter. &lt;/li&gt;    &lt;li&gt;&lt;em&gt;IMigrationProvider&lt;/em&gt;: This is used for writing to the adapters source system, so for me SharePoint. &lt;/li&gt;    &lt;li&gt;&lt;em&gt;IMigrationItemSerializer&lt;/em&gt;: This provides support for converting the item to XML. &lt;/li&gt;    &lt;li&gt;&lt;em&gt;IAnalysisProvider&lt;/em&gt;: This is used for reading from the adapters source system. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;as well as they both need to implement the &lt;em&gt;ChangeActionHandlers &lt;/em&gt;abstract class.&lt;/p&gt;  &lt;p&gt;The VC adapter also needs:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;em&gt;IServerPathTranslationService&lt;/em&gt;: Used to translate the path (i.e. directories and such) from other adapters to this adapter and visa versa. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_2_24.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_40.png" width="717" height="270" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;While the WIT adapter needs:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;em&gt;IConflictHandler&lt;/em&gt;: Provides support for handling conflicts during the migration. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_4_12.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_1_11.png" width="499" height="337" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So in both adapters you will need a minimum of 6 classes you will implement, excluding any extra ones you will need for your specific requirements.&lt;/p&gt;  &lt;p&gt;The core concepts of the adapters are all explained in the interfaces and so it appears that it is very simple to implement, and indeed it is – however there are some weird things which may catch you up which we will cover in detail in future posts.&lt;/p&gt;  &lt;h3&gt;TraceManager&lt;/h3&gt;  &lt;p&gt;Something very nice in the platform is the &lt;em&gt;TraceManager&lt;/em&gt; class which is really just a wrapper around &lt;em&gt;System.Diagnostics.Trace&lt;/em&gt; but it has some extras in that wrapper, such as being what is included in the console windows and log files. You will see this sprinkled through out my code because it is useful to to have when trying to debug later on. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;The &lt;em&gt;TraceManager&lt;/em&gt; puts all information written to it in the log files, so please make sure you do not put any sensitive information in there.&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=BT9NC8AsyqQ:Es1mXC8GblY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=BT9NC8AsyqQ:Es1mXC8GblY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=BT9NC8AsyqQ:Es1mXC8GblY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=BT9NC8AsyqQ:Es1mXC8GblY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=BT9NC8AsyqQ:Es1mXC8GblY:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=BT9NC8AsyqQ:Es1mXC8GblY:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=BT9NC8AsyqQ:Es1mXC8GblY:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=BT9NC8AsyqQ:Es1mXC8GblY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=BT9NC8AsyqQ:Es1mXC8GblY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=BT9NC8AsyqQ:Es1mXC8GblY:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/BT9NC8AsyqQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/how-create-adapter-tfs-integration-platform-part-iii-overview-adapters</feedburner:origLink></item><item><title>How to create an adapter for the TFS Integration Platform - Part II: Setup of the environment</title><link>http://feedproxy.google.com/~r/Sadev/~3/_VmUxtlImCM/how-create-adapter-tfs-integration-platform-part-ii-setup-environment</link><category>.NET</category><category>ALM</category><category>ALM Rangers</category><category>Development</category><category>SharePoint</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Wed, 26 May 2010 07:34:11 PDT</pubDate><guid isPermaLink="false">472 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Note: This post is part of a series and you can find the rest of the parts in the &lt;a href="/content/how-create-adapter-tfs-integration-platform-series-index" target="_blank"&gt;series index&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Getting started with the adapter development is not the easiest task because you are stuck a little in the wild, so this part will serve as as a quick start guide for getting what you need to become a &lt;a href="http://tfsintegration.codeplex.com/" target="_blank"&gt;TFS Integration Platform&lt;/a&gt; developer.&lt;/p&gt;  &lt;h3&gt;SQL Server&lt;/h3&gt;  &lt;p&gt;The TFS Integration Platform requires Microsoft SQL Server so you need to install an instance of that.&lt;/p&gt;  &lt;h3&gt;TFS&lt;/h3&gt;  &lt;p&gt;It goes without saying, or maybe it doesn’t, that if you plan to write an adapter to integrate to TFS you will need TFS. Even if you don’t care about TFS, you will want to test and the TFS 2010 adapters are of the highest quality and so they make a great test target (so testing between your adapter and TFS). Thankfully with TFS 2010 you can now &lt;a href="http://www.sadev.co.za/content/installing-tfs-2010-basic-laptop" target="_blank"&gt;install on Windows 7 natively&lt;/a&gt; so this means as a developer you can have a great easy environment. &lt;/p&gt;  &lt;h3&gt;Target system (SharePoint for me)&lt;/h3&gt;  &lt;p&gt;Since I was developing for SharePoint that meant I needed a SharePoint installation, which meant a 20Gb Windows 7 Virtual Machine :( Hopefully for you this will be less of an issue. &lt;/p&gt;  &lt;h3&gt;TFS Integration Platform&lt;/h3&gt;  &lt;p&gt;The TFS Integration Platform, is a software component and database which runs on your machine and handles the actual moving of data around. You can get it from &lt;a title="http://tfsintegration.codeplex.com/releases" href="http://tfsintegration.codeplex.com/releases"&gt;http://tfsintegration.codeplex.com/releases&lt;/a&gt; - however it may not be obvious which is the one you want since the team has so many download options, you want the tools:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_2_23.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_39.png" width="201" height="300" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;During install you will get an option to install the service, which is recommended for production environments when you want to have the synchronisation running continuously. However for development this is not needed. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Power Tip:&lt;/strong&gt; Once you have completed the tools install, go into to SQL Server and backup the &lt;em&gt;TFSIntegrationPlatform&lt;/em&gt; database immediately. There are not only a few odd bugs that roam around the platform (it’s still in beta) which may cause you to need a restore of the database but if you want to test on a clean environment then a restore is quicker than a reinstall.&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;Platform Source&lt;/h3&gt;  &lt;p&gt;To build adapters you will also need the source code for the TFS Integration Platform which you can also get from CodePlex. Best is to get the latest drop of the code which you can get from the &lt;a href="http://tfsintegration.codeplex.com/SourceControl/list/changesets" target="_blank"&gt;Source Control&lt;/a&gt; page and then by clicking on the Download link in the latest version box on the far right. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_4_11.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_1_10.png" width="282" height="101" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In there you will find the IntegrationPlatform folder which contains all the code from Microsoft.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_6_7.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_2_7.png" width="425" height="250" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Power Tip: &lt;/strong&gt;Make a common root for the TFS code and yours (in my case I used &lt;em&gt;RangersCode&lt;/em&gt;) and then create sub directories in there for platform and your code (so I had&lt;em&gt; My Production&lt;/em&gt; and &lt;em&gt;MS production &lt;/em&gt;folders under &lt;em&gt;RangersCode&lt;/em&gt;). This helps keep the items close, which makes things easier later plus keeps them separate so you can identify them.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The code itself is for Visual Studio 2008, however you can be just like me and use Visual Studio 2010 and it will work just fine. Once you have done all of this you are finally ready for writing your adapter!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=_VmUxtlImCM:9fS-GItdiIo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=_VmUxtlImCM:9fS-GItdiIo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=_VmUxtlImCM:9fS-GItdiIo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=_VmUxtlImCM:9fS-GItdiIo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=_VmUxtlImCM:9fS-GItdiIo:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=_VmUxtlImCM:9fS-GItdiIo:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=_VmUxtlImCM:9fS-GItdiIo:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=_VmUxtlImCM:9fS-GItdiIo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=_VmUxtlImCM:9fS-GItdiIo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=_VmUxtlImCM:9fS-GItdiIo:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/_VmUxtlImCM" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/how-create-adapter-tfs-integration-platform-part-ii-setup-environment</feedburner:origLink></item><item><title>How to create an adapter for the TFS Integration Platform - Part I: Introduction</title><link>http://feedproxy.google.com/~r/Sadev/~3/1IOcS-oU8TU/how-create-adapter-tfs-integration-platform-part-i-introduction</link><category>.NET</category><category>ALM</category><category>ALM Rangers</category><category>Development</category><category>SharePoint</category><category>Tools &amp; Apps</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Tue, 25 May 2010 05:29:16 PDT</pubDate><guid isPermaLink="false">471 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Note: This post is part of a series and you can find the rest of the parts in the &lt;a href="/content/how-create-adapter-tfs-integration-platform-series-index" target="_blank"&gt;series index&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Since September 2009 I have been engaged in a &lt;a href="http://tinyurl.com/almrangers" target="_blank"&gt;ALM Rangers&lt;/a&gt; project, namely the &lt;a href="http://tfsintegration.codeplex.com/" target="_blank"&gt;TFS Integration Platform&lt;/a&gt;. Which is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The TFS Integration Platform is a project developed by the Team Foundation Server (TFS) product group and the &lt;a href="http://tfsintegration.codeplex.com/#Rangers"&gt;Visual Studio ALM Rangers&lt;/a&gt; to facilitate the development of tools that integrate TFS with other systems. Currently, the scope of this project is to enable TFS to integrate with other version control and work-item/bug tracking systems, but the eventual goal of this project is to enable integration with a broader range of tools/systems (i.e. build). This platform enables the development of two major classifications of tools: tools that move data unidirectionally into TFS, and tools that synchronize data bidirectionally. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So in short it is a integration system, like BizTalk or SSIS but specially built for version control and work items. I have not said TFS there because, it can work to migrate between other source control and work item systems provided adapters exist. Adapters are the logic which allows the TFS platform to connect to a variety of technologies, and my goal has been to build two of them – one for SharePoint lists and one for SharePoint document libraries. &lt;/p&gt;  &lt;p&gt;You may have noticed that SharePoint isn’t a version control or work item system, so why integrate? Well lots of companies do use it for ALM related items, such as the lists being used for tracking work items and the document libraries are used to store content which should be in a source control system. This is the first post in a series which will give you an idea of what is involved in building adapters, show you what to avoid and hopefully give you a few laughs at my expense.&amp;#160; &lt;/p&gt;  &lt;p&gt;Now I want to be clear this series will not covering usage of the platform or any of the core concepts in it. For those please see the links below in particular Willy-Peter’s blog. You do need to understand a bit about how the platform works before you attempt to build your own adapter.&lt;/p&gt;  &lt;p&gt;As all my work was done for the ALM Rangers the source code for my adapters is included in the code which can be obtained from the CodePlex site.&lt;/p&gt;  &lt;p&gt;To help you on your way let’s list a few links which are key for this:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;MSDN home page: &lt;a title="http://msdn.microsoft.com/en-us/vstudio/bb840033.aspx" href="http://msdn.microsoft.com/en-us/vstudio/bb840033.aspx"&gt;http://msdn.microsoft.com/en-us/vstudio/bb840033.aspx&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;CodePlex Project home page: &lt;a title="http://tfsintegration.codeplex.com" href="http://tfsintegration.codeplex.com"&gt;http://tfsintegration.codeplex.com&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/willy-peter_schaub" target="_blank"&gt;Willy-Peter&lt;/a&gt; Schaub’s blog: &lt;a title="http://blogs.msdn.com/willy-peter_schaub/" href="http://blogs.msdn.com/willy-peter_schaub/"&gt;http://blogs.msdn.com/willy-peter_schaub/&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;MSDN Forums for the Platform: &lt;a title="http://social.msdn.microsoft.com/Forums/en-US/tfsintegration" href="http://social.msdn.microsoft.com/Forums/en-US/tfsintegration"&gt;http://social.msdn.microsoft.com/Forums/en-US/tfsintegration&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=1IOcS-oU8TU:Y93DY6TDlVY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=1IOcS-oU8TU:Y93DY6TDlVY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=1IOcS-oU8TU:Y93DY6TDlVY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=1IOcS-oU8TU:Y93DY6TDlVY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=1IOcS-oU8TU:Y93DY6TDlVY:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=1IOcS-oU8TU:Y93DY6TDlVY:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=1IOcS-oU8TU:Y93DY6TDlVY:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=1IOcS-oU8TU:Y93DY6TDlVY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=1IOcS-oU8TU:Y93DY6TDlVY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=1IOcS-oU8TU:Y93DY6TDlVY:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/1IOcS-oU8TU" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/how-create-adapter-tfs-integration-platform-part-i-introduction</feedburner:origLink></item><item><title>.NET 4 Baby Steps: Part XIII - Tiny steps</title><link>http://feedproxy.google.com/~r/Sadev/~3/qh82_JWUQPM/net-4-baby-steps-part-xiii-tiny-steps</link><category>.NET</category><category>ALM</category><category>Development</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Wed, 19 May 2010 02:15:41 PDT</pubDate><guid isPermaLink="false">469 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;&lt;a href="http://www.sadev.co.za/files/07042010191_2.jpg" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="07042010191" border="0" alt="07042010191" align="right" src="http://www.sadev.co.za/files/07042010191_thumb.jpg" width="212" height="282" /&gt;&lt;/a&gt; Note: This post is part of a series and you can find the rest of the parts in the &lt;a href="/content/net-4-baby-steps-series-index" target="_blank"&gt;series index&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;There is a bunch of tiny additions in .NET 4 which I have not covered yet, this post provides a quick hit list of some of the new and improved features:&lt;/p&gt;  &lt;h3&gt;New&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/new_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="new" border="0" alt="new" src="http://www.sadev.co.za/files/new_thumb.png" width="33" height="17" /&gt;&lt;/a&gt; StringBuilder.Clear: Quick method to clear a string builder. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/new_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="new" border="0" alt="new" src="http://www.sadev.co.za/files/new_thumb.png" width="33" height="17" /&gt;&lt;/a&gt; StopWatch.Reset: Quick method to reset a stop watch timer. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/new_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="new" border="0" alt="new" src="http://www.sadev.co.za/files/new_thumb.png" width="33" height="17" /&gt;&lt;/a&gt; IntPtr &amp;amp; UIntPtr: Both have had two new methods added, one for addition and one for subtraction. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/new_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="new" border="0" alt="new" src="http://www.sadev.co.za/files/new_thumb.png" width="33" height="17" /&gt;&lt;/a&gt; Thread.Yield: Allows you to yield execution to another thread that is ready to run on the current processor. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/new_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="new" border="0" alt="new" src="http://www.sadev.co.za/files/new_thumb.png" width="33" height="17" /&gt;&lt;/a&gt; System.Guid: Has got two new methods, TryParse and TryParseExact to allow for testing of the parsing. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/new_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="new" border="0" alt="new" src="http://www.sadev.co.za/files/new_thumb.png" width="33" height="17" /&gt;&lt;/a&gt; Microsoft.Win32.RegistryView: This allows you to request 64bit or 32bit views of the registry. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/new_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="new" border="0" alt="new" src="http://www.sadev.co.za/files/new_thumb.png" width="33" height="17" /&gt;&lt;/a&gt; Environment: Now contains two properties to identify 64bit scenarios:       &lt;ul&gt;       &lt;li&gt;Is64BitOperatingSystem: To identify if the OS is 64bit. &lt;/li&gt;        &lt;li&gt;Is64BitProcess: To identify if the process is 64bit. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/new_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="new" border="0" alt="new" src="http://www.sadev.co.za/files/new_thumb.png" width="33" height="17" /&gt;&lt;/a&gt; System.Net.Mail.SmtpClient: Support for SSL &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Improved&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/better_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="better" border="0" alt="better" src="http://www.sadev.co.za/files/better_thumb.png" width="41" height="17" /&gt;&lt;/a&gt; Path.Combine: A new method overload to allow you to combine file paths. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/better_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="better" border="0" alt="better" src="http://www.sadev.co.za/files/better_thumb.png" width="41" height="17" /&gt;&lt;/a&gt; Compression.DeflateStream &amp;amp; Compression.GZipSteam: They have been improved so that they so no try to compress already compressed data. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/better_2_0.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="better" border="0" alt="better" src="http://www.sadev.co.za/files/better_thumb_0.png" width="41" height="17" /&gt;&lt;/a&gt; Compression.DeflateStream &amp;amp; Compression.GZipSteam: The 4Gb size limit has been removed. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/better_2_0.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="better" border="0" alt="better" src="http://www.sadev.co.za/files/better_thumb_0.png" width="41" height="17" /&gt;&lt;/a&gt; Monitor.Enter: A new overload has been added which allows you to pass in a reference boolean which returns true of the monitor was successfully entered. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/better_2_0.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="better" border="0" alt="better" src="http://www.sadev.co.za/files/better_thumb_0.png" width="41" height="17" /&gt;&lt;/a&gt; Microsoft.Win32.RegistryOptions: Now includes an option to specify a volatile key which is removed when the system restarts. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/better_2_0.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="better" border="0" alt="better" src="http://www.sadev.co.za/files/better_thumb_0.png" width="41" height="17" /&gt;&lt;/a&gt; Registry keys are no longer limited to 255 characters. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/better_2_0.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="better" border="0" alt="better" src="http://www.sadev.co.za/files/better_thumb_0.png" width="41" height="17" /&gt;&lt;/a&gt; System.Net.Mail.MaiMessage: Support for new headers       &lt;ul&gt;       &lt;li&gt;HeadersEncoding: Sets the type of text encoding used in the mail header. &lt;/li&gt;        &lt;li&gt;ReplyToList: Sets the list of addresses to use when replying to a mail. This replaces ReplyTo which only supported one email address. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/better_2_0.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="better" border="0" alt="better" src="http://www.sadev.co.za/files/better_thumb_0.png" width="41" height="17" /&gt;&lt;/a&gt; System.Net.NetworkCredential: To improve security passwords can now be stored in a SecureString. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/better_2_0.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="better" border="0" alt="better" src="http://www.sadev.co.za/files/better_thumb_0.png" width="41" height="17" /&gt;&lt;/a&gt; ASP.NET Hashing: The default value has been changed from SHA1 to SHA256. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/better_2_0.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="better" border="0" alt="better" src="http://www.sadev.co.za/files/better_thumb_0.png" width="41" height="17" /&gt;&lt;/a&gt; ASP.NET Output caching: Previously setting the output cache to &lt;em&gt;ServerAndClient &lt;/em&gt;also required calling &lt;em&gt;SetOmitVaryStar&lt;/em&gt; to ensure it would be cached on the client. From .NET 4, calling of &lt;em&gt;SetOmitVaryStar&lt;/em&gt; is no longer needed. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/better_2_0.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="better" border="0" alt="better" src="http://www.sadev.co.za/files/better_thumb_0.png" width="41" height="17" /&gt;&lt;/a&gt; TimeZoneInfo.Local &amp;amp; DateTime.Now: Both of these follow the OS daylight savings settings rather than using the .NET Framework settings. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/better_2_0.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="better" border="0" alt="better" src="http://www.sadev.co.za/files/better_thumb_0.png" width="41" height="17" /&gt;&lt;/a&gt; When running on Windows 7, locale info will be retrieved from the OS rather than being stored in the framework. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/better_2_0.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="better" border="0" alt="better" src="http://www.sadev.co.za/files/better_thumb_0.png" width="41" height="17" /&gt;&lt;/a&gt; Support for all 1400 characters of Unicode 5.1. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sadev.co.za/files/better_2_0.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="better" border="0" alt="better" src="http://www.sadev.co.za/files/better_thumb_0.png" width="41" height="17" /&gt;&lt;/a&gt; ServiceInstaller.DelayedAutoStart: If you on a more modern OS (Vista, Win 7 etc…) then you can services can start as &lt;em&gt;Automatic Delayed.&lt;/em&gt; This means they start, but after system boot so that the user gets in quickly. This is now possible for your .NET apps using the DelayedAutoStart property. &lt;/li&gt; &lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=qh82_JWUQPM:SuoHbFr-YhM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=qh82_JWUQPM:SuoHbFr-YhM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=qh82_JWUQPM:SuoHbFr-YhM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=qh82_JWUQPM:SuoHbFr-YhM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=qh82_JWUQPM:SuoHbFr-YhM:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=qh82_JWUQPM:SuoHbFr-YhM:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=qh82_JWUQPM:SuoHbFr-YhM:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=qh82_JWUQPM:SuoHbFr-YhM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=qh82_JWUQPM:SuoHbFr-YhM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=qh82_JWUQPM:SuoHbFr-YhM:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/qh82_JWUQPM" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/net-4-baby-steps-part-xiii-tiny-steps</feedburner:origLink></item><item><title>.NET 4 Baby Steps: Part XII - Numbers</title><link>http://feedproxy.google.com/~r/Sadev/~3/-YOdfPVTjQ8/net-4-baby-steps-part-xii-numbers</link><category>.NET</category><category>ALM</category><category>Development</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Tue, 18 May 2010 00:32:58 PDT</pubDate><guid isPermaLink="false">468 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;&lt;a href="http://www.sadev.co.za/files/22032010170_2.jpg" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="22032010170" border="0" alt="22032010170" align="right" src="http://www.sadev.co.za/files/22032010170_thumb.jpg" width="311" height="234" /&gt;&lt;/a&gt; Note: This post is part of a series and you can find the rest of the parts in the &lt;a href="/content/net-4-baby-steps-series-index" target="_blank"&gt;series index&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;A new namespace has arrived in .NET 4 for those who spend a lot of time with numbers, &lt;em&gt;System.Numerics&lt;/em&gt; which has two classes: &lt;em&gt;BigInteger &lt;/em&gt;and &lt;em&gt;Complex&lt;/em&gt; – and they are exactly what they say they are. &lt;em&gt;BigInteger&lt;/em&gt; is for big integers and &lt;em&gt;Complex&lt;/em&gt; is complicated ;)&lt;/p&gt;  &lt;h3&gt;BigInteger&lt;/h3&gt;  &lt;p&gt;&lt;em&gt;BigInteger&lt;/em&gt; is a class, not a type (like &lt;em&gt;float&lt;/em&gt;), which allows you to have an integer with no theoretical upper and lower limits! Why is that cool? think about &lt;em&gt;Int64&lt;/em&gt; which can do up to: 9,223,372,036,854,775,807. If you have an &lt;em&gt;Int64&lt;/em&gt; which has that massive value, and you add one to it, the &lt;em&gt;Int64&lt;/em&gt; it overflows and becomes -9,223,372,036,854,775,806. That is not possible with &lt;em&gt;BigInt&lt;/em&gt; since it has no upper limit!&lt;/p&gt;  &lt;p&gt;Being a class means it has methods and properties you can use too, for example some of the properties&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;em&gt;IsZero&lt;/em&gt;: Tells you if it equals zero. &lt;/li&gt;    &lt;li&gt;&lt;em&gt;IsEven&lt;/em&gt;: Tells you if it is an even number. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;An example of using it:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;BigInteger firstBigInt = new BigInteger(Int64.MaxValue);
BigInteger secondBigInt = new BigInteger(Int64.MaxValue);

Console.WriteLine(&amp;quot;First BigInt is even? {0}&amp;quot;, firstBigInt.IsEven);
Console.WriteLine(&amp;quot;First BigInt = 1? {0}&amp;quot;, firstBigInt.IsOne);
Console.WriteLine(&amp;quot;First BigInt is power of twp? {0}&amp;quot;, firstBigInt.IsPowerOfTwo);
Console.WriteLine(&amp;quot;First BigInt = 0? {0}&amp;quot;, firstBigInt.IsZero);
Console.WriteLine(&amp;quot;First BigInt is positive (1), zero (0), or negative (-1)? {0}&amp;quot;, firstBigInt.Sign);
Console.WriteLine(&amp;quot;{0} multipled by {0} is {1}&amp;quot;, Int64.MaxValue, BigInteger.Multiply(firstBigInt, secondBigInt));&lt;/pre&gt;

&lt;p&gt;You can also use the standard operators (-, +, * etc…) with it.&lt;/p&gt;

&lt;p&gt;This gives the following output (look at the size of the number from the multiplication!):&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_2_22.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_38.png" width="495" height="122" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;BigRational&lt;/h3&gt;

&lt;p&gt;What if you want to work with rational numbers with no limits, rather than integers? Then you can use the BigRational class the BCL team has made available at &lt;a title="http://bcl.codeplex.com/" href="http://bcl.codeplex.com/"&gt;http://bcl.codeplex.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Complex&lt;/h3&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A complex number is a number that comprises a real number part and an imaginary number part. A complex number z is usually written in the form z = x + yi, where x and y are real numbers, and i is the imaginary unit that has the property i2 = -1.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That snippet is the first line from the documentation on&lt;em&gt; System.Numeric.Complex&lt;/em&gt; and unfortunately I am not smart enough to know what they are talking about. So who should understand this? &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Electrical engineers: Using &lt;em&gt;Complex &lt;/em&gt;they can do the following: Resistance(R) and Reactance(X) to calculate the impedance Z.&lt;/li&gt;

  &lt;li&gt;Mathematicians: Vector Calculus as well as Graphs.&lt;/li&gt;

  &lt;li&gt;People using positional (mapping) info: X, Y coordinates on a&amp;#160; map or 2d plane.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;For an example I will just wimp out and show you what the MSDN documentation has:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;// Create a complex number by calling its class constructor.
Complex c1 = new Complex(12, 6);
Console.WriteLine(c1);

// Assign a Double to a complex number.
Complex c2 = 3.14;
Console.WriteLine(c2);

// Cast a Decimal to a complex number.
Complex c3 = (Complex)12.3m;
Console.WriteLine(c3);

// Assign the return value of a method to a Complex variable.
Complex c4 = Complex.Pow(Complex.One, -1);
Console.WriteLine(c4);

// Assign the value returned by an operator to a Complex variable.
Complex c5 = Complex.One + Complex.One;
Console.WriteLine(c5);

// Instantiate a complex number from its polar coordinates.
Complex c6 = Complex.FromPolarCoordinates(10, .524);
Console.WriteLine(c6);&lt;/pre&gt;

&lt;p&gt;That produces: &lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.sadev.co.za/files/image_4_10.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.sadev.co.za/files/image_thumb_1_9.png" width="362" height="150" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Some info on complex is from: &lt;a title="http://www.dotnetspider.com/resources/36681-Examples-On-Complex-Class-C-New-Feature.aspx" href="http://www.dotnetspider.com/resources/36681-Examples-On-Complex-Class-C-New-Feature.aspx"&gt;http://www.dotnetspider.com/resources/36681-Examples-On-Complex-Class-C-New-Feature.aspx&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=-YOdfPVTjQ8:peulq-F0xdc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=-YOdfPVTjQ8:peulq-F0xdc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=-YOdfPVTjQ8:peulq-F0xdc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=-YOdfPVTjQ8:peulq-F0xdc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=-YOdfPVTjQ8:peulq-F0xdc:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=-YOdfPVTjQ8:peulq-F0xdc:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=-YOdfPVTjQ8:peulq-F0xdc:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=-YOdfPVTjQ8:peulq-F0xdc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=-YOdfPVTjQ8:peulq-F0xdc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=-YOdfPVTjQ8:peulq-F0xdc:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/-YOdfPVTjQ8" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/net-4-baby-steps-part-xii-numbers</feedburner:origLink></item><item><title>.NET 4 Baby Steps - Part XI: Special folders</title><link>http://feedproxy.google.com/~r/Sadev/~3/251PaS8qEBk/net-4-baby-steps-part-xi-special-folders</link><category>.NET</category><category>ALM</category><category>Development</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Mon, 17 May 2010 04:18:27 PDT</pubDate><guid isPermaLink="false">467 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;&lt;a href="http://www.sadev.co.za/files/15052010218_2.jpg" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="15052010218" border="0" alt="15052010218" align="right" src="http://www.sadev.co.za/files/15052010218_thumb.jpg" width="332" height="250" /&gt;&lt;/a&gt; Note: This post is part of a series and you can find the rest of the parts in the &lt;a href="/content/net-4-baby-steps-series-index" target="_blank"&gt;series index&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;h3&gt;Environment.SpecialFolder&lt;/h3&gt;  &lt;p&gt;If you are building an application which takes advantage of special folders in Windows (special folders are folders like My Documents), you will be happy to know that .NET 4 has expanded the number of special folders it support, by adding 25 new options to the Environment.SpecialFolder enum.&lt;/p&gt;  &lt;p&gt;The new options are: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;AdminTools &lt;/li&gt;    &lt;li&gt;CDBurning &lt;/li&gt;    &lt;li&gt;CommonAdminTools &lt;/li&gt;    &lt;li&gt;CommonDesktopDirectory &lt;/li&gt;    &lt;li&gt;CommonDocuments &lt;/li&gt;    &lt;li&gt;CommonMusic &lt;/li&gt;    &lt;li&gt;CommonOemLinks &lt;/li&gt;    &lt;li&gt;CommonPictures &lt;/li&gt;    &lt;li&gt;CommonProgramFilesX86 &lt;/li&gt;    &lt;li&gt;CommonPrograms &lt;/li&gt;    &lt;li&gt;CommonStartMenu &lt;/li&gt;    &lt;li&gt;CommonStartup &lt;/li&gt;    &lt;li&gt;CommonTemplates &lt;/li&gt;    &lt;li&gt;CommonVideos &lt;/li&gt;    &lt;li&gt;Fonts &lt;/li&gt;    &lt;li&gt;LocalizedResources &lt;/li&gt;    &lt;li&gt;MyVideos &lt;/li&gt;    &lt;li&gt;NetworkShortcuts &lt;/li&gt;    &lt;li&gt;PrinterShortcuts &lt;/li&gt;    &lt;li&gt;ProgramFilesX86 &lt;/li&gt;    &lt;li&gt;Resources &lt;/li&gt;    &lt;li&gt;SystemX86 &lt;/li&gt;    &lt;li&gt;Templates &lt;/li&gt;    &lt;li&gt;UserProfile &lt;/li&gt;    &lt;li&gt;Windows &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Usage is: &lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.MyVideos));&lt;/pre&gt;

&lt;h3&gt;GetFolderPath&lt;/h3&gt;

&lt;p&gt;The GetFolderPath method has also gotten an update with a new overload which takes a second enum, SpecialFolderOption. This has three values&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;None: Returns the path, but does not verify whether the path exists. If the folder is located on a network, specifying this option can reduce lag time. &lt;/li&gt;

  &lt;li&gt;Create: Verifies the folder path. If the folder does not exist, an empty string is returned. This is the default behavior. &lt;/li&gt;

  &lt;li&gt;DoNotVerify: Forces the folder to be created if it does not already exist. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Super fast network option:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.MyVideos, Environment.SpecialFolderOption.None));&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=251PaS8qEBk:3SbmgB5yA9k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=251PaS8qEBk:3SbmgB5yA9k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=251PaS8qEBk:3SbmgB5yA9k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=251PaS8qEBk:3SbmgB5yA9k:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=251PaS8qEBk:3SbmgB5yA9k:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=251PaS8qEBk:3SbmgB5yA9k:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=251PaS8qEBk:3SbmgB5yA9k:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=251PaS8qEBk:3SbmgB5yA9k:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=251PaS8qEBk:3SbmgB5yA9k:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=251PaS8qEBk:3SbmgB5yA9k:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/251PaS8qEBk" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/net-4-baby-steps-part-xi-special-folders</feedburner:origLink></item><item><title>Visual Studio ALM Ranger Champions for 2010!</title><link>http://feedproxy.google.com/~r/Sadev/~3/WGoGADWbQos/visual-studio-alm-ranger-champions-2010</link><category>ALM Rangers</category><category>Microsoft</category><category>Personal</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert MacLean</dc:creator><pubDate>Fri, 14 May 2010 00:48:07 PDT</pubDate><guid isPermaLink="false">466 at http://www.sadev.co.za</guid><description>&lt;p&gt;&lt;a href="http://www.sadev.co.za/files/CLIPART_OF_13161_SM_2.jpg" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Group of Blue Men Tossing Another Into the Air Clipart Illustration" border="0" alt="Group of Blue Men Tossing Another Into the Air Clipart Illustration" align="right" src="http://www.sadev.co.za/files/CLIPART_OF_13161_SM_thumb.jpg" width="151" height="192" /&gt;&lt;/a&gt; I am a proud contributor to the Microsoft Visual Studio &lt;a href="http://tinyurl.com/almrangers" target="_blank"&gt;ALM Rangers&lt;/a&gt; (see &lt;a href="/content/rangers-sabbatical-part-1-prologue" target="_blank"&gt;this post&lt;/a&gt; for who they are) and each year, the Rangers have a vote for who they believe are helping the Rangers initiatives the most. The top four from the votes are honoured with the title of Champion! I was &lt;a href="/content/note-worthy" target="_blank"&gt;honoured in 2009&lt;/a&gt; to be included in the list of the four champions and even more honoured that I have again been listed in the top 4! &lt;/p&gt;  &lt;p&gt;Congrats to the other three champions and especially to Mathias Olausson, who was also re-awarded!&lt;/p&gt;  &lt;p&gt;For more details on the latest Rangers champions see: &lt;a title="http://blogs.msdn.com/willy-peter_schaub/archive/2010/05/12/external-visual-studio-alm-rangers-the-votes-have-been-tallied-and-the-2010-champions-are-have-been-known.aspx" href="http://blogs.msdn.com/willy-peter_schaub/archive/2010/05/12/external-visual-studio-alm-rangers-the-votes-have-been-tallied-and-the-2010-champions-are-have-been-known.aspx"&gt;http://blogs.msdn.com/willy-peter_schaub/archive/2010/05/12/external-visual-studio-alm-rangers-the-votes-have-been-tallied-and-the-2010-champions-are-have-been-known.aspx&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=WGoGADWbQos:5wPCW1dG5co:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=WGoGADWbQos:5wPCW1dG5co:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=WGoGADWbQos:5wPCW1dG5co:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=WGoGADWbQos:5wPCW1dG5co:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=WGoGADWbQos:5wPCW1dG5co:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=WGoGADWbQos:5wPCW1dG5co:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=WGoGADWbQos:5wPCW1dG5co:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=WGoGADWbQos:5wPCW1dG5co:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?i=WGoGADWbQos:5wPCW1dG5co:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sadev?a=WGoGADWbQos:5wPCW1dG5co:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sadev?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sadev/~4/WGoGADWbQos" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.sadev.co.za/content/visual-studio-alm-ranger-champions-2010</feedburner:origLink></item></channel></rss>
