<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
    <title>brendan forster.com</title>
    <link>http://brendanforster.com/</link>
    <atom:link href="http://brendanforster.com/rss.xml" rel="self" type="application/rss+xml" />
    <description></description>
    <language>en-au</language>
    <pubDate>Thu, 23 Feb 2012 09:07:40 +1100</pubDate>
    <lastBuildDate>Thu, 23 Feb 2012 09:07:40 +1100</lastBuildDate>

    
    <item>
      <title>Introducing code52</title>
      <link>http://brendanforster.com/introducing-code52.html</link>
      <pubDate>Tue, 03 Jan 2012 21:30:00 +1100</pubDate>
      <author>shift.key@gmail.com (Brendan Forster)</author>
      <guid>http://brendanforster.com/introducing-code52.html</guid>
      <description>&lt;p&gt;Back from a self-imposed internet break (taking a phone which doesn't do 3G coverage and going rural is a good way to do this) and &lt;a href=&quot;http://twitter.com/aeoth&quot;&gt;Paul&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/tobin&quot;&gt;Tobin&lt;/a&gt; couldn't wait to kick off our new collaborative project.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;http://code52.org&quot;&gt;&lt;img class='right ' src='/img/posts/Code52/logo.png' width='' height='' alt='' title=''&gt;&lt;/a&gt;&lt;/center&gt;


&lt;br/&gt;


&lt;p&gt;There's a bit more of a blurb on &lt;a href=&quot;http://code52.org/about.html&quot;&gt;the website&lt;/a&gt; - its an idea we're still wrapping our heads around by using a bit of trial and error.&lt;/p&gt;

&lt;p&gt;We're already hard at work on our &lt;a href=&quot;http://code52.org/downmarker&quot;&gt;first project&lt;/a&gt; and we'd love to see people drop into the &lt;a href=&quot;http://jabbr.net/#/rooms/code52&quot;&gt;Jabbr room&lt;/a&gt; and get involved. Amd pf course, there's a &lt;a href=&quot;http://twitter.com/code_52&quot;&gt;Twitter account&lt;/a&gt; too to follow.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>2011 - Where did the time go?</title>
      <link>http://brendanforster.com/2011-recap.html</link>
      <pubDate>Tue, 20 Dec 2011 23:00:00 +1100</pubDate>
      <author>shift.key@gmail.com (Brendan Forster)</author>
      <guid>http://brendanforster.com/2011-recap.html</guid>
      <description>&lt;p&gt;&lt;article&gt;&lt;/p&gt;

&lt;p&gt;Three more days til Christmas. I intend to unplug completely from the internet from then until the end of the year (place a bet with your nearest bookie on the odds I'll crack before then) so I'm writing this now over a cold beer, wondering where the hell the year went - as well as the hot weather.&lt;/p&gt;

&lt;p&gt;&lt;img class='right ' src='/img/main/recap-lrg.jpg' width='600' height='400' alt='' title=''&gt;&lt;/p&gt;

&lt;p&gt;So where did 2011 go? Let's recap:&lt;/p&gt;

&lt;h2&gt;Perth&lt;/h2&gt;

&lt;p&gt;Work sent me over to Perth to work with a client between February and April. It was an interesting project, but the real fun was catching up with the developer community over beers (and they love their beer over in Perth). Particular shout outs to &lt;a href=&quot;http://twitter.com/jakeginnivan&quot;&gt;Jake Ginnivan&lt;/a&gt; (a &quot;brother from another mother&quot; according to someone who shall remain nameless) and &lt;a href=&quot;http://twitter.com/jtango18&quot;&gt;JT&lt;/a&gt; for making the non-work hours as &lt;a href=&quot;http://www.hulabulabar.com&quot;&gt;entertaining&lt;/a&gt; as humanly possible.&lt;/p&gt;

&lt;p&gt;I also managed to catch up with relatives over there over there (my cousin, her husband and three young kids live in Perth) and see some bands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://streetlightmanifesto.com/&quot;&gt;Streetlight Manifesto&lt;/a&gt; - two hours in the mosh pit is enought for any man. An item crossed off the bucket list.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://westcoastbluesnroots.com.au/&quot;&gt;West Coast Blues and Roots Festival&lt;/a&gt; - finally got to see Cat Empire live, and a bunch of other artists. Toots and the Maytals was an unexpected pleasure.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The only downside of my time in Perth was that my grandma passed away after having a stroke last year - it felt weird being away from the family when it all occurred, but I went back for the funeral to say my farewells.&lt;/p&gt;

&lt;h2&gt;NDC and Europe&lt;/h2&gt;

&lt;p&gt;While I was over in Perth, I was also madly planning my Europe trip. It coincided with &lt;a href=&quot;http://www.ndcoslo.com/&quot;&gt;NDC&lt;/a&gt; which was an amazing conference in itself.&lt;/p&gt;

&lt;p&gt;In no particular order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pre-drinks with Richard Campbell, Rob Conery, Shay Friedman and others (fairly certain I still owe Richard a Famous Grouse for something).&lt;/li&gt;
&lt;li&gt;three days jam packed with content - I can't recall another event where I'd have three or more sessions in the same timeslot I wanted to see.&lt;/li&gt;
&lt;li&gt;some great parties after the official one ;)&lt;/li&gt;
&lt;li&gt;hammocks to recover in after! (while mocking certain Brits on Twitter)&lt;/li&gt;
&lt;li&gt;an epic technical discussion over post-conference drinks with &lt;a href=&quot;http://twitter.com/kkzomic&quot;&gt;Krzysztof&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/philiplaureano&quot;&gt;Philip&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/gfraituer&quot;&gt;Gael&lt;/a&gt; (I tried to keep up but my brain had been melted over the previous days) before we all went our separate ways.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt; &lt;center&gt;&lt;img class='' src='/img/posts/recap/hammock.jpg' width='' height='' alt='' title=''&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;After the conference I headed up to Stavanger with Philip - it was a lot of fun to talk shop while hiking for a couple of hours to what is essentially &lt;a href=&quot;http://i.telegraph.co.uk/multimedia/archive/01359/Stavanger_1359940c.jpg&quot;&gt;a giant rock in the middle of nowhere&lt;/a&gt;. I was also invited to stay a few days with &lt;a href=&quot;http://twitter.com/thomasjo&quot;&gt;Thomas Johanson's&lt;/a&gt; family in rural Norway - which was capped off with a Norweigan BBQ and aquavit!&lt;/p&gt;

&lt;p&gt;After Norway, I spent a weekend in Copenhagen seeing the sights and ran into &lt;a href=&quot;http://umbraco.com/cg11&quot;&gt;some Umbraco guys doing whatever those Umbraco guys do&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then it was onward to Germany (a week of beer and sight-seeing) and France (a week of wine and beer and sight-seeing).&lt;/p&gt;

&lt;p&gt;Highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the quickest &lt;a href=&quot;/inotifypropertychanged-stop-the-madness.html&quot;&gt;blog post&lt;/a&gt; I've written (about 20 minutes), which still gets mentions in odd places&lt;/li&gt;
&lt;li&gt;having dinner and drinks with a group of Romanian retirees in Berlin. I didn't speak Romanian, they didn't speak English, but the staff were excellent mediators and fun was had by all.&lt;/li&gt;
&lt;li&gt;our pub crawl group being scolded by a German/French waiter in Hofbrauhaus Munich for being too loud with our chanting - &quot;Zis is not Oktoberfest!&quot;.&lt;/li&gt;
&lt;li&gt;visiting the Dachau concentration camp outside Munich and standing inside a gas chamber - an experience I still can't put into words.&lt;/li&gt;
&lt;li&gt;drinking the train's bar cart dry of beer with a gang of tourists when the train from Munich to Paris broke down at Metz for a few hours.&lt;/li&gt;
&lt;li&gt;wandering around Paris and accidentally finding Voltaire's tomb (as well as other famous French figures like Marie Curie) at the Pantheon.&lt;/li&gt;
&lt;/ul&gt;


&lt;center&gt;&lt;img class='' src='/img/posts/recap/voltaire.jpg' width='' height='' alt='' title=''&gt;&lt;/center&gt;




&lt;br /&gt;


&lt;h2&gt;BUILD and Los Angeles&lt;/h2&gt;

&lt;p&gt;Aside from unveiling the new version of Windows, and causing a collective conniption of the .NET community with their &lt;a href=&quot;http://dougseven.com/2011/09/15/a-bad-picture-is-worth-a-thousand-long-discussions/&quot;&gt;marketecture diagrams&lt;/a&gt;, it was an entertaining conference to chat with the guys behind the products. They'd been very quiet for a while, and were keen to talk to anyone at the conference who'd lend them an ear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ed:&lt;/strong&gt; &lt;em&gt;I'll come back to this discussion. I do want to fuel &lt;a href=&quot;http://twitter.com/MossyBlog&quot;&gt;someone's&lt;/a&gt; rage on the topic :)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On top of that there was Legoland - if I was ten years old, it would have been paradise. But I still enjoyed a bunch of things there - the Star Wars Lego was particularly good.&lt;/p&gt;

&lt;center&gt;&lt;img class='' src='/img/posts/recap/cantina.jpg' width='' height='' alt='' title=''&gt;&lt;/center&gt;




&lt;center&gt;The Cantina Bar from A Lost Hope (complete with animatronic band)&lt;/center&gt;




&lt;br /&gt;


&lt;p&gt;Ran into some Aussie friends who are now state-side, like &lt;a href=&quot;http://twitter.com/jthake&quot;&gt;Jeremy Thake&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/damianedwards&quot;&gt;Damian Edwards&lt;/a&gt; (again) and &lt;a href=&quot;http://twitter.com/will_robertson&quot;&gt;Will Robertson&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Community Stuff&lt;/h2&gt;

&lt;p&gt;I branched out into doing more presentations this year - not something deliberate, just opportunities crop up and I do enjoy jumping into the deep end:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dddMelbourne&lt;/strong&gt; - Ruby and .NET for fun and profit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Newcastle Coders Group&lt;/strong&gt; - XAML - past, present and future.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RDN Dev Day&lt;/strong&gt; - Practical Applications of the Modern Web&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ALT.NET Sydney&lt;/strong&gt; - Recap from BUILD&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows Phone 7 Workshops&lt;/strong&gt; (Sydney and Perth)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dddBrisbane&lt;/strong&gt; - Windows 8 - Who Moved My Cheese?&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;What's next for 2012?&lt;/h2&gt;

&lt;p&gt;Can I have a good nap and get back to you on that?&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;&lt;/p&gt;

&lt;div style=&quot;margin-top: 50px&quot;&gt;
&lt;em&gt;Image: http://www.flickr.com/photos/opethpainter/2866967426/&lt;/em&gt;
&lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>ALT.NET Open Spaces Recap</title>
      <link>http://brendanforster.com/alt-net-open-spaces-2011.html</link>
      <pubDate>Sat, 03 Dec 2011 19:00:00 +1100</pubDate>
      <author>shift.key@gmail.com (Brendan Forster)</author>
      <guid>http://brendanforster.com/alt-net-open-spaces-2011.html</guid>
      <description>&lt;p&gt;I flew down to Melbourne this weekend to catch up with the locals and talk about various topics around the .NET space. Here's the abridged recap - each session was scheduled for about 30 minutes and we (mostly) stuck to the schedule during the day.&lt;/p&gt;

&lt;p&gt;Disclaimer: I was sleep deprived and recovering from a party the night before. I may be recalling things differently to how they actually happened. Hell, I'm fairly certain I have the sessions listed out of order.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;There's supposed to be a photo here, but the only one I found (that's right, I didn't bother to take photos myself) was on lockerz.com, which seems to be a site that wants your Facebook details in exchange for something called &quot;grab it&quot;. I'm not even going to link to it, that's how disappointed I am...&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;User Groups&lt;/h3&gt;

&lt;p&gt;We started off the day with a discussion on how everyone perceived the user groups they attend - what works, how to grow a user group, discussions and war stories and whatnot. A lot of good ideas came out of this, which will hopefully materialies in the new year.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We had tacked on a session for talking about open source, but that seemed to have fallen through the cracks when the discussion for user groups went on longer than expected. Sadface.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;Code Dojo&lt;/h3&gt;

&lt;p&gt;As a follow up of the ALT.NET code dojo recently, the group discussed &lt;a href=&quot;http://codekata.pragprog.com/2007/01/kata_fourteen_t.html&quot;&gt;this kata&lt;/a&gt; and how to solve the problem. Unfortunately things got sidetracked (I was most annoyed I hadn't heard about this 'trigram' concept before) and we didn't get to demonstrate a good TDD design before the session expired. But it was still an entertaining discussion on how to tackle a problem, even if we didn't agree on much.&lt;/p&gt;

&lt;h3&gt;New Frontiers&lt;/h3&gt;

&lt;p&gt;After a quick break, we discussed how languages outside the .NET ecosystem have impacted on .NET and what might be coming down the pipe. A few takeaways from the discussion - some people wanted more concepts to be brought into C#, while others were feeling that the &quot;one language to rule them all&quot; didn't feel right.&lt;/p&gt;

&lt;h3&gt;Refactoring&lt;/h3&gt;

&lt;p&gt;I teamed up with &lt;a href=&quot;http://twitter.com/rbanks54&quot;&gt;Richard&lt;/a&gt; to talk about refactoring existing code, R# tips and tricks, and Richard shouting at me to &quot;no no, go down, not up&quot; when navigating some sample code from ages ago. Was fun.&lt;/p&gt;

&lt;h3&gt;RAD Frameworks&lt;/h3&gt;

&lt;p&gt;And here's where things got entertaining. What started out as a discussion of tools and libraries to simplify building apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First things first:&lt;/strong&gt; as soon as 'RAD' was mentioned, it was a red rag to much of the audience. It wasn't the intent, but all attempts to refocus the discussion failed miserably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Secondly:&lt;/strong&gt; I was fascinated by the number of people who were anti-third party libraries for their UIs. They preferred to roll their own, but I didn't push the discussion into why. Perhaps this is my background in client apps clouding my perceptions...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lastly:&lt;/strong&gt; data access. Oh man, I'm sick to death of this discussion. There's so many choices that whenever someone asks why I'm not using XYZ I have to physically force myself to listen. Can we move on as a society?&lt;/p&gt;

&lt;h3&gt;&quot;What if this is as good as it gets?&quot;&lt;/h3&gt;

&lt;p&gt;This was a neat discussion about how someone might go about staying in a technical career with software development and avoid the whole &quot;management&quot; position in the hierarchy. Of course, he was currently doing Sharepoint, so that was noted and made fun of.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A few dedicated souls continued on this thread of discussion at the pub after and came to a concensus that there was a correlation between architect-style roles and a conservative approach to new technologies. We had a number of ideas around how to bridge this gap, but its always been a tricky challenge in my experiences when working with clients.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;Code Coverage and Analysis&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://twitter.com/scubamunki&quot;&gt;Shaun&lt;/a&gt; discussed some of his work with code coverage tools and some gotchas with the code. This was the first time I'd heard of OpenCover (&lt;em&gt;audible gasp&lt;/em&gt;), an OSS project he works on, and it was awesome to catch up with him after and have my brain melted by another IL junkie :)&lt;/p&gt;

&lt;h3&gt;Agile Discussion&lt;/h3&gt;

&lt;p&gt;This was the point where I ran out of steam - 4:30am starts will do that to a guy. We discussed how agile projects manage the relationships with stakeholders, &lt;em&gt;scene missing&lt;/em&gt; and something about estimation?&lt;/p&gt;

&lt;p&gt;Anyway, as we wrapped up at about 3ish a few of the group headed to the pub up the road for further discussion. I'd worked in Melbourne last year, so it was great to catch up with the locals again and talk shop.&lt;/p&gt;

&lt;h3&gt;Wrapup&lt;/h3&gt;

&lt;p&gt;Big thanks to &lt;a href=&quot;http://twitter.com/pjimmy&quot;&gt;@pjimmy&lt;/a&gt; for organising the event and to &lt;a href=&quot;http://twitter.com/rbanks54&quot;&gt;Richard&lt;/a&gt; for helping with herding cats in the morning. It was a great event, and hopefully it'll be back bigger and better next year - there's rumours abound about a Sydney event next year.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>jQuery and KnockoutJS in Win8? Sure, why not!</title>
      <link>http://brendanforster.com/jquery-knockout-win8.html</link>
      <pubDate>Wed, 26 Oct 2011 00:00:00 +1100</pubDate>
      <author>shift.key@gmail.com (Brendan Forster)</author>
      <guid>http://brendanforster.com/jquery-knockout-win8.html</guid>
      <description>&lt;p&gt;Apparently this is old news to some. Trendsetters...&lt;/p&gt;

&lt;p&gt;With Windows 8 supporting HTML/JS (I refuse to call anything HTML5 these days - the words have lost all meaning to me, but that's another topic) applications, I was asked if &lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt; is supported - with a goal to making JS applications more maintainable.&lt;/p&gt;

&lt;p&gt;As I'd heard it mentioned at BUILD - and hadn't heard a major drama since people have been using the Developer Preview bits - I expected that it worked. However, to confirm this for myself, I found this &lt;a href=&quot;http://social.msdn.microsoft.com/Forums/en-US/winappswithhtml5/thread/66273417-92cd-4a35-b9a1-281d962eff59&quot;&gt;forum thread&lt;/a&gt; on MSDN with a couple of caveats.&lt;/p&gt;

&lt;p&gt;No fire and brimstone? Oh well, I'll just double-check...&lt;/p&gt;

&lt;p&gt;After adding the jQuery file to the project, I modified the &lt;strong&gt;default.html&lt;/strong&gt; file to include the jQuery file &lt;strong&gt;before&lt;/strong&gt; the default.js file. The default.js file contains the bootstrapping code for the application:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;   &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;/css/default.css&quot; /&amp;gt;
    &lt;strong&gt;&amp;lt;script src=&quot;/js/jquery-1.6.4.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/strong&gt;
    &amp;lt;script src=&quot;/js/default.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;

&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;And at the bottom of the default.js file, I use a simple selector to find a DOM element:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;            // other code

            WinJS.UI.process(&lt;strong&gt;$('#appbar')[0]&lt;/strong&gt;)
                .then(function () { 
                    &lt;strong&gt;$('#home').click(navigateHome);&lt;/strong&gt;
                });

            WinJS.Navigation.navigate(homePage);

            &lt;strong&gt;var host = $('#contentHost');&lt;/strong&gt;
        }
    }

    WinJS.Navigation.addEventListener('navigated', navigated);
    WinJS.Application.start();

})();
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;and started making use of selectors elsewhere instead of document.getElementById to make the code more concise...&lt;/p&gt;

