<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Eric Lee - A Humble Blog</title><link>http://blogs.msdn.com/ericlee/default.aspx</link><description>All things Visual Studio Team System and Team Foundation Server</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>My blog has moved</title><link>http://blogs.msdn.com/ericlee/archive/2007/01/02/my-blog-has-moved.aspx</link><pubDate>Wed, 03 Jan 2007 00:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1400218</guid><dc:creator>ericlee</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ericlee/comments/1400218.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlee/commentrss.aspx?PostID=1400218</wfw:commentRss><description>&lt;P&gt;Hey guys,&lt;/P&gt;
&lt;P&gt;To better coincide with my company, my blog has moved to &lt;A href="http://blogs.counterpunchsoftware.com/"&gt;http://blogs.counterpunchsoftware.com&lt;/A&gt;; I hope to see you at that new location!&lt;/P&gt;
&lt;P&gt;Thanks,&lt;/P&gt;
&lt;P&gt;Eric.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1400218" width="1" height="1"&gt;</description></item><item><title>Apologies, forgot to include a file in my Hemi distribution</title><link>http://blogs.msdn.com/ericlee/archive/2006/11/20/apologies-forgot-to-include-a-file-in-my-hemi-distribution.aspx</link><pubDate>Mon, 20 Nov 2006 22:56:27 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1110591</guid><dc:creator>ericlee</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ericlee/comments/1110591.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlee/commentrss.aspx?PostID=1110591</wfw:commentRss><description>&lt;p&gt;Hey guys,&lt;/p&gt;
&lt;p&gt;Sorry, in my Hemi tool, I&amp;rsquo;m using a 3rd party control from Component One.&amp;nbsp; I have a license for their tools and they allow redistribution.&amp;nbsp; The file you need is located here: &lt;a href="http://www.counterpunchsoftware.com/downloads/C1.Win.C1FlexGrid.2.zip"&gt;C1.Win.C1FlexGrid.2.zip&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to Grant for spotting this so quickly.&lt;/p&gt;
&lt;p&gt;Eric.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1110591" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlee/archive/tags/Team+Foundation+Server/default.aspx">Team Foundation Server</category><category domain="http://blogs.msdn.com/ericlee/archive/tags/Visual+Studio+Team+System/default.aspx">Visual Studio Team System</category></item><item><title>Work Item Moving Tool is back!</title><link>http://blogs.msdn.com/ericlee/archive/2006/11/20/work-item-moving-tool-is-back.aspx</link><pubDate>Mon, 20 Nov 2006 12:35:45 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1107861</guid><dc:creator>ericlee</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/ericlee/comments/1107861.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlee/commentrss.aspx?PostID=1107861</wfw:commentRss><description>&lt;p&gt;Hey guys, I've finally had a chance to update my work item moving tool to work with the RTM release of Team Foundation Server. Along the way, I made some modifications and changes that I've wanted to do for a while. I haven't thought of a better name than 'work item mover' so for now I've code-named it if you will 'Hemi'. &lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve posted the tool to:&amp;nbsp;&lt;a href="http://www.counterpunchsoftware.com/downloads/hemi.release.zip"&gt;http://www.counterpunchsoftware.com/downloads/hemi.release.zip&lt;/a&gt;.&amp;nbsp; You&amp;rsquo;ll also need: &lt;a href="http://www.counterpunchsoftware.com/downloads/C1.Win.C1FlexGrid.2.zip"&gt;C1.Win.C1FlexGrid.2.zip&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;I included the Team Foundation Server binaries that it depends on, but the best way to run the tool is just to run Hemi.exe from the Visual Studio Tools Command Prompt.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hemi" src="http://www.london54.com/blog_images/hemi.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Hemi starts up and looks as follows:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.london54.com/blog_images/hemi1.png"&gt;&lt;img alt="Hemi1" src="http://www.london54.com/blog_images/hemi1_thumb.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m thinking about using a MDI type of interface in the future; that would enable you to save and re-run moves that you might do on a regular basis.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;To start moving work items, the first thing to do is use the File menu&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hemi2" src="http://www.london54.com/blog_images/hemi2.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;This starts the various stages involved in moving work items from one team project to another.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.london54.com/blog_images/hemi3.png"&gt;&lt;img alt="Hemi3" src="http://www.london54.com/blog_images/hemi3_thumb.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The first thing to do is pick the Team Foundation Server that you want to access.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hemi3a" src="http://www.london54.com/blog_images/hemi3a.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Depending on the authentication that you are using, you may get prompted for credentials.&amp;nbsp; Once you&amp;rsquo;ve chosen a Team Foundation Server, the next step is to select the work items that you want to move.&amp;nbsp; This is done by selecting a Team Foundation Server Query.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hemi5" src="http://www.london54.com/blog_images/hemi5.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Pressing this button will bring up the same work item query control that is used in the Excel integration.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;img alt="Hemi6" src="http://www.london54.com/blog_images/hemi6.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Once you select a query, press the Find button on this dialog to bring up the actual work items.&amp;nbsp; Press OK and you&amp;rsquo;ve established the work items that you are going to move.&amp;nbsp; Now select the Team Project to move these work items to.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hemi7" src="http://www.london54.com/blog_images/hemi7.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Once you&amp;rsquo;ve done that, press Next to move on to the next stage.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hemi8" src="http://www.london54.com/blog_images/hemi8.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Any query that you might use might encompass a few different work item types, so in this stage, you&amp;rsquo;ll decide how to map those work item types to the Team Project you are moving the work items to.&amp;nbsp; In most cases, you&amp;rsquo;ll probably move the work items to the same type in the other Team Project.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;img alt="Hemi9" src="http://www.london54.com/blog_images/hemi9.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;But, sometimes work item types are defined differently.&amp;nbsp; For example, in a CMMI project, a bug is defined with two required fields &amp;ndash; Symptoms and Steps to Reproduce.&amp;nbsp; These fields aren&amp;rsquo;t required in an Agile project.&amp;nbsp; So, this stage also gives you the chance to fill these missing values in.&amp;nbsp; Press the Check for Missing Values to see what these missing values are.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hemi10" src="http://www.london54.com/blog_images/hemi10.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;If there are any, enter values into the table.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hemi12" src="http://www.london54.com/blog_images/hemi12.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Press Next to move on to the next stage and actually move your work items.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.london54.com/blog_images/hemi13.png"&gt;&lt;img alt="Hemi13" src="http://www.london54.com/blog_images/hemi13_thumb.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This stage shows you what work items will be moved, as well give you a couple of options for your original work items.&amp;nbsp; Team Foundation Server doesn&amp;rsquo;t support deleting work items, so your original work items will still exist.&amp;nbsp; By default, Hemi will create a Moved state for these work items and assign them to that state.&amp;nbsp; Also, it will create links between the original work items and their new copies, and vice versa.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.london54.com/blog_images/hemi15.png"&gt;&lt;img alt="Hemi15" src="http://www.london54.com/blog_images/hemi15_thumb.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Once you move to the next stage, your move will be committed!&amp;nbsp; &lt;/p&gt;
&lt;p&gt;If you look at your original work items, what you should see is that it is in a Moved state:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hemi16" src="http://www.london54.com/blog_images/hemi16.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;And also, your original work item will be linked to the new one, and vice versa.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hemi17" src="http://www.london54.com/blog_images/hemi17.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Anyways, I hope you find Hemi useful &amp;ndash; if you run into any bugs or have suggestions, please let me know.&amp;nbsp; Either through this blog or email me at &lt;a href="mailto:eric@counterpunchsoftware.com"&gt;eric@counterpunchsoftware.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;
&lt;p&gt;Eric.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1107861" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlee/archive/tags/Team+Foundation+Server/default.aspx">Team Foundation Server</category><category domain="http://blogs.msdn.com/ericlee/archive/tags/Visual+Studio+Team+System/default.aspx">Visual Studio Team System</category></item><item><title>A change of address of sorts...</title><link>http://blogs.msdn.com/ericlee/archive/2006/11/08/a-change-of-address-of-sorts.aspx</link><pubDate>Wed, 08 Nov 2006 18:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1036448</guid><dc:creator>ericlee</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ericlee/comments/1036448.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlee/commentrss.aspx?PostID=1036448</wfw:commentRss><description>&lt;P&gt;Hey guys,&lt;/P&gt;
&lt;P&gt;Well, the time has come.&lt;/P&gt;
&lt;P&gt;After 8 years at Microsoft, I've decided to pursue a long-time dream of running my own business.&amp;nbsp; My new venture will be in a Seattle-based consulting company, CounterPunch Software (&lt;A href="http://www.counterpunchsoftware.com/" mce_href="http://www.counterpunchsoftware.com/"&gt;www.counterpunchsoftware.com&lt;/A&gt;).&amp;nbsp; Not surprisingly we (or more accurately I) will be focusing on Microsoft technologies and solutions.&amp;nbsp; My last day at Microsoft will be towards the end of November.&lt;/P&gt;
&lt;P&gt;Not too much will change blog-wise – I believe that I am still allowed to have my blog on MSDN so I’ll keep it here.&amp;nbsp; MSDN has been pretty good to me, and I’m loathe to change my blogjet settings &lt;IMG src="http://www.london54.com/blog_images/smile1.gif" mce_src="http://www.london54.com/blog_images/smile1.gif"&gt;&lt;/P&gt;
&lt;P&gt;I will always look back on the past 8 years with fond memories.&amp;nbsp; I'll apologize for not thanking everyone individually, but I've enjoyed the tremendous privilege of working with, and learning from, some of the smartest and most passionate people imaginable.&amp;nbsp; For that, I'll always be grateful.&lt;/P&gt;
&lt;P&gt;It's a cliché of course, but it really does seem like yesterday when I walked into building 44 to start my first day at Microsoft.&amp;nbsp; At the time, I thought I was joining what was then known as the Visual Interdev team, little did I know that I had already experienced my first re-org and had been transferred to the Visual J++ team :)&amp;nbsp; In any case, it all worked out very well &lt;IMG src="http://www.london54.com/blog_images/smile1.gif" mce_src="http://www.london54.com/blog_images/smile1.gif"&gt;&lt;/P&gt;
&lt;P&gt;I’ve always been very passionate about Microsoft products – particularly, but not limited to, developer tools – and the folks who use them.&amp;nbsp; I think, and hope that my new venture will allow me to get closer to that.&lt;/P&gt;
&lt;P&gt;My new email address is &lt;A href="mailto:eric@counterpunchsoftware.com" mce_href="mailto:eric@counterpunchsoftware.com"&gt;eric@counterpunchsoftware.com&lt;/A&gt;.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Anyways, just a personal update &lt;IMG src="http://www.london54.com/blog_images/smile1.gif" mce_src="http://www.london54.com/blog_images/smile1.gif"&gt;&lt;/P&gt;
&lt;P&gt;Thanks!&lt;/P&gt;
&lt;P&gt;Eric.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1036448" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlee/archive/tags/Me/default.aspx">Me</category></item><item><title>Windows Vista for Extreme Programming?</title><link>http://blogs.msdn.com/ericlee/archive/2006/10/24/windows-vista-for-extreme-programming.aspx</link><pubDate>Wed, 25 Oct 2006 05:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:870969</guid><dc:creator>ericlee</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ericlee/comments/870969.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlee/commentrss.aspx?PostID=870969</wfw:commentRss><description>&lt;P&gt;Hey guys,&lt;/P&gt;
&lt;P&gt;As you can probably tell, the bright shiny lights of the soon-to-be-released products like Windows Vista and Office 2007 have caught my eye lately.&amp;nbsp; I promise I’ll be back to Team Foundation Server blogging soon.&lt;/P&gt;
&lt;P&gt;I’ve been playing with a feature in Windows Vista that I thought might be useful for development teams who are practicing Extreme Programming.&amp;nbsp; The feature is called Windows Meeting Space and is one of the out-of-the-box applications that takes advantage of Windows Vista Peer-to-Peer networking and more specifically, People Near Me.&lt;/P&gt;
&lt;P&gt;Both Peer-to-Peer networking and People Near Me are vast areas that I don’t fully understand; Justin Smith does a nice job of talking about the technology in his recent MSDN &lt;A href="http://msdn.microsoft.com/msdnmag/issues/06/10/peertopeer/default.aspx" mce_href="http://msdn.microsoft.com/msdnmag/issues/06/10/peertopeer/default.aspx"&gt;article&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;In terms of leveraging what is already there, Windows Meeting Space struck me as an easier to use netmeeting/netsharing/livemeeting technology.&amp;nbsp; It seems perfectly suited for a quick code review, or paired programming session.&lt;/P&gt;
&lt;P&gt;I found Windows Meeting Space from the handy search dialog in the start menu:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.london54.com/blog_images/wms1.png" mce_href="http://www.london54.com/blog_images/wms1.png"&gt;&lt;IMG alt=Wms1 src="http://www.london54.com/blog_images/wms1.png" border=0 mce_src="http://www.london54.com/blog_images/wms1.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Starting a meeting is pretty easy – easier than most of the Microsoft collaboration tools I’ve used.&amp;nbsp; Basically pick a name and a password.&amp;nbsp; I like how Windows Meeting Space puts the time into your name automatically.&amp;nbsp; You could also search for existing meetings.&amp;nbsp; Let’s say that we’ll create a code review meeting.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.london54.com/blog_images/wms2.png" mce_href="http://www.london54.com/blog_images/wms2.png"&gt;&lt;IMG alt=Wms2 src="http://www.london54.com/blog_images/wms2.png" border=0 mce_src="http://www.london54.com/blog_images/wms2.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Once created, you can invite people from the menu.&amp;nbsp; This is where People Near Me (PNM) comes into play.&amp;nbsp; PNM is supposed to search your subnet for peopled who have chosen to broadcast their identity.&amp;nbsp; From this list, you can invite people to join your meeting.&amp;nbsp; It might have been because of mismatching versions of Vista, a weird network connection, or something else, but I was never able to get a list populated with people near me.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.london54.com/blog_images/wms3.png" mce_href="http://www.london54.com/blog_images/wms3.png"&gt;&lt;IMG alt=Wms3 src="http://www.london54.com/blog_images/wms3.png" border=0 mce_src="http://www.london54.com/blog_images/wms3.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;In any case, you can use the “&lt;STRONG&gt;Invite others…”&lt;/STRONG&gt; button to create an invitation file that you email around.&amp;nbsp; Or, people in your network can use Windows Meeting Space to find this meeting, and invite themselves.&amp;nbsp; For example, on my other Windows Vista machine, I’m running Windows Meeting Space and I can see this meeting we’ve just created:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.london54.com/blog_images/wms4.png" mce_href="http://www.london54.com/blog_images/wms4.png"&gt;&lt;IMG alt=Wms4 src="http://www.london54.com/blog_images/wms4.png" border=0 mce_src="http://www.london54.com/blog_images/wms4png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Suppose that we were given the password out of band, we’re able to join this meeting.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.london54.com/blog_images/wms5.png" mce_href="http://www.london54.com/blog_images/wms5.png"&gt;&lt;IMG alt=Wms5 src="http://www.london54.com/blog_images/wms5.png" border=0 mce_src="http://www.london54.com/blog_images/wms5.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Now we can start some sharing and do our code review.&amp;nbsp; If you press the sharing icon in the meeting, you get a choice of what kinds of applications you want to share.&amp;nbsp; The PNM API supports a way to determine whether the attendees of your meeting have the same application or not.&amp;nbsp; In our case, since we are doing a code review, we’ll share Visual Studio.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Wms6 src="http://www.london54.com/blog_images/wms6.png" border=0 mce_src="http://www.london54.com/blog_images/wms6.png"&gt;&lt;/P&gt;
&lt;P&gt;As the person you initiated the sharing, you see a subtle tool bar in your desktop that says you are doing the sharing.&amp;nbsp; You have the option of stopping your sharing, pausing it and even sending it to a projector.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Wms7 src="http://www.london54.com/blog_images/wms7.png" border=0 mce_src="http://www.london54.com/blog_images/wms7.png"&gt;&lt;/P&gt;
&lt;P&gt;On the other side, for the folks who are attending the meeting, they see Visual Studio embedded into their meeting space window.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.london54.com/blog_images/wms8.png" mce_href="http://www.london54.com/blog_images/wms8.png"&gt;&lt;IMG alt=Wms8 src="http://www.london54.com/blog_images/wms8.png" border=0 mce_src="http://www.london54.com/blog_images/wms8.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;The image of VS that I have there is really squeezed, it is because I only have 1 monitor, so I have to show both my host VS instance as well as my shared one on the same real estate. &lt;/P&gt;
&lt;P&gt;Anyone in the meeting can request control of the application and make code changes, comments etc.&lt;/P&gt;
&lt;P&gt;None of this is necessarily anything new – you could always share with LiveMeeting and Remote Assistance and what not, but somehow Windows Meeting Spaces feels easier to use than all of those technologies.&amp;nbsp; I like that you don’t have to explicitly send out invitations if you don’t want to; you can just search on your network for a meeting to join.&amp;nbsp; Also, I like that there is an API underneath the covers; in theory you could build this type of sharing into right your application.&amp;nbsp; For example, for Visual Studio, maybe you could setup sharing for individual document windows or something?&lt;/P&gt;
&lt;P&gt;In any case, I thought this might be an interestig feature in Windows Vista, so I thought I would share.&lt;/P&gt;
&lt;P&gt;Thanks!&lt;/P&gt;
&lt;P&gt;Eric&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=870969" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlee/archive/tags/Windows+Vista/default.aspx">Windows Vista</category></item><item><title>Fixed my images and uploaded the Exchange sample code...</title><link>http://blogs.msdn.com/ericlee/archive/2006/10/24/fixed-my-images-and-uploaded-the-exchange-sample-code.aspx</link><pubDate>Tue, 24 Oct 2006 22:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:870034</guid><dc:creator>ericlee</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ericlee/comments/870034.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlee/commentrss.aspx?PostID=870034</wfw:commentRss><description>&lt;P&gt;Not sure what happened, but it seems like &lt;A href="http://blogjet.com/" mce_href="http://blogjet.com/"&gt;BlogJet&lt;/A&gt; is struggling with my build of Vista.&amp;nbsp; In any case, my images are fixed up and I posted the full sample code &lt;A href="http://www.london54.com/blog/exchange.zip" mce_href="http://www.london54.com/blog/exchange.zip"&gt;here&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Thanks!&lt;/P&gt;
&lt;P&gt;Eric&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=870034" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlee/archive/tags/Exchange+Server+2007/default.aspx">Exchange Server 2007</category></item><item><title>Ugh, messed up my images...</title><link>http://blogs.msdn.com/ericlee/archive/2006/10/22/ugh-messed-up-my-images.aspx</link><pubDate>Mon, 23 Oct 2006 07:56:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:859619</guid><dc:creator>ericlee</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ericlee/comments/859619.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlee/commentrss.aspx?PostID=859619</wfw:commentRss><description>&lt;p&gt;Apologies, I seem to have hosed something on my hosting site.&amp;nbsp; Other than today, all of the images from my posts seem to be gone; hopefully I&amp;rsquo;ll have things up and running again soon.&lt;/p&gt;
&lt;p&gt;Thanks,&lt;/p&gt;
&lt;p&gt;Eric&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=859619" width="1" height="1"&gt;</description></item><item><title>Exchange Server 2007 Web Service API for Developers!</title><link>http://blogs.msdn.com/ericlee/archive/2006/10/22/exchange-server-2007-for-developers.aspx</link><pubDate>Mon, 23 Oct 2006 06:33:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:859117</guid><dc:creator>ericlee</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/ericlee/comments/859117.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlee/commentrss.aspx?PostID=859117</wfw:commentRss><description>&lt;P&gt;Hey guys,&lt;/P&gt;
&lt;P&gt;Exchange is a Microsoft technology that I’ve used everyday for email, but never really delved into as a developer.&amp;nbsp; I’ve been working on some Office 2007 stuff, so I figured I would give it a try.&lt;/P&gt;
&lt;P&gt;I was absolutely knocked out by how much you can do as a developer with Exchange Server 2007.&amp;nbsp; There are a number of things, but what really caught my eye was the Web Service API.&lt;/P&gt;
&lt;P&gt;I’ve experimented with CDO and MAPI a little bit in the past, but I’ve always struggled with it.&amp;nbsp; It was always a struggle to download the version of CDO/MAPI that matched my server; and even the most trivial task like sending an email seemed really difficult.&lt;/P&gt;
&lt;P&gt;But, with Exchange Server 2007, you can access a wide range of its functionality through its web service API.&amp;nbsp; I didn’t find a lot of documentation about the API – a lot of it seems to be a work in progress – but I managed to get some of it working, so I wanted to share what I’ve learned.&lt;/P&gt;
&lt;P&gt;First, I downloaded Exchange Server 2007 from &lt;A href="http://www.microsoft.com/technet/prodtechnol/exchange/2007/downloads/beta.mspx" mce_href="http://www.microsoft.com/technet/prodtechnol/exchange/2007/downloads/beta.mspx"&gt;http://www.microsoft.com/technet/prodtechnol/exchange/2007/downloads/beta.mspx&lt;/A&gt;.&amp;nbsp; The installation was relatively painless.&amp;nbsp; The setup is quite good, there were a few prerequisites that I didn’t have, so I was notified and had a chance to restart the setup.&lt;/P&gt;
&lt;P&gt;The exchange web service is located at &lt;A href="http://%3cyourserver%3e/EWS/Exchange.asmx" mce_href="http://%3cyourserver%3e/EWS/Exchange.asmx"&gt;http://&amp;lt;yourserver&amp;gt;/EWS/Exchange.asmx&lt;/A&gt;, so you can literally just add a web reference to that URL and get a proxy class generated for you.&lt;/P&gt;
&lt;P&gt;The main proxy class is &lt;STRONG&gt;ExchangeServiceBinding&lt;/STRONG&gt;, you can instantiate it just like any other web proxy class.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Exchange1 src="http://www.london54.com/blog_images/exchange1.png" border=0 mce_src="http://www.london54.com/blog_images/exchange1.png"&gt;&lt;/P&gt;
&lt;P&gt;The exercise I took myself through was fairly straightforward – what I wanted to do was to expand a distribution list to see who belonged to that list.&amp;nbsp; For each person on that list, I want to check their availability.&amp;nbsp; In other words, I want to see if they are available for a 1–hour meeting today.&lt;/P&gt;
&lt;P&gt;The first thing to do is to expand out the distribution alias – Exchange Server 2007 has a web method to do exactly this, so it is just a matter of making the call.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Exchange2 src="http://www.london54.com/blog_images/exchange2.png" border=0 mce_src="http://www.london54.com/blog_images/exchange2.png"&gt;&lt;/P&gt;
&lt;P&gt;You’ll notice something about the Exchange&amp;nbsp;Server 2007 API that you may love, or you may hate.&amp;nbsp; Notice that the &lt;STRONG&gt;ExpandDL&lt;/STRONG&gt; takes a single parameter – an instance of &lt;STRONG&gt;ExpandDLType.&amp;nbsp; &lt;/STRONG&gt;That type contains members for all of the information that &lt;STRONG&gt;ExpandDL &lt;/STRONG&gt;might need as input.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;In my experience, there are essentially two main schools of thought about how to define a Web Service API.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;One school of thought is to develop web service methods just like they are ‘regular’ methods.&amp;nbsp; For example, if a web service method needs 4 parameters for input, that web service method signature would have 4 parameters.&amp;nbsp; It is pretty intuitive for developers to use a Web Service API like that.&lt;/P&gt;
&lt;P&gt;Another school of thought is to develop web service methods as though they were endpoints to which documents were submitted.&amp;nbsp; I was introduced to this approach when I was a developer on the UDDI feature in Windows Server 2003.&amp;nbsp; That is how we defined our web service API.&amp;nbsp; There are pros and cons to this approach.&amp;nbsp; When you take this approach, you typically start designing the web service method from the XSD schema onwards.&amp;nbsp; When you have to worry about interoperability, this isn’t a bad approach at all.&amp;nbsp; When I worked in UDDI, we worked with other companies to be sure that our UDDI implementatio would work with theirs.&amp;nbsp; Whenever we met, we would work on defining just the XML schema.&amp;nbsp; That helped because some companies used Java, some script and we used .NET to implement our version of UDDI.&amp;nbsp; It would have been difficult to talk about programming interfaces since there were so many in play.&amp;nbsp; What is also helpful about this approach is that you can use XSD schema validation to do some basic parameter checking.&amp;nbsp; For example, consider the following XSD type:&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Exchange3 src="http://www.london54.com/blog_images/exchange3.png" border=0 mce_src="http://www.london54.com/blog_images/exchange3.png"&gt;&lt;/P&gt;
&lt;P&gt;Exchange Server 2007 uses this type&amp;nbsp;as a return value of sorts when&amp;nbsp;you make a request&amp;nbsp;to see a user’s oof (out of office) settings.&amp;nbsp; It’s funny to see a relatively colloquial term like OOF make it into the API of a enterprise messaging solution &lt;IMG src="http://www.london54.com/blog_images/smile1.gif" mce_src="http://www.london54.com/blog_images/smile1.gif"&gt;&amp;nbsp; Anyways, the author of this API is using XSD and its ‘minOccurs’ and ‘maxOccurs’ operators to define what is essentially the post-condition the operation to retrieve&amp;nbsp;a user’s oof.&lt;/P&gt;
&lt;P&gt;This can be good for both the producer and consumer of the API.&amp;nbsp; For someone who is looking to use this API, the XSD gives them an idea of what to expect as a return value.&amp;nbsp; When you have detailed documentation, this isn’t a big deal, but when you have a new API like with Exchange Server 2007, reading the XSD is critical.&amp;nbsp; For someone who is developing this API, there is validation that is usually done on the outgoing end of the web service.&amp;nbsp; Each outgoing message (i.e.&amp;nbsp;GetUserOofSettingsResponse) is validated against its schema.&amp;nbsp; If it violates something, it is returning something the user is not expecting, so it fails.&amp;nbsp; Essentially, you are checking against the contract you agreed upon with your intended caller.&lt;/P&gt;
&lt;P&gt;This approach was really helpful for us in UDDI because our shared UDDI specification was always changing.&amp;nbsp; What we did was put XSD schema validation on the incoming and outgoing ends of our web service.&amp;nbsp; Whenever we got a UDDI message, we validated it against schema before we passed it on to the appropriate method (ASP.NET allows you a hook to do this before it delegates to the appropriate web method).&amp;nbsp; If the incoming message didn’t pass validation, that meant it would give our actual method trouble of some sort.&amp;nbsp; Either the signature didn’t match, or the expected parameters changed.&amp;nbsp; In any case, if the message failed validation, we threw an exception right away.&amp;nbsp; On the outgoing end, we validated each response message we sent against its schema.&amp;nbsp; If something failed validation, that&amp;nbsp;meant whatever we were returning was not what was expected by our caller.&amp;nbsp; Again, we threw an exception in this case.&amp;nbsp; Whenever our UDDI specification changed, we just uploaded the new XSD schemas in our system.&amp;nbsp; Whenever the UDDI design committee decided that a given parameter&amp;nbsp;must occur at least once, but not more than 5 times for example, they put it into the XSD.&amp;nbsp; And through XSD validation, our code automatically checked for that condition.&amp;nbsp; That saved us from spending a lot time writing and changing our input and output validation code.&lt;/P&gt;
&lt;P&gt;All that said, there are drawbacks to this approach as well.&amp;nbsp; Mainly, it feels weird if you’re coming from a pure programming perspective, and instantiating a bunch of composite classes can be a pain&amp;nbsp;&lt;IMG src="http://www.london54.com/blog_images/smile1.gif" mce_src="http://www.london54.com/blog_images/smile1.gif"&gt;&amp;nbsp; Once you get used to it though, it’s not so bad.&lt;/P&gt;
&lt;P&gt;OK, enough about XSD and web service API design methodologies and back to Exchange Server 2007.&amp;nbsp; Once you make the call to expand the DL, you basically get back a set of email addresses (sort of).&lt;/P&gt;
&lt;P&gt;What you get back at first is a collection of response messages.&amp;nbsp; I’m not sure when there will be more than one response to your request, maybe if there are clustered/linked Exchange servers.&amp;nbsp; In any case, in any given response, there is a collection of email addresses.&amp;nbsp; The double loop to go through this looks like:&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Exchange4 src="http://www.london54.com/blog_images/exchange4.png" border=0 mce_src="http://www.london54.com/blog_images/exchange4.png"&gt;&lt;/P&gt;
&lt;P&gt;I should mention, I don’t work at a fashion design firm – the context of the code being shown is for a demonstration that I’m working on &lt;IMG src="http://www.london54.com/blog_images/smile1.gif" mce_src="http://www.london54.com/blog_images/smile1.gif"&gt;&lt;/P&gt;
&lt;P&gt;What our inner loop, as illustrated above, is working through is each member of our distribution list.&amp;nbsp; Each member may be a person or another distribution list itself.&amp;nbsp; I didn’t write this code, but what we should do is check for the type of member that we got back.&amp;nbsp; There is an enumerated type on &lt;STRONG&gt;EmailAddressType &lt;/STRONG&gt;that we can check for:&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Exchange6 src="http://www.london54.com/blog_images/exchange6.png" border=0 mce_src="http://www.london54.com/blog_images/exchange6.png"&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;If this is another DL, I suppose you might want to go through and recursively expand each one.&amp;nbsp; We won’t do that in this simple example, so let’s assume that each member we get back is just a person and not another DL.&lt;/P&gt;
&lt;P&gt;If that’s the case, the only thing we need to do is define what our meeting time looks like:&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Exchange7 src="http://www.london54.com/blog_images/exchange7.png" border=0 mce_src="http://www.london54.com/blog_images/exchange7.png"&gt;&lt;/P&gt;
&lt;P&gt;And make the call to check the user’s availability.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Exchange8 src="http://www.london54.com/blog_images/exchange8.png" border=0 mce_src="http://www.london54.com/blog_images/exchange8.png"&gt;&lt;/P&gt;
&lt;P&gt;I skipped some of the plumbing code – mostly setting up some of the parameter types.&amp;nbsp; I’m having some trouble with my FTP server, but I’ll post the rest of my code tomorrow.&lt;/P&gt;
&lt;P&gt;That’s about it – the next thing I’d like to look at is actually creating some lists and folders in Exchange 2007.&lt;/P&gt;
&lt;P&gt;Thanks!&lt;/P&gt;
&lt;P&gt;Eric&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=859117" width="1" height="1"&gt;</description></item><item><title>Presentation/Demo Tips</title><link>http://blogs.msdn.com/ericlee/archive/2006/10/17/presentation-demo-tips.aspx</link><pubDate>Tue, 17 Oct 2006 11:03:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:834239</guid><dc:creator>ericlee</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ericlee/comments/834239.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlee/commentrss.aspx?PostID=834239</wfw:commentRss><description>&lt;P&gt;Hey guys,&lt;/P&gt;
&lt;P&gt;When I first started at Microsoft 8 years ago, I was an awful presenter.&amp;nbsp; I hardly made any eye contact and I spoke really, really, really fast.&amp;nbsp; Over the years, I’ve had some training by some really good instructors and gotten a lot of practice.&amp;nbsp; Now I like to think of speaking as one of my strong points.&lt;/P&gt;
&lt;P&gt;Mentally, I’ve been keeping a little list of tips and tricks – many of which have come from fellow speakers – that have helped me.&amp;nbsp; I thought I would share some of them in this post.&amp;nbsp; A lot has to do with doing technical demos since&amp;nbsp;I feel like that is one of my strong points in any presentation I do.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;&lt;U&gt;Make sure the audience can see what you’re doing&lt;/U&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;It can be really hard for an audience to see things on the screen when you’re doing a demo;&amp;nbsp;particularly in a complicated&amp;nbsp;user interface like Visual Studio.&amp;nbsp; There are some things you can do, and utilities that you can use to help them out.&amp;nbsp; &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.sysinternals.com/Utilities/ZoomIt.html" mce_href="http://www.sysinternals.com/Utilities/ZoomIt.html"&gt;ZoomIt&lt;/A&gt;&amp;nbsp;is a great tool for zooming in on specific parts of Visual Studio (thanks for the tip &lt;STRONG&gt;Martin Woodward&lt;/STRONG&gt;!)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Try the following from &lt;STRONG&gt;Tools -&amp;gt; Options &lt;/STRONG&gt;in Visual Studio&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;In the &lt;STRONG&gt;Environment-&amp;gt;Fonts and Colors &lt;/STRONG&gt;setting, make the&amp;nbsp;text editor font use at least size &lt;STRONG&gt;16&lt;/STRONG&gt;&amp;nbsp;and change the font to &lt;STRONG&gt;Lucida Console &lt;/STRONG&gt;(I find this font shows the larger text better).&amp;nbsp; Try to make this change before you speak because the first time you access the &lt;STRONG&gt;Fonts and Colors &lt;/STRONG&gt;settings it takes a long, long time.&lt;/LI&gt;
&lt;LI&gt;Turn your system font up to &lt;STRONG&gt;Large&lt;/STRONG&gt; from the properties of your Windows desktop.&amp;nbsp; The Visual Studio tool windows will pick up this larger font.&amp;nbsp; Make sure to test all the windows that you are going to show since some VS windows don’t handle the large system font that well.&amp;nbsp; You might have to restart Visual Studio as well.&lt;/LI&gt;
&lt;LI&gt;Try hiding as many tool bars as possible to keep Visual Studio from looking cluttered.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;&lt;U&gt;Keep things snappy&lt;/U&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Performance is always important for any demo that you might do.&amp;nbsp; It goes without saying to get a machine with as much RAM and CPU horsepower as possible; here are some of my other favorite tips.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;If you’re running a Virtual PC or Virtual Server, a secondary hard drive is an absolute must.&amp;nbsp; Virtual PC and Virtual Server are really IO intensive, so if you run a virtual image on the same hard drive as your native operating system, you will get a lot of contention on that drive.&amp;nbsp; Another hard drive, either native in your computer or USB does wonders.&lt;/LI&gt;
&lt;LI&gt;Buy as much RAM as you can afford/fit into your machine – at least 2 GB is ideal&lt;/LI&gt;
&lt;LI&gt;Try to use fast hard drives, at least 7200 RPM.&lt;/LI&gt;
&lt;LI&gt;I’m&amp;nbsp;addicted to&amp;nbsp;defragging my VPC drive – I do this after almost every time I run a virtual PC image.&amp;nbsp; The built-in defrag utility in Windows is pretty good.&amp;nbsp; The commercial product from &lt;A href="http://www.diskeeper.com/products/products.asp" mce_href="http://www.diskeeper.com/products/products.asp"&gt;Diskeeper&lt;/A&gt;&amp;nbsp;seems to defrag faster and can be put on a schedule.&amp;nbsp; I’m not sure if it does a better job or not.&amp;nbsp; I’ve also used a free tool from &lt;A href="http://www.flexomizer.com/PermaLink,guid,ce99367e-158c-487a-879d-b32145cc1957.aspx" mce_href="http://www.flexomizer.com/PermaLink,guid,ce99367e-158c-487a-879d-b32145cc1957.aspx"&gt;http://www.flexomizer.com/PermaLink,guid,ce99367e-158c-487a-879d-b32145cc1957.aspx&lt;/A&gt;.&amp;nbsp; That tool probably takes the longest, but does the best job I’ve seen.&amp;nbsp; Thanks to &lt;STRONG&gt;David Whitney&lt;/STRONG&gt; for writing this tool!&amp;nbsp; &lt;/LI&gt;
&lt;LI&gt;There are tons of ways to optimize your VPC images themselves.&amp;nbsp; A good document can be found at: &lt;A href="http://blogs.msdn.com/nolansax/attachment/700992.ashx" mce_href="http://blogs.msdn.com/nolansax/attachment/700992.ashx"&gt;http://blogs.msdn.com/nolansax/attachment/700992.ashx&lt;/A&gt;.&amp;nbsp; These tips really do make a big, big difference in performance.&lt;/LI&gt;
&lt;LI&gt;Before you finalize your VPC image, try running &lt;A href="http://www.ccleaner.com/" mce_href="http://www.ccleaner.com/"&gt;CCleaner&lt;/A&gt;.&amp;nbsp; This handy tool cleans up IE history, old setup files and a bunch of other bits of data cluttering up your system.&lt;/LI&gt;
&lt;LI&gt;If you can, don’t use differencing drives – they are really handy, but they eat up your performance.&lt;/LI&gt;
&lt;LI&gt;If you can, don’t enable undo drives – again, undo drives are super handy, but they do eat up performance.&amp;nbsp; Despite this, I tend to run with undo drives enabled.&lt;/LI&gt;
&lt;LI&gt;If you turn off themes in the VPC OS, or set the UI to maximize performance, your image will run faster.&amp;nbsp; I don’t usually do this because I don’t like the way the display looks.&lt;/LI&gt;
&lt;LI&gt;For Visual Studio Team System demos, my colleague, &lt;STRONG&gt;Ajay Sudan&lt;/STRONG&gt; has a nice technique where he runs a Team Foundation Server in a VPC, but uses a natively installed Visual Studio to access it.&amp;nbsp; That’s a nice combination because you can’t beat running the client bits natively when it comes to performance.&lt;/LI&gt;
&lt;LI&gt;This can be time consuming, but I think it’s worth it.&amp;nbsp; If you’re showing Visual Studio, open up each file type (i.e. C# files, resource files, etc) and note what tool bars they enable in Visual Studio.&amp;nbsp; To maximize the perceived performance, close every tool bar that every document you are doing to show enables.&amp;nbsp; This way, when you switch from document to document in Visual Studio, there are no delays from drawing the tool bars.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT size=4&gt;&lt;U&gt;&lt;STRONG&gt;Slow Down!&lt;/STRONG&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;This is something that I use to really, really struggle with - trying to slow down my speaking pace.&amp;nbsp; What I’ve found is that I can’t just tell myself to slow down.&amp;nbsp; What I try to do is concentrate on maintaining my volume from end-to-end when I’m presenting.&amp;nbsp; One thing I’ll notice when I’m speaking quickly is that my voice tends to trail off at the end of a sentence.&amp;nbsp; This is usually because I’ve used one breath for the entire sentence and by the time I get to the end of that sentence, I’ve run out.&amp;nbsp; Using one breath for a sentence like that is usually a sign for me that I’m going too fast.&amp;nbsp; So, I concentrate on making sure I take a breath somewhere in the middle so that I can finish strong.&amp;nbsp;&amp;nbsp;To get that breath in, I’ll need to pause somewhere between my words.&amp;nbsp; With some practice, I’ve been able to take a quick breath and still sound like I’m speaking naturally.&amp;nbsp; That has really helped me slow down.&amp;nbsp; I’m still a fast speaker, and I probably always will be, but what I’ve found with trying to breath better is that I can make myself easier to understand.&lt;/P&gt;
&lt;P&gt;A funny thing to keep in mind is that I think that no matter how experienced of a speaker you are, there is some inaccuracy in how you&amp;nbsp;perceive yourself and how your audience perceives you.&amp;nbsp; This is particularly true for pace.&amp;nbsp; What tends to happen is that when&amp;nbsp;you’re trying to&amp;nbsp;slow down your pace a bit on stage, your brain will tell you that you’re speaking way too slowly and that you sound like an idiot.&amp;nbsp; In reality, you sound perfectly normal to your audience.&amp;nbsp; This is where video tape comes in handy.&amp;nbsp; What I’ve done in the past is record myself speaking at various speeds.&amp;nbsp; I’ll go really, really slow; so slow that I can barely take it &lt;IMG src="http://www.london54.com/blog_images/smile1.gif" mce_src="http://www.london54.com/blog_images/smile1.gif"&gt;&amp;nbsp;and then go watch myself on tape.&amp;nbsp; What I’ve noticed is that you can go really, really really slow and feel awkward doing it, but it looks and sound perfectly normal.&amp;nbsp; I didn’t have to do this too many times before&amp;nbsp;I got a better at gauging my actual pace versus my perceived pace. &lt;/P&gt;
&lt;P&gt;All that said, the last thing you want to do is stretch out every single word and put your audience to sleep.&amp;nbsp; Varying your pace is always good and makes you sound (and be) much more a genuine speaker.&amp;nbsp; If you’re excited about something, let yourself speak a bit faster, a bit louder.&amp;nbsp; Just be sure to slow down now and again when you wanto make a point or do a re-sync with the audience.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;&lt;U&gt;Enjoy Yourself&lt;/U&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;We’re lucky to be in an industry that is driven by so much passion.&amp;nbsp; If you’ve taken the time to put together a presentation, take the time to enjoy delivering it.&amp;nbsp; No matter how badly you think you did, chances are it wasn’t that bad.&amp;nbsp; Chances are, you did a good job.&amp;nbsp; In almost all cases, your audience wants you to succeed – so if you meet them 1/2 way, you’ll have done a nice job more times than not.&lt;/P&gt;
&lt;P&gt;Anyways, just some thoughts I wanted to share.&lt;/P&gt;
&lt;P&gt;Eric.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=834239" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlee/archive/tags/Misc/default.aspx">Misc</category></item><item><title>A diversion - Windows Live Alerts</title><link>http://blogs.msdn.com/ericlee/archive/2006/10/07/A-diversion-_2D00_-Windows-Live-Alerts.aspx</link><pubDate>Sun, 08 Oct 2006 04:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:803038</guid><dc:creator>ericlee</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ericlee/comments/803038.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlee/commentrss.aspx?PostID=803038</wfw:commentRss><description>&lt;P&gt;I’ve been poking around the Windows Live stuff for developers (&lt;A href="http://dev.live.com/" mce_href="http://dev.live.com/"&gt;http://dev.live.com&lt;/A&gt;) and someting caught my eye.&amp;nbsp; With Live Messenger (formerly MSN Messenger), you can sign up for, as well as provide Alerts.&amp;nbsp; These alerts get delivered to your device of choice (MSN Messenger, Phone, PDA, etc).&lt;/P&gt;
&lt;P&gt;One of my projects at work right now is to work on the keynote demo that will be delivered at Tech Ed Barcelona later this fall.&amp;nbsp; Not to give too much away, but one of the things we might try&amp;nbsp;to cover&amp;nbsp;is the developer angle for Windows Live.&amp;nbsp; So, I thought I would give this alerts thing a try.&lt;/P&gt;
&lt;P&gt;I went over to &lt;A href="http://signup.alerts.live.com/brochure/index.jsp" mce_href="http://signup.alerts.live.com/brochure/index.jsp"&gt;http://signup.alerts.live.com/brochure/index.jsp&lt;/A&gt;&amp;nbsp;and registered the RSS feed for my blog as a provider of alerts.&amp;nbsp; The sign-up experience was a pleasant surprise.&amp;nbsp; The form was pretty short and a few minutes after submitting it, I received an email with a confirmation link.&amp;nbsp; After clicking on the confirmation link, I received another email a few minutes later with the following image/link:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://signup.alerts.live.com/alerts/login.do?PINID=21987150&amp;amp;returnURL=http://blogs.msdn.com/ericlee" mce_href="http://signup.alerts.live.com/alerts/login.do?PINID=21987150&amp;amp;returnURL=http://blogs.msdn.com/ericlee"&gt;&lt;IMG alt="Windows Live Alerts" src="http://images.alerts.live.com/mcwebsite/graphics/blog/alert_signup_eng.gif" border=0 mce_src="http://images.alerts.live.com/mcwebsite/graphics/blog/alert_signup_eng.gif"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;If you&amp;nbsp;click on that link, you’ll have the option of signing up for alerts from my blog &lt;IMG src="http://www.london54.com/blog_images/smile1.gif" mce_src="http://www.london54.com/blog_images/smile1.gif"&gt;&lt;/P&gt;
&lt;P&gt;Oh one thing – you’ll notice that my alert is called ‘Fabrikam Design’ – I named it that to match the fictious company name we are using for the demo.&lt;/P&gt;
&lt;P&gt;Thanks,&lt;/P&gt;
&lt;P&gt;Eric.&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=803038" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlee/archive/tags/Misc/default.aspx">Misc</category></item><item><title>'Wall Time' as a way of determining correctness</title><link>http://blogs.msdn.com/ericlee/archive/2006/09/28/wall-time-as-a-way-of-determining-correctness.aspx</link><pubDate>Fri, 29 Sep 2006 01:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:776189</guid><dc:creator>ericlee</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ericlee/comments/776189.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlee/commentrss.aspx?PostID=776189</wfw:commentRss><description>&lt;P&gt;Quite a few years back, I joined the Windows Server 2003 team as a developer.&amp;nbsp; Windows Server 2003 is a massive organization – I was part of the UDDI team which resided under Directory Services.&lt;/P&gt;
&lt;P&gt;Our QA team had a suite of about 300 automated tests.&amp;nbsp; The collected the ‘wall time’ of a test run – so literally how many minutes/seconds it took for each test to run.&amp;nbsp; The ‘wall time’ amounts were aggregated into a test suite run time.&lt;/P&gt;
&lt;P&gt;When I first joined, that suite of tests was taking about 2 hours to complete.&amp;nbsp; That was a concern because the test suite used to only take about 20 minutes.&amp;nbsp; We used a homegrown solution to store our test data and this was 2002, so there was no SQL Server 2005 Business Intelligience to take advantage of &lt;IMG src="http://www.london54.com/blog_images/smile1.gif" mce_src="http://www.london54.com/blog_images/smile1.gif"&gt;&lt;/P&gt;
&lt;P&gt;My first task when I joined was to determine if there was a performance problem – the number of tests in the suite had increased, and so had our functionality – and if there was one, to fix it.&amp;nbsp; I spent a long while in our profiling tools (crude compared to what we have today) and tracked the problem down to a Thread.Sleep() that someone had accidently put in the code.&lt;/P&gt;
&lt;P&gt;What was ironic was that we had several unit tests that targetted that particular piece of code.&amp;nbsp; Looking back, at the test results for those unit tests, I could see that the ‘wall time’ for those tests had almost tripled.&amp;nbsp; On their own, these slower unit tests only added a little bit of time to the test run.&amp;nbsp; But when the Thread.Sleep() code those unit tests were targetting werer hit by our load/scalability tests, the slowdown because expontential. &lt;/P&gt;
&lt;P&gt;What we didn’t have then was a way to express how long a test was supposed to take.&amp;nbsp; We checked for return values, the presence of exceptions, etc, but we couldn’t say that&amp;nbsp;a test would fail if it took longer than some amount of time. &lt;/P&gt;
&lt;P&gt;This ‘timeout’ is something that is built into Visual Studio Team System.&amp;nbsp; If you look at the properties of a test, you’ll see a timeout property. &lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Image8 src="http://www.london54.com/blog_images/image8.png" border=0 mce_src="http://www.london54.com/blog_images/image8.png"&gt;&lt;/P&gt;
&lt;P&gt;The value of this property is a handy way to define the performance characteristics of a given test.&amp;nbsp; Run times will of course differ based on hardware, but this property is a good sanity test.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Thanks,&lt;/P&gt;
&lt;P&gt;Eric.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=776189" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlee/archive/tags/Visual+Studio+Team+System/default.aspx">Visual Studio Team System</category></item><item><title>Building development scorecards</title><link>http://blogs.msdn.com/ericlee/archive/2006/09/27/building-development-scorecards.aspx</link><pubDate>Thu, 28 Sep 2006 01:03:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:774494</guid><dc:creator>ericlee</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ericlee/comments/774494.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlee/commentrss.aspx?PostID=774494</wfw:commentRss><description>&lt;P&gt;Hey guys,&lt;/P&gt;
&lt;P&gt;Earlier this year, I did some blog posts about how to create key performance indicators (KPIs) based on the software development data that Team Foundation Server collects.&lt;/P&gt;
&lt;P&gt;There are numerous clients for those KPIs, but the one that is probably the most dedicated KPI client from Microsoft is &lt;A href="http://office.microsoft.com/en-us/FX012225041033.aspx" mce_href="http://office.microsoft.com/en-us/FX012225041033.aspx"&gt;Business Scorecard Manager (BSM)&lt;/A&gt;; with the upcoming Office 2007 release, this product will become a part of Microsoft Office PerformancePoint Server 2007.&amp;nbsp; The BSM team &lt;A href="http://blogs.msdn.com/bsm/default.aspx" mce_href="http://blogs.msdn.com/bsm/default.aspx"&gt;blog&lt;/A&gt;&amp;nbsp;has lots of great information about their product.&lt;/P&gt;
&lt;P&gt;Scorecards in general are interesting.&amp;nbsp; In just about any business, there are dozens, if not hundreds of data points to collect when trying to build an overall (or sub-overall &lt;IMG src="http://www.london54.com/blog_images/smile1.gif" mce_src="http://www.london54.com/blog_images/smile1.gif"&gt;) view of the business so somebody can make a decision.&amp;nbsp; One of my first projects when I joined Microsoft was to build a status collection and display web application for our QA team.&amp;nbsp; Team members would update the status of their test runs, and every week the managers would look at the overall status and decide on strategy.&amp;nbsp; That simple web site was in essence a score card.&amp;nbsp; Maintaining it was a pain, because different teams had different data formats and different preferences for updating their data.&amp;nbsp; Some didn’t want to use a web site, some did, etc.&lt;/P&gt;
&lt;P&gt;Gathering and displaying data from across many different teams and normalizing data formats is what Business Scorecard Manager does a really nice job of.&amp;nbsp; BSM takes KPI’s from various sources, including itself, and visualizes them in a consistent manner.&lt;/P&gt;
&lt;P&gt;Usually, BSM is shown in the context of business functions like sales and finance, but there is no reason not to use it for software development data as well.&lt;/P&gt;
&lt;P&gt;Let’s use the KPI’s from my earlier posts as an example.&amp;nbsp; Below is a screen shot of what one of them looks like inside the SQL Server 2005 KPI browser view.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Image12 src="http://www.london54.com/blog_images/image12.png" border=0 mce_src="http://www.london54.com/blog_images/image12.png"&gt;&lt;/P&gt;
&lt;P&gt;The first step is to import our SQL Server 2005 KPIs’ into a format that BSM understands.&amp;nbsp; The &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=556e01a4-49a2-4a61-bec5-0260b42dcf1b&amp;amp;DisplayLang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=556e01a4-49a2-4a61-bec5-0260b42dcf1b&amp;amp;DisplayLang=en"&gt;KPIUtil&lt;/A&gt;&amp;nbsp;from Microsoft Downloads does exactly this.&amp;nbsp; The instructions for the tool are excellent; basically you install the sample indicators and run the tool to import your KPIs from SQL Server 2005.&amp;nbsp; The first step is necessary to bring in the indicators that SQL Server KPIs have access to.&lt;/P&gt;
&lt;P&gt;After running KPIUtil, we will have access to our &lt;STRONG&gt;LeadTime&lt;/STRONG&gt; KPI inside of Business Scorecard Manager.&amp;nbsp; I just used one of the example workspaces (SalesSummary) from Business Scorecard Manager to augment.&amp;nbsp; In a real project, you would probably want to create your own workspace from scratch.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Image19 src="http://www.london54.com/blog_images/image19.png" border=0 mce_src="http://www.london54.com/blog_images/image19.png"&gt;&lt;/P&gt;
&lt;P&gt;A BSM scorecard can be published into many different forms.&amp;nbsp; One way is to publish the scorecard into Windows Sharepoint Services – BSM will automatically create, format and populate a WSS page for you.&amp;nbsp; Once published, this page will stay in sync with any changes that you might make to your scorecard.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Before adding our LeadTime KPI, the WSS page generated by the example Sales Summary score card looks like this:&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Image17 src="http://www.london54.com/blog_images/image17.png" border=0 mce_src="http://www.london54.com/blog_images/image17.png"&gt;&lt;/P&gt;
&lt;P&gt;Inserting a new KPI into the scorecard is pretty straightforward.&amp;nbsp; Objectives are used to organize data in your scorecard, so you might create an objective for tracking various KPIs for your software development.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Image20 src="http://www.london54.com/blog_images/image20.png" border=1 mce_src="http://www.london54.com/blog_images/image20.png"&gt;&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Image21 src="http://www.london54.com/blog_images/image21.png" border=1 mce_src="http://www.london54.com/blog_images/image21.png"&gt;&lt;/P&gt;
&lt;P&gt;There are various aspects of an objective that I can’t do justice to, so I’ll just add the LeadTime KPI to the objective we just created.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Image23 src="http://www.london54.com/blog_images/image23.png" border=1 mce_src="http://www.london54.com/blog_images/image23.png"&gt;&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Image26 src="http://www.london54.com/blog_images/image26.png" border=1 mce_src="http://www.london54.com/blog_images/image26.png"&gt;&lt;/P&gt;
&lt;P&gt;Once we re-publish this scorecard, our WSS page is updated as well, and we see our new KPI, displayed pretty much the same way as we saw in the SQL Server 2005 browser view:&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Image28 src="http://www.london54.com/blog_images/image28.png" border=0 mce_src="http://www.london54.com/blog_images/image28.png"&gt;&lt;/P&gt;
&lt;P&gt;I’m not sure that scorecarding is for everyone, but I think it might be more applicable than people think.&amp;nbsp; Whenever I walk through the hallways of our development team, or many others at Microsoft, I see monitors on the walls that show various charts and graphs tracking project progress.&amp;nbsp; Most of these systems are hand created and maintained.&amp;nbsp; I wonder if Business Scorecard Manager would be&amp;nbsp;a more efficient solution?&lt;/P&gt;
&lt;P&gt;In any case, I’m always on the look out for a technology that might make software development a little bit easier.&amp;nbsp; There is a lot of capabilities in the upcoming release of Office 2007, so I’m looking forward to doing more posts about that.&lt;/P&gt;
&lt;P&gt;Thanks!&lt;/P&gt;
&lt;P&gt;Eric.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=774494" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlee/archive/tags/Visual+Studio+Team+System/default.aspx">Visual Studio Team System</category></item><item><title>Building a Virtual Kanban System with Team Foundation Server - Part 1</title><link>http://blogs.msdn.com/ericlee/archive/2006/09/11/building-a-virtual-kanban-system-with-team-foundation-server-part-1.aspx</link><pubDate>Mon, 11 Sep 2006 23:11:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:749867</guid><dc:creator>ericlee</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ericlee/comments/749867.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlee/commentrss.aspx?PostID=749867</wfw:commentRss><description>&lt;P&gt;Hey guys,&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.agilemanagement.net/" mce_href="http://www.agilemanagement.net/"&gt;David Anderson&lt;/A&gt; is someone that I’ve had the privilege of working with for the past couple of years.&amp;nbsp; One of the things that I’ve&amp;nbsp;found really interesting about his work is that he often takes practices from other industries and applies them to managing software development.&lt;/P&gt;
&lt;P&gt;One example of his is the idea of a &lt;A href="http://en.wikipedia.org/wiki/Kanban" mce_href="http://en.wikipedia.org/wiki/Kanban"&gt;Kanban System&lt;/A&gt;.&amp;nbsp; Many Japanese manufacturing companies have used this process with great success.&amp;nbsp; The basic idea is to control the amount of raw material in play.&amp;nbsp; Wikipedia has a great explanation of the system in general.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;“The Kanban system might be visualised as a "Three bin system" - one bin on the factory floor, one bin in the factory store and one bin at the Suppliers' store. The bins usually have a removeable card that contains the product details and other relevant information - the Kanban card. When the bin on the shop floor is empty, the Kanban card is removed and given to the store. The store then replaces the bin on the factory floor with a full bin which also contains a removeable Kanban card. The store then contacts the Supplier and indicates the need to replenish the Kanban card. The product also containing a Kanban card is delivered into the factory store completing the final step to the system. So it will never run out of product, providing of course, the cards are reliably collected from empty containers”&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;David Anderson has had a lot of success applying&amp;nbsp;the principles of a Kanban System to software development.&amp;nbsp; It remarkable how effective a relatively lightweight process like a Kanban System can be; his &lt;A href="http://www.agilemanagement.net/Articles/Papers/AndersonDumitriuTOCICO2005_Final_NoAnim.pdf" mce_href="http://www.agilemanagement.net/Articles/Papers/AndersonDumitriuTOCICO2005_Final_NoAnim.pdf"&gt;paper&lt;/A&gt;&amp;nbsp;describes&amp;nbsp;in detail the success of a Microsoft IT team.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I won’t do justice to the work so I’ll leave it to you to read the paper; what I wanted to explore was how one might implement a Kanban System with Team Foundation Server.&lt;/P&gt;
&lt;P&gt;As I mentioned in one of my earlier posts, I think there might be some really interesting integration between BizTalk Server and Team Foundation Server.&amp;nbsp; BizTalk becomes really useful when you have to make a bunch of things and people interact in a reasonable and consistent way; otherwise referred to as orchestration &lt;IMG src="http://www.london54.com/blog_images/smile1.gif" mce_src="http://www.london54.com/blog_images/smile1.gif"&gt;&lt;/P&gt;
&lt;P&gt;I’m new to BizTalk Server so I wanted to experiment with how it can be used in conjunction with Team Foundation Server.&amp;nbsp; I’m just scratching the surface of BizTalk so be warned, there might be easier/better ways to do things.&amp;nbsp; The full solution can be downloaded &lt;A href="http://www.london54.com/blog_images/kanban.zip" mce_href="http://www.london54.com/blog_images/kanban.zip"&gt;here&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;The Orchestration Designer integrates into Visual Studio 2005 and is a key part of BizTalk Server.&amp;nbsp; First, I’ll show you the orchestration as a whole; then we’ll dive down into the details.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Bts1 src="http://www.london54.com/blog_images/bts1_small4.jpg" border=0 mce_src="http://www.london54.com/blog_images/bts1_small4.jpg"&gt;&lt;/P&gt;
&lt;P&gt;Let’s go through each step so we get a basic idea of what the orchestration looks like.&amp;nbsp; The number items below match the numbers in the diagram above.&amp;nbsp; &lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;The orchestration is activated when we get a message indicating that a work item is changed&lt;/LI&gt;
&lt;LI&gt;From a Kanban perspective, we only care about a work item that has changed if it is just been created, made active or closed.&amp;nbsp; We don’t care about any intermediate changes.&amp;nbsp; If this change matches that criteria, we are going to query Team Foundation Server to determine the number of active work items.&lt;/LI&gt;
&lt;LI&gt;If a new work item has been created, and our Kanban is full – i.e. there are more than a certain number of active work items – then we will have to put this work item in our back log.&lt;/LI&gt;
&lt;LI&gt;If a work item is being closed, and our Kanban has at least one open card – i.e. there are less than a certain number of active work items - then we will notify the customer that a free card is available.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;That’s all there is to our Kanban System example.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;But, you’ll notice that I left out a bunch of details – things like how do we determine the number of active work items, notify the customer, etc.&amp;nbsp; One advantage of using BizTalk Server is that there is a separate between logical and physical ports.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;A port in BizTalk Server is something you receive data from and/or send data to.&amp;nbsp; The data being sent or received is in the form of XML.&amp;nbsp; You have to define the structure of the XML immediately, but you can decide what the physical ports are later.&amp;nbsp; You change them as well.&amp;nbsp; So for now, we don’t have to worry about how we’ll get information about the number of work items in Team Foundation Server or how we notify our customer.&amp;nbsp; We know we have to do it,&amp;nbsp;we’ll figure out exactly how to do it later on.&lt;/P&gt;
&lt;P&gt;Now let’s look into the details of the orchestration.&amp;nbsp; First, let’s look at how the orchestration is activated.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Bts2 src="http://www.london54.com/blog_images/bts2_small.jpg" border=0 mce_src="http://www.london54.com/blog_images/bts2_small.jpg"&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;1 – Port_WorkItemChanged Port&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;We haven’t done it yet, but we will register for WorkItemChanged events with Team Foundation Server.&amp;nbsp; These event notifications will come into this port.&lt;/P&gt;
&lt;P&gt;The designer unfortunately does not allow you to change the width of things, so the name of this port is somewhat obscured.&amp;nbsp; The message we are waiting for is defined by an XML schema that we create.&amp;nbsp; Actually, strictly speaking, we can create the schema from scratch or reference an existing one defined in XSD, as a .NET or as a web service.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The structure of the message we are waiting for is very simpe and looks like:&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Bts3 src="http://www.london54.com/blog_images/bts3_small.jpg" border=0 mce_src="http://www.london54.com/blog_images/bts3_small.jpg"&gt;&lt;/P&gt;
&lt;P&gt;Ideally, I would have liked to use the WorkItemChangedEvent that is delivered directly from Team Foundation Server’s event notification system.&amp;nbsp; But, the structure of that message makes it somewhat difficult to extract the information that I need from it.&amp;nbsp; For now, I took the easy way out and defined my own message structure that I’ll hyrdate.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2 – Receiving the message&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This is just a standard BizTalk Server thing – this receive is what activates our orchestration.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;3 – Deciding if we are interested in this event&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;We’re not interested every time a work item changes; the Expression shape in BizTalk Server allows us to define an expression to find only the ones we’re interested.&amp;nbsp; The expression behind this shape looks like:&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Bts4 src="http://www.london54.com/blog_images/bts4_small.jpg" border=0 mce_src="http://www.london54.com/blog_images/bts4_small.jpg"&gt;&lt;/P&gt;
&lt;P&gt;The only changes we’re only interested in are the newly created work items, the ones that get closed, and the ones that are reactivated.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;When we have a work item in any of those states, we’ll treat them differently based on the number of active work items that we have.&amp;nbsp; The section of our orchestration below is what we use to count up our active work items.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Bts5 src="http://www.london54.com/blog_images/bts5_small1.jpg" border=0 mce_src="http://www.london54.com/blog_images/bts5_small1.jpg"&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;1 – Counting Work Items &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;We have a web service that queries Team Foundation Server and returns the number of Work Items in the active state.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2 – Web Service Port&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;BizTalk Server setups up a request/response port for you automatically when you use a port from a web reference.&lt;/P&gt;
&lt;P&gt;Once we have the number of active work items, we will combine that information along with the state of the work item.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;IMG alt=Bts7 src="http://www.london54.com/blog_images/bts7_small.jpg" border=0 mce_src="http://www.london54.com/blog_images/bts7_small.jpg"&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;If the work item is active (either because it is newly created, or because it’s state was set that way), and our Kanban is full, we will ‘punt’ the work item.&amp;nbsp; A Kanban is full when there are no open slots or cards to represent the work.&amp;nbsp; This enables us to control the amount of work the development team has to worry about.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Bts8 src="http://www.london54.com/blog_images/bts8_small.jpg" border=0 mce_src="http://www.london54.com/blog_images/bts8_small.jpg"&gt;&lt;/P&gt;
&lt;P&gt;We ‘punt’ a work item by calling another method on our web service port.&amp;nbsp; What that web service does is change the state of our Work Item to ‘BackLog’.&amp;nbsp; This is the end of the orchestration for this branch.&lt;/P&gt;
&lt;P&gt;If the work item is closed and our Kanban has an empty slot, then we will notify our team of a free Kanban card.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Bts9 src="http://www.london54.com/blog_images/bts9_small.jpg" border=0 mce_src="http://www.london54.com/blog_images/bts9_small.jpg"&gt;&lt;/P&gt;
&lt;P&gt;This is the end of the orchestration for this branch as well.&lt;/P&gt;
&lt;P&gt;So, what we have in our orchestration as a whole is&amp;nbsp;the basic implementation of a Kanban system.&amp;nbsp; To summarize, when a work item is created or re-activated, we check to see if we have any open kanban cards.&amp;nbsp; If we do, that’s fine we don’t need to do anything.&amp;nbsp; But if we don’t, then we will assign that work item to the backlog.&amp;nbsp; Every time a work item is closed, we check to see if we have any open kanban cards.&amp;nbsp; If we do, then we send a notification to our team to let them know that a card is open.&lt;/P&gt;
&lt;P&gt;Those are the basics of the system – I’ll do a follow up post that delves into some of the details about how the ports are bound and show some examples of the orchestration actually executing.&lt;/P&gt;
&lt;P&gt;Thanks!&lt;/P&gt;
&lt;P&gt;Eric.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=749867" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlee/archive/tags/Visual+Studio+Team+System/default.aspx">Visual Studio Team System</category></item><item><title>Quick post - 2 really cool features about Work Items</title><link>http://blogs.msdn.com/ericlee/archive/2006/09/05/quick-post-2-really-cool-features-about-work-items.aspx</link><pubDate>Wed, 06 Sep 2006 06:50:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:742175</guid><dc:creator>ericlee</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ericlee/comments/742175.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlee/commentrss.aspx?PostID=742175</wfw:commentRss><description>&lt;P&gt;I’ve just returned from Tech Ed Australia and New Zealand and I’ve got lots to blog about that. &lt;/P&gt;
&lt;P&gt;But before I do that, 2 features about Work Items caught my eye tonight that I really wanted to share.&lt;/P&gt;
&lt;P&gt;First, you can copy a single work item to another Team Project by simply right-clicking on it.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=CreateCopy src="http://www.london54.com/blog_images/CreateCopy.png" border=0 mce_src="http://www.london54.com/blog_images/CreateCopy.png"&gt;&lt;/P&gt;
&lt;P&gt;When you choose &lt;STRONG&gt;Create Copy of Work Item…&lt;/STRONG&gt;&amp;nbsp;you get a choice of what Team Project and Work Item Type you like to make the copy to.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Copy src="http://www.london54.com/blog_images/Copy.png" border=0 mce_src="http://www.london54.com/blog_images/Copy.png"&gt;&lt;/P&gt;
&lt;P&gt;Neat stuff!&amp;nbsp; I am perpetually working on my tool for copying work items en mass, and in all honesty I had overlooked this feature before.&amp;nbsp; Now I wonder if this is exposed in the API somewhere &lt;IMG src="http://www.london54.com/blog_images/smile1.gif" mce_src="http://www.london54.com/blog_images/smile1.gif"&gt;&amp;nbsp; I don’t think it is, but maybe it is something we can do in the future.&lt;/P&gt;
&lt;P&gt;Another neat feature is the way process guidance is integrated – let’s say that you’re wondering what the lifecycle of a given work item type is.&amp;nbsp; For example, do bugs go from active to resolved to closed; or active to approved to resolved to close?&amp;nbsp; If you’re ever wondering, just right-click on the work item and view the process template.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=Guidance src="http://www.london54.com/blog_images/Guidance.png" border=0 mce_src="http://www.london54.com/blog_images/Guidance.png"&gt;&lt;/P&gt;
&lt;P&gt;This will bring up the process template at exactly the place that is pertinent at the moment.&amp;nbsp; One can easily view every related to this work item type in the guidance.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt=MSF src="http://www.london54.com/blog_images/MSF.png" border=0 mce_src="http://www.london54.com/blog_images/MSF.png"&gt;&lt;/P&gt;
&lt;P&gt;If you customize your process guidance, then you can be taken to information that pertinent to your organization as well.&lt;/P&gt;
&lt;P&gt;Lately I’ve been trying to drill into the depths of work item tracking and these 2 tips caught my eye so I wanted to share.&amp;nbsp; It never ceases to amaze me how dense of a product VSTS 1.0 is.&lt;/P&gt;
&lt;P&gt;Anyways, hope you’re doing well, look for a Tech Ed wrap up post from me soon.&lt;/P&gt;
&lt;P&gt;Thanks!&lt;/P&gt;
&lt;P&gt;Eric.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=742175" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlee/archive/tags/Team+Foundation+Server/default.aspx">Team Foundation Server</category><category domain="http://blogs.msdn.com/ericlee/archive/tags/Visual+Studio+Team+System/default.aspx">Visual Studio Team System</category></item><item><title>You meet the nicest people on a Honda...</title><link>http://blogs.msdn.com/ericlee/archive/2006/08/13/you-meet-the-nicest-people-on-a-honda.aspx</link><pubDate>Mon, 14 Aug 2006 05:54:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:698969</guid><dc:creator>ericlee</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ericlee/comments/698969.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlee/commentrss.aspx?PostID=698969</wfw:commentRss><description>&lt;P align=left&gt;When I moved to Seattle, one of the most enjoyable things I learned how to do was ride a motorcycle.&amp;nbsp; I really enjoyed the open air, speed and thrill of riding.&lt;/P&gt;
&lt;P align=left&gt;Both of the bikes that I’ve owned – a Kawasaki Ninja 500 and a Ducati Monster 750 – were very reliable and never caused me any problems; a good thing, since I don’t&amp;nbsp;have any mechanical skills to speak of.&lt;/P&gt;
&lt;P align=left&gt;The only thing I had to worry about was learning how to ride.&amp;nbsp; And even that wasn’t very hard – in Washington State, there is a Motorcycle Safety Foundation class that is jointly sponsored by the state and several of the major motorcycle manufacturers – Honda, Kawasaki, Suzuki, etc.&amp;nbsp; The class was just $50 and included 1/2 day of classes and 2 full days of riding.&amp;nbsp; &lt;/P&gt;
&lt;P align=left&gt;Just about everything was provided for us.&amp;nbsp;&amp;nbsp;A few weeks before the class, everyone that was registered for the class received vouchers in the mail entitling us to 20% off helmets and gloves at most of the local motorcycle dealerships.&amp;nbsp; &lt;/P&gt;
&lt;P align=left&gt;For those who didn’t buy their own gear, there was a reasonable selection of helmets and gloves to use onsite.&amp;nbsp; We had brand-new, friendly, 250cc motorcycles to learn on as well.&amp;nbsp; These bikes were provided by the&amp;nbsp;various manufacturers that sponsor the course.&amp;nbsp; Generally speaking, we had our choice of bikes that represented the major&amp;nbsp;categories of motorcycles – cruisers, standards and dirt-bikes.&lt;/P&gt;
&lt;P align=left&gt;The last-half of the course was our endorsement test.&amp;nbsp; Our instructors became our evaluators&amp;nbsp;and one-by-one we did the test.&amp;nbsp; My class had 30 or so people and everyone passed.&amp;nbsp; Many, like myself, had had never ridden any motorized 2–wheelers in their lives before.&lt;/P&gt;
&lt;P align=left&gt;After 3 days, the market for motorcycles in Washington State grew by 30 &lt;IMG src="http://www.london54.com/blog_images/smile1.gif" mce_src="http://www.london54.com/blog_images/smile1.gif"&gt;&lt;/P&gt;
&lt;P align=left&gt;At the time, I took the class a bit for granted.&amp;nbsp; However, had I wanted to learn how to ride a motorcycle in the 1950’s or early 1960’s, things would have been very different.&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG alt=Honda src="http://www.london54.com/blog_images/honda.jpg" border=0 mce_src="http://www.london54.com/blog_images/honda.jpg"&gt;&lt;/P&gt;
&lt;P align=left&gt;‘You meet the nicest people in a Honda’ is a popular ad that Honda ran in the 1960’s to promote their new motorcycle, the ‘Super Cub’.&amp;nbsp; This ad campaign and the motorcycle represented an important turning point in the motorcycle industry in the United States.&lt;/P&gt;
&lt;P align=left&gt;At the time, the perception around motorcycles in the United States wasn’t very positive.&amp;nbsp; Generally speaking, motorcycle-ists were considered rebels, outlaws and members on the fringe of society.&amp;nbsp; Also, maybe more importantly, the motorcycles at the time were not very attractive for the mainstream.&amp;nbsp; Motorcycles of that era were heavy, difficult to ride and unreliable.&amp;nbsp; You had to have a good understanding of the workings of a motorcycle to perform the near constant maintenance that the bikes of that day required.&lt;/P&gt;
&lt;P align=left&gt;Honda’s ‘Super Cub’ changed all of this.&amp;nbsp; It was small, friendly-looking and easy to ride.&amp;nbsp; And it’s engine was nearly maintenance free.&amp;nbsp; The ad campaign that introduced this motorcycle focused on parents, young couples and professionals riding the ‘Super Cub’.&amp;nbsp; &lt;/P&gt;
&lt;P align=left&gt;What Honda did was pretty impressive.&amp;nbsp; They identified an appealing thing that a small, niche segment of the market was doing, and, more importantly, they identified what was keeping this niche thing from being popular in the mainstream United States.&amp;nbsp; To name a few examples, motorcycles in the United States at the time:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV align=left&gt;suffered from a negative image&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=left&gt;required its customers to have indepth mechnical knowledge&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=left&gt;was thought to have little practical value&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P align=left&gt;To mitigate these issues, Honda did 2 things.&amp;nbsp; First, they built a great product - a fun, easy to ride, bullet-proof motorcycle that could accomodate 2 people easily; this helped increase the broad appeal of the motorcycle.&amp;nbsp; Second,&amp;nbsp;Honda built a friendly ad-campaign to start changing the negative perception of motorcycling in general.&amp;nbsp;&lt;/P&gt;
&lt;P align=left&gt;The rest is history, the ‘Super Cub’ sold 200K units in its first year, more than all the other motorcycle manufacturers combined that year and went on to sell 50M units in its lifetime.&amp;nbsp;&amp;nbsp;The ‘Super Cub’&amp;nbsp;is largely remembered as being the motorcycle that brought motorcyling into the mainstream US market.&lt;/P&gt;
&lt;P align=left&gt;So what does this have to do with software? Or Application Lifecycle Management?&amp;nbsp; Well, my hypothesis is that there is an opportunity to bring what customers who are very, very&amp;nbsp;early adopters have been doing into the mainstream.&lt;/P&gt;
&lt;P align=left&gt;When we launched Visual Studio 2005 last year, we started talking about something called the Application Platform, which was the combination of BizTalk Server (BTS), Visual Studio and SQL Server.&lt;/P&gt;
&lt;P align=left&gt;My hypothesis is that the Application Platform represents what a few of our very early adopter customers have been doing for&amp;nbsp;quite some time.&amp;nbsp; &lt;/P&gt;
&lt;P align=left&gt;For example, BTS can do many things, but one of the things it does very well is provide a way to implement complex workflows and flow of data.&amp;nbsp; &lt;/P&gt;
&lt;P align=left&gt;From a software &lt;STRONG&gt;development &lt;/STRONG&gt;standpoint, BTS is pretty useful.&amp;nbsp; There are lots and lots of complex human workflows that take place in software development – code reviews, buddy builds, check-in approvals are just a few examples.&amp;nbsp; Why not take advantage of a graphical designer to literally orchstrate these instead of relying on word of mouth or documentation?&amp;nbsp; SQL Server is pretty useful as well – I’ve gotten a lot of interest around building Key Performance Indicators from software development data as well as applying data mining to it.&amp;nbsp; Whether you are doing either or both, the great thing about having a data warehouse for your software development is that you can use it in so many other places.&amp;nbsp; Project Server, Business Scorecard Manager and Excel are all clients that can make very sophisticated use of a data warehouse.&lt;/P&gt;
&lt;P align=left&gt;If your organization happens to be using BTS and SQL Server for more traditional scenarios, you all of a sudden have a single place for to implement all of your processes – either business-related or software development-related, and you have a common format, a data warehouse, to represent all of your data – either business-related or software development-related.&lt;/P&gt;
&lt;P align=left&gt;My hunch is that &lt;EM&gt;some &lt;/EM&gt;customers have been able to do this with BTS 2004, VS 2003 and SQL Server 2000 products, but it hasn’t been easy.&amp;nbsp; There certainly are a lot of hurdles that prevent this type of solution from being accepted by the mainstream.&lt;/P&gt;
&lt;P align=left&gt;With the Application Platform bringing together SQL Server 2005, BTS 2006 and VS 2005, I think we are taking&amp;nbsp;a step towards making a solution like this attractive for the mainstream. &lt;/P&gt;
&lt;P align=left&gt;For example, BTS 2006 has a bunch of new adapters, but 2 that are really interesting for software development are the email and sharepoint adapters.&amp;nbsp; A BTS adapter allows BTS to accept messages from whatever is being ‘adapted’.&amp;nbsp;&amp;nbsp;With these 2 new adapters, BTS can&amp;nbsp;treat email and sharepoint (SPS and WSS)&amp;nbsp;documents as though they&amp;nbsp;were XML documents and use them in&amp;nbsp;BTS orchestrations.&amp;nbsp; SOAP is another BTS adapter.&lt;/P&gt;
&lt;P align=left&gt;Since&amp;nbsp;Team&amp;nbsp;Foundation Server uses email or SOAP for its notifications and automatically creates a WSS sharepoint site for your projects, there is a natural way to integrate with BTS.&amp;nbsp; Team Foundation Server doesn’t have a great workflow story right now, but BTS is all about complex workflows and orchestrations.&amp;nbsp; It’s not hard to imagine&amp;nbsp;a TFS event notification that activates a BTS orchestration which runs its course and reports its results by creating a new document on a Team Project’s portal.&amp;nbsp; I’m sure there are tons and tons of other possiblities.&lt;/P&gt;
&lt;P align=left&gt;Another example in terms of making this solution more mainstream is the integration with the Visual Studio client – now without ever leaving the friendly confines of the Visual Studio shell, you can:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;write C++ code&lt;/LI&gt;
&lt;LI&gt;design a class in C#&lt;/LI&gt;
&lt;LI&gt;design a multi-tier SOA application&lt;/LI&gt;
&lt;LI&gt;kick off a load test&lt;/LI&gt;
&lt;LI&gt;create a KPI to report your results&lt;/LI&gt;
&lt;LI&gt;data mine to find interesting associations&lt;/LI&gt;
&lt;LI&gt;design your business process&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;If you know the previous generation tools, then this integration maybe isn’t as important.&amp;nbsp; But if you’re new to an Application Platform-style solution, then centering everything around the familiar – Visual Studio – can really ease the learning curve.&lt;/P&gt;
&lt;P&gt;Anyways, just some thoughts on a Sunday evening.&amp;nbsp; The more I dig into SQL Server 2005 and BizTalk Server 2006, the more excited I become about how to apply those technologies to software development.&amp;nbsp; I don’t think we have a ‘Super Cub’ yet, but it’s getting there.&lt;/P&gt;
&lt;P&gt;Thanks!&lt;/P&gt;
&lt;P&gt;Eric.&lt;/P&gt;
&lt;P align=left mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=698969" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlee/archive/tags/Team+Foundation+Server/default.aspx">Team Foundation Server</category><category domain="http://blogs.msdn.com/ericlee/archive/tags/Visual+Studio+Team+System/default.aspx">Visual Studio Team System</category></item></channel></rss>