<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>.NET</title><link>http://www.tourneylogic.com/Blogs/joel/category/7.aspx</link><description>.NET</description><managingEditor>Joel Ross</managingEditor><dc:language>en-US</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>Joel Ross</dc:creator><title>CruiseControl.NET Turns 1.0, Almost</title><link>http://www.tourneylogic.com/Blogs/joel/archive/2005/08/15/2334.aspx</link><pubDate>Mon, 15 Aug 2005 19:49:00 GMT</pubDate><guid>http://www.tourneylogic.com/Blogs/joel/archive/2005/08/15/2334.aspx</guid><description>&lt;P&gt;I monitor the updates and additions to the CruiseControl.NET product documentation, and today there's been a plethora of action. The first was an &lt;A href="http://confluence.public.thoughtworks.org/display/CCNET/MsBuild+Task"&gt;interesting page addition&lt;/A&gt; that showed up in my aggregator - a nant task to run MsBuild scripts. &lt;/P&gt;&lt;P&gt;That definitely piqued my interest, and as the day went on, I eventually saw that &lt;A href="http://confluence.public.thoughtworks.org/display/CCNET/2005/08/15/CruiseControl.NET+1.0+RC1+Released"&gt;CruiseControl.NET 1.0 RC1 was released today&lt;/A&gt;. &lt;A href="http://confluence.public.thoughtworks.org/display/CCNET/CCNet+1.0+RC1+Release+Notes"&gt;There's a few new features&lt;/A&gt;, but the two that stand out to me are (obviously) the MsBuild tasks, and that CCTray has been rewritten to support multiple servers and multiple projects better. They've also completely moved to the web dashboard (something we already did with our move to CCNET .9x), and gotten rid of the files for the old web project.&lt;/P&gt;&lt;P&gt;I can't wait for an opportunity to try this out, although I'm guessing I probably won't get the chance until it's no longer a release candidate, and it could possibly be the beginning of the year before I find a project that needs my build server skills!&lt;/P&gt;&lt;img src ="http://www.tourneylogic.com/Blogs/joel/aggbug/2334.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Ross</dc:creator><title>Enterprise Library Hands-On Labs</title><link>http://www.tourneylogic.com/Blogs/joel/archive/2005/07/14/1552.aspx</link><pubDate>Thu, 14 Jul 2005 19:09:00 GMT</pubDate><guid>http://www.tourneylogic.com/Blogs/joel/archive/2005/07/14/1552.aspx</guid><description>&lt;P&gt;It looks like Microsoft &lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=b9bff619-236c-4bbb-9aa1-2e7bc562c7f5&amp;amp;displaylang=en"&gt;has released a set of 8 labs&lt;/A&gt; in both C# and VB.NET about how to use Enterprise Library. Each takes an hour or so, so you could waste a day on these pretty easily. On the other hand, after that day, you'd probably have a pretty good idea of how to use EntLib, which is always a good thing.&lt;/P&gt;&lt;P&gt;I've downloaded them. Now I just need some free time!&lt;/P&gt;&lt;img src ="http://www.tourneylogic.com/Blogs/joel/aggbug/1552.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Ross</dc:creator><title>CruiseControl.NET 0.9.2 - Released</title><link>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/27/915.aspx</link><pubDate>Mon, 27 Jun 2005 06:24:00 GMT</pubDate><guid>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/27/915.aspx</guid><description>&lt;P&gt;I &lt;A href="http://www.rosscode.com/blog/index.php?title=cruisecontrol_net_0_9_2&amp;amp;more=1&amp;amp;c=1&amp;amp;tb=1&amp;amp;pb=1"&gt;posted that there was a feature&lt;/A&gt; I was very much looking forward to in CCNET 0.9.2, but didn’t' know when it was going to be released. &lt;/P&gt;&lt;P&gt;&lt;A href="http://confluence.public.thoughtworks.org/display/CCNET/2005/06/26/CCNet+0.9.2+is+released"&gt;Well, it's now officially out&lt;/A&gt;. You can read &lt;A href="http://confluence.public.thoughtworks.org/display/CCNET/CCNet+0.9.2+Release+Notes"&gt;the release notes&lt;/A&gt; to see what changes were made, but there are three things that make it a must for me to get the newest version:&lt;/P&gt;&lt;P&gt;1. Using Vault source control now supports automatically getting the source&lt;BR /&gt;2. Filter modifications by username&lt;BR /&gt;3. CCTray doesn't show the exception message box by default.&lt;/P&gt;&lt;P&gt;I'll be upgrading a few build servers tomorrow!&lt;/P&gt;&lt;img src ="http://www.tourneylogic.com/Blogs/joel/aggbug/915.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Ross</dc:creator><title>A Change to Switch Statements</title><link>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/24/806.aspx</link><pubDate>Fri, 24 Jun 2005 20:58:00 GMT</pubDate><guid>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/24/806.aspx</guid><description>&lt;P&gt;I ran into this today, and if it was available, my life would have been easier. Here's the problem I came up against.&lt;/P&gt;&lt;P&gt;Let's say that you have an object that has two properties: color and shape. You need to do something based on the combination of those two properties. Here's how you could do it now:&lt;/P&gt;&lt;DIV class="csharpcode"&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     1: &lt;/SPAN&gt;&lt;SPAN class="kwrd"&gt;if&lt;/SPAN&gt;(myObject.Shape == Shape.Round) {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     2: &lt;/SPAN&gt;    &lt;SPAN class="kwrd"&gt;if&lt;/SPAN&gt;(myObject.Color == Color.Red) {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     3: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     4: &lt;/SPAN&gt;    } &lt;SPAN class="kwrd"&gt;else&lt;/SPAN&gt; &lt;SPAN class="kwrd"&gt;if&lt;/SPAN&gt;(myObject.Color == Color.Blue) {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     5: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     6: &lt;/SPAN&gt;    } &lt;SPAN class="kwrd"&gt;else&lt;/SPAN&gt; &lt;SPAN class="kwrd"&gt;if&lt;/SPAN&gt;(myObject.Color == Color.Green) {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     7: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     8: &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     9: &lt;/SPAN&gt;} &lt;SPAN class="kwrd"&gt;else&lt;/SPAN&gt; &lt;SPAN class="kwrd"&gt;if&lt;/SPAN&gt; (myObject.Shape == Shape.Square) {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    10: &lt;/SPAN&gt;    &lt;SPAN class="kwrd"&gt;if&lt;/SPAN&gt;(myObject.Color == Color.Red) {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    11: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    12: &lt;/SPAN&gt;    } &lt;SPAN class="kwrd"&gt;else&lt;/SPAN&gt; &lt;SPAN class="kwrd"&gt;if&lt;/SPAN&gt;(myObject.Color == Color.Blue) {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    13: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    14: &lt;/SPAN&gt;    } &lt;SPAN class="kwrd"&gt;else&lt;/SPAN&gt; &lt;SPAN class="kwrd"&gt;if&lt;/SPAN&gt;(myObject.Color == Color.Green) {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    15: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    16: &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    17: &lt;/SPAN&gt;} &lt;SPAN class="kwrd"&gt;else&lt;/SPAN&gt; &lt;SPAN class="kwrd"&gt;if&lt;/SPAN&gt; (myObject.Shape == Shape.Triangle) {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    18: &lt;/SPAN&gt;    &lt;SPAN class="kwrd"&gt;if&lt;/SPAN&gt;(myObject.Color == Color.Red) {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    19: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    20: &lt;/SPAN&gt;    } &lt;SPAN class="kwrd"&gt;else&lt;/SPAN&gt; &lt;SPAN class="kwrd"&gt;if&lt;/SPAN&gt;(myObject.Color == Color.Blue) {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    21: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    22: &lt;/SPAN&gt;    } &lt;SPAN class="kwrd"&gt;else&lt;/SPAN&gt; &lt;SPAN class="kwrd"&gt;if&lt;/SPAN&gt;(myObject.Color == Color.Green) {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    23: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    24: &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    25: &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;This could also be done with one level of if statements:&lt;/P&gt;&lt;DIV class="csharpcode"&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     1: &lt;/SPAN&gt;&lt;SPAN class="kwrd"&gt;if&lt;/SPAN&gt;(myObject.Shape == Shape.Round &amp;amp;&amp;amp; myObject.Color == Color.Red) {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     2: &lt;/SPAN&gt;    &lt;SPAN class="rem"&gt;// Do something&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     3: &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;And so on...&lt;/P&gt;&lt;P&gt;Either way, imagine now that switch statements could accept more than one expression. This makes this code much easier to read:&lt;/P&gt;&lt;DIV class="csharpcode"&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     1: &lt;/SPAN&gt;&lt;SPAN class="kwrd"&gt;switch&lt;/SPAN&gt;(myObject.Shape, myObject.Color){&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     2: &lt;/SPAN&gt;    &lt;SPAN class="kwrd"&gt;case&lt;/SPAN&gt; Shape.Round, Color.Red:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     3: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     4: &lt;/SPAN&gt;        &lt;SPAN class="kwrd"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     5: &lt;/SPAN&gt;    &lt;SPAN class="kwrd"&gt;case&lt;/SPAN&gt; Shape.Round, Color.Blue:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     6: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     7: &lt;/SPAN&gt;        &lt;SPAN class="kwrd"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     8: &lt;/SPAN&gt;    &lt;SPAN class="kwrd"&gt;case&lt;/SPAN&gt; Shape.Round, Color.Green:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     9: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    10: &lt;/SPAN&gt;        &lt;SPAN class="kwrd"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    11: &lt;/SPAN&gt;    &lt;SPAN class="kwrd"&gt;case&lt;/SPAN&gt; Shape.Square, Color.Red:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    12: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    13: &lt;/SPAN&gt;        &lt;SPAN class="kwrd"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    14: &lt;/SPAN&gt;    &lt;SPAN class="kwrd"&gt;case&lt;/SPAN&gt; Shape.Square, Color.Blue:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    15: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    16: &lt;/SPAN&gt;        &lt;SPAN class="kwrd"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    17: &lt;/SPAN&gt;    &lt;SPAN class="kwrd"&gt;case&lt;/SPAN&gt; Shape.Square, Color.Green:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    18: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    19: &lt;/SPAN&gt;        &lt;SPAN class="kwrd"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    20: &lt;/SPAN&gt;    &lt;SPAN class="kwrd"&gt;case&lt;/SPAN&gt; Shape.Triangle, Color.Red:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    21: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    22: &lt;/SPAN&gt;        &lt;SPAN class="kwrd"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    23: &lt;/SPAN&gt;    &lt;SPAN class="kwrd"&gt;case&lt;/SPAN&gt; Shape.Triangle, Color.Blue:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    24: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    25: &lt;/SPAN&gt;        &lt;SPAN class="kwrd"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    26: &lt;/SPAN&gt;    &lt;SPAN class="kwrd"&gt;case&lt;/SPAN&gt; Shape.Triangle, Color.Green:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    27: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    28: &lt;/SPAN&gt;        &lt;SPAN class="kwrd"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;    29: &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;The code isn't that much smaller, but to me, it's much easier to read and see where things are happening. You could even go farther, and have a wildcard operator so you could say that a particular parameter doesn't matter for a particular case. For example, let's say that if the shape is a triangle, you need to do something if it's red, and something else if it's any other color. You could rewrite the last three case statements to be two case statements:&lt;/P&gt;&lt;DIV class="csharpcode"&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     1: &lt;/SPAN&gt;    &lt;SPAN class="kwrd"&gt;case&lt;/SPAN&gt; Shape.Triangle, Color,Red:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     2: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     3: &lt;/SPAN&gt;        &lt;SPAN class="kwrd"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     4: &lt;/SPAN&gt;    &lt;SPAN class="kwrd"&gt;case&lt;/SPAN&gt; Shape.Triangle, *:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     5: &lt;/SPAN&gt;        &lt;SPAN class="rem"&gt;// Do something&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class="lnum"&gt;     6: &lt;/SPAN&gt;        &lt;SPAN class="kwrd"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;I haven't thought this completely through, so I may be missing something. I ran into a situation where I have 4 parameters to base off of, and this would have made the coding simpler and easier to understand. &lt;/P&gt;&lt;P&gt;Now, how do you go about getting a change into a language?&lt;/P&gt;&lt;img src ="http://www.tourneylogic.com/Blogs/joel/aggbug/806.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Ross</dc:creator><title>BizTalk: Exposing .NET Classes</title><link>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/13/603.aspx</link><pubDate>Mon, 13 Jun 2005 22:04:00 GMT</pubDate><guid>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/13/603.aspx</guid><description>&lt;P&gt;Ok. I'm new to BizTalk Server, but I think I got this right. Please let me know if I didn't. &lt;/P&gt;&lt;P&gt;I have an existing application that uses an object. I want to take this object, allow BizTalk to accept messages of that type, and map them to another message type that can then be sent out to a third party verification system. Sounds like a pretty typical scenario to me.&lt;/P&gt;&lt;P&gt;It took me a while to figure it out though. First, I added a reference in BizTalk to my business object class. Then I created ports that could receive a .NET object of my type. That worked - I could even set up a web service based on that object. Then I got to the mapper. No schema was defined my custom object, and I couldn't find an easy way to get one.&lt;/P&gt;&lt;P&gt;Searching Google didn't help either - do a search for "create schema from c# class", and you'll be flooded with results for "create c# class from schema" - no one is doing it backwards. Of course, the solution is pretty simple. You can run xsd.exe on a class and tell it what type you want the xsd for. We ran into a few issues, but nothing major, and now I have an XSD file for my type.&lt;/P&gt;&lt;P&gt;Once you get that, you can then generate everything I did above - a message for it, a web service for it, and, now that I have schema, I can do mapping.&lt;/P&gt;&lt;P&gt;I know this probably isn't the most ideal way to use BizTalk, but it works for us for now.&lt;/P&gt;&lt;img src ="http://www.tourneylogic.com/Blogs/joel/aggbug/603.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Ross</dc:creator><title /><link>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/13/601.aspx</link><pubDate>Mon, 13 Jun 2005 21:54:00 GMT</pubDate><guid>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/13/601.aspx</guid><description>&lt;P&gt;I first heard of CodeZone from someone in Australia, and I've been getting the magazine since last summer.&lt;/P&gt;&lt;P&gt;Well, they finally launched something for the US crowd - &lt;A href="http://www.codezone.com/Default.aspx"&gt;MyCodeZone&lt;/A&gt;. It's a portal for developers, and I got a chance to talk to one of the team members. They are actively looking for feedback on what is good and what isn't, so this is your chance to make it what you want.&lt;/P&gt;&lt;P&gt;I may spend some time in this. I've never gotten into online portals like My Yahoo, but then again, there's never been anything like this geared for developers.&lt;/P&gt;&lt;img src ="http://www.tourneylogic.com/Blogs/joel/aggbug/601.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Ross</dc:creator><title>PDC '05</title><link>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/13/599.aspx</link><pubDate>Mon, 13 Jun 2005 20:11:00 GMT</pubDate><guid>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/13/599.aspx</guid><description>&lt;P&gt;I know I won't be at the &lt;A href="http://msdn.microsoft.com/events/pdc/"&gt;PDC&lt;/A&gt; this year, but the sessions look pretty good! There was some alluding to C# 3.0 at Tech Ed, but it looks like PDC will have a whole lot more about it, as well as more info on Longhorn and IIS 7. Very cool.&lt;/P&gt;&lt;P&gt;The difference between Tech Ed and PDC is definitely obvious now. Tech Ed is about what you can do today and tomorrow, while PDC is about what you can do tomorrow and the next day. I think going to Tech Ed was definitely the right choice for me, but PDC would be fun too.&lt;/P&gt;&lt;P&gt;Anyway, go take a look at the &lt;A href="http://msdn.microsoft.com/events/pdc/agenda/default.aspx"&gt;session list&lt;/A&gt;. It'll give you a quick view into where the industry is heading.&lt;/P&gt;&lt;img src ="http://www.tourneylogic.com/Blogs/joel/aggbug/599.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Ross</dc:creator><title>Automatically Adding Projects To CruiseControl.NET</title><link>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/03/534.aspx</link><pubDate>Fri, 03 Jun 2005 21:56:00 GMT</pubDate><guid>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/03/534.aspx</guid><description>&lt;P&gt;I recently set up a build server for my personal projects that includes CruiseControl.Net, Vault, and Dragnet. I'll be putting my blogging tool on there, as well as a few other things I have been putting together. &lt;/P&gt;&lt;P&gt;Anyway, one of the pains of setting up a continuous integration server is adding new projects. Most of the time, I have to TS into the server and change the ccnet.config file to include the new project and I usually end up leaving the file checked out on the build server, and never check it in. That means I never get the latest version under source control. I know - I should just check it in, but I don't.&lt;/P&gt;&lt;P&gt;I also don't typically have a nice editor on my build server to manage the editing of the config file. Notepad is nice, but VS.Net is better! So, my idea was to create a project in &lt;A href="http://ccnet.sourceforge.net/"&gt;CruiseControl.NET&lt;/A&gt; that would monitor the ccnet.config file, and reload it if the file changes. Thus, I can change how a project is watched, add projects, or remove projects. &lt;/P&gt;&lt;P&gt;First, I configured CCNet to use a ccnet.config file in my source control tool. I put it in the $/BuildProcess folder. The first project I added was my build process project. It watches the $/BuildProcess folder and when something is changed, it calls my build file. Here's the build file contents:&lt;/P&gt;&lt;P&gt;&amp;lt;project name="BuildProcess" default="Go"&amp;gt;&lt;BR /&gt; &amp;lt;target name="Go"&amp;gt;&lt;BR /&gt;  &amp;lt;exec basedir="." program="vault.exe" commandline="GET $/BuildProcess/ccnet.config -host [host] -username admin -password [pwd] -repository [Repository] -destpath C:\Source\BuildProcess\"/&amp;gt;&lt;BR /&gt; &amp;lt;/target&amp;gt;&lt;BR /&gt;&amp;lt;/project&amp;gt;&lt;/P&gt;&lt;P&gt;Basically, all I do is get the latest version of the ccnet.config file. The CCService reloads this file and you have any updates you added, so if you add a project, you can have it start being monitored remotely!&lt;/P&gt;&lt;P&gt;One word of caution: If you screw up the config file, you're done. You'll have to go onto the build server and fix the problem there, since CruiseControl.NET can't load it's config file.&lt;/P&gt;&lt;img src ="http://www.tourneylogic.com/Blogs/joel/aggbug/534.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Ross</dc:creator><title>Generic Collecions In .NET 2.0</title><link>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/03/533.aspx</link><pubDate>Fri, 03 Jun 2005 20:03:00 GMT</pubDate><guid>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/03/533.aspx</guid><description>&lt;P&gt;I'm starting to dig into Generics and collections for the &lt;A href="http://www.tourneylogic.com/Products/BracketControl/default.aspx"&gt;Tourney Bracket Control&lt;/A&gt;. We have a number of collections that we use, and before, we had a lot of (generated) code wrapped into those collections. With generics, we can eliminate most of that code.&lt;/P&gt;&lt;P&gt;Each of our collections has an "Owner" property, which allows us to walk the bracket hierarchy - go from a round to it's containing group, or from a match up to it's containing round. Based on these requirements, I need to have a custom collection and can't use a generic list, but I still want the maintainability of generics. Well, it turns out you can inherit from a generic collection and make a typed collection:&lt;/P&gt;&lt;P&gt;MyTypedCollection : System.Collections.Generic.List&amp;lt;MyTypedObject&amp;gt;&lt;/P&gt;&lt;P&gt;You can inherit from a generic collection, specifying a particular type when you do so. Now I can add my methods and properties that I need for each collection. I cut my collections down from a few 100 lines of code to less than 20. Nice!&lt;/P&gt;&lt;img src ="http://www.tourneylogic.com/Blogs/joel/aggbug/533.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Ross</dc:creator><title>The Polymorphic Podcast</title><link>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/03/532.aspx</link><pubDate>Fri, 03 Jun 2005 19:51:00 GMT</pubDate><guid>http://www.tourneylogic.com/Blogs/joel/archive/2005/06/03/532.aspx</guid><description>&lt;P&gt;I've started listening to quite a few podcasts lately, but &lt;A href="http://www.polymorphicpodcast.com/"&gt;The Polymorphic Podcast&lt;/A&gt; is different than most I subscribe to. While shows like DotNetRocks and The Microsoft Developer Show are technical in nature, the Polymorphic Podcast is technical. He gets into code samples and really discusses implementation details. It's a great podcast, and if you're a developer, you might want to check it out. The podcasts are short (15-30 minutes each) and I've listened to the whole archive over the past two days. &lt;/P&gt;&lt;P&gt;Thanks to Jason Salas for pointing this one out in his &lt;A href="http://weblogs.asp.net/jasonsalas/archive/2005/06/02/410023.aspx"&gt;June 2nd episode of Digital Pontifications&lt;/A&gt;.&lt;/P&gt;&lt;img src ="http://www.tourneylogic.com/Blogs/joel/aggbug/532.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>