<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>Greg Malcolm</title>
        <link>http://gregmalcolm.com/Default.aspx</link>
        <description>Everything but the Perl</description>
        <language>en-US</language>
        <copyright>Greg Malcolm</copyright>
        <managingEditor>greg@gregmalcolm.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <image>
            <title>Greg Malcolm</title>
            <url>http://gregmalcolm.com/images/RSS2Image.gif</url>
            <link>http://gregmalcolm.com/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>My Codemash 2011 Retrospective</title>
            <link>http://gregmalcolm.com/archive/2011/01/15/codemash-2011-retrospective.aspx</link>
            <description>&lt;p style="text-align: center;"&gt;&lt;a href="http://codemash.org"&gt;&lt;img border="0" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/codemash2011.png" alt="codemash" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I just got back from &lt;a href="http://codemash.org"&gt;Codemash&lt;/a&gt; yesterday, and still on an adrenaline buzz. Here's my take on this years encounter:&lt;/p&gt;
&lt;p&gt;&lt;img width="100" height="75" border="0" align="right" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/bacon.jpg" alt="Photobucket" /&gt;&lt;/p&gt;
&lt;h1&gt;The Awesome&lt;/h1&gt;
&lt;h3&gt;Nearly everybody in one place&lt;/h3&gt;
&lt;p&gt;Codemash is the ultimate place to catch up with community friends. This is my 3rd year visiting and I've got to know a great number of very cool people through various conferences, Give Camps and other community events. I'm finding more and more that Codemash is the best place to catch up with everybody regardless of technology interest or location. Of course I always make a whole bunch more friends while I'm there! Yay!&lt;/p&gt;
&lt;h3&gt;Open Spaced&lt;/h3&gt;
&lt;p&gt;I found the open spaces didn't work so well last year. This year things went a lot smoother and the topics were engaging and fresh.&lt;/p&gt;
&lt;p&gt;While I miss Alan Steven's approach of running it like an agile project, it was very cool to see that it evolving. Laptops were often cracked open, not just once but frequently!&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Jasmine&lt;/strong&gt; - Paired on a &lt;a href="https://github.com/zspencer/Javascript-ATM-Kata"&gt;javascript kata&lt;/a&gt; using the &lt;a href="http://pivotal.github.com/jasmine"&gt;Jasmine&lt;/a&gt; javascript test runner&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;J&lt;/strong&gt; - Sat in on a &lt;a href="http://www.jsoftware.com/zippy.htm"&gt;J&lt;/a&gt; demo from local J enthusiast, &lt;a href="http://kaleidic.com"&gt;Tracy Harms&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Watir&lt;/strong&gt; - More pairing, this time using Ruby with the &lt;a href="https://github.com/jarib/watir-webdriver"&gt;watir-webdriver&lt;/a&gt; through cucumber. I'd mostly forgotten that Cucumber runs just fine without Rails. It made a change to do without.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The other spaces were engaging too, but I think that's enough for that topic.&lt;/p&gt;
&lt;h3&gt;Javascript Shenanigans&lt;/h3&gt;
&lt;p&gt;I've already mentioned that I attended a Jasmine kata session. Jasmine is close to my heart right now every since I discovered it while on the hunt for a decent Javascript testing framework for a &lt;a href="https://github.com/mrdavidlaing/javascript-koans"&gt;javascript koans&lt;/a&gt; project earlier this year. Well, it also got covered in the Java Precompiler and Pillar's vendor session, which was great to see.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://nodejs.org"&gt;Node.js&lt;/a&gt; was also a reoccurring theme. Node.js in a nutshell? It's an extremely scalable Event based I/O server which runs on Javascript. I'd already encountered through a Startup Weekend project and have been noticing increasing interest of late. After encountering more node.js driven excitement from my peers at codemash I absolutely had to attend the open space on it. At least 20 people turned up and by the end we had some answers, a whole ton of new questions and an impromptu user group in the form of a twitter channel (#nodemash). I have no idea where this is going to go or how big it is going to become, but if it can cross the chasm into the enterprise it could become huge...&lt;/p&gt;
&lt;h3&gt;Scala Koans&lt;/h3&gt;
&lt;p&gt;I'm a bit of a Koans addict, and I really need more exposure to functional languages so I gave the Scala Koans precompiler a try. Great fun! I'm really glad I attended because I found I had a whole ton of questions. Currently the koans are available &lt;a href="https://bitbucket.org/dmarsh/scalakoansexercises"&gt;here&lt;/a&gt;, and the answers are &lt;a href="https://bitbucket.org/dickwall/scala-koans"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Opportunities&lt;/h1&gt;
&lt;h3&gt;While we're on the subject can we change the subject now?&lt;/h3&gt;
&lt;p&gt;&lt;tt&gt;Hai Gregory,&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;You really need to keep the drinking for later in the day. I mean seriously, you're 34 and you still do this every single time! Sure, you made it to Chad Fowler keynote ok, but you looking a rather pale weren't you?&lt;/tt&gt; &lt;tt&gt;Also might have been nice to attend 'Netflicks in the Cloud' instead of 'Sleeping It Off For People Who Should Know Better'.&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;Kthxbye&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;PS: Stop talking to yourself&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Not that I entirely regret it, I've had some of my greatest insights through late night drunken conversations at the CodeMash bar. Just might be nice to reign it in a little and get something out of the next morning too.&lt;/p&gt;
&lt;h3&gt;Diversity&lt;/h3&gt;
&lt;p&gt;This is something that is in the back of my mind because of conversations at Codemash as well as throughout the year; I'm realizing more and more how discouraging the IT&lt;/p&gt;
&lt;p&gt;profession is for women. I notice in the community there has been a lot of attention paid to stamping out harrasment, which is good, but there also seems to be a massive PR issue.&lt;/p&gt;
&lt;p&gt;I really don't have any solutions, but I figure it can't hurt to pay more attention to whats going on...&lt;/p&gt;
&lt;h1&gt;And in Other News&lt;/h1&gt;
&lt;ul&gt;
    &lt;li style="text-align: center;"&gt;
    &lt;p style="text-align: left;"&gt;I now have a picture of Chad Fowler giving me more cowbell! Sadly I managed to lose the cowbell later on. Hopefully it's gone to a Better Place.&lt;/p&gt;
    &lt;img align="bottom" alt="... and if Chad Fowler wants more cowbell, we should probably give him more cowbell!!" src="http://www.aaronchristy.com/Events/Codemash/20110113-DSC5143/1156469879_qWNQr-S.jpg" /&gt;&lt;/li&gt;
    &lt;li&gt;
    &lt;p&gt;The Womack Family Band joined in with the musicians jam this year. There's my cowbell again! Why must you hide from me?&lt;/p&gt;
    &lt;object width="640" height="385"&gt;
    &lt;param value="http://www.youtube.com/v/h_rus39TLew?fs=1&amp;amp;hl=en_US&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6" name="movie" /&gt;
    &lt;param value="true" name="allowFullScreen" /&gt;
    &lt;param value="always" name="allowscriptaccess" /&gt;&lt;embed width="640" height="385" allowfullscreen="true" allowscriptaccess="always" type="application/x-shockwave-flash" src="http://www.youtube.com/v/h_rus39TLew?fs=1&amp;amp;hl=en_US&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/li&gt;
    &lt;li&gt;I also finally went in the water for the first time in all the I've been coming to codemash. Why did I wait so long?!?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; &lt;/p&gt; &lt;img src="http://gregmalcolm.com/aggbug/143497.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Greg Malcolm</dc:creator>
            <guid>http://gregmalcolm.com/archive/2011/01/15/codemash-2011-retrospective.aspx</guid>
            <pubDate>Sun, 16 Jan 2011 01:30:36 GMT</pubDate>
            <wfw:comment>http://gregmalcolm.com/comments/143497.aspx</wfw:comment>
            <comments>http://gregmalcolm.com/archive/2011/01/15/codemash-2011-retrospective.aspx#feedback</comments>
            <wfw:commentRss>http://gregmalcolm.com/comments/commentRss/143497.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Koans, now available in Python flavor</title>
            <link>http://gregmalcolm.com/archive/2010/04/05/koans-now-available-in-python-flavor.aspx</link>
            <description>&lt;p&gt;Recently a Python developer friend with whom I was pair programming with suggested that I show him how to write a little Ruby. I responded by telling him to check out &lt;a href="http://github.com/edgecase/ruby_koans"&gt;Ruby Koans&lt;/a&gt; as a starting point.&lt;/p&gt;
&lt;p&gt;However I wanted to try that in reverse at the same time with me learning some Python. I did a bit of googling, and sure enough someone had started writing some Python Koans. It just needed finishing...&lt;/p&gt;
&lt;p&gt;So, a few weeks later Python Koans is now complete and ready for action!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Python Koans Screenshot" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/PythonKoansScreenshot.png" /&gt;&lt;/p&gt;
&lt;p&gt;It is available through Mercurial on Bitbucket:&lt;/p&gt;
&lt;p style="margin-left: 40px;"&gt;&lt;a href="http://bitbucket.org/gregmalcolm/python_koans/wiki/Home"&gt;http://bitbucket.org/gregmalcolm/python_koans/wiki/Home&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It is also mirrored on Github:&lt;/p&gt;
&lt;p style="margin-left: 40px;"&gt;&lt;a href="http://wiki.github.com/gregmalcolm/python_koans/"&gt;http://wiki.github.com/gregmalcolm/python_koans/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Converting it was fairly easy. Aside from the differing philosophical approaches behind the two languages, Ruby and Python are fairly similar. We had to come up with completely new material for a few subjects like multiple inheritance and decorators, but for most features in Ruby there is something roughly comparable in Python.&lt;/p&gt;
&lt;p&gt;I highly recommend writing tests (or koans) as a means to lean a new language or framework. I've learned a lot from doing this.&lt;/p&gt; &lt;img src="http://gregmalcolm.com/aggbug/139109.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Greg Malcolm</dc:creator>
            <guid>http://gregmalcolm.com/archive/2010/04/05/koans-now-available-in-python-flavor.aspx</guid>
            <pubDate>Tue, 06 Apr 2010 03:41:50 GMT</pubDate>
            <wfw:comment>http://gregmalcolm.com/comments/139109.aspx</wfw:comment>
            <comments>http://gregmalcolm.com/archive/2010/04/05/koans-now-available-in-python-flavor.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://gregmalcolm.com/comments/commentRss/139109.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Speaking of IronRuby, VS2010 integration would be nice...</title>
            <link>http://gregmalcolm.com/archive/2009/11/06/ironruby-in-vs2010-petition.aspx</link>
            <description>&lt;p&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;" class="Apple-style-span"&gt;&lt;span style="font-family: monospace; font-size: 13px; white-space: pre-wrap;" class="Apple-style-span"&gt;Right now IronRuby Microsoft is not planning on integrating IronRuby in Visual Studio 2010. Want to do something about that? Sign this petition:&lt;/span&gt;&lt;span style="font-family: monospace; font-size: 13px; white-space: pre-wrap;" class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style="margin-left: 40px;"&gt;
&lt;p&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=479957"&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;" class="Apple-style-span"&gt;&lt;span style="font-family: monospace; font-size: 13px; white-space: pre-wrap;" class="Apple-style-span"&gt;https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=479957&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;" class="Apple-style-span"&gt;&lt;span style="font-family: monospace; font-size: 13px; white-space: pre-wrap;" class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;" class="Apple-style-span"&gt;&lt;span style="font-family: monospace; font-size: 13px; white-space: pre-wrap;" class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;" class="Apple-style-span"&gt;&lt;span style="font-family: monospace; font-size: 13px; white-space: pre-wrap;" class="Apple-style-span"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;" class="Apple-style-span"&gt;&lt;span style="font-family: monospace; font-size: 13px; white-space: pre-wrap;" class="Apple-style-span"&gt;Same deal with IronPython too:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style="margin-left: 40px;"&gt;
&lt;p&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=475830"&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;" class="Apple-style-span"&gt;&lt;span style="font-family: monospace; font-size: 13px; white-space: pre-wrap;" class="Apple-style-span"&gt;https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=475830&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt; &lt;img src="http://gregmalcolm.com/aggbug/136062.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Greg Malcolm</dc:creator>
            <guid>http://gregmalcolm.com/archive/2009/11/06/ironruby-in-vs2010-petition.aspx</guid>
            <pubDate>Fri, 06 Nov 2009 16:32:28 GMT</pubDate>
            <wfw:comment>http://gregmalcolm.com/comments/136062.aspx</wfw:comment>
            <comments>http://gregmalcolm.com/archive/2009/11/06/ironruby-in-vs2010-petition.aspx#feedback</comments>
            <wfw:commentRss>http://gregmalcolm.com/comments/commentRss/136062.aspx</wfw:commentRss>
        </item>
        <item>
            <title>IronRuby and Cucumber - Cucumber Tutorial (Part 3 of 3)</title>
            <link>http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-3-cucumber-tutorial.aspx</link>
            <description>&lt;a href="http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-2-iirb-tutorial.aspx"&gt;&amp;lt;&amp;lt; Part 2 – A quick look at IronRuby&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font size="4"&gt;Gambling with Cucumbers&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