&lt;h2&gt;And what of KnockoutJS?&lt;/h2&gt;

&lt;p&gt;I've only had basic experience with &lt;a href=&quot;http://knockoutjs.com/&quot;&gt;Knockout&lt;/a&gt;, but found an easier scenario to support. I dropped in the code and modified the detailPage template.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;   &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;/css/default.css&quot; /&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;/css/detailPage.css&quot; /&amp;gt;
    &amp;lt;script type=&quot;ms-deferred/javascript&quot; src=&quot;/js/detailPage.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &lt;strong&gt;&amp;lt;script type=&quot;ms-deferred/javascript&quot; src=&quot;/js/knockout-1.2.1.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/strong&gt;
&amp;lt;/head&amp;gt;

&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;And then went to work making changes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In detailPage.js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Before&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function fragmentLoad(elements, options) {
    var item = options &amp;amp;&amp;amp; options.item ? options.item : getItem();
    elements.querySelector('.pageTitle').textContent = item.group.title;

    WinJS.UI.processAll(elements)
        .then(function () {
            elements.querySelector('.title').textContent = item.title;
            elements.querySelector('.content').innerHTML = item.content;
        });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;After&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function fragmentLoad(elements, options) {
    var item = options &amp;amp;&amp;amp; options.item ? options.item : getItem();
    WinJS.UI.processAll(elements).then(function () { &lt;strong&gt;ko.applyBindings(item);&lt;/strong&gt; });
}
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;In detailPage.html - declared some bindings using the data-bind attribute&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;detailPage fragment&quot;&amp;gt;
    &amp;lt;header role=&quot;banner&quot; aria-label=&quot;Header content&quot;&amp;gt;
        &amp;lt;button disabled class=&quot;win-backbutton&quot; aria-label=&quot;Back&quot;&amp;gt;&amp;lt;/button&amp;gt;
        &amp;lt;div class=&quot;titleArea&quot;&amp;gt;
            &amp;lt;h1 class=&quot;pageTitle win-title&quot; &lt;strong&gt;data-bind=&quot;text: group.title&quot;&lt;/strong&gt;&amp;gt;&amp;lt;/h1&amp;gt;

        &amp;lt;/div&amp;gt;
    &amp;lt;/header&amp;gt;
    &amp;lt;section role=&quot;main&quot; aria-label=&quot;Main content&quot;&amp;gt;
        &amp;lt;article&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;header&amp;gt;

                    &amp;lt;h1 class=&quot;title win-contentTitle&quot; &lt;strong&gt;data-bind=&quot;text: title&quot;&lt;/strong&gt;&amp;gt;&amp;lt;/h1&amp;gt;
                &amp;lt;/header&amp;gt;
                &amp;lt;div class=&quot;image&quot; &lt;strong&gt;data-bind=&quot;style: { color: backgroundColor }&quot;&lt;/strong&gt;&amp;gt;&amp;lt;/div&amp;gt;
                &amp;lt;div class=&quot;content&quot; &lt;strong&gt;data-bind=&quot;html: content&quot;&lt;/strong&gt;&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;

        &amp;lt;/article&amp;gt;
    &amp;lt;/section&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;So by moving the binding expressions to the UI (like the MVVM pattern that is popular with XAML application) we can lean on frameworks to make our Javascript code easier to maintain. Other components of the default templates have their own binding attributes - &lt;em&gt;data-win-bind&lt;/em&gt; - which I'll explain later, but I find the KnockoutJS syntax more concise.&lt;/p&gt;

&lt;p&gt;In particular the use of &lt;em&gt;textContent&lt;/em&gt; instead of &lt;em&gt;text&lt;/em&gt; to denote a text value? Why? Drop the 'Content' part unless there's a real good reason - it feels like ceremony.&lt;/p&gt;

&lt;p&gt;I'll formulate some more opinions on the WinJS side as I delve deeper....&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I'm speaking at DDD Brisbane</title>
      <link>http://brendanforster.com/ddd-brisbane.html</link>
      <pubDate>Sun, 23 Oct 2011 00:00:00 +1100</pubDate>
      <author>shift.key@gmail.com (Brendan Forster)</author>
      <guid>http://brendanforster.com/ddd-brisbane.html</guid>
      <description>&lt;p&gt;&lt;img src='/img/main/metro-preview.png' width='400' height='300' alt='' title='' style='float: right;margin-left: 1.5em;'&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;http://dddbrisbane.com&quot;&gt;dddBrisbane&lt;/a&gt; organisers sent out a call over the weekend to finalise the schedule - some very cool talks that I'm looking forward to seeing (look for the schedule to appear early this week).&lt;/p&gt;

&lt;p&gt;I'm especially honoured to see my session was picked - especially after seeing the depth of Windows 8 talks submitted.&lt;/p&gt;

&lt;p&gt;So what am I talking about?&lt;/p&gt;

&lt;h2&gt;Windows 8 - Who Moved My Cheese?&lt;/h2&gt;

&lt;p&gt;The slides are available on &lt;a href=&quot;http://ddd-windows8.heroku.com&quot;&gt;Heroku&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The source code for the slides are available on &lt;a href=&quot;http://github.com/shiftkey/dddbrisbane&quot;&gt;Github&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Doing the build server dance with NuGet</title>
      <link>http://brendanforster.com/doing-the-build-server-dance-with-nuget.html</link>
      <pubDate>Fri, 08 Jul 2011 14:00:00 +1000</pubDate>
      <author>shift.key@gmail.com (Brendan Forster)</author>
      <guid>http://brendanforster.com/doing-the-build-server-dance-with-nuget.html</guid>
      <description>&lt;p&gt;I started exploring NuGet package building yesterday evening, as a strategy for managing dependencies between projects I'm involved with.&lt;/p&gt;

&lt;p&gt;And with NuGet in the enterprise being the &lt;a href=&quot;http://www.hanselman.com/blog/NuGetForTheEnterpriseNuGetInAContinuousIntegrationAutomatedBuildSystem.aspx&quot;&gt;upcoming hotness&lt;/a&gt;, I thought I'd see how I could get companies I work with to start doing similar things with their internal projects. It was much easier than I'd expected, with a couple of hurdles.&lt;/p&gt;

&lt;h2&gt;The Goal&lt;/h2&gt;

&lt;p&gt;I have two projects, A and B. A has no upstream dependencies (that have NuGet packages, anyway), but B requires A.&lt;/p&gt;

&lt;p&gt;So, after A builds and passes its tests, I want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a new package for A, using it's build number.&lt;/li&gt;
&lt;li&gt;Publish the package for A somewhere&lt;/li&gt;
&lt;li&gt;Trigger a new build for B, using the newest version of A.&lt;/li&gt;
&lt;li&gt;Verify B builds and passes tests.&lt;/li&gt;
&lt;li&gt;Create a new package for B, using it's build number.&lt;/li&gt;
&lt;li&gt;Publish the package for B somewhere.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;After a couple of hours work, I'm 95% of the way there.&lt;/p&gt;

&lt;h2&gt;Defining the package specification&lt;/h2&gt;

&lt;p&gt;As I wasn't really familiar with the process of creating the .nuspec file (sorry &lt;a href=&quot;http://twitter.com/damianedwards&quot;&gt;Damo&lt;/a&gt;, your NDC talk was a long time ago :)) I decided to go and craft it by hand. I used this &lt;a href=&quot;http://lostechies.com/joshuaflanagan/2011/06/23/tips-for-building-nuget-packages/&quot;&gt;blog post&lt;/a&gt; by &lt;a href=&quot;http://twitter.com/jflanagan&quot;&gt;Joshua Flanagan&lt;/a&gt; (including a good reference &lt;a href=&quot;https://github.com/DarthFubuMVC/bottles/blob/6d82e063fd889ac1909c98adc369a97b4c1e377e/packaging/nuget/bottles.nuspec&quot;&gt;nuspec file&lt;/a&gt;) to get started.&lt;/p&gt;

&lt;p&gt;And that's about it. Put that into my build folder along with the NuGet.exe - I grabbed the latest one from the 1.4 OOB build on &lt;a href=&quot;http://ci.nuget.org:8080/&quot;&gt;NuGet CI server&lt;/a&gt; due to an issue with how it parses the &amp;lt;files&amp;gt; element. This should be part of the next release.&lt;/p&gt;

&lt;h2&gt;Building the package on the server&lt;/h2&gt;

&lt;p&gt;So, I'm using TeamCity to build the project. Thus, I can use the build number directly against the NuGet package.&lt;/p&gt;

&lt;p&gt;NOTE: Using the default value TeamCity provides for a project, which is just an incrementing integer, will fail with a &quot;Version string portion was too short or too long&quot; error. To fix that, go to General Settings and make it something more descriptive:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;img/posts/NuGet/BuildNumber.png&quot; alt=&quot;General Settings&quot; /&gt;&lt;/p&gt;

&lt;p&gt;With that in place, the next step is to add in a post-build step:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/img/posts/NuGet/PackageStep.png&quot;&gt;&lt;img src=&quot;/img/posts/NuGet/PackageStep-Small.png&quot; alt=&quot;Post Build Step&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;The script I've used (duplicated for two different packages):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;del *.nupkg

.\NuGet.exe pack Package.nuspec -Version %system.build.number%
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That script is courtesy of Scott Kirkland, who also has a decent guide to using NuGet on TC &lt;a href=&quot;http://weblogs.asp.net/srkirkland/archive/2011/03/29/deploy-nuget-packages-during-ci-build-with-teamcity.aspx&quot;&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Publishing the package&lt;/h2&gt;

&lt;p&gt;I didn't want to publish these packages to the NuGet gallery immediately, so what other options do I have? I could set up my own NuGet gallery. Or I could use &lt;a href=&quot;http://www.myget.org/&quot;&gt;MyGet&lt;/a&gt; and skip all the hassle.&lt;/p&gt;

&lt;p&gt;For those who aren't familiar with MyGet, its a service to create custom NuGet feeds. All I've done so far is create a private feed (which anyone can consume) and obtained an API key.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;img/posts/NuGet/myget.png&quot;&gt;&lt;img src=&quot;img/posts/NuGet/myget-small.png&quot; alt=&quot;Post Build Step&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;While MyGet supports the ability to upload or create packages within the admin UI, I was feeling lazy and wanted to push packages from the build server.&lt;/p&gt;

&lt;p&gt;This required an additional line in the script:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;del *.nupkg

.\NuGet.exe pack Package.nuspec -Version %system.build.number%

forfiles /m *.nupkg /c &quot;cmd /c NuGet.exe push @FILE &amp;lt;your-key&amp;gt; -Source https://www.myget.org/F/mahapps/&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;which will find all .nupkg files and invoke &lt;em&gt;push&lt;/em&gt; against the specific repository - in this case, my private feed.&lt;/p&gt;

&lt;h2&gt;Trigger a new build&lt;/h2&gt;

&lt;p&gt;This isn't directly related to NuGet, but I wanted to force a new build when upstream packages change in TeamCity.&lt;/p&gt;

&lt;p&gt;Under Build Triggering in the Project Configuration, add a trigger for &quot;Finish Build&quot; and select the upstream project.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;img/posts/NuGet/buildtriggering.png&quot;&gt;&lt;img src=&quot;img/posts/NuGet/buildtriggering-small.png&quot; alt=&quot;Add Build Trigger&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;Update the package for A and test&lt;/h2&gt;

&lt;p&gt;Right, this is where things get rough.&lt;/p&gt;

&lt;p&gt;I added a step before building the project, and executed this command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.\Nuget.exe update ..\MahApps.Twitter.sln -Source http://www.myget.org/f/mahapps
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;which will look through all the projects in my solution and update to the newest packages it can find. I've added in my MyGet feed URL to grab the latest packages from the specific feed.&lt;/p&gt;

&lt;p&gt;And this works. Kinda.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;img/posts/NuGet/updatescripts.png&quot;&gt;&lt;img src=&quot;img/posts/NuGet/updatescripts-small.png&quot; alt=&quot;Success?&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;It updates my projects, but doesn't store updated packages locally.
Which causes my build to break.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;img/posts/NuGet/compileerrors.png&quot;&gt;&lt;img src=&quot;img/posts/NuGet/compileerrors-small.png&quot; alt=&quot;Oops&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Scouring the forums produced &lt;a href=&quot;http://nuget.codeplex.com/discussions/264082&quot;&gt;this discussion&lt;/a&gt; on this issue, which recommended this workaround:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nuget install MyProj\packages.config -o packages
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: a minor grievance with the &lt;em&gt;install&lt;/em&gt; command. Unlike the &lt;em&gt;update&lt;/em&gt; command, this works against a project's repository. This seems subpar, when I can call &lt;em&gt;update&lt;/em&gt; against a solution file. Can we get some consistency with this? Or have I missed something with how install behaves?&lt;/p&gt;

&lt;p&gt;Fine, not all workarounds are pretty.&lt;/p&gt;

&lt;p&gt;Let's modify my script to suit:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.\Nuget.exe update ..\MahApps.Twitter.sln -Source http://www.myget.org/f/mahapps -Source https://go.microsoft.com/fwlink/?LinkID=206669 -o ..\packages

.\Nuget.exe install ..\src\Identica\packages.config -Source http://www.myget.org/f/mahapps -Source https://go.microsoft.com/fwlink/?LinkID=206669 -o ..\packages

.\Nuget.exe install ..\src\NET4\packages.config -Source http://www.myget.org/f/mahapps -Source https://go.microsoft.com/fwlink/?LinkID=206669 -o ..\packages

.\Nuget.exe install ..\src\Tests\packages.config -Source http://www.myget.org/f/mahapps -Source https://go.microsoft.com/fwlink/?LinkID=206669 -o ..\packages

.\Nuget.exe install ..\src\WP7\packages.config -Source http://www.myget.org/f/mahapps -Source https://go.microsoft.com/fwlink/?LinkID=206669 -o ..\packages
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Icky. Whatever, I've got awesome to do.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;https://go.microsoft.com/fwlink/?LinkID=206669&lt;/em&gt; is the path to the official NuGet feed (the build server couldn't find some packages), and it is explicitly after my local feed (I may have some custom packages which I prefer). And I've added the &quot;-o&quot; parameter to point to the default packages location, just in case.&lt;/p&gt;

