<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/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Bill Tudor</title>
        <link>http://geekswithblogs.net/btudor/Default.aspx</link>
        <description>Weblog</description>
        <language>en-US</language>
        <copyright>Bill Tudor</copyright>
        <managingEditor>btudor@nycap.rr.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <image>
            <title>Bill Tudor</title>
            <url>http://geekswithblogs.net/images/RSS2Image.gif</url>
            <link>http://geekswithblogs.net/btudor/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>The Joel Test for 2010</title>
            <category>Architecture</category>
            <category>Programming</category>
            <category>configuration management</category>
            <link>http://geekswithblogs.net/btudor/archive/2010/01/04/137329.aspx</link>
            <description>&lt;p&gt;Back in June, I posted my own version of the &lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html"&gt;Joel Test&lt;/a&gt; – updated for 2010. [&lt;a href="http://geekswithblogs.net/btudor/archive/2009/06/16/132842.aspx"&gt;See Here&lt;/a&gt;.]&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;p&gt;Do you have a change management system?&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Can everyone make a build in one step?&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Do your daily builds include automated tests?&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Is work item tracking integrated with source control?&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Do you fix bugs &lt;em&gt;and&lt;/em&gt; write new code?&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Do you track progress and manage change?&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Do you have a requirements management system?&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Do programmers have quiet working conditions and teaming rooms?&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Do you use the best tools money can buy?&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Are your testers involved in requirements management?&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Do new candidates review code during their interview?&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Do you do hallway usability testing?&lt;/p&gt;   &lt;/li&gt; &lt;/ol&gt; &lt;img src="http://geekswithblogs.net/btudor/aggbug/137329.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bill Tudor</dc:creator>
            <guid>http://geekswithblogs.net/btudor/archive/2010/01/04/137329.aspx</guid>
            <pubDate>Mon, 04 Jan 2010 10:52:07 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/btudor/comments/137329.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/btudor/archive/2010/01/04/137329.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/btudor/comments/commentRss/137329.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/btudor/services/trackbacks/137329.aspx</trackback:ping>
        </item>
        <item>
            <title>Objective C &amp;ndash; A lot going on here</title>
            <category>Programming</category>
            <link>http://geekswithblogs.net/btudor/archive/2009/12/28/137235.aspx</link>
            <description>&lt;p&gt;I know I’m late to the iPhone development party, and consequently I’m also late to the Objective-C debates. But I can’t help but chime in; so here goes . . . &lt;/p&gt;  &lt;h3&gt;Back in the Day&lt;/h3&gt;  &lt;p&gt;Back in the C programming days (while I was apparently sleeping), there seem to have been two directions: The C++ road, and the objective-C road. I have never seen Objective-C until OS-X, and I have never worked with it until a couple of weeks ago, but there is certainly a lot of goodness going on here – much more than C++ ever attempted. In hindsight, I can say that every large C++ project I’ve seen has grown into a mess – that includes apps using UI frameworks, as well as apps using STL, boost, and other frameworks and libraries. Objective-C does show its age from time to time, but it contains many things I mistakenly thought were “invented” later (probably invented earlier – even before smalltalk – I’ll have to do some research sometime). Here are a few thoughts from an absolute beginner in Objective C. It should be fun to read this a few months from now and reflect upon my initial impressions.&lt;/p&gt;  &lt;h3&gt;Learn a New Language Every Year&lt;/h3&gt;  &lt;p&gt;This advice from the &lt;a href="http://en.wikipedia.org/wiki/The_Pragmatic_Programmer"&gt;Pragmatic Programmer&lt;/a&gt; is good advice, even if it is not really possible to follow &lt;em&gt;every&lt;/em&gt; year. The advice is given so that you may learn a new way to think. &lt;/p&gt;  &lt;p&gt;What I am learning to think about:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Static typing and dynamic dispatch (and dynamic typing, too, if you want) &lt;/li&gt;    &lt;li&gt;Message passing vs method calling, including ignoring and forwarding messages &lt;/li&gt;    &lt;li&gt;Protocols vs Java/C# interfaces &lt;/li&gt;    &lt;li&gt;Categories to add (and replace) methods on a class &lt;/li&gt;    &lt;li&gt;Newer features, such as Properties, garbage collection &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Some of the silliness&lt;/h3&gt;  &lt;p&gt;There still remains some silliness, like header files, much of the syntax, and the lack of namespaces (I am getting tired of prefixing all of the NextStep, err, I mean Cocoa APIs with ‘NS’), but that’s a result of the time period when all this stuff was developed, and the close relationship to the ‘C’ language, which is also touted as a feature but I could care less about. But all of this is very minor.&lt;/p&gt;  &lt;p&gt;Overall, a much better extension of C than C++ in almost every way. &lt;/p&gt; &lt;img src="http://geekswithblogs.net/btudor/aggbug/137235.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bill Tudor</dc:creator>
            <guid>http://geekswithblogs.net/btudor/archive/2009/12/28/137235.aspx</guid>
            <pubDate>Mon, 28 Dec 2009 14:20:10 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/btudor/comments/137235.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/btudor/archive/2009/12/28/137235.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/btudor/comments/commentRss/137235.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/btudor/services/trackbacks/137235.aspx</trackback:ping>
        </item>
        <item>
            <title>Top 10 Christmas Gifts for Developers</title>
            <link>http://geekswithblogs.net/btudor/archive/2009/12/17/137023.aspx</link>
            <description>&lt;p&gt;2009 Edition.&lt;/p&gt;  &lt;h3&gt;No. 1 Solid State Disk&lt;/h3&gt;  &lt;p&gt;The crucial CT64M225 64GB ($234) or CT128M225 128GB ($429), or the ultimate Intel X25 160GB ($549) for the notebook machine. Improve performance, improve battery life. Best of all, you don’t have to wait a few seconds after closing the lid for the HDD to spin down before you pick up and go.&lt;/p&gt;  &lt;h3&gt;No. 2 Roku Player&lt;/h3&gt;  &lt;p&gt;The Roku now has tech video podcasts available, as well as netflix and Amazon video on demand. All it needs is “Play To” DLNA capability so we can stream everything from our Win7 computers to it.&lt;/p&gt;  &lt;h3&gt;No. 3 Stand-Alone Blue Ray Player&lt;/h3&gt;  &lt;p&gt;Forget about the playstation 3, that just sucks up your time playing games. Purchase the LG BD390 instead (or equivalent player with DLNA support) – not for playing blu-ray disks, as blu-ray will fade away before it ever gets started (physical disk delivery will disappear), but rather as a DLNA receiver for both audio and video, a YouTube box, and a netflix online device. Now all we need is support for Hulu, . . . [PlayTo, not play]&lt;/p&gt;  &lt;h3&gt;No. 4 Netflix Subscription&lt;/h3&gt;  &lt;p&gt;We need some content for our #2 and #3 video/audio devices (besides everything already on our computers).&lt;/p&gt;  &lt;h3&gt;No. 5 Buy another Monitor&lt;/h3&gt;  &lt;p&gt;You can always use another monitor, and screen real estate is king. Make this one 1920x1080 pixels widescreen, good quality, and plunk it down in the middle of your current setup.&lt;/p&gt;  &lt;h3&gt;No. 6 Stocking Stuffers&lt;/h3&gt;  &lt;p&gt;Grab a bunch of 4GB USB sticks for Windows 7 and Server 2008r2 boot media, as well as some memory and disk checking utilities. You’ll need at least 4 of these, at about $11 a piece. Optical disks are not worth the shelf space. Throw in an all-in-one USB stick adapter for your SD cards and the phone’s microSD, and you’re all set wherever you go.&lt;/p&gt;  &lt;h3&gt;No. 7 MacOS X Machine&lt;/h3&gt;  &lt;p&gt;Re-discover your unix roots, learn a new language (objective-C), and look at all the pretty, shiny things. Try for a MacBook Pro refurbished (or ebay) to make to reasonably affordable, or get a Mac Mini and hook up one of your monitors from time-to-time. Don’t forget to install Windows 7 – get a 1TB drive and split it in half. No virtual machines needed, here.&lt;/p&gt;  &lt;h3&gt;No. 8 MiFi portable Wi-Fi&lt;/h3&gt;  &lt;p&gt;Assuming you have a data plan, keep the whole family happy in the car on the next trip. Don’t expect to watch a movie on Hulu, however, because it’s just not going to happen. But everyone can check their email - and tweet. [Are we there, yet?]&lt;/p&gt;  &lt;h3&gt;No. 9 Kindle 2&lt;/h3&gt;  &lt;p&gt;They added native PDF and longer battery life (by turning off the wireless when not in use – Duh!) to this little guy, which now makes the list for 2009.&lt;/p&gt;  &lt;h3&gt;No. 10 Core i5, 16GB RAM, P55 Motherboard&lt;/h3&gt;  &lt;p&gt;Update and upgrade your main dev box with lots more RAM for those virtual machines using the best-value Core i5 quad chip. You won’t heat up the room, just the code.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Merry Christmas.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/btudor/aggbug/137023.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bill Tudor</dc:creator>
            <guid>http://geekswithblogs.net/btudor/archive/2009/12/17/137023.aspx</guid>
            <pubDate>Thu, 17 Dec 2009 12:15:14 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/btudor/comments/137023.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/btudor/archive/2009/12/17/137023.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/btudor/comments/commentRss/137023.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/btudor/services/trackbacks/137023.aspx</trackback:ping>
        </item>
        <item>
            <title>Apple iMac for a Windows Developer</title>
            <category>Apple</category>
            <category>Programming</category>
            <category>Windows 7</category>
            <link>http://geekswithblogs.net/btudor/archive/2009/12/07/136816.aspx</link>
            <description>&lt;h3&gt;New Apple iMac Arrives&lt;/h3&gt;  &lt;p&gt;The latest edition to the growing home computing center is an Apple iMac (Intel E7600 Core 2 Duo/8Gb RAM/1Tb HD/21.5"), which I promptly setup to use Boot Camp with Windows 7 as the default OS. This makes a great Family Room machine, in Windows or MacOS (despite missing HDMI port), and doubles as the iPhone development platform. What is more interesting is the purchase survey, which I took today.&lt;/p&gt;  &lt;h3&gt;Apple New Purchase Survey&lt;/h3&gt;  &lt;p&gt;Going though the questions it became clear that there were 3 main goals to the survey: canvass the effect of recent advertising campaigns; perform some basic market research; and make some decisions about Macs of the future. I answered the question about “who am I” correctly (software engineer), so I am sure they ignored everything I said with respect to advertising. Questions related to the second goal were interesting to me (do most people have wireless N or wireless G?), but the third goal – that’s the important one. We, as an industry and as consumers, have benefited from Apple’s presence in the market and I would like this role to continue. I want a say about Apple’s products of the future!&lt;/p&gt;  &lt;p&gt;So, just in case my entire survey response ended up in the bit-bucket, I will reiterate some of my survey responses here in the vein hopes that they will actually be heard. . . &lt;/p&gt;  &lt;h3&gt;What Apple Did Right&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;Use Intel hardware &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The use of industry standard hardware – not just Intel processors – saved Apple from death. This includes seamless operation with most peripherals (printers, etc.) and protocols in use today and not just processors, chipsets, and video cards. But most important is x86/x64, and the ability to run Windows on Mac hardware.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Build what people want &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;A few misses over the years, but mostly Apple builds what people want.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Provide Boot Camp (boot manager and drivers) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If your going to spend extra on a Mac, you might as well get something extra in return. Such as the ability to run Windows and MacOS on the same box. Nice.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Great hardware design. I mean, &lt;em&gt;great&lt;/em&gt; hardware design. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;What Apple Still Does not “Get”&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;The menu bar has got to go &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So what if the original MacOS had a bar at the top. MultiFinder is gone;  so get rid of the bar.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Secondary mouse click is critical (not to mention useful) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The new iMac comes with an excellent multi-touch wireless mouse that can detect if you click on its left side vs its right side. By default, however, the mouse control panel preferences are setup to ignore this feature. Although it was a simple change to enable what Apple calls &lt;em&gt;secondary click&lt;/em&gt;, this should be the default.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Charge a little less. Please? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I wish I could have gotten an i5 (or i7) for the price, and adding $200 for 4Gb of DDR3/1066 RAM is double the price I paid from Crucial (which is where I got my second half). I won’t mention what an additional TB of disk space costs, but at least memory is user-replaceable.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;No removable drive? Really? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Somebody tell Apple that (a) hard drives fail, (b) capacity requirements always go up over time, (c) costs always come down over time, and (d) new technology is just around the corner (SSD). Creating a computer without a user-replaceable drive is just stupid. In a year or so when I pry apart the glue in the beautiful glass display panel with a flat-blade screwdriver in order to access the drive, I’ll be cursing out loud. Drop the velvet lint cloth and add 2 screws and a tray.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Development Tools &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There’s good and bad, here. XCode is free, and comes with the OS. The App Store is obviously popular (and effective) with consumers. But objective-C? Really? Didn’t even take the time to remove the “ns” (NextStep) from the framework names! Focusing on what’s important or too lazy . . .not sure.&lt;/p&gt;  &lt;p&gt;But then there are all those users. Waiting for your app.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/btudor/aggbug/136816.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bill Tudor</dc:creator>
            <guid>http://geekswithblogs.net/btudor/archive/2009/12/07/136816.aspx</guid>
            <pubDate>Tue, 08 Dec 2009 01:11:16 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/btudor/comments/136816.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/btudor/archive/2009/12/07/136816.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/btudor/comments/commentRss/136816.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/btudor/services/trackbacks/136816.aspx</trackback:ping>
        </item>
        <item>
            <title>Google Go &amp;ndash; Who needs another language?</title>
            <category>Programming</category>
            <link>http://geekswithblogs.net/btudor/archive/2009/11/16/136343.aspx</link>
            <description>&lt;p&gt;My first thought – who needs another language? Are new languages the new rage?&lt;/p&gt;  &lt;p&gt;If I were to design a new language (I am not qualified, trust me), what would it address . . .&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;It would be garbage collected (no brainer) &lt;/li&gt;    &lt;li&gt;It would run in a VM (actually, many different VMs ) &lt;/li&gt;    &lt;li&gt;It would also be statically typed (I think many would disagree these days) &lt;/li&gt;    &lt;li&gt;Threading would be a focus (with message passing as a language feature). Certainly include some aspects of functional programming languages &lt;/li&gt;    &lt;li&gt;It would have first class functions to throw around &lt;/li&gt;    &lt;li&gt;Some sort of cool, built-in data types – if only to set it apart from other languages. &lt;/li&gt;    &lt;li&gt;Nearly all functionality in libraries, and try to get others to actually write the libraries &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Sounds a bit like &lt;a href="http://golang.org/"&gt;Google Go&lt;/a&gt; - “Expressive, concurrent, garbage collected” they say. Fast, safe, concurrent, fun, open source they continue. Fun and fast? I don’t think “compile time” is an issue and nearly everything these days, interpreted or not, runs “nearly as quickly as C or C++ code”. So that’s nothing new. All programming is fun. (Well, nearly all).&lt;/p&gt;  &lt;p&gt;My language would not have a googly-goofy name, like “Go” with all the “Go nuts”, “Go for it”, etc., phrases being thrown around. I do like the co-routines moniker, err, I mean Go-routines, however. At least they did not call it “goo” or “goog”. In fact, without the &lt;em&gt;goroutines&lt;/em&gt; I probably would not have given this thing a second look.&lt;/p&gt;  &lt;p&gt;So what is new with this language?&lt;/p&gt;  &lt;h3&gt;A Systems Programming Language&lt;/h3&gt;  &lt;p&gt;I think that title is a clue as to what this all might be about – I would love to see C/C++ disappear, but I would like to see that done through evolution of those languages. Something like removing all the “bad goo” from C/C++, but leaving the good stuff alone. Maybe that is impossible – we can only pile on, not take away. A colleague of mine once said that C/C++ would always be around because someone has to write the thread scheduler and the device drivers for the OS – I disagree, eventually we will jettison what is bad about C and keep what’s not. Is that GO? I don’t know.&lt;/p&gt;  &lt;p&gt;Why does it have pointers? Who in their right mind would add that as a language feature? It has no pointer arithmetic – so maybe this is OK, then? &lt;em&gt;Slices&lt;/em&gt; – they seem to allow you to address arbitrary blobs of bytes (defined via a pointer, maybe) or portions of arrays, as the documentation states, in a semi-safe manner without the pointer arithmetic. Sounds reasonable for a &lt;em&gt;systems&lt;/em&gt; programming language. I wonder, then, why are strings immutable? &lt;/p&gt;  &lt;h3&gt;Things I like&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;Maps, slices, and channels &lt;/li&gt;    &lt;li&gt;Go-Routines &lt;/li&gt;    &lt;li&gt;No implicit numeric conversions &lt;/li&gt;    &lt;li&gt;Lots of implicit “compatible conversions” (my terminology) &lt;/li&gt;    &lt;li&gt;No side-effects or alternatives syntaxes for things &lt;/li&gt;    &lt;li&gt;No operator overloading &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Things Not-so-hot&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;No exception handling &lt;/li&gt;    &lt;li&gt;No generics &lt;/li&gt;    &lt;li&gt;Pointers &lt;/li&gt;    &lt;li&gt;No method overloading &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;No type inheritance? I’ll have to think about that one for a while. Sounds very interesting, though, since a significant amount of refactoring I seem to do involves unwinding complex type hierarchies into composition models. There is also implicitly-inherited (my terminology) types – i.e., when one type just happens to implement a set of methods that matches another type or interface. They are then magically, implicitly compatible. That is cool. Very cool.&lt;/p&gt;  &lt;p&gt;I plan to spend some time over the next few months looking at Google Go. There are lots of very smart people over in google-land, so I am sure there is a lot to consider and learn from the ideas around Go. Too bad I’ll have to fire up linux or actually boot the Macbook into OSX instead of Windows 7 to play with it. Stupid decision on google’s part, if you ask me.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/btudor/aggbug/136343.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bill Tudor</dc:creator>
            <guid>http://geekswithblogs.net/btudor/archive/2009/11/16/136343.aspx</guid>
            <pubDate>Tue, 17 Nov 2009 02:37:17 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/btudor/comments/136343.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/btudor/archive/2009/11/16/136343.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/btudor/comments/commentRss/136343.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/btudor/services/trackbacks/136343.aspx</trackback:ping>
        </item>
        <item>
            <title>Windows Search &amp;ndash; Good or Bad?</title>
            <category>Windows 7</category>
            <category>Vista</category>
            <link>http://geekswithblogs.net/btudor/archive/2009/11/02/135941.aspx</link>
            <description>&lt;p&gt;One of the things I have always hated was “Windows Search”. Why the heck would I need “instant results” – instant as in donating countless CPU cycles and disk churns to background indexing operations running all day long on my box? YUK! I am never actually “looking” for something – I know where everything is. It’s right where I put it. Who are these people “looking” for things on their computers all the time?&lt;/p&gt;  &lt;h2&gt;Typical Scenario&lt;/h2&gt;  &lt;p&gt;My typical use case came up again this morning: I downloaded a source distribution from Google Code, and decided to check the files into my local SCM system (sidebar: this project is not taking any patches). Before doing this, I would like to delete all of the hidden “.svn” folders that came down with the distro. “Search for all folders named .svn”. Now keep in mind that I am not actually&lt;em&gt; looking for the folders&lt;/em&gt;, as I know where they are (there is one folder named .svn in each of the folders in the distribution). I simply want to &lt;em&gt;find&lt;/em&gt; them so I can &lt;em&gt;control-A&lt;/em&gt; (select all) and press the &lt;em&gt;delete&lt;/em&gt; key. You see what I mean.&lt;/p&gt;  &lt;h2&gt;Trouble with Windows Search&lt;/h2&gt;  &lt;p&gt;I always have trouble with Windows Search. I start typing “.svn” and immediately my file display window changes and I get a bunch of wrong answers – files with the letters “svn” in them (dot being ignored), sometimes files with “svn” inside of them, as well as virtually all of the files inside the folders, since many contain .svn extensions. Great. Hundreds of results when I was expecting around ten. What happened to the good old days when “find files” actually did what I wanted!&lt;/p&gt;  &lt;h2&gt;Read the Manual&lt;/h2&gt;  &lt;p&gt;Read the manual. For the first time, I decided to read the manual. I found &lt;a href="http://www.microsoft.com/windows/products/winfamily/desktopsearch/technicalresources/advquery.mspx"&gt;a page at microsoft.com&lt;/a&gt; with the search syntax. For my scenario:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;kind:folder .svn&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The dot “.” is still ignored, and you get all folders – not just folders with “svn” in the name. Hmm. A little more digging. . .&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;kind:folder name:.svn&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now I am getting just the folders named “.svn”, but I am still getting folders named “svn” (no dot), as well as any folder with “svn” in the name. Hmm.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;kind:folder name: “.svn”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That did it. The dot is still being ignored, despite the quotes, but it is not a wildcard in some sort of pseudo-regular expression. The documentation says that * and ? are the wildcard characters, taking on their typical meanings. There’s plenty of syntax for AND, OR, greater or less than (for things like dates and sizes), and virtually any property you can think of – in or out of the file(s).&lt;/p&gt;  &lt;p&gt;Maybe I’ll spend some more time looking over the documentation. Maybe not. At least I can now find a bunch of folders to delete. The next time I’m looking for a MSWord document containing the phrase “place contract”, the word “lease”, and was edited within the last 3 days, created by “mydomain\joe”, and last saved by “otherdomain\mike” – I’ll know how to do it. Thanks, Microsoft.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/btudor/aggbug/135941.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bill Tudor</dc:creator>
            <guid>http://geekswithblogs.net/btudor/archive/2009/11/02/135941.aspx</guid>
            <pubDate>Mon, 02 Nov 2009 10:55:55 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/btudor/comments/135941.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/btudor/archive/2009/11/02/135941.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/btudor/comments/commentRss/135941.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/btudor/services/trackbacks/135941.aspx</trackback:ping>
        </item>
        <item>
            <title>Visual Studio 2010 beta2 + Framework 4.0</title>
            <category>.Net</category>
            <category>c#</category>
            <category>Programming</category>
            <link>http://geekswithblogs.net/btudor/archive/2009/10/25/135709.aspx</link>
            <description>&lt;h1&gt;Visual Studio 2010 beta2 + Framework 4.0&lt;/h1&gt;  &lt;p&gt;. . . with a few comments on Windows Virtual PC.&lt;/p&gt;  &lt;h2&gt;Installation&lt;/h2&gt;  &lt;p&gt;I don’t “&lt;em&gt;work&lt;/em&gt;” on my laptop – mostly used for travel, library, watching Hulu and channel 9, etc. Since I will be out of town for a while, however, I decided to install VS20101b2 in a winVPC for the trip on the laptop. The only complaint about the new VPC offering from Microsoft is that when it is running, &lt;em&gt;it takes forever&lt;/em&gt; for my notebook to initiate sleep mode. I don’t recall the old product having this issue.&lt;/p&gt;  &lt;p&gt;Installation of 2010 was a breeze, especially Team Foundation Server (holy crap is that a different experience!). The new icon needs work – looks very bad in the new Windows 7 taskbar with the default theme. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/btudor/WindowsLiveWriter/VisualStudio2010beta2Framework4.0_6760/Capture_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Capture" border="0" alt="Capture" src="http://geekswithblogs.net/images/geekswithblogs_net/btudor/WindowsLiveWriter/VisualStudio2010beta2Framework4.0_6760/Capture_thumb_2.png" width="244" height="131" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;First Impressions&lt;/h2&gt;  &lt;p&gt;The first thing I did was fire up the VM and connect to TFS server – all running on the laptop – in a 1GB VM, I might add. I create a new team project (‘TestProject’). This all worked. I seem to remember several days before I was able to accomplish this on tfs2005, and at least a few hours on tfs2008. Today’s elapsed time is a couple of minutes (for the TFS part).&lt;/p&gt;  &lt;p&gt;Overall, I found a snappy IDE that has a &lt;em&gt;finished&lt;/em&gt; feel to it. Nice. March release should be no problem.&lt;/p&gt;  &lt;h2&gt;Branching and Merging&lt;/h2&gt;  &lt;p&gt;I setup the TestProject with a typical branching and merging strategy (dev/main/prod), added a few work items and a bug, and got to work.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/btudor/WindowsLiveWriter/VisualStudio2010beta2Framework4.0_6760/Capture2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Capture2" border="0" alt="Capture2" src="http://geekswithblogs.net/images/geekswithblogs_net/btudor/WindowsLiveWriter/VisualStudio2010beta2Framework4.0_6760/Capture2_thumb.png" width="192" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;[ Note: I like the little ‘Save’ icon – saves a picture of the visualization] There seem to be lots of tools accessible from this UI, such as branch compare tools. Overall, this visualizer is a nice feature (the simple picture shown does not do justice). I’m still looking for the merge visualizations (update: found them!). I’d like to see merge arrows that are labeled per the changeset description and clickable to show history/changeset details for merges. It looks like I’ve got some exploring to do.&lt;/p&gt;  &lt;h2&gt;Team Web Access&lt;/h2&gt;  &lt;p&gt;I was not expecting this. Even in the Basic product running on a local client OS. Nice touch. It’s a beautiful source, work item, project browser web application. Who needs SharePoint?&lt;/p&gt;  &lt;h2&gt;New in Framework&lt;/h2&gt;  &lt;p&gt;I’ve already &lt;a href="http://geekswithblogs.net/btudor/archive/2009/09/08/134547.aspx"&gt;blogged a few times&lt;/a&gt; about &lt;a href="http://geekswithblogs.net/btudor/archive/2009/06/10/132733.aspx"&gt;changes&lt;/a&gt; in the Framework 4.0 beta. A few more in this release:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;DLR library &lt;/li&gt;    &lt;li&gt;Several more threading primitives &lt;/li&gt;    &lt;li&gt;System.Collections.Concurrent namespace &lt;/li&gt;    &lt;li&gt;MEF improvements &lt;/li&gt;    &lt;li&gt;In-process side-x-side CLR &lt;/li&gt; &lt;/ul&gt; &lt;img src="http://geekswithblogs.net/btudor/aggbug/135709.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bill Tudor</dc:creator>
            <guid>http://geekswithblogs.net/btudor/archive/2009/10/25/135709.aspx</guid>
            <pubDate>Sun, 25 Oct 2009 22:48:55 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/btudor/comments/135709.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/btudor/archive/2009/10/25/135709.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/btudor/comments/commentRss/135709.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/btudor/services/trackbacks/135709.aspx</trackback:ping>
        </item>
        <item>
            <title>Static Reflection in .Net</title>
            <category>c#</category>
            <category>Architecture</category>
            <category>.Net</category>
            <category>Programming</category>
            <link>http://geekswithblogs.net/btudor/archive/2009/10/12/135423.aspx</link>
            <description>&lt;h2&gt;Static Reflection in .Net&lt;/h2&gt;  &lt;p&gt;Where have I been?&lt;/p&gt;  &lt;p&gt;I recently took a few minutes to look through the latest &lt;a href="http://msdn.microsoft.com/en-us/magazine/default.aspx"&gt;MSDN magazine&lt;/a&gt; and ran across &lt;a href="http://msdn.microsoft.com/en-us/magazine/ee309512.aspx"&gt;a nice article by Jeremy Miller&lt;/a&gt; on “Functional Programming for Everyday .NET Development”. The section titled “Lambdas as Data” was my first introduction to static reflection in .Net. Where the heck have I been? I don’t write database persistence code, so I am not familiar with NHibernate (or fluent NHibernate) (which is where Jeremy’s sample comes from), but I am still surprised at how little I understand about everything Linq brought to the .Net party. A quick search around the internet reveals &lt;a href="http://www.lostechies.com/blogs/chad_myers/archive/2008/07/06/exploring-shadetree-features-part-1-static-reflection-with-reflectionhelper.aspx"&gt;this topic is well-covered&lt;/a&gt;, and several years old.&lt;/p&gt;  &lt;h2&gt;Example Code&lt;/h2&gt;  &lt;p&gt;Suppose you have a need to dynamically discover properties on an object. Easy, right? After all, that’s what the System.Reflection namespaces is for! However..&lt;/p&gt;  &lt;p&gt;Let’s look at a class named “SomeObject” with a property “SomeProperty”:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt; SomeObject&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; SomeProperty { get; set; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;You can use&lt;em&gt; so-called&lt;/em&gt; “static reflection” like this:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Program&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;         SomeObject o = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SomeObject()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;             SomeProperty = &lt;span style="color: #006080"&gt;"Test"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;         };&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;         staticReflection(o, e =&amp;gt; e.SomeProperty);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;         Console.ReadKey();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; staticReflection&amp;lt;T&amp;gt;(T o, Expression&amp;lt;Func&amp;lt;T,&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; expression)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;         MemberExpression me = expression.Body &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; MemberExpression;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (me != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; me.Member.MemberType == System.Reflection.MemberTypes.Property)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;             Console.WriteLine(&lt;span style="color: #006080"&gt;"Property: '{0}' of type '{1}' has value '{2}'."&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;                 me.Member.Name,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;                 expression.Body.Type,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;                 expression.Compile().Invoke(o)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;                 );&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The output is:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font size="3" face="Courier New"&gt;Property: 'SomeProperty' of type 'System.String' has value 'Test'.&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Very cool. Now I need to understand why the second argument has to be something like Expression&amp;lt;Func&amp;lt;T, object&amp;gt;&amp;gt; rather than simply Expression&amp;lt;T&amp;gt;. If the latter is used, the compiler rewards me with:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font size="3" face="Courier New"&gt;Error    1    Cannot convert lambda to an expression tree whose type argument 'StaticReflection.SomeObject' is not a delegate type&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s the whole “return type” thing on the delegate that throws me as well – where does that come from? In my code sample I have declared the Func return type as type “object” (it is actually a string in my case). Why don’t I have to do something like “e =&amp;gt; {return e.SomeProperty;}”, and how come a lambda expression with a statement body like that cannot be converted into an expression tree (compiler’s words, not mine)?&lt;/p&gt;

&lt;p&gt;I still have a little more learning to do before really understanding what’s going on here. My suspicion is that Linq brought a heck of a lot more to the party than it might appear at first look.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/btudor/aggbug/135423.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bill Tudor</dc:creator>
            <guid>http://geekswithblogs.net/btudor/archive/2009/10/12/135423.aspx</guid>
            <pubDate>Mon, 12 Oct 2009 17:08:21 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/btudor/comments/135423.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/btudor/archive/2009/10/12/135423.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/btudor/comments/commentRss/135423.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/btudor/services/trackbacks/135423.aspx</trackback:ping>
        </item>
        <item>
            <title>Designing Software for Scientists</title>
            <category>Architecture</category>
            <category>Programming</category>
            <link>http://geekswithblogs.net/btudor/archive/2009/10/06/135325.aspx</link>
            <description>&lt;h1&gt;Designing Software for Scientists&lt;/h1&gt;  &lt;p&gt;Creating a software design for scientists can be tricky business. Unlike the businessman, who is better off looking at the pretty database report or marveling over the catchy name of the latest &lt;em&gt;Forms over Data&lt;/em&gt; application, the scientist can actually contribute to the implementation – provided you use the right architecture. In year’s past (I’m referring to 20+ years ago), the typical Physicist / Chemist / etc. was &lt;em&gt;nearly on par&lt;/em&gt; with the typical software engineer / computer scientists with respect to software design skills. Although the scientific community of that time preferred the ‘&lt;em&gt;GOTO’&lt;/em&gt;, they nevertheless understood the value of using subroutines to nearly the same degree as a computer scientists. &lt;/p&gt;  &lt;p&gt;Not so, today. Software design has come a long way since then.&lt;/p&gt;  &lt;h3&gt;Software Design has Matured&lt;/h3&gt;  &lt;p&gt;Software design has matured. We have terms like inheritance and encapsulation. We talk about singletons, abstract factories, and chain of responsibility. We use terms like polymorphism, covariance, and contravariance (as applied to software design). We compose systems with Inversion of Control containers. Mock objects are used for unit testing. Reflection, dynamic and static languages. The discipline of software engineering has matured to a point where the typical scientist cannot possibly hope to understand what makes a well-design system – no more than a software engineer can understand how to model protein folding of polypeptides. &lt;/p&gt;  &lt;p&gt;So how do we design software so that other scientists and engineers can participate in the implementation? Here are some ideas.&lt;/p&gt;  &lt;h4&gt;1. Keep it Simple.&lt;/h4&gt;  &lt;p&gt;Don’t compose in an IoC container – too abstract. Do use layers, repositories, and multiple program units. Scientists understand process control, state transitions, and other engineering/scientific/mathematics concepts so use them in your software designs. [Object models? Not sure where I stand on this one. There might be a whole blog post in here somewhere.]&lt;/p&gt;  &lt;h4&gt;2. Work in Pairs&lt;/h4&gt;  &lt;p&gt;Match a subject matter expert with a software design expert. &lt;/p&gt;  &lt;h4&gt;3. Limit Participation&lt;/h4&gt;  &lt;p&gt;Limit the “coding” performed by the scientist to the functional code, not the design. The infrastructure, layout, program flow as well as all meta-design elements (project structure, build environment, coding standards, etc.) – essentially &lt;em&gt;the software design&lt;/em&gt;, should be strictly the realm of the software architect. Leave the algorithms for the subject matter expert. &lt;/p&gt;  &lt;h4&gt;4. Move the problem domain.&lt;/h4&gt;  &lt;p&gt;Let the scientists program in their own “language” - provide a scripting component, meta-programming, or data-driven model such that the subject matter expert remains closer to their problem domain, even if this means additional software (such as interpreters, data transformation engines) must be developed. In a really large system, you might go so far as to develop a rules engine or other knowledge base approach.&lt;/p&gt;  &lt;h4&gt;5. Use Abstractions&lt;/h4&gt;  &lt;p&gt;The nature of software is to provide abstractions. This also happens to be common of all science and engineering. You can use your entire software design Bag ‘o Tricks provided you supply an appropriate level of abstraction over top. Explain the abstraction, and the typical scientist will have no trouble using it, even if they really don’t know what is going on. So in spite of the first idea listed here, you &lt;em&gt;can&lt;/em&gt; fire up your favorite IoC container and use it – as long as you provide the right abstraction for your scientific colleagues.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/btudor/aggbug/135325.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bill Tudor</dc:creator>
            <guid>http://geekswithblogs.net/btudor/archive/2009/10/06/135325.aspx</guid>
            <pubDate>Tue, 06 Oct 2009 10:02:48 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/btudor/comments/135325.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/btudor/archive/2009/10/06/135325.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/btudor/comments/commentRss/135325.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/btudor/services/trackbacks/135325.aspx</trackback:ping>
        </item>
        <item>
            <title>Three&amp;rsquo;s a Charm?</title>
            <category>.Net</category>
            <category>configuration management</category>
            <link>http://geekswithblogs.net/btudor/archive/2009/10/02/135243.aspx</link>
            <description>&lt;h1&gt;Three’s a Charm&lt;/h1&gt;  &lt;p&gt;It looks like the third iteration of Team Foundation Server might be a good one. I just finished reading &lt;a href="http://blogs.msdn.com/bharry/archive/2009/10/01/tfs-2010-for-sourcesafe-users.aspx"&gt;Brian Harry’s post on TFS 2010&lt;/a&gt; and it contains some interesting references.&lt;/p&gt;  &lt;h3&gt;SourceSafe Replacement?&lt;/h3&gt;  &lt;p&gt;I never could understand why TFS was often compared to SourceSafe. All the sessions on migrating from VSS to TFS, TFS for VSS users, etc. Is a team really going to migrate from VSS to TFS? Really? You have got to be kidding me! TFS is&lt;em&gt; change management&lt;/em&gt; (to borrow a phrase from Rational), and &lt;em&gt;VSS was barely version control&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;… but now I think I get it …&lt;/p&gt;  &lt;p&gt;All those VSS (or CVS, etc.) users were left stranded – there was no lightweight version control server for individuals (or very small teams). So they all went to SVN. Quick setup, version control, painful (but possible) branching and merging, command line, nice shell client, poor VS client, and all of that.&lt;/p&gt;  &lt;h3&gt;VSTS 2010&lt;/h3&gt;  &lt;p&gt;In steps Visual Studio Team System, Team Foundation Server, 2010.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Can run locally on Windows 7 and Windows Vista &lt;em&gt;client&lt;/em&gt; OS’&lt;/li&gt;    &lt;li&gt;Simple installation / Configuration &lt;/li&gt;    &lt;li&gt;Can optional use SQL Server express edition &lt;/li&gt;    &lt;li&gt;Can be installed on a domain controller &lt;/li&gt;    &lt;li&gt;Stand-alone version includes Work Item Tracking, Version Control &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Note that this stand alone version also appears to include the build server/services!&lt;/p&gt;  &lt;p&gt;I assume with the new project collections feature, you could move your SQL Express database over to a real SQL Server when your team gets a bit bigger. And good pricing is also on the Redmond minds.&lt;/p&gt;  &lt;p&gt;Looks to me like they did their research. And did it well.&lt;/p&gt;  &lt;p&gt;Nice.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/btudor/aggbug/135243.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bill Tudor</dc:creator>
            <guid>http://geekswithblogs.net/btudor/archive/2009/10/02/135243.aspx</guid>
            <pubDate>Fri, 02 Oct 2009 10:10:48 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/btudor/comments/135243.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/btudor/archive/2009/10/02/135243.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/btudor/comments/commentRss/135243.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/btudor/services/trackbacks/135243.aspx</trackback:ping>
        </item>
        <item>
            <title>Running Command Line Tools from .Net</title>
            <category>c#</category>
            <category>.Net</category>
            <category>Programming</category>
            <link>http://geekswithblogs.net/btudor/archive/2009/09/22/135001.aspx</link>
            <description>&lt;p&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx"&gt;Process&lt;/a&gt; class in .Net makes it easy to run command line tools from within a .Net program. Here is an implementation with a couple of twists:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Environment variable expansion &lt;/li&gt;    &lt;li&gt;Optional asynchronous execution &lt;/li&gt;    &lt;li&gt;Transformation of output into an enumerable collection of objects &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The implementation takes the form of an object named &lt;strong&gt;&lt;em&gt;CommandLineTool&lt;/em&gt;&lt;/strong&gt; with the following constructors:&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; height: 283px; max-height: 600px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; CommandLineTool(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; command)&lt;br /&gt;    : &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;(command, String.Empty, Environment.CurrentDirectory, _defaultTransform) { }&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; CommandLineTool(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; command, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; arguments)&lt;br /&gt;    : &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;(command, arguments, Environment.CurrentDirectory, _defaultTransform) { }&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; CommandLineTool(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; command, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; arguments, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; workingDirectory)&lt;br /&gt;    : &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;(command, arguments, workingDirectory, _defaultTransform) { }&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; CommandLineTool(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; command, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; arguments, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; workingDirectory, Func&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; transform)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Command = Environment.ExpandEnvironmentVariables(command);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Arguments = Environment.ExpandEnvironmentVariables(arguments);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.WorkingDirectory = Environment.ExpandEnvironmentVariables(workingDirectory);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Transform = transform;&lt;br /&gt;    _isBusy = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;The simplest form provides for an executable filename only, while the last constructor accepts arguments, working directory, and transformation function for the output lines. Note that environment variables, such as "%ComSpec%, may be included in any of the first three arguments.&lt;/p&gt;

&lt;h3&gt;Output Transformation&lt;/h3&gt;

&lt;p&gt;Each line of output (strings) can be sent to a transformation function, defined as a Func&amp;lt;string, object&amp;gt;, and returned as an enumerable collection of objects (IEnumerable&amp;lt;Object&amp;gt;) accessed via the OutputObjects property. Output can also be expressed as a single string (Output) or an array of lines of text (OutputLines). These are exposed as properties. The transformation function is free to return &lt;em&gt;null&lt;/em&gt; to exclude an item from the OutputObjects collection.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// Command output.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Output { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// Command output lines.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; [] OutputLines&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     get&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Output != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Output.Split(_seperators, StringSplitOptions.RemoveEmptyEntries);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// Output Objects.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// Output lines are converted to output objects using the transform&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// function. The default transform functions results in an enumeration&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// of the out lines (strings).&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Object&amp;gt; OutputObjects&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;     get&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Transform != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; OutputLines.Select(Transform).Where(o =&amp;gt; o != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum37"&gt;  37:&lt;/span&gt; }    &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;Asynchronous and Synchronous Operation&lt;/h3&gt;

&lt;p&gt;Both asynchronous and synchronous modes of operation are provided. An event (&lt;em&gt;ExecuteCompleted&lt;/em&gt;) is raised following the completion of an asynchronous execution. Overloads are provided for both the &lt;em&gt;Execute()&lt;/em&gt; and &lt;em&gt;ExecuteAsync()&lt;/em&gt; methods to allow for an alternate transformation function to be applied in successive calls. Only one asynchronous operation at a time is allowed. The asynchronous version simply calls on the synchronous version using a background thread from the thread pool. Error output is provided in a similar manner to standard output, except that there is no option for transformation of lines of text on the error output to objects.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// Execute the command.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;param name="transform"&amp;gt;Transform to apply to the output.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;Command result.&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Execute(Func&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; transform)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Transform = transform;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Execute();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// Executes the command.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;Command result.&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Execute()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;     ProcessStartInfo info = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ProcessStartInfo();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;     info.FileName = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Command;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;     info.Arguments = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Arguments;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;     info.WorkingDirectory = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.WorkingDirectory;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;     info.CreateNoWindow = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;     info.UseShellExecute = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;     info.RedirectStandardError = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;     info.RedirectStandardOutput = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;     Process p = Process.Start(info);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;     Output = p.StandardOutput.ReadToEnd();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;     ErrorOutput = p.StandardError.ReadToEnd();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; p.ExitCode;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// Execute the command asynchronously.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;param name="transform"&amp;gt;Transform to apply to the output.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ExecuteAsync(Func&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; transform)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Transform = transform;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum37"&gt;  37:&lt;/span&gt;     ExecuteAsync();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum38"&gt;  38:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum39"&gt;  39:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum40"&gt;  40:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// Execute the command asynchronously.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum41"&gt;  41:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum42"&gt;  42:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ExecuteAsync()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum43"&gt;  43:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum44"&gt;  44:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;lock&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum45"&gt;  45:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum46"&gt;  46:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!_isBusy)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum47"&gt;  47:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum48"&gt;  48:&lt;/span&gt;             _isBusy = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum49"&gt;  49:&lt;/span&gt;             ThreadPool.QueueUserWorkItem((WaitCallback)((state) =&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum50"&gt;  50:&lt;/span&gt;             {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum51"&gt;  51:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; result = Execute();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum52"&gt;  52:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (ExecuteCompleted != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum53"&gt;  53:&lt;/span&gt;                 {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum54"&gt;  54:&lt;/span&gt;                     ExecuteCompleted(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, EventArgs.Empty);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum55"&gt;  55:&lt;/span&gt;                 }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum56"&gt;  56:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;lock&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum57"&gt;  57:&lt;/span&gt;                 {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum58"&gt;  58:&lt;/span&gt;                     _isBusy = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum59"&gt;  59:&lt;/span&gt;                 }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum60"&gt;  60:&lt;/span&gt;             }));&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum61"&gt;  61:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum62"&gt;  62:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum63"&gt;  63:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum64"&gt;  64:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; InvalidOperationException(&lt;span style="color: #006080"&gt;"Async operation in progress."&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum65"&gt;  65:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum66"&gt;  66:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum67"&gt;  67:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;Using the Code&lt;/h3&gt;

&lt;p&gt;Using the code is fairly easy. Just create a new &lt;em&gt;CommandLineTool&lt;/em&gt; object and call either the &lt;em&gt;Execute&lt;/em&gt;() or &lt;em&gt;ExecuteAsync&lt;/em&gt;() methods. Here is a snippet from one of the unit tests:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; command = &lt;span style="color: #006080"&gt;"cmd.exe"&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; arguments = &lt;span style="color: #006080"&gt;"/c dir"&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; CommandLineTool target = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CommandLineTool(command, arguments);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; expected = 0;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; actual;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; actual = target.Execute();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; Assert.AreEqual(expected, actual);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;A more involved example (somewhat contrived) includes transformation of the results and asynchronous operations. [Results are transformed into &lt;em&gt;FileObject&lt;/em&gt; objects].&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;// The FileObject class ...&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; FileObject&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; DateTime ModifiedDate { get; set; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Name { get; set; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;  &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt; &lt;span style="color: #008000"&gt;// Code ...&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;  &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; command = &lt;span style="color: #006080"&gt;"cmd.exe"&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; arguments = &lt;span style="color: #006080"&gt;"/c dir /s"&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     Func&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; transform = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;(s =&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;             DateTime modified = DateTime.MaxValue;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (s.Length &amp;gt; 39 &amp;amp;&amp;amp; DateTime.TryParse(s.Substring(0, 20), &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; modified))&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;             {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; FileObject()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;                 {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;                     ModifiedDate = modified,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;                     Name = s.Substring(39)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;                 };&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;             }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;         });&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;     CommandLineTool target = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CommandLineTool(command, arguments);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;     target.ExecuteAsync(transform);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (target.IsBusy) Thread.Sleep(0);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;  &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;     List&amp;lt;FileObject&amp;gt; files = target.OutputObjects.Cast&amp;lt;FileObject&amp;gt;().ToList();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;  &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;     ... etc ... &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Hope this comes in handy for someone. Let me know if you see any errors/problems or room for improvement.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/btudor/aggbug/135001.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bill Tudor</dc:creator>
            <guid>http://geekswithblogs.net/btudor/archive/2009/09/22/135001.aspx</guid>
            <pubDate>Tue, 22 Sep 2009 09:36:27 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/btudor/comments/135001.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/btudor/archive/2009/09/22/135001.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/btudor/comments/commentRss/135001.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/btudor/services/trackbacks/135001.aspx</trackback:ping>
        </item>
        <item>
            <title>The &amp;ldquo;Web Application&amp;rdquo; Must Die</title>
            <category>Programming</category>
            <category>Architecture</category>
            <link>http://geekswithblogs.net/btudor/archive/2009/09/14/134795.aspx</link>
            <description>&lt;p&gt;Remember when a program was termed a “GUI Application” - a program with a &lt;em&gt;G&lt;/em&gt;raphical &lt;em&gt;U&lt;/em&gt;ser &lt;em&gt;I&lt;/em&gt;nterface? It had features like menus that “dropped-down” (or “popped up”), scroll bars to reveal more of the virtual surface area, a pointing device (still called a &lt;em&gt;cursor&lt;/em&gt;), and lots and lots of Drag &amp;amp; Drop. Thankfully, that moniker has mostly died. Now it is time another term to fall by the wayside – the &lt;em&gt;Web Application&lt;/em&gt;.&lt;/p&gt;  &lt;h3&gt;What is a Web Application?&lt;/h3&gt;  &lt;p&gt;Just what is a web application, anyway. An application delivered over the web? A Java applet, flash, or silverlight program running in a browser? How about HTML+Javascript with lots of Ajaxy asynchronous updating? What about plain old static HTML pages with hyperlinks to navigate between them?&lt;/p&gt;  &lt;h3&gt;Who are Web Developers?&lt;/h3&gt;  &lt;p&gt;Just who are these web developers? Are they PHP junkies, ASP.net gurus, Flex monkeys? Are the real web developers HTML+CSS+JavaScriptors? Rails developers? Web site designers? What about a C++ application that runs locally yet stores data in the cloud or communicates with other instances on the internet? &lt;em&gt;Is the twitter client a web application?&lt;/em&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;The ubiquitous internet makes every application a web application. The term has lost its meaning, and the term must die.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Just like “GUI”. If an application requires a user interface, it will be a &lt;em&gt;graphical&lt;/em&gt; one. If an application requires communication between computers, or presence on more than one computer, it will use the “&lt;em&gt;Web&lt;/em&gt;”. In one way or another. Server side, client side, I don’t care. These days, every “application” is a “web application”.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/btudor/aggbug/134795.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bill Tudor</dc:creator>
            <guid>http://geekswithblogs.net/btudor/archive/2009/09/14/134795.aspx</guid>
            <pubDate>Mon, 14 Sep 2009 09:55:56 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/btudor/comments/134795.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/btudor/archive/2009/09/14/134795.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/btudor/comments/commentRss/134795.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/btudor/services/trackbacks/134795.aspx</trackback:ping>
        </item>
        <item>
            <title>Microsoft .Net Framework 4.0</title>
            <category>Programming</category>
            <category>.Net</category>
            <link>http://geekswithblogs.net/btudor/archive/2009/09/08/134547.aspx</link>
            <description>&lt;p&gt;Below are a few thoughts on the upcoming framework 4.0. I am not sure if the feature set is finalized, but I’ll comment on what I think are some of the more interesting features being planned for this release, as seen in the beta.&lt;/p&gt;  &lt;h3&gt;Managed Extensibility Framework&lt;/h3&gt;  &lt;p&gt;Plug-in architectures are a fairly common pattern for many scenarios, and I have seen quite a few over the years. MEF seems to be a nice combination of plug-in/IoC container/Dependency Injection framework. It’s use in Visual Studio 2010 should prove to give this framework a leg-up. I’m looking forward to using it as a replacement to the typical roll-your-own plug-in architecture. Not sure if it will be used where a complete dynamically composed extensible application is called for, however, that is exactly the scenario that MEF is designed for. I’ll see how it works out for plug-ins, first, before jumping in with both feet.&lt;/p&gt;  &lt;h3&gt;Language Enhancements&lt;/h3&gt;  &lt;p&gt;Some of these are obvious improvements: Optional arguments, COM interop/PIA enhancements. Some are welcome, such as named parameters. As for the new dynamic language features in C# ... well, I’m not qualified to comment on that yet. Interoperability with dynamic languages is a good thing. Whether or not I’ll be writing “dynamic c#” in the near future remains to be seen.&lt;/p&gt;  &lt;h3&gt;Base Class Library&lt;/h3&gt;  &lt;p&gt;I’ve &lt;a href="http://geekswithblogs.net/btudor/archive/2009/06/10/132733.aspx"&gt;blogged about one new class&lt;/a&gt;, the Memory Mapped File, in the recent past. There are a host of additional improvements, including the inclusion of the Task Parallel Library (TPL) that I believe came out of Microsoft research and has been release in CTP form a few times. Code Contracts look interesting, but I seriously doubt I will be adding pre-conditions, post-conditions and the like to very much code. I suppose there is a use for this – for some types of code; but I don’t see it for typical use. I had some experience with Eiffel in the past and did not care for it.&lt;/p&gt;  &lt;h3&gt;More Framework, Less P/Invoke&lt;/h3&gt;  &lt;p&gt;I would like to see more framework and less P/Invoke, particularly for new technologies such as those introduced in Windows Vista. There are managed wrappers provided for many things from Microsoft, but how about adding Windows 7 stuff to framework 4.0? It’s fine that wrapper libraries appear on CodePlex, but I would like to see the kind of treatment you would get from including new APIs in the framework – the way the System.Net.Sockets namespace is not simply a wrapper around the Win32 sockets API. I know, it’s hard – but what else is windows except a platform for development? If I was looking for merely an OS to run standard applications on, I could look elsewhere. Windows is first and foremost an application development platform for me. And for applications, I prefer managed code. Leave the C code (and COM goo) for drivers and low-level applications like virus scanners.&lt;/p&gt;  &lt;h3&gt;Visual Studio 2010&lt;/h3&gt;  &lt;p&gt;This looks like a big change. I’ll probably be using this for R&amp;amp;D (and also at home). But will probably wait about a year (or more) before converting all development projects over to vs2010. Although the beta seems pretty solid, my experience is that the first of a major change (vs2002/2003, the initial vs2008) in the Visual Studio line is not the greatest (contrast to vs6, vs2005 and now 2008/SP1). I love two things: multi-targeting and the ability to run different visual studio versions side x side. I expect that experience to be kept in vs2010. This allows developers to install the new tools with “no fear”, committing to them down the road. Goes a long way to increase adoptability. All that being said, the C++ team is saying “&lt;a href="http://channel9.msdn.com/pdc2008/TL13/"&gt;10 is the new 6&lt;/a&gt;”, and MSBuild can now be used for C++ code, etc., etc. I’ll keep an eye on thing in 2010.&lt;/p&gt;  &lt;h3&gt;F#?&lt;/h3&gt;  &lt;p&gt;Don’t know about this one. I’m thinking that the pile of technologies that I am now “expert” in is getting a little too large. However, I believe in the mantra “&lt;em&gt;learn a new programming language every year&lt;/em&gt;”. It can be a bit confusing to switch from maintaining classic C code, early C++ code (mostly C with sprinkles of C++, MFC/ATL), later C++ code (STL, etc.), some VB6 and VBscript in classic ASP or office apps; then perform new development in JavaScript, C#, Windows Forms, WPF, Silverlight, and ASP.net. with a sprinkling of objective C for an iPhone app or two (quite a mix of frameworks and languages in that sentence, but you get the idea). I love it all. I’ll have to work F# in somewhere, because a functional language perspective brings new thought patterns, which is always a good thing. I suppose I’m glad it’s in the box, although at first thought I might want IronRuby or IronPython in there instead. I don’t see any production apps developed in F# in the next year or two, but an R&amp;amp;D project is likely.&lt;/p&gt;  &lt;p&gt;-   -    -     -&lt;/p&gt;  &lt;p&gt;I have to admit that I have not played all that much with the beta; been pretty busy over the past few months. But I’m looking forward to framework 4.0, and expect it will turn out to be a significant release.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/btudor/aggbug/134547.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bill Tudor</dc:creator>
            <guid>http://geekswithblogs.net/btudor/archive/2009/09/08/134547.aspx</guid>
            <pubDate>Tue, 08 Sep 2009 10:40:02 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/btudor/comments/134547.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/btudor/archive/2009/09/08/134547.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/btudor/comments/commentRss/134547.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/btudor/services/trackbacks/134547.aspx</trackback:ping>
        </item>
        <item>
            <title>2 THz Computer with 100GB Memory and a Petabyte Hard Drive</title>
            <link>http://geekswithblogs.net/btudor/archive/2009/08/21/134233.aspx</link>
            <description>&lt;p&gt;There have been a few famous quotes on the subject – how much memory do you really need; how many GHz is enough; how much storage to hold all the books in the world; how many personal computers are enough for planet earth (let alone a single family), etc., etc. - I’ll stay away from predicting the future and &lt;em&gt;just talk about what I need today&lt;/em&gt;.&lt;/p&gt;  &lt;h3&gt;2 THz processor&lt;/h3&gt;  &lt;p&gt;I need a 2THz processor. It took me 5 hours (300 minutes) to encode a family video to MP4 (H.264 720p) on a dual-core 2.66GHz machine. It is reasonable to want this to take just a few minutes (around the time it takes to burn an audio CD today) so that I could grab a video, throw some clips together, and encode the clips in an afternoon before dinner.&lt;/p&gt;  &lt;h3&gt;100 GB of RAM&lt;/h3&gt;  &lt;p&gt;Remember the days when large digital images could not fit in RAM? I would like my 5GB of video to fit in RAM – maybe two or three of them – comfortably – while editing the video. 100GB should be enough (for today). Speed up disk transfer, network, etc. by 100x or 1000x while we’re at it so we can push all this data around easier.&lt;/p&gt;  &lt;h3&gt;Petabyte Hard Drive&lt;/h3&gt;  &lt;p&gt;We need a place to store all these bits. A Petabyte would be a good starting point. While it is true that all of the emails, financial data, and other digital records I have can fit on a $20 8Gb flash card, and the music collections of everyone in the house combined add up to less than 100 Gb, we still have a cabinet full of DVD disks and nearly zero video digitally encoded and stored on the computers. Kind of like our audio data was some years ago.&lt;/p&gt;  &lt;h3&gt;Final Thoughts&lt;/h3&gt;  &lt;p&gt;Just sticking with what I need today – right now – I came up with these numbers. But I’m stuck with just a few GHz of cycles, a few Gb of ram, and a few Tb of storage. And I’ll be heating up the computer room for 5 hours at a clip with fans on high and CPU’s pegged at 100%. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;We still have a long way to go.&lt;/em&gt;&lt;/p&gt; &lt;img src="http://geekswithblogs.net/btudor/aggbug/134233.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bill Tudor</dc:creator>
            <guid>http://geekswithblogs.net/btudor/archive/2009/08/21/134233.aspx</guid>
            <pubDate>Fri, 21 Aug 2009 11:18:04 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/btudor/comments/134233.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/btudor/archive/2009/08/21/134233.aspx#feedback</comments>
            <slash:comments>15</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/btudor/comments/commentRss/134233.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/btudor/services/trackbacks/134233.aspx</trackback:ping>
        </item>
        <item>
            <title>Monitoring Home Network Activity</title>
            <link>http://geekswithblogs.net/btudor/archive/2009/08/11/134020.aspx</link>
            <description>&lt;p&gt;As my home router’s “blocked web sites” list slowly began to fill up with open proxies (kproxy.com, getus.in, vtunnel.com, browse007.com, and anonymouse.org, etc.), I realized that it’s time to &lt;em&gt;stop blocking and start monitoring&lt;/em&gt;.&lt;/p&gt;  &lt;h3&gt;DLink DIR-655 Event Logging&lt;/h3&gt;  &lt;p&gt;My DLink DIR-655 (great little router) contains an event logging feature that can send events, SYSLOG-style, over the network to a collector.&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;110&amp;gt;Mon Aug 10 20:32:30 2009 DIR655 System Log: Web site geekswithblogs.net/ accessed from 192.168.1.91&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;110&amp;gt;Mon Aug 10 20:32:30 2009 DIR655 System Log: Web site geekswithblogs.net/ScriptResource.axd?d=afn4d1BEk_dsfd45j-LusKDJDF accessed from 192.168.1.91&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;110&amp;gt;Mon Aug 10 20:32:30 2009 DIR655 System Log: Web site geekswithblogs.net/Geekswithblogs.css accessed from 192.168.1.91&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;110&amp;gt;Mon Aug 10 20:32:30 2009 DIR655 System Log: Web site geekswithblogs.net/WebResource.axd?d=PKDJF7383jdhksj_jd accessed from 192.168.1.91&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;110&amp;gt;Mon Aug 10 20:32:30 2009 DIR655 System Log: Web site geekswithblogs.net/ScriptResource.axd?d=kalwo*hsdh%%jdjdgs90-48JSH accessed from 192.168.1.91&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;110&amp;gt;Mon Aug 10 20:32:31 2009 DIR655 System Log: Web site geekswithblogs.net/?_TSM_HiddenField_=ctl00__mainContent_ScriptMana accessed from 192.168.1.91&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;110&amp;gt;Mon Aug 10 20:32:31 2009 DIR655 System Log: Web site ads.geekswithblogs.net/a.aspx?ZoneID=1&amp;amp;Task=Get&amp;amp;IFR=False&amp;amp;PageID=51102&amp;amp; accessed from 192.168.1.91&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;110&amp;gt;Mon Aug 10 20:32:31 2009 DIR655 System Log: Web site docs.geekswithblogs.net/DiscountASPNET/160x600_Champs_Trophy_6Mo_SM.gif accessed from 192.168.1.91&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;110&amp;gt;Mon Aug 10 20:32:31 2009 DIR655 System Log: Web site www.gravatar.com/avatar.php?gravatar_id=4837367e8383a8b38376f accessed from 192.168.1.91&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;All I have to do is run a little server on the SYSLOG port, collecting messages as they come in and storing them in a database that can later be used as a source for reporting. I use the following regular expression to parse these messages:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Regex _webSiteRegex = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #006080"&gt;@"^&amp;lt;\d{1,3}&amp;gt;(?&amp;lt;date&amp;gt;.+) DIR655 System Log: Web site (?&amp;lt;msg&amp;gt;.+) accessed from (?&amp;lt;source&amp;gt;[A-F0-9\.]+)"&lt;/span&gt;, RegexOptions.Compiled);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This expression provides me with the date string, the partial URL of the site accessed, and the source of the request. The DLink router indicates the source as either an IP address or a MAC address. Wireless devices, such as an iPod Touch, are usually reported by MAC address while wired computers working off the router’s DHCP server are reported via IP. I decided to store MAC address information in the database, since the IP address for the various devices can change (I use DHCP). A simple ARP request can convert any of the IP address to MAC address on my subnet as needed.&lt;/p&gt;

&lt;p&gt;To facilitate reporting, I decided to only store the hostname and domain portions of the URL in the database. My daily report, sent via email, displays the top 10 domains per device along with any domains that I have not seen before. &lt;/p&gt;

&lt;h3&gt;The Results&lt;/h3&gt;

&lt;p&gt;Well, the kids spend most of their time on facebook; I spend mine on various programming related sites; there are a fair amount of online shopping sites being hit, and of course there are &lt;em&gt;way too many&lt;/em&gt; advertising sites.&lt;/p&gt;

&lt;p&gt;Not that I didn’t already know this information.&lt;/p&gt;

&lt;p&gt;But it will be nice to spot the occasional new domain that I might want to discuss with the kids. Sure beats the cat-and-mouse game of trying to keep the blocked list up to date, which I was beginning to lose.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/btudor/aggbug/134020.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bill Tudor</dc:creator>
            <guid>http://geekswithblogs.net/btudor/archive/2009/08/11/134020.aspx</guid>
            <pubDate>Tue, 11 Aug 2009 10:41:32 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/btudor/comments/134020.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/btudor/archive/2009/08/11/134020.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/btudor/comments/commentRss/134020.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/btudor/services/trackbacks/134020.aspx</trackback:ping>
        </item>
    </channel>
</rss>