In &lt;a href="http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-2-iirb-tutorial.aspx"&gt;part 2&lt;/a&gt; we demonstrated how we can mix .NET and Ruby though IronRuby. The question is, why would you want to do that? It is probably easier to stick with one language for most projects. Why combine them?&lt;br /&gt;
&lt;br /&gt;
&lt;font size="2" style="font-weight: bold;"&gt;The problem with BDD in .NET&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
One area where Ruby currently has a clear advantage over.NET is in the realms of Behavioral Driven Development (&lt;a href="http://dannorth.net/introducing-bdd"&gt;BDD&lt;/a&gt;). &lt;br /&gt;
&lt;br /&gt;
You can write &lt;a href="http://c2.com/cgi/wiki?UnitTest"&gt;Unit Tests&lt;/a&gt; and &lt;a href="http://c2.com/cgi/wiki?IntegrationTest"&gt;Integration Tests&lt;/a&gt; in .NET just fine, but what about when you want to make tests based on actual user stories?  Specifications written as word documents and UML diagrams have a tendency to evolve separately to the actual product. If you could replace the specifications with human readable tests specifications it could easier to keep the product’s functional requirements in sync with the actual implementation.&lt;br /&gt;
&lt;br /&gt;
The problem with this is that not everyone involved with the product is necessarily going to be a programmer. For example, this &lt;a href="http://www.nunit.org/index.php"&gt;NUnit &lt;/a&gt;test a &lt;a href="http://en.wikipedia.org/wiki/List_of_poker_hands"&gt;poker hand&lt;/a&gt; that should make up “One Pair”:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;[&lt;span style="color: rgb(0, 128, 128);"&gt;TestFixture&lt;/span&gt;]&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public class&lt;/span&gt; DemoTests&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;{&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;    &lt;span style="color: rgb(0, 128, 128);"&gt;Hand &lt;/span&gt;_hand;&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;    [&lt;span style="color: rgb(0, 128, 128);"&gt;SetUp&lt;/span&gt;]&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;public void&lt;/span&gt; SetUp()&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;    {&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;        _hand = new Hand();&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;    }&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;    [&lt;span style="color: rgb(0, 128, 128);"&gt;Test&lt;/span&gt;]&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;public void&lt;/span&gt; Should_show_one_pair_for_3c_3s_Jc_9d_As()&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;    {&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;        _hand.AddCard(&lt;span style="color: rgb(128, 0, 0);"&gt;"3 clubs"&lt;/span&gt;);&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;        _hand.AddCard(&lt;span style="color: rgb(128, 0, 0);"&gt;"3 spades"&lt;/span&gt;);&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;        _hand.AddCard(&lt;span style="color: rgb(128, 0, 0);"&gt;"J clubs"&lt;/span&gt;);&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;        _hand.AddCard(&lt;span style="color: rgb(128, 0, 0);"&gt;"9 diamonds"&lt;/span&gt;);&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;        _hand.AddCard(&lt;span style="color: rgb(128, 0, 0);"&gt;"A spades"&lt;/span&gt;);&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;        &lt;span style="color: rgb(0, 128, 128);"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: rgb(128, 0, 0);"&gt;"One Pair"&lt;/span&gt; , _hand.EvalScore());&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;    }&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;    .&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;    .&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;    .&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
This makes plenty of sense to developers, not so much to business professionals. And this is a relatively readable test, what if theres mocking and other distractions?&lt;br /&gt;
&lt;br /&gt;
Now compare that with the popular Ruby BDD framework, &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt;:&lt;br /&gt;
&lt;br style="color: rgb(0, 128, 128);" /&gt;
&lt;div style="margin-left: 40px;"&gt; &lt;span style="font-family: Courier New; color: rgb(0, 128, 128);"&gt;# &lt;span style="font-style: italic;"&gt;hand_spec.rb&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt; require &lt;span style="color: rgb(51, 51, 153);"&gt;'IronPoker'&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt; describe Hand &lt;span style="color: rgb(128, 0, 128);"&gt;do&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;   it &lt;span style="color: rgb(51, 51, 153);"&gt;"show a score of 'One Pair' if player has "&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;   &lt;span style="color: rgb(51, 51, 153);"&gt;"3 Clubs, 3 Spades, J Clubs, 9 Diamonds and A Spades"&lt;/span&gt; do&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     &lt;span style="color: rgb(128, 0, 0);"&gt;20.times&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt; bowling.hit&lt;span style="color: rgb(128, 0, 128);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;) }&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     bowling.score.should &lt;span style="color: rgb(128, 0, 128);"&gt;== &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     &lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     hand &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;IronPoker::Hand.new&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     hand.add_card &lt;span style="color: rgb(51, 51, 153);"&gt;"3 Clubs" &lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     hand.add_card &lt;span style="color: rgb(51, 51, 153);"&gt;"3 Spades"&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     hand.add_card &lt;span style="color: rgb(51, 51, 153);"&gt;"J Clubs"&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     hand.add_card &lt;span style="color: rgb(51, 51, 153);"&gt;"9 Diamonds"&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     hand.add_card &lt;span style="color: rgb(51, 51, 153);"&gt;"A Spades"&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     &lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     score &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;hand.eval_score&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     score.should &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(51, 51, 153);"&gt;"One Pair"&lt;/span&gt;   &lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;   &lt;span style="color: rgb(128, 0, 128);"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;/div&gt;
&lt;br /&gt;
Much cleaner!&lt;br /&gt;
&lt;br /&gt;
And you can also use command line tools to generate reports:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt; &lt;span style="font-family: Courier New;"&gt;$ spec hand_spec.rb --format specdoc&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt; Hand&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt; - show a score of 'One Pair' if player has 3 Clubs, 3 Spades, J Clubs, 9 Diamonds and&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;   A Spades&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt; Finished in 0.007534 seconds&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
There have been attempts at creating similar frameworks for .NET, but there are syntactical constraints that make it difficult to keep the readability. For example, my favorite .NET BDD framework is &lt;a href="http://codebetter.com/blogs/aaron.jensen/archive/2008/05/08/introducing-machine-specifications-or-mspec-for-short.aspx"&gt;MSpec&lt;/a&gt; (also known as Machine Spec). Here is what an MSpec spec looks like:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt; &lt;span style="font-family: Courier New; color: rgb(51, 153, 102);"&gt;// machine.spec (mspec) sample&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;using &lt;/span&gt;IronPoker;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt; [&lt;span style="color: rgb(0, 128, 128);"&gt;Description&lt;/span&gt;]&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;public class&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;Player_showing_their_hand&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt; {&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     &lt;span style="color: rgb(0, 0, 255);"&gt;static &lt;/span&gt;Hand _hand;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     Context before_each = () =&amp;gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     {&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;         _hand = &lt;span style="color: rgb(0, 0, 255);"&gt;new &lt;/span&gt;_Hand();&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     };&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     When 3_clubs_and_3_spades_and_J_clubs_and_9_clubs_and_A_Spades_are_dealt = () =&amp;gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     {&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;        _hand.AddCard(&lt;span style="color: rgb(128, 0, 0);"&gt;"3 clubs"&lt;/span&gt;);&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;        _hand.AddCard(&lt;span style="color: rgb(128, 0, 0);"&gt;"3 spades"&lt;/span&gt;);&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;        _hand.AddCard(&lt;span style="color: rgb(128, 0, 0);"&gt;"J clubs"&lt;/span&gt;);&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;        _hand.AddCard(&lt;span style="color: rgb(128, 0, 0);"&gt;"9 diamonds"&lt;/span&gt;);&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;        _hand.AddCard(&lt;span style="color: rgb(128, 0, 0);"&gt;"A spades"&lt;/span&gt;);&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;         _result = _hand.EvalScore();&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     };&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     It should_show_a_score_of_One_Pair = () =&amp;gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     {&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;         _result.ShouldEqual(&lt;span style="color: rgb(128, 0, 0);"&gt;"One Pair"&lt;/span&gt;);&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;     };&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt; }&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;/div&gt;
&lt;br /&gt;
Sure it looks a bit like RSpec, but notice how the When…It… descriptions have to be separated by underscores, and the use of the unsightly “= () =&amp;gt;” lambda syntax at the end of each clause? There are other BDD frameworks, but they all have to make compromises somwhere. (In fairness to MSpec, it does at least have a tool which generates very nice html RSpec style reports though!).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;font size="3" style="font-weight: bold;"&gt;Cucumber, Finally!&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
As nice as RSpec is, we can do even better when it comes to turning user stories into tests. Cucumber is an RSpec extension that lets you write tests like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt;Feature: Player shows their hand&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;   In order to finish the round&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;   The player&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;   Needs to show their hand&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New; color: rgb(51, 153, 102);"&gt;Scenario Outline: Play is dealt a card&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(51, 153, 102);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(51, 153, 102);"&gt;   Given I have a &amp;lt;card_1&amp;gt; in my hand&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(51, 153, 102);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(51, 153, 102);"&gt;   And I have a &amp;lt;card_2&amp;gt; in my hand&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(51, 153, 102);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(51, 153, 102);"&gt;   And I have a &amp;lt;card_3&amp;gt; in my hand&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(51, 153, 102);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(51, 153, 102);"&gt;   And I have a &amp;lt;card_4&amp;gt; in my hand&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(51, 153, 102);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(51, 153, 102);"&gt;   And I have a &amp;lt;card_5&amp;gt; in my hand&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(51, 153, 102);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(51, 153, 102);"&gt;   When I am dealt a card&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(51, 153, 102);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(51, 153, 102);"&gt;   Then the result should be &amp;lt;output&amp;gt; on the screen&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 128, 0);"&gt;Examples:&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(128, 128, 0);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 128, 0);"&gt;  |   card_1   |   card_2   |   card_3   |   card_4   |   card_5   |      output     |&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(128, 128, 0);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 128, 0);"&gt;   | 3 Clubs    | 3 Spades   | J Clubs    | 9 Diamonds | 3 Spades   | One Pair        |&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Makes sense, right? The first section, “Feature” describes in plain English the story and use case. The scenario is described in the what appers to be plain English, but actual confirms to a “Given… When… Then”  structure. And final the table of examples directly correlates to the parts of the Scenario bracketed names (card_1, card_2 etc).&lt;br /&gt;
&lt;br /&gt;
Because part Cucumber is part of RSpec this means it also implemented in Ruby. Sounds like a job for IronRuby!&lt;br /&gt;
&lt;br /&gt;
Lets try it out!&lt;br /&gt;
&lt;br /&gt;
&lt;font size="3"&gt;&lt;span style="font-weight: bold;"&gt;IronPoker tutorial&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
For this demonstration we are going to try out Cucumber on an incomplete .NET application application I’m calling “IronPoker”. I got as far as writing the code to analyse poker hands written &lt;a href="http://c2.com/cgi-bin/wiki?TestDrivenDevelopment"&gt;TDD&lt;/a&gt; style using NUnit. Lets switch and let Cucumber have a go!&lt;br /&gt;
&lt;br /&gt;
The IronPoker code is in  &lt;a href="http://github.com/gregmalcolm/IronPoker"&gt;github&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt; &lt;a href="http://github.com/gregmalcolm/IronPoker"&gt;http://github.com/gregmalcolm/IronPoker&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
You can either checkout the code using &lt;a href="http://www.lostechies.com/blogs/jason_meridth/archive/2009/06/01/git-for-windows-developers-git-series-part-1.aspx"&gt;Git&lt;/a&gt;, or click on the &lt;a href="http://github.com/gregmalcolm/IronPoker"&gt;Download button&lt;/a&gt; to retrieve the it  in the form of a .zip file. The solution file is in Visual Studio 2008 format, but don’t worry if you don’t have it, we are going to work with Cucumber from the windows command interpreter.&lt;br /&gt;
&lt;br /&gt;
Incidentally if you build and running IronPoker from Visual Studio there is not much to see there. The executable is a stub:
&lt;div style="text-align: center;"&gt;  &lt;br /&gt;
&lt;img hspace="0" border="0" vspace="0" alt="IronPoker Stub App Screenshot" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_3_1_ironpoker_app.png" /&gt;&lt;/div&gt;
&lt;br /&gt;
The bulk of code currently written is all in the ‘IronRuby’ class library. Its just logic to calculate scores. Feel free to poke around in ‘IronPoker.Tests’ if you want to get a feel for it does. But we’re here for the cucumber, right? Open up a command prompt, navigate to this folder:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt; &lt;span style="font-family: Courier New;"&gt;IronPoker\src\IronPoker.Cucumber &lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
and we’ll run the cucumber test found in the subfolder:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt; &lt;span style="font-family: Courier New;"&gt;.\Features\PlayHand.Feature&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
by running:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt;icucumber.bat Features&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
Note: if you start seeing “[36” spread liberally through the output, this means that the console colors do not work in your version of ruby. I have the same problem. See the Cucumber installation comment in Step 1 of this guide for details on how to turn it off.&lt;br /&gt;
&lt;br /&gt;
Anyway, here are the results (in boring monochrome):&lt;br /&gt;
  &lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;img hspace="0" border="0" vspace="0" alt="1st Cucumber Test Results Screenshot" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_3_2_unimplemented.png" /&gt;&lt;/div&gt;
&lt;br /&gt;
Cucumber parsed the “feature” file, but didn’t find an implementation. Generously, it hass given us some code to get started with!&lt;br /&gt;
&lt;br /&gt;
We have an implementation file already, but it is empty. It is here:&lt;br /&gt;
 &lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt;.\Features\steps\ironpoker_steps.rb&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
Copy and paste the implementation so far. (Copy and paste is available from the top left menu of the command window).&lt;br /&gt;
  &lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;img hspace="0" border="0" vspace="0" alt="Initial Implementation Screenshot" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_3_3_steps.png" /&gt;&lt;/div&gt;
&lt;br /&gt;
As you may have gathered, this is ruby code. Next we need to figure out how to drive our IronPoker .NET code from IronRuby. This is where the “IIRB” tool comes in handy! (Reminder, its accessed by running “iirb.bat” from the windows command interpreter).&lt;br /&gt;
&lt;br /&gt;
First off we need access to IronPoker.dll, which can be built from the “IronPoker” class library. You don’t need build it though because a copy of it is already in the IronRuby.cucumber folder, just to keep things simple! We can load it with:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt;require &lt;span style="color: rgb(51, 51, 153);"&gt;'IronPoker'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
Next we need to test the IronPoker.Hand class, as found in IronRuby\Hand.cs. So lets make an instance of it:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt;hand &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;IronPoker::Hand.new&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
Which of course is the same as saying “&lt;span style="font-family: Courier New;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;var &lt;/span&gt;hand = &lt;span style="color: rgb(0, 0, 255);"&gt;new &lt;/span&gt;IronPoker.Hand()&lt;/span&gt;” in C#.&lt;br /&gt;
&lt;br /&gt;
Remember that NUnit sample we looked at earlier? We’re looking to do the same thing with Cucumber. So we need access to &lt;span style="font-style: italic;"&gt;AddCard()&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;EvalScore() &lt;/span&gt;methods to run our tests. We can inspect which methods are available to us by running method called &lt;span style="font-style: italic;"&gt;methods&lt;/span&gt;. Every ruby object has this:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt; &lt;img hspace="0" border="0" vspace="0" alt="Hand.methods Screenshot" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_3_4_methods.png" /&gt; &lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
There they are! Only because the function names have been rubyized, they have become &lt;span style="font-style: italic;"&gt;add_card&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;eval_score&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
Let try playing a hand:&lt;br /&gt;
  &lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;img hspace="0" border="0" vspace="0" alt="Straight Flush in IIRB Screenshot" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_3_5_iirb_straight_flus.png" /&gt;&lt;/div&gt;
&lt;br /&gt;
Yep, Ace, 2, 3 ,4 and 5 of spades is indeed a ‘Straight Flush’.&lt;br /&gt;
&lt;br /&gt;
Now we just have to do something similar for Cucumber. Time to go back to implementing ironpoker_steps.rb. First off stick this at the top of the code before the Given statements:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt; &lt;span style="font-family: Courier New;"&gt;require &lt;span style="color: rgb(51, 51, 153);"&gt;'IronPoker'&lt;/span&gt; &lt;span style="color: rgb(128, 128, 128);"&gt;# IronPoker.dll&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt; Before &lt;span style="color: rgb(128, 0, 128);"&gt;do&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;   @hand = IronPoker::Hand.new &lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;/div&gt;
&lt;br /&gt;
The Before clause is the equivalent of the “SetUp” method in typical unit testing frameworks. In other words, It is the function that gets called before each test. In this case the “hand” object is a member instance rather than a local instance so it has the extra @ at the front.&lt;br /&gt;
&lt;br /&gt;
Next we need to to call &lt;span style="font-style: italic;"&gt;add_card&lt;/span&gt; for each of the 5 given statements. We can actually reduce it down to one statement though thanks to regular expression:&lt;br /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; Given &lt;span style="color: rgb(128, 0, 128);"&gt;/&lt;/span&gt;^I have a (.*) in my hand$/ &lt;span style="color: rgb(128, 0, 128);"&gt;do |&lt;/span&gt;c&lt;span style="color: rgb(128, 0, 128);"&gt;|&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;   &lt;span style="color: rgb(128, 128, 128);"&gt;# c = (.*)&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;   @hand.add_card c&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 0, 128);"&gt; end&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
In ruby, regular expressions are encapsulated between forward slashes. So we just have one given statement with a regular expression wildcard (.*) on the part that changes, the card descriptions. The body of the Given block assign the text from the wildcard to the variable “c” and uses it as the argument for “@hand.add_card”.&lt;br /&gt;
&lt;br /&gt;
This will be the When block:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt; &lt;span style="font-family: Courier New;"&gt;When &lt;span style="color: rgb(128, 0, 128);"&gt;/&lt;/span&gt;I am dealt a card&lt;span style="color: rgb(128, 0, 128);"&gt;/ do&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;   @result &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;@hand.eval_score&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;/div&gt;
&lt;br /&gt;
Which is saying that when the player receives a card it will be evaluated and stored in @result. In the case of the test, this applies for when the player has all 5 cards.&lt;br /&gt;
&lt;br /&gt;
Finally in the Then block we evaluate whether or not the conditions of the test are met:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt;Then &lt;span style="color: rgb(128, 0, 128);"&gt;/&lt;/span&gt;the result should be (.*) on the screen&lt;span style="color: rgb(128, 0, 128);"&gt;/ do |&lt;/span&gt;score&lt;span style="color: rgb(128, 0, 128);"&gt;|&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt;   @result.should == score&lt;/span&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;span style="font-family: Courier New;"&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
So @result is compared to the wildcard (which was assigned to “score”). So its roughly the same as an Assert in a unit testing framework.&lt;br /&gt;
&lt;br /&gt;
Put it all together and we have:&lt;br /&gt;
&lt;div style="text-align: center;"&gt;  &lt;br /&gt;
&lt;img hspace="0" border="0" vspace="0" alt="Implemented Tests Screenshot" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_3_6_steps_implemented.png" /&gt;&lt;/div&gt;
&lt;br /&gt;
Save that and we can run our cucumber test again:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;  &lt;br /&gt;
&lt;img hspace="0" border="0" vspace="0" alt="Failed Test Screenshot" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_3_7_FailedTest.png" /&gt;&lt;/div&gt;
&lt;br /&gt;
The test completed! Only problem is  the result was “Three of a kind” instead of “One pair”. It actually is a Three of a kind, so the test is wrong!&lt;br /&gt;
&lt;br /&gt;
Easily fixed, change one of the 3s to an A and it should pass.&lt;br /&gt;
&lt;br /&gt;
Also why not add some more examples to the examples talbe in ‘PlayHand.Feature’? Try changing the examples section to this:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 128, 0);"&gt;    Examples:&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(128, 128, 0);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 128, 0);"&gt;       |   card_1   |   card_2   |   card_3   |   card_4   |   card_5   |      output     |&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(128, 128, 0);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 128, 0);"&gt;       | 3 Clubs    | 3 Spades   | J Clubs    | 9 Diamonds | A Spades   | One Pair        |&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(128, 128, 0);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 128, 0);"&gt;       | 9 Diamonds | J Diamonds | Q Diamonds | K Diamonds | A Diamonds | Royal Flush     |&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(128, 128, 0);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 128, 0);"&gt;       | 8 Spades   | J Diamonds | 8 Diamonds | K Spades   | 8 Hearts   | Three of a Kind |&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(128, 128, 0);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 128, 0);"&gt;       | 8 Spades   | J Spades   | 8 Spades   | K Spades   | 8 Spades   | Flush           |&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(128, 128, 0);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 128, 0);"&gt;       | 2 Spades   | 2 Diamonds | 8 Diamonds | 2 Clubs    | 2 Hearts   | Four of a Kind  |&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(128, 128, 0);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 128, 0);"&gt;       | A Hearts   | 2 Diamonds | 3 Spades   | 4 Clubs    | 5 Spades   | Straight        |&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(128, 128, 0);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 128, 0);"&gt;       | 9 Diamonds | A Hearts   | 9 Clubs    | A Spades   | A Hearts   | Full House      |&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(128, 128, 0);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 128, 0);"&gt;       | 4 Hearts   | 5 Hearts   | 6 Hearts   | 7 Hearts   | 8 Hearts   | Straight Flush  |&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(128, 128, 0);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 128, 0);"&gt;       | A Spades   | 4 Diamonds | 5 Diamonds | 9 Diamonds | 8 Diamonds | High Card       |&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(128, 128, 0);" /&gt;
&lt;span style="font-family: Courier New; color: rgb(128, 128, 0);"&gt;       | A Spades   | 4 Diamonds | A Diamonds | 4 Clubs    | 8 Clubs    | Two Pair        |&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Giving us:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;  &lt;img hspace="0" border="0" vspace="0" alt="Completed Tests Screenshot" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_3_8_Passed.png" /&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
And that’s a wrap! (I would say "cucumber wrap" but there are Laws...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;font size="3"&gt;&lt;font size="2"&gt;&lt;span style="font-weight: bold;"&gt;Reference Sources&lt;/span&gt;&lt;/font&gt;&lt;br style="font-weight: bold;" /&gt;
&lt;br style="font-weight: bold;" /&gt;
&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/font&gt; These are some of the sites which I used to research the tutorial, and a few more that you may find helpful:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Installation&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Ruby&lt;/span&gt; - &lt;a href="http://www.ruby-lang.org/"&gt;http://www.ruby-lang.org/&lt;/a&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;IronRuby &lt;/span&gt;- &lt;a href="http://ironruby.net"&gt;http://ironruby.net&lt;/a&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Cucumber &lt;/span&gt;- &lt;a href="http://wiki.github.com/aslakhellesoy/cucumber/ironruby-and-net"&gt;http://wiki.github.com/aslakhellesoy/cucumber/ironruby-and-net&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;IIRB/DLR&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/magazine/dd434651.aspx"&gt;http://msdn.microsoft.com/en-us/magazine/dd434651.aspx&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://silverlight.net/content/samples/sl2/dlrconsole/index.html"&gt;http://silverlight.net/content/samples/sl2/dlrconsole/index.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;TDD/BDD&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;NUnit &lt;/span&gt;- &lt;a href="http://www.nunit.org/index.php"&gt;http://www.nunit.org/index.php&lt;/a&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Machine Spec&lt;/span&gt; - &lt;a href="http://codebetter.com/blogs/aaron.jensen/archive/2008/05/08/introducing-machine-specifications-or-mspec-for-short.aspx"&gt;http://codebetter.com/blogs/aaron.jensen/archive/2008/05/08/introducing-machine-specifications-or-mspec-for-short.aspx&lt;/a&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;RSpec &lt;/span&gt;- &lt;a href="http://rspec.info/"&gt;http://rspec.info/&lt;/a&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Cucumber &lt;/span&gt;- &lt;a href="http://cukes.info/"&gt;http://cukes.info/&lt;/a&gt; &lt;img src="http://gregmalcolm.com/aggbug/136043.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Greg Malcolm</dc:creator>
            <guid>http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-3-cucumber-tutorial.aspx</guid>
            <pubDate>Fri, 06 Nov 2009 01:32:52 GMT</pubDate>
            <wfw:comment>http://gregmalcolm.com/comments/136043.aspx</wfw:comment>
            <comments>http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-3-cucumber-tutorial.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://gregmalcolm.com/comments/commentRss/136043.aspx</wfw:commentRss>
        </item>
        <item>
            <title>IronRuby and Cucumber - IIRB Tutorial (Part 2 of 3)</title>
            <link>http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-2-iirb-tutorial.aspx</link>
            <description>&lt;a href="http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-1-installation.aspx"&gt;&amp;lt;&amp;lt; Part 1 - Installing IronRuby and Cucumber&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font size="4"&gt;&lt;span style="font-weight: bold;"&gt;A quick look at IronRuby&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font size="3"&gt;&lt;span style="font-weight: bold;"&gt;Background&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
IronRuby is an implementation of Ruby which runs on .NETs Dynamic Language Runtime platform (the DLR). Languages hosted on the DLR are interpreted at runtime, rather than compiled then executed (like C# applications). &lt;br /&gt;
&lt;br /&gt;
One benefit is that code can be invoked on the fly from a command line shell. This is handy when debugging or figuring out how to do something. Other popular DLR hosted languages include &lt;a href="http://www.codeplex.com/IronPython"&gt;IronPython&lt;/a&gt; and &lt;a href="http://silverlight.net/"&gt;Silverlight&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;img hspace="0" border="0" vspace="0" alt="DLR Diagram" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_2_1_DLR.png" /&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;font size="3"&gt;&lt;span style="font-weight: bold;"&gt;Messing around with Interactive IronRuby Shell (IIRB)&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
In standard ruby the interactive shell is invoked by running “IRB”. With IronRuby we prefix it with an extra “I", giving us “IIRB”. &lt;br /&gt;
&lt;br /&gt;
Let's try that. From a windows command prompt type &lt;span style="color: rgb(128, 0, 0);"&gt;iirb.bat&amp;lt;enter&amp;gt;&lt;/span&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt; &lt;img hspace="0" border="0" vspace="0" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_2_2_iirb.png" i442.photobucket.com="" albums="" qq150="" gregmalcolm="" alt="IIRB Prompt Screenshot" /&gt; &lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
This looks exactly like the standard Ruby IRB, but the unfortunate delay on loading is a giveaway. Hopefully that delay will reduce as the framework matures!&lt;br /&gt;
&lt;br /&gt;
First off, lets confirm that it is a Ruby interpreter. Try making it interpret some basic ruby expressions:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="color: rgb(51, 51, 153);"&gt;"live racecar !"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New;"&gt; &lt;span style="color: rgb(51, 51, 153);"&gt;"live racecar !"&lt;/span&gt;.reverse&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New;"&gt; &lt;span style="color: rgb(51, 51, 153);"&gt;"live racecar !"&lt;/span&gt;.reverse &lt;span style="color: rgb(128, 0, 128);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New;"&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(51, 51, 153);"&gt;"live racecar !"&lt;/span&gt;.reverse &lt;span style="color: rgb(128, 0, 128);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;5&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;)&lt;/span&gt;.split&lt;span style="color: rgb(128, 0, 128);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(51, 51, 153);"&gt;" racecar "&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New;"&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;(&lt;/span&gt;"&lt;span style="color: rgb(51, 51, 153);"&gt;live racecar !"&lt;/span&gt;.reverse &lt;span style="color: rgb(153, 51, 102);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;5&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;)&lt;/span&gt;.split&lt;span style="color: rgb(128, 0, 128);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(51, 51, 153);"&gt;" racecar "&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;).&lt;/span&gt;map &lt;span style="color: rgb(128, 0, 128);"&gt;{|&lt;/span&gt;x&lt;span style="color: rgb(153, 51, 102);"&gt;|&lt;/span&gt; result &lt;span style="color: rgb(153, 51, 102);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(51, 51, 153);"&gt;"We"&lt;/span&gt; &lt;span style="color: rgb(153, 51, 102);"&gt;+&lt;/span&gt; x&lt;span style="color: rgb(153, 51, 102);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
These are the result I got:&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;img hspace="0" border="0" vspace="0" alt="IIRB showing ruby commands executed screenshot" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_2_3_live_racecar.png" /&gt;&lt;br /&gt;
&lt;/div&gt;
  &lt;br /&gt;
Yep, it looks just like conventional Ruby so far! Of course there is a lot more to Ruby, but we’re not going to cover it here. Try these resources instead:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;a href="http://tryruby.sophrinix.com/"&gt; http://tryruby.sophrinix.com/&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://ruby-doc.org/docs/ProgrammingRuby/"&gt;http://ruby-doc.org/docs/ProgrammingRuby/&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
So, how about something you can’t do in standard Ruby? How about we use IIRB to show a .NET &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.messagebox.aspx"&gt;MessageBox&lt;/a&gt;?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;font size="3"&gt;&lt;span style="font-weight: bold;"&gt;Showing .NET MessageBoxes&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/font&gt;First we need access to the .NET libraries. For accessing a message box in .NET app we would need to add a reference to a library like ‘&lt;span style="color: rgb(128, 0, 0);"&gt;PresentationFramework.dll&lt;/span&gt;’.&lt;br /&gt;
&lt;br /&gt;
In IronRuby we do this through the &lt;a href="http://ruby-doc.org/docs/ProgrammingRuby/html/ref_m_kernel.html#Kernel.require"&gt;require&lt;/a&gt; keyword. Excute this from the IIRB:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;require &lt;span style="color: rgb(51, 51, 153);"&gt;'PresentationFramework'&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
Now we can have access to the message box. Try this next:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt;System::Windows::MessageBox.Show&lt;span style="color: rgb(128, 0, 128);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(51, 51, 153);"&gt;"Mein fruhstuck ist sehr langweilig!",&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: Courier New; color: rgb(51, 51, 153);" /&gt;
&lt;span style="font-family: Courier New;"&gt;&lt;span style="color: rgb(51, 51, 153);"&gt;  "IronRuby Demo"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;font size="2"&gt;&lt;br /&gt;
You should now see this:&lt;br /&gt;
&lt;/font&gt;
&lt;div style="text-align: center;"&gt;&lt;font size="2"&gt;  &lt;br /&gt;
&lt;img hspace="0" border="0" vspace="0" alt="MessageBox screenshot" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_2_3_live_racecar.png" /&gt;&lt;/font&gt;&lt;/div&gt;
&lt;font size="2"&gt;&lt;br /&gt;
This is almost the same as using the MessageBox object from C#, except that we are using “::” instead of “.” to separate namespaces and there is no semicolon at the end.&lt;br /&gt;
&lt;br /&gt;
Personally I don’t want to keep referring to MessageBox namespace every single time I use it. Let's create another &lt;br /&gt;
MessageBox object with a shorter name:&lt;/font&gt;&lt;font size="2"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;font size="2" style="font-family: Courier New;"&gt;MessageBox &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;System::Windows::MessageBox&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;MessageBox.show &lt;span style="color: rgb(51, 51, 153);"&gt;'Mein fruhstuck ist noch immer sehr langweilig!', &lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New; color: rgb(51, 51, 153);" /&gt;
&lt;font size="2" style="font-family: Courier New; color: rgb(51, 51, 153);"&gt;  'IronRuby Demo'&lt;/font&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;font size="2"&gt;&lt;br /&gt;
You may notice that I also switched over to using the Ruby style lowercase version of “Show()” method and that I dropped the parenthesis. I also switched to apostrophes instead of quotes. This is just another way of doing the same thing in Rubyland.&lt;br /&gt;
&lt;br /&gt;
So... we can now can show a message box. Big deal! How about we modify the class at runtime? Ruby has this neat &lt;a href="http://ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html#S2"&gt;mixins&lt;/a&gt; feature which allows classes to be modified at any time. Here goes:&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;MessageBox&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;  &lt;span style="color: rgb(128, 0, 128);"&gt;def &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;.&lt;/span&gt;wide_show&lt;span style="color: rgb(128, 0, 128);"&gt;(&lt;/span&gt;msg&lt;span style="color: rgb(128, 0, 128);"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;    MessageBox&lt;span style="color: rgb(128, 0, 128);"&gt;.s&lt;/span&gt;how msg&lt;span style="color: rgb(128, 0, 128);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(51, 51, 153);"&gt;'This message box is '&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;+ (&lt;/span&gt;&lt;span style="color: rgb(51, 51, 153);"&gt;'very '&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;8&lt;/span&gt;) &lt;span style="color: rgb(128, 0, 128);"&gt;+&lt;/span&gt; &lt;br /&gt;
      &lt;span style="color: rgb(51, 51, 153);"&gt;' wide, is it not?'&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;  &lt;span style="color: rgb(128, 0, 128);"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="color: rgb(128, 0, 128);"&gt;&lt;span style="font-family: Courier New;"&gt;end&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2"&gt;&lt;span style="font-family: Courier New;"&gt;MessageBox&lt;span style="color: rgb(128, 0, 128);"&gt;.&lt;/span&gt;wide_show &lt;span style="color: rgb(51, 51, 153);"&gt;'Testing 123...'&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;font size="2"&gt;&lt;br /&gt;
… and we now have a customized “extra wide” MessageBox at our disposal&lt;br /&gt;
&lt;/font&gt;
&lt;div style="text-align: center;"&gt;&lt;font size="2"&gt;  &lt;br /&gt;
&lt;img hspace="0" border="0" vspace="0" demo="" alt="Wide Messagebox Screenshot" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_2_5_wide_show.png" /&gt;&lt;/font&gt;&lt;/div&gt;
&lt;font size="2"&gt;&lt;br /&gt;
As you may have already figured out, we extended the MessageBox class, “def” defines a function, and the putting the “self.” prefix is similar to using “static” or “shared” in .NET. It makes it a “class method”&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;font size="3"&gt;&lt;span style="font-weight: bold;"&gt;WPF&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
Quit out of irrb (type “quit:), start it up again afresh (“iirb”). Copy and paste the following:&lt;/font&gt;&lt;font size="2"&gt;&lt;br /&gt;
&lt;br /&gt;
require 'PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'&lt;br /&gt;
require 'PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;font size="2" style="font-family: Courier New;"&gt;require &lt;span style="color: rgb(51, 51, 153);"&gt;'PresentationFramework, Version=3.0.0.0, Culture=neutral,&lt;/span&gt;&lt;br style="color: rgb(51, 51, 153);" /&gt;
&lt;span style="color: rgb(51, 51, 153);"&gt;  PublicKeyToken=31bf3856ad364e35'&lt;/span&gt;&lt;br /&gt;
require &lt;span style="color: rgb(51, 51, 153);"&gt;'PresentationCore, Version=3.0.0.0, Culture=neutral,&lt;/span&gt;&lt;br style="color: rgb(51, 51, 153);" /&gt;
&lt;span style="color: rgb(51, 51, 153);"&gt;  PublicKeyToken=31bf3856ad364e35'&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Windows &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;System::Windows&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;Media &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;Windows::Media&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;redBrush &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;Media::SolidColorBrush.new&lt;span style="color: rgb(128, 0, 128);"&gt;(&lt;/span&gt; Media::Colors.Red &lt;span style="color: rgb(128, 0, 128);"&gt;)&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;blackBrush &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;Media::SolidColorBrush.new&lt;span style="color: rgb(128, 0, 128);"&gt;(&lt;/span&gt; Media::Colors.Black )&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;redButton &lt;span style="color: rgb(128, 0, 128);"&gt;=&lt;/span&gt; Windows::Controls::Button.new&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;redButton.content &lt;span style="color: rgb(128, 0, 128);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(51, 51, 153);"&gt;"Do NOT press!"&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;redButton.font_size &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;40&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;redButton.font_weight &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;Windows::FontWeights.bold&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;redButton.Width &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;600&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;redButton.Height &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;400&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;redButton.background &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;redBrush&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;redButton.click &lt;span style="color: rgb(128, 0, 128);"&gt;do |&lt;/span&gt;sender, args&lt;span style="color: rgb(128, 0, 128);"&gt;|&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;  Windows::MessageBox.show &lt;span style="color: rgb(51, 51, 153);"&gt;'Please do not press this button again!'&lt;/span&gt;,&lt;br /&gt;
    &lt;span style="color: rgb(51, 51, 153);"&gt;'Why would you even do that?!?'&lt;/span&gt;,&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;    Windows::MessageBoxButton.OK, Windows::MessageBoxImage.exclamation&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;end&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;warningWindow &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;Windows::Window.new&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;warningWindow.content &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;redButton&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;warningWindow.title &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(51, 51, 153);"&gt;"Example WPF Window"&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;warningWindow.background &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;blackBrush&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;app &lt;span style="color: rgb(128, 0, 128);"&gt;= &lt;/span&gt;Windows::Application.new&lt;/font&gt;&lt;br style="font-family: Courier New;" /&gt;
&lt;font size="2" style="font-family: Courier New;"&gt;app.run warningWindow&lt;/font&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;font size="2"&gt;&lt;br /&gt;
&lt;br /&gt;
Yep, this demonstrates how you can create a &lt;a href="http://en.wikipedia.org/wiki/Windows_Presentation_Foundation"&gt;WPF&lt;/a&gt; window on the fly:&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;
&lt;div style="text-align: center;"&gt;&lt;font size="2"&gt;  &lt;br /&gt;
&lt;img hspace="0" border="0" vspace="0" alt="WPF Screenshot" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_2_6_wpf.png" /&gt;&lt;/font&gt;&lt;/div&gt;
&lt;font size="2"&gt;&lt;br /&gt;
One last thing for this segment, the DLR is designed so that programs hosted on it can interact with each other regardless of which languages the different parts are written in. There is a rather cool Silverlight sample out there called “DLRConsole” which demonstates how you can modify Silverlight elements from IronRuby or IronPython in the same browser window. &lt;br /&gt;
&lt;br /&gt;
This is the URL:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://silverlight.net/content/samples/sl2/dlrconsole/index.html"&gt;http://silverlight.net/content/samples/sl2/dlrconsole/index.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Note: it could move at any time without warning. Just &lt;a href="http://lmgtfy.com/?q=dlr+console"&gt;google&lt;/a&gt; on “DLRConsole” if this happens.&lt;br /&gt;
&lt;/font&gt;&lt;span style="font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;"&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div style="text-align: center;"&gt;&lt;a href=" http://silverlight.net/content/samples/sl2/dlrconsole/index.html"&gt;&lt;span style="font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;"&gt;&lt;img hspace="0" border="0" vspace="0" alt="DLR Console" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_2_7_dlrconsole.png" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style="font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;"&gt;&lt;br /&gt;
In &lt;a href="http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-3-cucumber-tutorial.aspx"&gt;Part 3&lt;/a&gt; we will have at a partical use for IronRuby, BDD with Cucumber&lt;br /&gt;
&lt;/span&gt; &lt;img src="http://gregmalcolm.com/aggbug/136042.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Greg Malcolm</dc:creator>
            <guid>http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-2-iirb-tutorial.aspx</guid>
            <pubDate>Fri, 06 Nov 2009 01:30:58 GMT</pubDate>
            <wfw:comment>http://gregmalcolm.com/comments/136042.aspx</wfw:comment>
            <comments>http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-2-iirb-tutorial.aspx#feedback</comments>
            <wfw:commentRss>http://gregmalcolm.com/comments/commentRss/136042.aspx</wfw:commentRss>
        </item>
        <item>
            <title>IronRuby and Cucumber - Installation (Part 1 of 3)</title>
            <link>http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-1-installation.aspx</link>
            <description>&lt;p&gt;This tutorial is based on a short demo/talk I gave at the Columbus .NET Developers Group (&lt;a href="javascript:void(0);/*1257470135943*/"&gt;CONDG&lt;/a&gt;) on IronRuby. It’s mostly designed for the .NET professional and making no assumptions of prior Ruby experience. &lt;br /&gt;
&lt;br /&gt;
&lt;img hspace="0" border="0" align="middle" vspace="0" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_1_3_1_install.png" i442.photobucket.com="" albums="" qq150="" gregmalcolm="" alt="Installer" /&gt; In Part 1 we get everything installed.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-2-iirb-tutorial.aspx"&gt;&lt;img hspace="0" border="0" align="middle" vspace="0" alt="IIRB" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_1_3_2_iib.png" /&gt;&lt;/a&gt; In &lt;a href="http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-2-iirb-tutorial.aspx"&gt;Part 2&lt;/a&gt; we take IronRuby for a test drive&lt;/p&gt;
&lt;p&gt;&lt;a href="http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-3-cucumber-tutorial.aspx"&gt;&lt;img hspace="0" border="0" align="middle" vspace="0" alt="Cucumber" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_1_3_3_cucumber.png" /&gt;&lt;/a&gt; In &lt;a href="http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-3-cucumber-tutorial.aspx"&gt;Part 3&lt;/a&gt; we use it to integrate with Cucumber.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;font size="4"&gt;&lt;span style="font-weight: bold;"&gt;Installing IronRuby&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
Before we get started, my instructions are more or less the same as this:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://wiki.github.com/aslakhellesoy/cucumber/ironruby-and-net"&gt;http://wiki.github.com/aslakhellesoy/cucumber/ironruby-and-net&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
… but with a little bit more elaboration on how to install the MRI and IronRuby.&lt;br /&gt;
&lt;br /&gt;
If you already have it all installed, go straight to &lt;a href="http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-2-iirb-tutorial.aspx"&gt;Part 2&lt;/a&gt;!&lt;br /&gt;
&lt;font size="3"&gt;&lt;br /&gt;
&lt;br style="font-weight: bold;" /&gt;
&lt;span style="font-weight: bold;"&gt;Step 1 – Install MRI (Matz’s Ruby Interpreter)&lt;/span&gt;&lt;/font&gt; &lt;br /&gt;
&lt;br /&gt;
We will need the standard Ruby language installed so we have access to the Gems package installer. This makes it really easy to install additional Ruby libraries, like Rails and Cucumber.&lt;br /&gt;
&lt;br /&gt;
Install the latest stable Windows version of Ruby from here:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.ruby-lang.org/en/downloads/"&gt;http://www.ruby-lang.org/en/downloads/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I used the one click installer. At the time of writing the one-click installer installs Ruby 1.8.6.&lt;br /&gt;
&lt;br /&gt;
Afterwards make sure you have the Ruby bin folder in your system path (It will probably be C:\Ruby\Bin):&lt;/p&gt;
&lt;div style="text-align: center;"&gt; &lt;img hspace="0" border="0" vspace="0" alt="Ruby Path Screenshot" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_1_1_ruby_path.png" /&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font size="3"&gt;&lt;span style="font-weight: bold;"&gt;Step 2 – Install IronRuby&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
IronRuby is currently available on &lt;a href="http://ironruby.net/Download"&gt;Codeplex&lt;/a&gt; and &lt;a href="http://wiki.github.com/ironruby/ironruby"&gt;Github&lt;/a&gt;. Grabbing it from Codeplex is probably the easiest approach:&lt;br /&gt;
&lt;a href="http://ironruby.net/Download"&gt;&lt;br /&gt;
http://ironruby.net/Download&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
This will allow you to download the MSI Installer version. The current installer at this time or writing is ironruby-0.9.2.msi.&lt;br /&gt;
&lt;br /&gt;
Also make sure IronRuby’s bin folder is now in the system path (mine is called C:\Program Files\IronRuby 0.9.2\bin):&lt;/p&gt;
&lt;div style="text-align: center;"&gt; &lt;img hspace="0" border="0" vspace="0" alt="IronRuby Path Screenshot" gregmalcolm="" qq150="" albums="" i442.photobucket.com="" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/IronRubyDemo_1_2_IronRuby_path.png" /&gt;&lt;/div&gt;
&lt;p&gt;&lt;font size="3"&gt;&lt;br /&gt;
&lt;br style="font-weight: bold;" /&gt;
&lt;span style="font-weight: bold;"&gt;Step 3 – Install Cucumber&lt;/span&gt;&lt;/font&gt; &lt;br /&gt;
&lt;br /&gt;
The cucumber installation instructions on the Cucumber Github wiki are here:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://wiki.github.com/aslakhellesoy/cucumber/ironruby-and-net"&gt;http://wiki.github.com/aslakhellesoy/cucumber/ironruby-and-net&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I can’t really improve much on these remaining instructions. Just open a command prompt and do everything it says, with the exception of downloading and installing MRI and IronRuby. So just run all the commands, and create the icucumber.bat script file. &lt;br /&gt;
&lt;br /&gt;
Our version will probably look more like this:&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;link href="file:///C:%5CDOCUME%7E1%5CGMALCO%7E1.TOP%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List" /&gt;
&lt;link href="file:///C:%5CDOCUME%7E1%5CGMALCO%7E1.TOP%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData" /&gt;
&lt;link href="file:///C:%5CDOCUME%7E1%5CGMALCO%7E1.TOP%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping" /&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
&lt;w:WordDocument&gt;
&lt;w:View&gt;Normal&lt;/w:View&gt;
&lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
&lt;w:TrackMoves /&gt;
&lt;w:TrackFormatting /&gt;
&lt;w:PunctuationKerning /&gt;
&lt;w:ValidateAgainstSchemas /&gt;
&lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
&lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
&lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
&lt;w:DoNotPromoteQF /&gt;
&lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
&lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
&lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
&lt;w:Compatibility&gt;
&lt;w:BreakWrappedTables /&gt;
&lt;w:SnapToGridInCell /&gt;
&lt;w:WrapTextWithPunct /&gt;
&lt;w:UseAsianBreakRules /&gt;
&lt;w:DontGrowAutofit /&gt;
&lt;w:SplitPgBreakAndParaMark /&gt;
&lt;w:DontVertAlignCellWithSp /&gt;
&lt;w:DontBreakConstrainedForcedTables /&gt;
&lt;w:DontVertAlignInTxbx /&gt;
&lt;w:Word11KerningPairs /&gt;
&lt;w:CachedColBalance /&gt;
&lt;/w:Compatibility&gt;
&lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
&lt;m:mathPr&gt;
&lt;m:mathFont m:val="Cambria Math" /&gt;
&lt;m:brkBin m:val="before" /&gt;
&lt;m:brkBinSub m:val="&amp;#45;-" /&gt;
&lt;m:smallFrac m:val="off" /&gt;
&lt;m:dispDef /&gt;
&lt;m:lMargin m:val="0" /&gt;
&lt;m:rMargin m:val="0" /&gt;
&lt;m:defJc m:val="centerGroup" /&gt;
&lt;m:wrapIndent m:val="1440" /&gt;
&lt;m:intLim m:val="subSup" /&gt;
&lt;m:naryLim m:val="undOvr" /&gt;
&lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
&lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="267"&gt;
&lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal" /&gt;
&lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 1" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 2" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 3" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 4" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 5" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 6" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 7" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 8" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 9" /&gt;
&lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /&gt;
&lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title" /&gt;
&lt;w:LsdException Locked="false" Priority="0" Name="Default Paragraph Font" /&gt;
&lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /&gt;
&lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong" /&gt;
&lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /&gt;
&lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid" /&gt;
&lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /&gt;
&lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading" /&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List" /&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid" /&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1" /&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2" /&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1" /&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2" /&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1" /&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2" /&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3" /&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List" /&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading" /&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List" /&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid" /&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /&gt;
&lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /&gt;
&lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /&gt;
&lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote" /&gt;
&lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /&gt;
&lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /&gt;
&lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /&gt;
&lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /&gt;
&lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title" /&gt;
&lt;w:LsdException Locked="false" Priority="37" Name="Bibliography" /&gt;
&lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /&gt;
&lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;style type="text/css"&gt;&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1107304683 0 0 159 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	font-size:10.0pt;
	mso-ansi-font-size:10.0pt;
	mso-bidi-font-size:10.0pt;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
--&gt;&lt;/style&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"Times New Roman";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
table.MsoTableGrid
{mso-style-name:"Table Grid";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-unhide:no;
border:solid black 1.0pt;
mso-border-themecolor:text1;
mso-border-alt:solid black .5pt;
mso-border-themecolor:text1;
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-border-insideh:.5pt solid black;
mso-border-insideh-themecolor:text1;
mso-border-insidev:.5pt solid black;
mso-border-insidev-themecolor:text1;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
&lt;/style&gt;
&lt;![endif]--&gt;
&lt;table cellspacing="0" cellpadding="0" border="1" width="667" style="border: medium none ; width: 6.95in; border-collapse: collapse;" class="MsoTableGrid"&gt;
    &lt;tbody&gt;
        &lt;tr style=""&gt;
            &lt;td width="667" valign="top" style="border: 1pt solid black; padding: 0in 5.4pt; width: 6.95in;"&gt;
            &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(95, 73, 122);"&gt;ECHO OFF&lt;br /&gt;
            REM This is to tell IronRuby where to find gems.&lt;br /&gt;
            SET GEM_PATH=&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(192, 0, 0);"&gt;c&lt;strong style=""&gt;:\ruby\lib\ruby\gems\1.8&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(95, 73, 122);"&gt;&lt;br /&gt;
            @ "&lt;/span&gt;&lt;strong style=""&gt;&lt;span style="font-size: 9pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(192, 0, 0);"&gt;C:\Program Files\IronRuby   0.9.2\bin\ir.exe&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-size: 9pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(95, 73, 122);"&gt;" "&lt;/span&gt;&lt;strong style=""&gt;&lt;span style="font-size: 9pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(192, 0, 0);"&gt;c:\ruby\bin\cucumber&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-size: 9pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(95, 73, 122);"&gt;" %* &lt;/span&gt;&lt;strong style=""&gt;&lt;span style="font-size: 9pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(192, 0, 0);"&gt;--no-color&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-size: 9pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(95, 73, 122);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;
&lt;span style="font-style: italic;"&gt;NOTE: The --no-color option is a workaround for an issue with showing color in command terminals that exists in ruby at the moment on windows. You can try it with colors turned ont, but if its not fixed you will start seeing “←[36” symbols all your cucumber test output.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
In &lt;a href="http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-2-iirb-tutorial.aspx"&gt;Part 2&lt;/a&gt; we will have a quick look at what you can achieve with IronRuby.&lt;/p&gt;
&lt;input type="hidden" id="gwProxy" /&gt;&lt;!--Session data--&gt;&lt;input type="hidden" onclick="jsCall();" id="jsProxy" /&gt;
&lt;div id="refHTML"&gt; &lt;/div&gt;
&lt;input type="hidden" id="gwProxy" /&gt;&lt;!--Session data--&gt;&lt;input type="hidden" id="jsProxy" onclick="jsCall();" /&gt;
&lt;div id="refHTML"&gt; &lt;/div&gt;
&lt;p&gt; &lt;/p&gt; &lt;img src="http://gregmalcolm.com/aggbug/136041.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Greg Malcolm</dc:creator>
            <guid>http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-1-installation.aspx</guid>
            <pubDate>Fri, 06 Nov 2009 01:16:38 GMT</pubDate>
            <wfw:comment>http://gregmalcolm.com/comments/136041.aspx</wfw:comment>
            <comments>http://gregmalcolm.com/archive/2009/11/05/ironruby-and-cucumber-part-1-installation.aspx#feedback</comments>
            <wfw:commentRss>http://gregmalcolm.com/comments/commentRss/136041.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Goodbye Green Card!</title>
            <link>http://gregmalcolm.com/archive/2009/07/14/goodbye-green-card.aspx</link>
            <description>&lt;p&gt;Today, just after 1:00pm I completed the US Naturalization Oath. I am now an American Citizen! Well technically a dual citizen, because my British citizenship still stands. &lt;br /&gt;
&lt;br /&gt;
&lt;img style="WIDTH: 261px; HEIGHT: 186px" hspace="4" alt="American Flag" vspace="4" align="right" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/american-flag.jpg" /&gt;It felt really strange handing over the green card. It has been my constant companion for 5 1/2 years and I've just got used to having it around. Nevermind, I'm sure it has gone to a better place (or at least places. Most likely it got shredded. Eep.)&lt;/p&gt;
&lt;p&gt;The oath ceremony was fun. The 45 immigrants present each had to stand up and address the judge with something along the lines of "Good afternoon your honor, I am David Hasselhoff and I'm from Elbonia!" &lt;br /&gt;
&lt;br /&gt;
The first person forgot the "Good afternoon" part, so nobody (myself included) included that part of the greeting until about half way through when somebody finally reintroduced it when we were about half through!&lt;br /&gt;
&lt;br /&gt;
Every nation had subtly different ways of introducing themselves. The Polynesians approach was the most impressive; they made a point of yelling out their country of origin!&lt;br /&gt;
&lt;br /&gt;
In case you are wondering we didn't get to sing the Star Spangled Banner. I'm sure the attempt would have been highly entertaining... &lt;img alt="" src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/teeth_smile.gif" /&gt;&lt;/p&gt; &lt;img src="http://gregmalcolm.com/aggbug/133497.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Greg Malcolm</dc:creator>
            <guid>http://gregmalcolm.com/archive/2009/07/14/goodbye-green-card.aspx</guid>
            <pubDate>Tue, 14 Jul 2009 23:53:00 GMT</pubDate>
            <wfw:comment>http://gregmalcolm.com/comments/133497.aspx</wfw:comment>
            <comments>http://gregmalcolm.com/archive/2009/07/14/goodbye-green-card.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://gregmalcolm.com/comments/commentRss/133497.aspx</wfw:commentRss>
        </item>
        <item>
            <title>User Interface Patterns</title>
            <link>http://gregmalcolm.com/archive/2009/07/14/user-interface-patterns.aspx</link>
            <description>&lt;link rel="File-List" href="file:///C:\DOCUME~1\GMALCO~1.TOP\LOCALS~1\Temp\msohtml1\01\clip_filelist.xml" /&gt;&lt;o:smarttagtype name="place" namespaceuri="urn:schemas-microsoft-com:office:smarttags"&gt;&lt;/o:smarttagtype&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
&lt;w:WordDocument&gt;
&lt;w:View&gt;Normal&lt;/w:View&gt;
&lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
&lt;w:PunctuationKerning /&gt;
&lt;w:ValidateAgainstSchemas /&gt;
&lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
&lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
&lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
&lt;w:Compatibility&gt;
&lt;w:BreakWrappedTables /&gt;
&lt;w:SnapToGridInCell /&gt;
&lt;w:WrapTextWithPunct /&gt;
&lt;w:UseAsianBreakRules /&gt;
&lt;w:DontGrowAutofit /&gt;
&lt;/w:Compatibility&gt;
&lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
&lt;w:LatentStyles DefLockedState="false" LatentStyleCount="156"&gt;
&lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if !mso]&gt;&lt;object
classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui&gt;&lt;/object&gt;
&lt;style&gt;
st1\:*{behavior:url(#ieooui) }
&lt;/style&gt;
&lt;![endif]--&gt;&lt;style type="text/css"&gt;&lt;!--
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.25in 1.0in 1.25in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
--&gt;&lt;/style&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;
&lt;p class="MsoNormal"&gt;I just gave a short presentation at &lt;a href="javascript:void(0);/*1247570297759*/"&gt;ColArc&lt;/a&gt; earlier on User Interface patterns. I got someone to film it, but unfortunately there is no audio. I just wasn't loud enough.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;That’s ok though, it gives me an excuse to write it up!&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;span style="FONT-SIZE: 16pt"&gt;&lt;font size="5"&gt;User Interface Patterns&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;font size="4"&gt;&lt;strong&gt;Smart UI (Anti-pattern)&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;A &lt;a href="javascript:void(0);/*1247570390073*/"&gt;Smart UI&lt;/a&gt; is what you get when your GUI has no separation of concerns. That is, when the user interface and business logic are all mixed together. For example, if you take a form, throw a bunch of widgets on it and add some code in the event handlers.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;This kind of approach is not always bad. It is fine if you want something quick and simple that isn’t going to change. For example if you want to create a quick demo, or explore how something works. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;However, most of the time an application will change and that’s where things will get messy, particular if you have a lot of Smart UIs in one application. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Maintenance will get difficult. A supposedly simple change could affect anything else associated with the same class. Over time the code will likely messier and messier as more maintainers work with the same code.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p style="TEXT-ALIGN: center" class="MsoNormal"&gt;&lt;o:p&gt;&lt;img style="WIDTH: 348px; HEIGHT: 464px" alt="Office clutter" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/SmartUI.png" /&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Writing &lt;a href="javascript:void(0);/*1247570735576*/"&gt;tests&lt;/a&gt; for this kind of code is typically very difficult. User interface code is the hardest part to test and if the business logic is mixed in it can make the job near impossible.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;It’s called an &lt;a href="javascript:void(0);/*1247570451255*/"&gt;anti-pattern&lt;/a&gt; for a reason.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;font size="4"&gt;Model View Controller (MVC)&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;The most famous user interface design pattern, &lt;a href="javascript:void(0);/*1247570549229*/"&gt;MVC&lt;/a&gt;, has been around for quite a while. It was devised in the late 1970s for use in the &lt;a href="javascript:void(0);/*1247570605328*/"&gt;development&lt;/a&gt; of Smalltalk-80. The problem its designers were initially trying to solve was that of how to bridge the gap between the human user’s mental model and the digital model of the computer.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Eventually they whittled it down to the famous MVC triad we know today representing 3 key concerns:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p style="TEXT-ALIGN: center" class="MsoNormal"&gt;&lt;o:p&gt;&lt;img alt="MVC Triad" width="588" height="359" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/MVC.png" /&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;Controller&lt;/strong&gt; – Represents interactions, typically with the mouse or keyboard, or in the case of web applications, in the form of HTTP requests.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;View&lt;/strong&gt; – Renders the graphical output of the application&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;Model&lt;/strong&gt; – Everything else. In particular this includes the data and business logic.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;There are numerous other “triad” style user interface patterns. They all tend to feature some kind of concept of model and view, but the 3&lt;sup&gt;rd&lt;/sup&gt; part (in this case the Control) tends to vary.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;The other distinct trait of the MVC is that it is extremely loosely coupled. The Model knows nothing of the View or Controller, and similarly the View knows knows nothing of the controller either. One particularly useful side effect is that it is possible (and completely normal) to have multiple views for any given model. It is also relatively easy to change out parts (for example the viewing technology).&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Testing is relatively easy. The Model and Controller are easy to test.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;font size="4"&gt;Model View Presenter (MVP)&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;During the 90s not &lt;a href="javascript:void(0);/*1247570864672*/"&gt;everybody&lt;/a&gt; was satisfied with Model View Controller. In particular some developers working with rich application interfaces were creating GUI’s with highly detailed state changes and high degree with user control over the environment. At that time the typical MVC implementations did not handle this kind of activity as efficiently.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;The creators of &lt;a href="javascript:void(0);/*1247570816862*/"&gt;MVP&lt;/a&gt; ended up with a new model by shifting the MVC responsibilities around in what they called “&lt;a href="javascript:void(0);/*1247570982940*/"&gt;Twisting the Triad&lt;/a&gt;”.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p style="TEXT-ALIGN: center" class="MsoNormal"&gt;&lt;o:p&gt;&lt;img alt="Twisting of the Triad" width="562" height="265" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/MVP.png" /&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;So instead of a controller, you get a presenter instead. The presenter has much of the computational logic of the View, but also takes over the Application Model aspects of the Model. That is, the part of the model in charge  view state changes, such as which widgets are visible or not visible.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;The other twist is “Controller” behavior is moved into the View.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;This gives us this:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p style="TEXT-ALIGN: center" class="MsoNormal"&gt;&lt;o:p&gt;&lt;img style="WIDTH: 533px; HEIGHT: 280px" alt="MVP Triad" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/MVP2.png" /&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;The MVP architecture works really well from a testing point of view. First you develop the model with a full set of tests. On getting that working you write the Presenter to handle as much of the viewing logic as you can, but out showing anything. This part two is therefore very easy to test. The actual view code is typically difficult to test, but in this architecture the view code is kept to a bare minimum, with events getting delegated to the Model. This means the untestable code is being kept to a bare minimum.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;The code reuse is good too. A single presenter can be reused with multiple views if the functionality is similar. Because the View and the Presenter are tightly coupled it is easy to support &lt;a href="javascript:void(0);/*1247571037813*/"&gt;databinding&lt;/a&gt;.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;There is one complication I have not covered yet. There are actually 2 &lt;a href="javascript:void(0);/*1247571191314*/"&gt;variants&lt;/a&gt; of this pattern:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p style="TEXT-ALIGN: center" class="MsoNormal"&gt;&lt;strong&gt;&lt;img style="WIDTH: 657px; HEIGHT: 383px" alt="MVP - Passive View and Supervising Controller" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/mvp3.png" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;The style I have described up till now is closest to the &lt;a href="javascript:void(0);/*1247571245972*/"&gt;Passive View&lt;/a&gt; variant. The &lt;a href="javascript:void(0);/*1247571216357*/"&gt;Supervising Controller&lt;/a&gt; variant typically is used when you want to bind the view to model directly.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;font size="4"&gt;Presenter-Abstraction-Control (PAC)&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;o:p&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="TEXT-ALIGN: center" class="MsoNormal"&gt;&lt;strong&gt;&lt;o:p&gt;&lt;img style="WIDTH: 636px; HEIGHT: 451px" alt="Presenter-Abstraction-Control Hierachy" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/PAC.png" /&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;This &lt;a href="javascript:void(0);/*1247571303478*/"&gt;pattern&lt;/a&gt; is a little more specialized; it is designed for rendering hierarchical views quickly. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;For example, suppose you have a form based application. The form is the top triad node. Descending nodes might include the titlebar and client frame. The client frame in turn may have a number of widgets. Some of these widgets may in turn be composed of more widgets.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Each triad is similar to the MVC parts:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Abstraction = Model&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Presentation = View&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Control = Controller&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;The Control handles communications with the Abstraction and Presentation, also with other Controls in thee hierarchy.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;The clever bit is that the Abstraction and Presentation parts are completely isolated from the outside world. This means they work really well in a multitasking context.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;font size="4"&gt;Hierarchical Model View Controller (HMVC)&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;In 1987 &lt;a href="javascript:void(0);/*1247571413186*/"&gt;JavaWorld&lt;/a&gt; magazine published an article on &lt;a href="javascript:void(0);/*1247571386104*/"&gt;HMVC&lt;/a&gt;, which looks almost identical to &lt;st1:place w:st="on"&gt;PAC.&lt;/st1:place&gt; Apparently the authors were unaware PAC already existed. HMVC is very similar to PAC but there are some small differences. In particular, it is less strict about isolating the Abstraction and Presentation; they are allowed to communicate with each other from within a triad.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;Model-View-ViewModel (MVVM)&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;This &lt;a href="javascript:void(0);/*1247571724485*/"&gt;pattern&lt;/a&gt; is very specialized, it is designed for use in .NET’s &lt;a href="javascript:void(0);/*1247571683703*/"&gt;WPF&lt;/a&gt; and &lt;a href="javascript:void(0);/*1247571749446*/"&gt;Silverlight&lt;/a&gt; frameworks.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p style="TEXT-ALIGN: center" class="MsoNormal"&gt;&lt;img style="WIDTH: 713px; HEIGHT: 230px" alt="Model View ModelView Triad" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/MVVM.png" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Both these frameworks configure the View in the form of XML based properties (&lt;a href="javascript:void(0);/*1247571788294*/"&gt;XAML&lt;/a&gt;). In a way working with XAML can be a bit like developing for &lt;a href="javascript:void(0);/*1247571854677*/"&gt;Webforms&lt;/a&gt;, it is possible to respond to events in the &lt;a href="javascript:void(0);/*1247571886318*/"&gt;Code-Behind&lt;/a&gt;. That of course would give you a Smart UI, so not ideal. Implementing classic UI patterns such as MVC or MVP would be very difficult. Instead these frameworks offer an alternative by allowing a ViewModel class to be referenced as a resource in the XAML.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Using the ViewModel we get a slightly unconventional triad structure:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;The ViewModel class is able to work part of the UI in the form of &lt;a href="javascript:void(0);/*1247572115599*/"&gt;Command&lt;/a&gt; objects for handling state interactions. Also it gets access to part of the Model data needed for the specific view. This model data is transitory, and can be committed back into the model when the view changes are complete.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;A common question with MVVM is “How is it different to MVC and MVP”?&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;The&lt;strong&gt; &lt;/strong&gt;MVC parts are extremely loosely coupled. Also the Controller does not do much more than pass messages to the Model or View while the ViewModel is responsible for doing a lot more.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;The MVP looks similar at a glance, but in MVP the Presenter is the more dominant than the View. In MVVM the View owns the ViewModel. Also the ViewModel only exists if there is a View, while in MVP there can be multiple views to a Presenter.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;font size="4"&gt;Conclusions&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;So which do you use? Well, personally I would almost always stick the MVC pattern because there are many great frameworks available:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p style="TEXT-INDENT: 0.5in" class="MsoNormal"&gt;&lt;a href="javascript:void(0);/*1247572188929*/"&gt;Ruby on Rails&lt;/a&gt;, &lt;a href="javascript:void(0);/*1247572237428*/"&gt;Spring MVC&lt;/a&gt;, &lt;a href="javascript:void(0);/*1247572295509*/"&gt;ASP.NET MVC&lt;/a&gt;, &lt;a href="javascript:void(0);/*1247572332598*/"&gt;Monorail&lt;/a&gt;, etc&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;I think MVP looks useful, but I only know of &lt;span style="TEXT-DECORATION: line-through"&gt;one&lt;/span&gt; a couple of frameworks:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p style="MARGIN-LEFT: 40px" class="MsoNormal"&gt;&lt;span&gt;&lt;/span&gt;&lt;a href="http://www.codeplex.com/websf/Wiki/View.aspx?title=MVP_landing_page"&gt;MVC#&lt;/a&gt;&lt;/p&gt;
&lt;p style="MARGIN-LEFT: 40px" class="MsoNormal"&gt;&lt;a href="http://www.codeplex.com/websf/Wiki/View.aspx?title=MVP_landing_page"&gt;Web Client Software Factory - MVP Bundle &lt;/a&gt; (Thanks Jeronimo for point this one out!)&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Yes, peculiar as it might sound, MVC# is actually an MVP framework.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;However, if I had to implement a pattern myself, it could go either way. I have recently spent time refactoring a “Smart UI” into an MVC structure in a Windows C++ application. In hindsight I think it would have been easier to refactor it into a MVP structure, because it’s hard to separate controller logic from the view with CWnds andit would involve less refactoring steps.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;I think PAC/HMVC sounds very cool but I doubt I would ever run into a scenario where the optimization would be make it worth while. Looks like it could be fun to play with though.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;And of course MVVM is pretty much the only game in town if you want to write a WPF or Silverlight application.&lt;/p&gt;
&lt;p class="MsoNormal"&gt; &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;font size="4"&gt;&lt;strong&gt;Sources&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Everything described here was pieced together from various places. Here are some of the them:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;General&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;a href="javascript:void(0);/*1247545627754*/"&gt;http://haacked.com&lt;/a&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;a href="javascript:void(0);/*1247545633642*/"&gt;http://ctrl-shift-B.com&lt;/a&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;SmartUI&lt;/span&gt;  &lt;a href="javascript:void(0);/*1247545639026*/"&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;a href="javascript:void(0);/*1247545639026*/"&gt;http://blog.codeville.net/&lt;/a&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;PAC&lt;/span&gt;  &lt;a href="javascript:void(0);/*1247545645138*/"&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;a href="javascript:void(0);/*1247545645138*/"&gt;http://www.dossier-andreas.net&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;MVVM&lt;/span&gt; &lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;a href="javascript:void(0);/*1247545651946*/"&gt;http://www.acceptedeclectic.com&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt; &lt;/p&gt;
&lt;!--[if !mso]&gt;
&lt;style&gt;
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
p\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
v\:textbox {display:none;}
&lt;/style&gt;
&lt;![endif]--&gt;&lt;!--[if !ppt]--&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.O
	{font-size:149%;}
]]&gt;&lt;/style&gt;&lt;style type="text/css" media="print"&gt;&lt;!--.sld
	{left:0px !important;
	width:6.0in !important;
	height:4.5in !important;
	font-size:103% !important;}
--&gt;&lt;/style&gt;&lt;!--[endif]--&gt;&lt;o:shapelayout v:ext="edit"&gt;&lt;/o:shapelayout&gt;&lt;o:idmap v:ext="edit" data="1"&gt;&lt;/o:idmap&gt;
&lt;p:colorscheme colors="#ffffff,#000000,#808080,#000000,#bbe0e3,#333399,#009999,#99cc00"&gt;
&lt;div class="O" v:shape="_x0000_s1026"&gt;
&lt;div&gt;&lt;span style="COLOR: teal; FONT-SIZE: 178%"&gt;&lt;span style="POSITION: absolute; COLOR: rgb(0,102,102); LEFT: -5.7%"&gt;•&lt;/span&gt;&lt;/span&gt;&lt;span style="COLOR: teal; FONT-SIZE: 32pt"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;/p:colorscheme&gt; &lt;img src="http://gregmalcolm.com/aggbug/133471.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Greg Malcolm</dc:creator>
            <guid>http://gregmalcolm.com/archive/2009/07/14/user-interface-patterns.aspx</guid>
            <pubDate>Tue, 14 Jul 2009 04:19:32 GMT</pubDate>
            <wfw:comment>http://gregmalcolm.com/comments/133471.aspx</wfw:comment>
            <comments>http://gregmalcolm.com/archive/2009/07/14/user-interface-patterns.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://gregmalcolm.com/comments/commentRss/133471.aspx</wfw:commentRss>
        </item>
        <item>
            <title>My CodeStock 2009</title>
            <link>http://gregmalcolm.com/archive/2009/06/30/my-codestock-2009.aspx</link>
            <description>&lt;link rel="File-List" href="file:///C:\DOCUME~1\Greg\LOCALS~1\Temp\msohtml1\01\clip_filelist.xml" /&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
&lt;w:WordDocument&gt;
&lt;w:View&gt;Normal&lt;/w:View&gt;
&lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
&lt;w:Compatibility&gt;
&lt;w:BreakWrappedTables /&gt;
&lt;w:SnapToGridInCell /&gt;
&lt;w:WrapTextWithPunct /&gt;
&lt;w:UseAsianBreakRules /&gt;
&lt;/w:Compatibility&gt;
&lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;style type="text/css"&gt;&lt;!--
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";}
a:link, span.MsoHyperlink
	{color:blue;
	text-decoration:underline;
	text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
	{color:purple;
	text-decoration:underline;
	text-underline:single;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.25in 1.0in 1.25in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
--&gt;&lt;/style&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";}
&lt;/style&gt;
&lt;![endif]--&gt;
&lt;link rel="File-List" href="file:///C:\DOCUME~1\Greg\LOCALS~1\Temp\msohtml1\01\clip_filelist.xml" /&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
&lt;w:WordDocument&gt;
&lt;w:View&gt;Normal&lt;/w:View&gt;
&lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
&lt;w:Compatibility&gt;
&lt;w:BreakWrappedTables /&gt;
&lt;w:SnapToGridInCell /&gt;
&lt;w:WrapTextWithPunct /&gt;
&lt;w:UseAsianBreakRules /&gt;
&lt;/w:Compatibility&gt;
&lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;style type="text/css"&gt;&lt;!--
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";}
a:link, span.MsoHyperlink
	{color:blue;
	text-decoration:underline;
	text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
	{color:purple;
	text-decoration:underline;
	text-underline:single;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.25in 1.0in 1.25in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
--&gt;&lt;/style&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";}
&lt;/style&gt;
&lt;![endif]--&gt;
&lt;p class="MsoNormal"&gt;&lt;strong style=""&gt;&lt;span style="font-size: 14pt;"&gt;Cool Sessions&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;o:p&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong style=""&gt;Experience Agile Practices - &lt;a href="http://www.donaldegray.com/tiki-index.php"&gt;Don Gray&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Agile with lego! We split into teams of 6-7 people (one of which being the product owner) and worked on projects to build a lego animal, with an enclosure and vehicle (although our enclosure ended up being the vehicle. It met requirements!). &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Work was split into iterations (design, build, retrospective), with a set of story cards for each rounds. Stuff like:&lt;br /&gt;
&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent: 0.5in;"&gt;“It must have two legs”&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent: 0.5in;"&gt;“It must have wings”&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent: 0.5in;"&gt;“It must be have a single color”&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent: 0.5in;"&gt;“It must have four legs”.&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent: 0.5in;"&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;a target="_blank" href="http://s442.photobucket.com/albums/qq150/gregmalcolm/?action=view&amp;amp;current=Lego.jpg"&gt;&lt;img hspace="10" border="0" align="left" vspace="2" style="width: 143px; height: 107px;" alt="Lego Animal" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/Lego.jpg" /&gt;&lt;/a&gt;It was a blast! And yes 2 of the requirements contradicted. Because that would never happen in real life! And of course on completing the first round of iterations we got a bunch of new story cards which required changing. just about everything! If only we’ed thought to ask the product owner about future plans first…&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;If anyone is looking to for Agile Training, I thoroughly recommend looking up Don. His webpage is &lt;a href="http://www.donaldegray.com/tiki-index.php"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p style="text-align: center;" class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong style=""&gt;&lt;br /&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong style=""&gt;Inside Linq – &lt;a href="http://www.thinqlinq.com/"&gt;Jim Wooley&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;img hspace="10" align="right" style="width: 143px; height: 161px;" alt="Cooking curry" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/Chef-Cooking-up-a-hot-curry.jpg" /&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;When I’ve been out drinking, I sometimes get the urge to go out for a really hot curry at the local indian restaurant. I know full well its going to be to spicy for me but I just can’t resist the challenge. See where I’m going with this?&lt;o:p&gt; &lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;“Inside Linq” was listed as Advanced in the convention program. And yep, it was plenty spicy, like advertised! A lot of it went over my head, I think I at least got the gist. Mostly it boiled down to an explanation of how Linq works under the covers using IEnumerable and IQueryable and how you can see this through Reflector. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;My mind imploded a bit on but I think I at least got the gist. I think I’d understand the rest if I just take the time to play around a bit.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong style=""&gt;&lt;br /&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong style=""&gt;&lt;br /&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong style=""&gt;Introducing the MVVM Pattern – &lt;a href="http://houseofbilz.com/archive/2009/06/12/adventures-in-mvvm-ndash-slides-and-demo-app.aspx"&gt;Brian Genisio&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;o:p&gt; &lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;I haven’t done much with WPF or Silverlight yet, but I couldn’t resist looking in on this presentation because I’ve recently being investigating various User Interface patterns for a future lightning talk.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Brian’s talk gave me quite a bit of added insight on MVVM that I hadn’t picked up in my previous research, and the examples of mini code patterns used to implement MVVM. I would have liked to have attended the Open Space Brian hosted immediately on the topic immediately afterwards, but I really needed to go see that Mono presentation…&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong style=""&gt;&lt;br /&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong style=""&gt;Mono, Making .NET portable – &lt;a href="http://dennishayes.sys-con.com/"&gt;Dennis Hayes&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;I’ve had a soft spot for Mono ever since my &lt;a href="http://gregmalcolm.com/archive/2008/10/29/condg-lightning-talks.aspx"&gt;lightning talk&lt;/a&gt; at &lt;a href="http://www.condg.org/archive/2008/10/16/October-Meeting-Announcement.aspx"&gt;CONDG&lt;/a&gt;, so it was a great opportunity to totally geek out. It was good to know that it’s a lot easier to get up and running for development nowadays and I learned that there is now a Live CD and downloading VMware. Maybe I’ll go play with Mono more sometime soon…&lt;/p&gt;
&lt;p class="MsoNormal"&gt; &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong style=""&gt;&lt;span style="font-size: 14pt;"&gt;Open Spaces&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;I already raved lots about Open Spaces in my &lt;a href="http://gregmalcolm.com/archive/2009/01/10/codemash-2009.aspx"&gt;CodeMash&lt;/a&gt; report, so not going to say too much about it this time. One difference, I hosted my own session this time around, on Pomodoro. Predictably it didn’t quite go as I envisioned, instead of learning about how to fine tune Pomodoro, I ended up teaching about what it is and how it works which was fun. Also got to see some neat Pomodoro clients. Shame they were for the mac!&lt;/p&gt;
&lt;p style="text-align: center;" class="MsoNormal"&gt;&lt;o:p&gt; &lt;img height="311" width="415" alt="OpenSpace Session" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/Community2.jpg" /&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;As with last time, credit goes to &lt;a href="http://netcave.org/"&gt;Alan Stevens&lt;/a&gt; for making the event work.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt;  &lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong style=""&gt;&lt;span style="font-size: 14pt;"&gt;Parties&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;I think it’s safe to say I had fun:&lt;/p&gt;
&lt;p class="MsoNormal" style="text-align: center;"&gt;&lt;img height="344" width="459" alt="Drink!" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/Party1.jpg" /&gt;&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;img src="http://s442.photobucket.com/albums/qq150/gregmalcolm/?action=view&amp;amp;current=FirePit2.jpg" alt="" /&gt;&lt;br /&gt;
&lt;img height="345" width="460" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/FirePit2.jpg" alt="Party!" /&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-weight: bold;"&gt;Acknowlegement&lt;/span&gt;: CodeStock photos are courtesy of &lt;a href="http://cid-67d16e3143fa2957.skydrive.live.com/browse.aspx/Codestock%202009"&gt;Alan Barber&lt;/a&gt; and &lt;a href="http://picasaweb.google.com/alanstevens/CodeStock2009#"&gt;Alan Stevens&lt;/a&gt;. As everyone knows all Alans are keen photographers...&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt; &lt;img src="http://gregmalcolm.com/aggbug/133140.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>gregorymalcolm</dc:creator>
            <guid>http://gregmalcolm.com/archive/2009/06/30/my-codestock-2009.aspx</guid>
            <pubDate>Tue, 30 Jun 2009 05:33:59 GMT</pubDate>
            <wfw:comment>http://gregmalcolm.com/comments/133140.aspx</wfw:comment>
            <comments>http://gregmalcolm.com/archive/2009/06/30/my-codestock-2009.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://gregmalcolm.com/comments/commentRss/133140.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Two random bash shell tips</title>
            <link>http://gregmalcolm.com/archive/2009/03/17/2-random-unix-shell-tips.aspx</link>
            <description>I thought it was about time I imparted some actual information, instead of just reporting on where I've been, so here goes...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="FONT-WEIGHT: bold"&gt;&lt;font size="4"&gt;Suggestion #1: Quicker access to the Bash History with Ctrl+R&lt;br /&gt;
&lt;/font&gt;&lt;br /&gt;
&lt;span style="FONT-WEIGHT: bold"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;font size="4"&gt;&lt;img alt="Bash Shell" align="left" src="http://i442.photobucket.com/albums/qq150/gregmalcolm/terminal.png" /&gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;
Find your self constantly hitting up and down buttons when logged into a UNIX terminal, trying to locate the last command entered in the history for rebooting the cable modem, backing up the internet or shutting down the HAL 9000? There are much quicker ways to do it!&lt;br /&gt;
&lt;br /&gt;
My personal favorite is hit Ctrl + R, then type a fragment of the command you are after. For example hit the keys Ctrl + R, s, and u and you've probably already found "sudo su - root".&lt;br /&gt;
&lt;br /&gt;
You can also get a similar affect by prefxing a partial command with the '!' key. Only problem with that is you don't get a preview of what command you're running. &lt;span style="FONT-WEIGHT: bold"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;font size="4"&gt;&lt;br /&gt;
&lt;br /&gt;
Suggestion #2: ssh -v (verbose mode) is your friend!&lt;br /&gt;
&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;
I was trying to connect to &lt;a href="javascript:void(0);/*1237344355976*/"&gt;github&lt;/a&gt; for the first time with using public/private key access ealier, but it was rejecting my key. I was getting this when I tried to checkout some code:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="MARGIN-LEFT: 40px"&gt;&lt;span style="FONT-FAMILY: Courier New"&gt;Permission denied (publickey)&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
Great! So I tried the troubleshooting support webpages, and they suggested I test the connection through ssh. This gave me:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="MARGIN-LEFT: 40px"&gt;&lt;span style="FONT-FAMILY: Courier New"&gt;[gmalcolm ~]$ ssh git@github.com&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New"&gt;Permission denied (publickey).&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
Yep, I'm locked out! I checked through a few more support threads, lots of people getting similar issues, but nothing that really applied to me. Until I finally remembered to take advantage of ssh's verbose mode:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="MARGIN-LEFT: 40px"&gt;&lt;span style="FONT-FAMILY: Courier New"&gt;[gmalcolm ~]$ ssh git@github.com &lt;span style="FONT-WEIGHT: bold"&gt;-v&lt;/span&gt;&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New"&gt;OpenSSH_4.6p1, OpenSSL 0.9.8e 23 Feb 2007&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New"&gt;debug1: Connecting to github.com [65.74.177.129] port 22.&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New"&gt;debug1: Connection established.&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New"&gt;debug1: identity file /c/Documents and Settings/gmalcolm/.ssh/identity ty&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New"&gt;pe -1&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New"&gt;.&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New"&gt;.&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New"&gt;.&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New"&gt;debug1: Authentications that can continue: publickey&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New"&gt;debug1: Next authentication method: publickey&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New; FONT-WEIGHT: bold"&gt;debug1: Trying private key: /c/Documents and Settings/gmalcolm/.ssh/identity&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New"&gt;debug1: Trying private key: /c/Documents and Settings/gmalcolm/.ssh/id_rsa&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New"&gt;debug1: Trying private key: /c/Documents and Settings/gmalcolm/.ssh/id_dsa&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New"&gt;debug1: No more authentication methods to try.&lt;/span&gt;&lt;br style="FONT-FAMILY: Courier New" /&gt;
&lt;span style="FONT-FAMILY: Courier New"&gt;Permission denied (publickey).&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
And there was it was! Apparently ssh was not looking where I expected for the private key. It just boiled down to the fact Git Bash (which I'm not that familar with) was using a slightly different flavor of ssh to the one I normally use, and verbose mode showed me what that difference was.&lt;br /&gt; &lt;img src="http://gregmalcolm.com/aggbug/130173.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Greg Malcolm</dc:creator>
            <guid>http://gregmalcolm.com/archive/2009/03/17/2-random-unix-shell-tips.aspx</guid>
            <pubDate>Wed, 18 Mar 2009 03:40:36 GMT</pubDate>
            <wfw:comment>http://gregmalcolm.com/comments/130173.aspx</wfw:comment>
            <comments>http://gregmalcolm.com/archive/2009/03/17/2-random-unix-shell-tips.aspx#feedback</comments>
            <wfw:commentRss>http://gregmalcolm.com/comments/commentRss/130173.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>