&lt;p&gt;Aaaaand...&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;img/posts/NuGet/installedpackages.png&quot;&gt;&lt;img src=&quot;img/posts/NuGet/installedpackages-small.png&quot; alt=&quot;Success!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Booyah!&lt;/p&gt;

&lt;h2&gt;TODO&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;submit patch for making update more &quot;correct&quot; ?&lt;/li&gt;
&lt;li&gt;demonstrate how to add to VS tooling and how it changes dev story&lt;/li&gt;
&lt;li&gt;some documentation on managing upstream dependencies&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    
    <item>
      <title>Soapbox: INotifyPropertyChanged - Stop the Madness</title>
      <link>http://brendanforster.com/inotifypropertychanged-stop-the-madness.html</link>
      <pubDate>Sat, 18 Jun 2011 14:00:00 +1000</pubDate>
      <author>shift.key@gmail.com (Brendan Forster)</author>
      <guid>http://brendanforster.com/inotifypropertychanged-stop-the-madness.html</guid>
      <description>&lt;p&gt;Its time to stop with this madness.&lt;/p&gt;

&lt;p&gt;Apologies again to &lt;a href=&quot;http://twitter.com/kiwipom&quot;&gt;Ian&lt;/a&gt; as I picked on him unnecessarily when I read yet another &quot;Let's make OnPropertyChanged compile safe&quot; &lt;a href=&quot;http://xaml.geek.nz/binding/5&quot;&gt;blog post&lt;/a&gt; yesterday.&lt;/p&gt;

&lt;p&gt;I don't have an issue with the approach, but I had an issue with the bigger picture - how little had changed for XAML developers in this regard. Keep in mind that lambdas were first made available in C# 3.0 - which itself was made available in 2007, with .NET 3.5.&lt;/p&gt;

&lt;p&gt;I've been summoned into this debate &lt;a href=&quot;http://www.mail-archive.com/ozdotnet@ozdotnet.com/msg03903.html&quot;&gt;before&lt;/a&gt; (and was assumed to be a &quot;cool kid&quot;) so I thought I'd put down some thoughts on the issue, and what I think needs to change:&lt;/p&gt;

&lt;h2&gt;Stop writing plumbing code&lt;/h2&gt;

&lt;p&gt;Every time you write logic in the setter of a property, an angel disappoints her family by taking up stripping.&lt;/p&gt;

&lt;p&gt;There have been compelling reasons to do so. After dealing with the resulting pain, I've explored other options to take all those needs away. So let's break it down:&lt;/p&gt;

&lt;p&gt;To start off with the &lt;em&gt;worst&lt;/em&gt; case scenario, we have:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;private string _someProperty;
public string SomeProperty
{
    get { return _someProperty; }
    set 
    { 
        _someProperty = value;
        OnPropertyChanged(&quot;SomeProperty&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Make it refactor-friendly - let's use a lambda instead!&lt;/h3&gt;

&lt;p&gt;Yes, this is better than magic strings - that's about it. Don't you get that sinking feeling when adding a new property to the viewmodel, and the code inside the setter looks almost identical to all the others?&lt;/p&gt;

&lt;p&gt;So let's change the property to look like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;private string _someProperty;
public string SomeProperty
{
    get { return _someProperty; }
    set 
    { 
        _someProperty = value;
        OnPropertyChanged(() =&amp;gt; SomeProperty);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For an example implementation that accepts lambda statements, &lt;a href=&quot;http://stackoverflow.com/questions/141370/inotifypropertychanged-property-name-hardcode-vs-reflection/1209104#1209104&quot;&gt;this Stackoverflow answer&lt;/a&gt; is a good starting point.&lt;/p&gt;

&lt;h3&gt;I only want to raise the change when the backing value actually changes!&lt;/h3&gt;

&lt;p&gt;&quot;Wait,&quot; the audience exlaims in shock, &quot;you're going to raise the event each time now.&quot; The author relents, and adds some code to end the pain for the audience:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;private string _someProperty;
public string SomeProperty
{
    get { return _someProperty; }
    set 
    { 
        if (_someProperty == value)
            return;

        _someProperty = value;
        OnPropertyChanged(() =&amp;gt; SomeProperty);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I'd better ensure this is defined in all the setters, and that the right backing field is used in each case. I'd look pretty silly if I'd used the wrong field, like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// elsewhere in the codebase
private string _someOtherProperty;

// ...

private string _someProperty;
public string SomeProperty
{
    get { return _someProperty; }
    set 
    { 
        if (_someOtherProperty == value)
            return;

        _someProperty = value;
        OnPropertyChanged(() =&amp;gt; SomeProperty);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;so I'd better do it real carefully...&lt;/p&gt;

&lt;h3&gt;We need caching now!&lt;/h3&gt;

&lt;p&gt;Really? That's what comes to mind next? You crazy developers.&lt;/p&gt;

&lt;p&gt;Fine, let's add a dictionary to capture the event arguments, instead of recreating them each time (adapted from this &lt;a href=&quot;http://www.paulstovell.com/strong-property-names&quot;&gt;blog post&lt;/a&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public class ViewModelBase
{
    protected void OnPropertyChanged(Expression&amp;lt;Func&amp;lt;object&amp;gt;&amp;gt; lambda)
    {
        // Go read Paul (and especially Miguel's comment) about this [here][6]. I'll wait...
    }

    private IDictionary&amp;lt;string, PropertyChangedEventArgs&amp;gt; _handlers = new Dictionary&amp;lt;string, PropertyChangedEventArgs&amp;gt;      

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventArgs args;

        if (!_handlers.ContainsKey(propertyName))
        {
            _handlers.Add(propertyName, new PropertyChangedEventArgs(propertyName));
        }

        args = _handlers[propertyName];

        PropertyChanged(this, args);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Have we saved much? Perhaps. Perhaps not...&lt;/p&gt;

&lt;h3&gt;Wait, what about cross-thread issues? I do a lot on the background thread!&lt;/h3&gt;

&lt;p&gt;Ah yes. Have you ever been bitten by this one - a background thread updates a property, which triggers the PropertyChanged event, which asplodes because the UI can only be updated from the main thread?&lt;/p&gt;

&lt;h2&gt;Stop. Put down the keyboard for a minute.&lt;/h2&gt;

&lt;p&gt;See how quickly all these features around INotifyPropertyChanged can spiral out of control? You've worked out the code and classes necessary to solve a common problem, but some overhead remains for writing boilerplate code everywhere the solution is required. And while it is a manual process, it is prone to human error.&lt;/p&gt;

&lt;p&gt;Go back and read that last sentence again. Did something click about what you've been doing all along with INotifyPropertyChanged?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/posts/Achievement.jpg&quot; alt=&quot;Huzzah!&quot; /&gt;&lt;/p&gt;

&lt;h2&gt;A what?&lt;/h2&gt;

&lt;p&gt;INotifyPropertyChanged is a very specialised example of a cross-cutting concern.&lt;/p&gt;

&lt;p&gt;We use INotifyPropertyChanged in many places when doing XAML-based applications - as it is critical when databinding POCO objects without requiring the use of DependencyProperty instances. Although we spent a lot of time optimising the behaviour of invoking INotifyPropertyChanged, we didn't improve &lt;strong&gt;how&lt;/strong&gt; this code is used - we're still copying-and-pasting the same code around, and having to make manual changes to each instance to suit the property.&lt;/p&gt;

&lt;p&gt;We need the ability to apply the INotifyPropertyChanged behaviour in an automatic way. Of course, there are various tradeoffs to consider - which I'll outline from my experiences.&lt;/p&gt;

&lt;h2&gt;What Next?&lt;/h2&gt;

&lt;p&gt;I need to wrap this post up before it becomes even longer, so until my next post - where I'll discuss how AOP flips all this discussion on its ear - readers can get ahead by reading these links:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sacha Barber - &lt;a href=&quot;http://www.codeproject.com/KB/library/Aspects.aspx&quot;&gt;Aspect Examples (INotifyPropertyChanged via Aspects)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://twitter.com/philiplaureano&quot;&gt;Philip Laureano&lt;/a&gt; linked me this yesterday. A large read, but lots of demo code for people who want to see something more concrete.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://code.google.com/p/notifypropertyweaver/&quot;&gt;NotifyPropertyWeaver&lt;/a&gt; - a .NET library for weaving INotifyPropertyChanged code into IL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is my library of choice for automating INotifyPropertyChanged usage. I definitely owe &lt;a href=&quot;http://twitter.com/simoncropp&quot;&gt;Simon&lt;/a&gt; a beer (or drink of choice) next time we cross paths - its been a joy to use.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On the Windows 8 Preview Video</title>
      <link>http://brendanforster.com/on-the-windows-8-preview.html</link>
      <pubDate>Wed, 08 Jun 2011 14:00:00 +1000</pubDate>
      <author>shift.key@gmail.com (Brendan Forster)</author>
      <guid>http://brendanforster.com/on-the-windows-8-preview.html</guid>
      <description>&lt;p&gt;For those who haven't seen it, this video was announced last week about how the Windows 8 UI is changing: &lt;a href=&quot;http://www.youtube.com/watch?v=p92QfWOw88I&quot;&gt;http://www.youtube.com/watch?v=p92QfWOw88I&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was the trigger for significant backlash - and not for what was said, but for what wasn't said around the other options available for building Windows applications.&lt;/p&gt;

&lt;h2&gt;Yes, MSFT could have handled it better&lt;/h2&gt;

&lt;p&gt;Since the video dropped, developers and possibly everyone with a blog has been raising concerns about the other options available to developers for building Windows apps. The underlying vibe has been &quot;everything else has been abandoned, the only option is now HTML5, the sky is falling and I have nothing to wear&quot;. I haven't watched the Sinofsky video (if it was even recorded), but when you see reporting like:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&quot;The development platform is based on HTML5 and JavaScript.&quot; &lt;a href=&quot;http://news.cnet.com/8301-31021_3-20068119-260/sinofsky-shows-off-windows-8-at-d9/&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;and constrast with a different source:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&quot;Windows 8 essentially supports two kinds of applications. One is the classic Windows application, which runs in a desktop very similar to the Windows 7 desktop.&quot; &lt;a href=&quot;http://allthingsd.com/20110601/exclusive-making-sense-of-what-we-just-learned-about-windows-8/&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;then you know something got lost in the message.&lt;/p&gt;

&lt;h2&gt;The sky is falling for &lt;em&gt;insert technology here&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://forums.silverlight.net/forums/t/230502.aspx&quot;&gt;That thread&lt;/a&gt;. Oh dear $deity, &lt;a href=&quot;http://forums.silverlight.net/forums/p/230725/563975.aspx&quot;&gt;that thread&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I appreciate that the MSFT guys &quot;in the field&quot; are stuck between a rock and a hard place currently - they cannot provide details to answer people's concerns or questions, but are dealing with a large backlash due to the large amount that is not know currently.&lt;/p&gt;

&lt;p&gt;As one of those in the audience who has to wait, in uncertainty, between now and &lt;a href=&quot;http://www.buildwindows.com/&quot;&gt;BUILD&lt;/a&gt; to have these questions answered, I wish they would rethink this decision and respond to questions and help change the course of discussion.&lt;/p&gt;

&lt;p&gt;While the video does mention:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&quot;Windows 8 also runs the existing Windows apps that you know and that you love&quot;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;it then follows up with running Excel.&lt;/p&gt;

&lt;p&gt;Yep. Excel.&lt;/p&gt;

&lt;p&gt;While an Excel demo is a good indicator of the backwards compatibility that Windows is famous for, it was a jarring change from the rest of the video, and I'm not sure it was the best application to demonstrate.&lt;/p&gt;

&lt;p&gt;Perhaps the developer story is not ready to show. Perhaps it was supposed to be about the shell, and HTML5 was only mentioned in passing. Perhaps, perhaps, perhaps. I suspect a demonstration of how a WPF/SL/Winforms/native application &lt;strong&gt;could&lt;/strong&gt; look/feel/behave within the new shell would provide some information without giving much away.&lt;/p&gt;

&lt;p&gt;The video was about creating interest in the new platform and discussing the opportunities it provides. Now is the time to talk more broadly, while everyone is talking about it.&lt;/p&gt;

&lt;p&gt;So instead of &lt;a href=&quot;http://forums.silverlight.net/forums/t/230744.aspx&quot;&gt;drumming up more drama&lt;/a&gt;, I thought I'd share some takeaways for both sides on this:&lt;/p&gt;

&lt;h2&gt;Devs: pay attention to the user experience&lt;/h2&gt;

&lt;p&gt;I hope developers took away from this story how the user experience of applications has changed, and how the classic WIMP (Windows, Icons, Menu, Pointer) applications will be impacted. Much like the transition from Windows Mobile 6.5 to Windows Phone 7, I anticipate some growing pains once developers get their hands on the development tools.&lt;/p&gt;

&lt;p&gt;Touch input is also something that many Windows developers may not be familiar with. While it has been available to native developers since Windows 7 launched, and was added to WPF and Silverlight with subsequent product releases, it hasn't really been utilized to anywhere near its full potential.&lt;/p&gt;

&lt;p&gt;Get familiar with how gestures work - as a starting point, the WP7 emulator turns mouse inputs into touch inputs. Touch will be mandatory if you want an application to be usable on different form factors (Windows 8 is taking an iOS-ish route with the same codebase running on desktops, tablets and devices).&lt;/p&gt;

&lt;h2&gt;MSFT: don't let the echo chamber continue&lt;/h2&gt;

&lt;p&gt;I'm still baffled by the decision to stonewall. Developers are customers, and they have questions. Why not be pro-active and help smooth the transition over the coming months?&lt;/p&gt;

&lt;p&gt;With all the strong and passionate opinions flying around, wouldn't it be good to plant some seeds of confidence and turn the conversation from &quot;Where is XYZ?&quot; to &quot;What can I do with Windows 8 using XYZ?&quot;&lt;/p&gt;

&lt;p&gt;Give the community a baseline of information so they can start planning and start providing feedback. It doesn't have to be revealing all the cards, but the developer story for Windows 8 is (mostly) unknown currently. That's why people are concerned.&lt;/p&gt;

&lt;h2&gt;MSFT: don't forget the hardware&lt;/h2&gt;

&lt;p&gt;I've been looking for a kick-arse tablet device to run Windows on for a while, but have been stuck in Goldilocks-mode - &quot;too large, too heavy, the battery is too short, etc&quot; - and continue to sit on the fence. Much like with WP7, I'm curious about the involvement of hardware vendors to support the new features coming in Windows 8.&lt;/p&gt;

&lt;p&gt;Windows 7 was launched with support for touch input, but it never really gained traction due to lack of a compelling tablet device - the Touchsmarts were a nice device, but were primarily for kiosks, rather than daily usage.&lt;/p&gt;

&lt;p&gt;Compare Windows 7 to the WP7 launches - which have been done with device announcements involving hardware vendors - and it gives me hope that the launch can be done in a more &quot;complete&quot; fashion.&lt;/p&gt;

&lt;p&gt;And I want to see more presentations from MSFT about Windows 8 using touch - drive the presentations from a tablet, demonstrate how the new UI supports touch, and compel me to put it everywhere.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>slsvcutil - Workaround StackOverflowException</title>
      <link>http://brendanforster.com/slsvcutil-stackoverflowexception-workaround.html</link>
      <pubDate>Fri, 06 May 2011 14:00:00 +1000</pubDate>
      <author>shift.key@gmail.com (Brendan Forster)</author>
      <guid>http://brendanforster.com/slsvcutil-stackoverflowexception-workaround.html</guid>
      <description>&lt;p&gt;I've hit this issue before, but it took a bit of googling to remember the fix - especially since that little site called &lt;a href=&quot;http://www.stackoverflow.com/&quot;&gt;stackoverflow&lt;/a&gt; came into the mix :)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;D:\Readify\Hg\ReadifySample\src&amp;gt;&quot;C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Tools\Slsvcutil.exe&quot; http://localhost:47862/Services/ParentService.svc

Process is terminated due to StackOverflowException.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;No configuration options set. No informative error message. Annoying.&lt;/p&gt;

&lt;p&gt;The solution, which was initially posted &lt;a href=&quot;http://blogs.msdn.com/b/silverlightws/archive/2010/04/30/workaround-for-stackoverflowexception-when-using-slsvcutil-exe.aspx&quot;&gt;here&lt;/a&gt; over a year ago, is to add in a configuration file alongside slsvcutil.exe, called &lt;strong&gt;slsvcutil.exe.config&lt;/strong&gt;, which will point to the neutral-culture assembly.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;configuration&amp;gt;
  &amp;lt;satelliteassemblies&amp;gt;
    &amp;lt;assembly name=&quot;SlSvcUtil, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&quot; /&amp;gt;
  &amp;lt;/satelliteassemblies&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That's right. If you have set your system language to something &lt;strong&gt;other than US English&lt;/strong&gt;, you will probably encounter this issue.&lt;/p&gt;

&lt;p&gt;Enjoy.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Musing - Simpler UI Testing for WPF Apps</title>
      <link>http://brendanforster.com/simpler-ui-testing-for-wpf-apps.html</link>
      <pubDate>Sat, 26 Mar 2011 14:00:00 +1100</pubDate>
      <author>shift.key@gmail.com (Brendan Forster)</author>
      <guid>http://brendanforster.com/simpler-ui-testing-for-wpf-apps.html</guid>
      <description>&lt;p&gt;After spending some time this week getting to know Ruby and some of its testing frameworks (Shoulda, rspec, and TestCase), I thought I'd put pen
to paper and revisit why I started down this path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some background&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The current project I am working on is a large data-driven WPF application, with a lot of complex scenarios to
identify, develop and test. There is a group of testers on the project, but I can see an opportunity to use
automated testing to verify functionality and allow testers to focus on areas of better value - exploratory testing, for example.&lt;/p&gt;

&lt;p&gt;Yes, there are frameworks like &lt;a href=&quot;http://white.codeplex.com/&quot;&gt;White&lt;/a&gt; or Coded UI Tests, but these tools were designed with developers in mind.
You have to write code like &lt;a href=&quot;http://msdn.microsoft.com/en-us/magazine/dd483216.aspx&quot;&gt;this&lt;/a&gt; to drive the tests, and the tests are commonly written after the feature is implemented.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enter Automated Acceptance Testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In an ideal world, business users would define tests in an English-like language, which can then be translated into an executable
script and run against the application.&lt;/p&gt;

&lt;p&gt;What I'm looking for in a framework for defining use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;define the test first, so that the high-level scenario is set before development occurs&lt;/li&gt;
&lt;li&gt;flexible with syntax for test cases - tailor scripts to suit people involved, while remaining declarative&lt;/li&gt;
&lt;li&gt;integrate into deployment process to verify builds automated&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Some inspiration from obscure corners&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When I first saw the syntax for &lt;a href=&quot;http://msdn.microsoft.com/en-us/magazine/dd483216.aspx&quot;&gt;webrat&lt;/a&gt;, I was intrigued and jealous. To declare a test like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class SignupTest &amp;lt; ActionController::IntegrationTest

    def test_trial_account_sign_up
        visit home_path
        click_link &quot;Sign up&quot;
        fill_in &quot;Email&quot;, :with =&amp;gt; &quot;good@example.com&quot;
        select &quot;Free account&quot;
        click_button &quot;Register&quot;
    end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;was not far off what I'd had in mind for something that was easy to follow and easy to write.&lt;/p&gt;

&lt;p&gt;So I spent some time this week experimenting with various ways of achieving this against a sample WPF application.&lt;/p&gt;

&lt;p&gt;I'm using rspec at the moment to run the test cases, and IronRuby and White to support the integration with the hosted WPF application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does a test for the WPF application look like?&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;describe &quot;new customers screen&quot; do

    subject { Host.new(File.expand_path('./app/WpfTestApp.exe', File.dirname(__FILE__)))

    before(:each) do
        click &quot;Add Customer&quot;
    end

    it &quot;cannot save empty form&quot; do
        cannot_click &quot;Save&quot;
        can_click &quot;Cancel&quot;
    end

    it &quot;can enter details for customer&quot; do
        fill &quot;FirstName&quot;, :with =&amp;gt; &quot;Brendan&quot;
        fill &quot;LastName&quot;, :with =&amp;gt; &quot;Forster&quot;
        # and some other fields
        can_click &quot;Save&quot;
    end

    it &quot;can save and return to main screen&quot; do
        fill &quot;FirstName&quot;, :with =&amp;gt; &quot;Brendan&quot;
        fill &quot;LastName&quot;, :with =&amp;gt; &quot;Forster&quot;
        # and some other fields
        click &quot;Save&quot;
        assert_title &quot;Dashboard&quot;
    end

    after(:each) do
        cleanup
    end

    def method_missing(sym, *args, &amp;amp;block)
        subject.send sym, *args, &amp;amp;block
    end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The fields used here are based off the UI Automation features of the .NET Framework (some reading &lt;a href=&quot;http://white.codeplex.com/&quot;&gt;here&lt;/a&gt; on recommendations)
which I'll dig into a bit later if people are interested.&lt;/p&gt;

&lt;p&gt;The method_missing method is used to reduce the noise of writing &quot;subject.&quot; to start each line - I'm not quite sold on the approach, but it was cleaner than the previous approaches I'd tried.
Also, rspec has a &lt;a href=&quot;https://gist.github.com/663876&quot;&gt;huge set of features&lt;/a&gt; which I've barely scratched the surface on.&lt;/p&gt;

&lt;p&gt;So with a set of files like the file above, the testrunner is a simple script to load specific files found in the current directory:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'rubygems'
require 'rspec'
require 'host'

Dir[File.dirname(__FILE__) + '/*tests.rb'].each do |file| 
    load file
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I'll share some more as I polish additional features (I'm most certainly doing Ruby wrong at the moment, so I keep refactoring code),
just needed to write this post.&lt;/p&gt;
</description>
    </item>
    

  </channel>
</rss>
