<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" version="2.0">
  <channel>
    <title>No Fluff Just Stuff</title>
    <link>http://www.nofluffjuststuff.com</link>
    <description>The best value in the Java/Open Source conferencing space hands down</description>
    <item>
      <title>Architecting from the Features</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124294&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;I&amp;#8217;m writing the portfolio management book, and I just finished a whole big re-architecture. I&amp;#8217;m so excited.&lt;/p&gt;
&lt;p&gt;I realize most people aren&amp;#8217;t that excited about a rearchitecture :-), especially not of a book in progress. But I am, because I took my own advice.&lt;/p&gt;
&lt;p&gt;When I started writing the book, I had several partly done chapter-things. They were not particularly well-written, nor were they coherent and several pieces were tightly coupled. But they were enough for the Prags to see what I was thinking. Luckily, that was enough for a contract.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been writing off and on since I got the contract, and have been getting stuck. I realized last week it was time to print the book and start cutting pieces of it to reorganize.&lt;/p&gt;
&lt;p&gt;I finally started making the book (yes, I write in markup language, check my writing into Subversion, and use make to make the book), and seeing it on paper helped me see where my features were.&lt;/p&gt;
&lt;p&gt;I have some user stories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; &amp;#8220;As a first level manager or technical lead, I want to see how to make a portfolio.&amp;#8221;&lt;/li&gt;
&lt;li&gt;&amp;#8220;As a middle manager, I want to see how to make a portfolio and make decisions about it.&amp;#8221;&lt;/li&gt;
&lt;li&gt;&amp;#8220;As a senior manager, I want to review the portfolio, and make decisions about it based on data.&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But being your own product owner is not such a good idea. Because I thought the roles were driving the book, I had separated a bunch of the writing by role first, and then what the roles did. But it turns out, that for this book, right now, the portfolio activities are what needs to drive the book. Maybe that&amp;#8217;s obvious to you. But it wasn&amp;#8217;t for me.&lt;/p&gt;
&lt;p&gt;I realize the current book&amp;#8217;s architecture may not last. But I can see how to write more of it. And, I&amp;#8217;ve been refactoring to clean up my writing. I think of the refactoring as where I put things to make the book clearer, and editing as how I change the words to make the ideas clearer.&lt;/p&gt;
&lt;p&gt;I wrote several features&amp;#8211;actually parts of several features because I got stuck. Now I&amp;#8217;ve rearchitected and the writing is flowing. I&amp;#8217;m probably not done rearchitecting, but that&amp;#8217;s ok. I have a place to head towards now. Onward!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ManagingProductDevelopment?a=vxwtfJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ManagingProductDevelopment?i=vxwtfJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ManagingProductDevelopment?a=L5yXCJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ManagingProductDevelopment?i=L5yXCJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ManagingProductDevelopment?a=lNcWqj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ManagingProductDevelopment?i=lNcWqj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ManagingProductDevelopment?a=TDavgj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ManagingProductDevelopment?i=TDavgj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ManagingProductDevelopment?a=OCT8HJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ManagingProductDevelopment?i=OCT8HJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ManagingProductDevelopment?a=JMEw8J"&gt;&lt;img src="http://feeds.feedburner.com/~f/ManagingProductDevelopment?i=JMEw8J" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ManagingProductDevelopment/~4/328252752" height="1" width="1"/&gt;</description>
      <pubDate>Sun, 06 Jul 2008 16:00:00 CDT</pubDate>
      <guid isPermaLink="true">http://jrothman.com/blog/mpd/2008/07/architecting-from-the-features.html</guid>
      <dc:creator>Johanna Rothman</dc:creator>
    </item>
    <item>
      <title>Uxebu Hangs Their Shingle</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124289&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;Several Dojo&amp;#8217;s most prolific European contributors have banded together to form &lt;a href="http://uxebu.com/"&gt;Uxebu&lt;/a&gt;, a new consultancy centered around Dojo and JavaScript (&lt;a href="http://blog.uxebu.com/"&gt;blog here&lt;/a&gt;). SitePen recently expanded to the UK and while we&amp;#8217;re doing lots of business in the EU, it&amp;#8217;s an exciting time to be working with Dojo as the demand is very high. I&amp;#8217;m tremendously excited to see that Nikolai, Wolfram, and Tobias are stepping in to help fill the need! Given the quality and quantity of their contributions to Dojo, I expect great things of their new firm.&lt;/p&gt;
&lt;p&gt;Congrats guys!&lt;/p&gt;</description>
      <pubDate>Sun, 06 Jul 2008 13:00:00 CDT</pubDate>
      <guid isPermaLink="true">http://alex.dojotoolkit.org/?p=684</guid>
      <dc:creator>Alex Russell</dc:creator>
    </item>
    <item>
      <title>Ode to Process</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124290&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;Clearly I&amp;#8217;ve kicked off a trend - one day, I post about &lt;a href="http://ntschutta.com/jat/2008/06/21/the-purpose-of-process/"&gt;process&lt;/a&gt;, a few days later &lt;a href="http://weblog.raganwald.com/"&gt;Reg Braithwaite&lt;/a&gt; coins a &lt;a href="http://weblog.raganwald.com/2008/07/process-theatre.html"&gt;new term&lt;/a&gt; and &lt;a href="http://thedailywtf.com/"&gt;the Daily WTF&lt;/a&gt; posts an &lt;a href="http://thedailywtf.com/Articles/Slaves-to-The-Process.aspx"&gt;ode to process&lt;/a&gt; &lt;img src='http://ntschutta.com/jat/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /&gt; . OK, I&amp;#8217;ve only got three readers so I know it&amp;#8217;s all just a big fat coincidence but still! Process theatre really does capture the notion perfectly; pointy haired bosses believe more templates, meetings and blind adherence to methodology are the answer to failing projects. Of course when you remove all decision making from the hands of sentient beings, you get a lost workday instead of someone just hitting the spacebar.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not anti-process; you&amp;#8217;ve got to have some framework to hang your work on. I plain can&amp;#8217;t stand dogma though and I thoroughly believe you need to test your processes just as much as you test your code. Is this document/meeting/hurdle saving us money? Resulting in better projects? Happier customers? Whatever the raison d&amp;#8217;��tre, we should make sure it&amp;#8217;s actually delivering. Do more of what works, less of what doesn&amp;#8217;t. Rinse and repeat.&lt;/p&gt;</description>
      <pubDate>Sun, 06 Jul 2008 11:00:00 CDT</pubDate>
      <guid isPermaLink="true">http://ntschutta.com/jat/2008/07/05/ode-to-process/</guid>
      <dc:creator>Nathaniel Schutta</dc:creator>
    </item>
    <item>
      <title>LHB: Same Story, Different Tune</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124291&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;I&amp;#8217;m not sure how I missed it for so long, but &lt;a href="http://linuxhaters.blogspot.com/"&gt;I&amp;#8217;m now reading every word of the Linux Hater&amp;#8217;s Blog&lt;/a&gt;. It&amp;#8217;s beautiful catharsis, and I say that as someone who used to serve as President of a university LUG and who writes open source software for a living.&lt;/p&gt;
&lt;p&gt;Like the author of LHB, I&amp;#8217;ve written my share of low-level Linux stuff and shudder in horror and how backward the linux desktop still is. X11 is an abomination and configuring sound or wifi or some new-ish device&amp;#8230;well, I still have those scars. It wasn&amp;#8217;t that long ago that I was hacking together bits of kernel patches to get an early firewire iPod (a gift from &lt;a href="http://jennifer-russell.com"&gt;Jennifer&lt;/a&gt;) working on my SuSE desktop. And I was using SuSE &lt;em&gt;because it usually required the least futzing&lt;/em&gt; of the then-available distros. Even when Linux was my desktop OS of choice &amp;ndash; I had since climbed down from my brief flirtation with OpenBSD &amp;ndash; it was blindingly clear to me that building my own packages was a fool&amp;#8217;s game. My time is simply worth more than that. Perhaps the most cogent point I took away from reading the LHB archives is that building professional code for the &amp;#8220;Linux Platform&amp;#8221; is nearly impossible, not because it can&amp;#8217;t be done, but because it costs too damned much to justify the costs. The Linux crowd seems to mis-value the immediate vs. long term costs of choice. By failing to provide a binary-friendly environment, the Linux world creates conditions only friendly to Open Source software, crippling their platform and robbing it of the capital investment that would allow it to truly compete. Many people who suffer through some Linux distro as their desktop environment no doubt see this as a good thing. I, however, need to get some work done. The LHB cogently lays out why everyone &lt;em&gt;else&lt;/em&gt; on the planet whose time is worth more than what Amazon charges for a CPU-hour on EC2 similarly dismisses Linux for anything but servers.&lt;/p&gt;
&lt;p&gt;The almost religious belief that choice is good ignores the inability of most people (myself included) to fully judge the long-run costs of any given technology decision. Oddly, the web browser world seems stuck in a similar position. Choice in browsers is promoted like some sort of panacea, when in fact our big problem isn&amp;#8217;t choice, it&amp;#8217;s that browsers simply can&amp;#8217;t natively attempt the feats we need them to accomplish. Smart people don&amp;#8217;t replace their browsers, they use what works until it doesn&amp;#8217;t any more. No wonder it&amp;#8217;s taken Firefox so long to gain market share. Like linux distros, browsers evolve in hodge-podge was, never quite tracing a straight line toward real progress. The refrain of &amp;#8220;standards will save us&amp;#8221; seems to ignore the reality that, like the &lt;a href="http://www.linuxfoundation.org/en/LSB"&gt;LSB&lt;/a&gt;, the existing W3C standards are absolutely insufficient to address the problems at-hand. Both CSS3 and HTML5 are nice first-stabs, but they don&amp;#8217;t get us &amp;#8220;there&amp;#8221;. For Linux, the &lt;a href="http://linuxhaters.blogspot.com/2008/06/standardizing-linux-suckiness-20.html"&gt;LHB points out that there&amp;#8217;s zero reason to not ship &amp;#8220;the same bits&amp;#8221;&lt;/a&gt;, and for the web, the issue is that content can&amp;#8217;t tell the browser &amp;#8220;no, really, use &lt;em&gt;that&lt;/em&gt; renderer&amp;#8221;. Interestingly, Microsoft tried to convince the world that we should version our content and the standards zealots just shot them down without really considering the consequences. Instead of making the world safe for a better web, the HTML standards geeks instead did the most powerful thing they could do to prevent it from materializing. In essence, they preserved &amp;#8220;choice&amp;#8221; at the expense of utility. What a waste. Seriously, if these are the deep thinkers on &amp;#8220;our team&amp;#8221;, why &lt;em&gt;not&lt;/em&gt; go just use Flash to build everything?&lt;/p&gt;
&lt;p&gt;Many people have gotten worked up about Microsoft&amp;#8217;s role in killing Netscape (although they tend to minimize Netscape&amp;#8217;s role in its own demise), but ISTM that the real long-term harm done here has been to remove the renderer as a profit center. Once Microsoft set the price of the browser at &amp;#8220;free&amp;#8221; they effectively killed browser evolution as part of anything but an OS-based platform play (in part, to preserve their existing OS-based platform play). Interestingly, then, web-based services have routed around the difficulties of the platform to date to deliver apps that seemed well out of reach of HTML 4.01 as implemented by IE 6, but well, we&amp;#8217;re a plucky lot, aren&amp;#8217;t we? The most progress being made right now seems to be coming from a large software vendor in Cupertino with an &lt;a href="http://www.apple.com/iphone/"&gt;OS-based platform play&lt;/a&gt; that absolutely needs the web to sparkle in order to drive adoption of their OS and hardware.&lt;/p&gt;
&lt;p&gt;Like Linux, the web will probably lurch forward this way for the forseeable future. The standards zealots smacked down the IE team so hard on content versioning that I don&amp;#8217;t think anyone else will have the testicular fortitude to try again for a good while. It&amp;#8217;s down to the whole &amp;#8220;vision thing&amp;#8221;, and the web standards crowd doesn&amp;#8217;t seem to have any. It&amp;#8217;s about time someone took the punch bowl away from them once and for all. The open web needs real progress too badly to stall any longer.&lt;/p&gt;</description>
      <pubDate>Sun, 06 Jul 2008 08:00:00 CDT</pubDate>
      <guid isPermaLink="true">http://alex.dojotoolkit.org/?p=685</guid>
      <dc:creator>Alex Russell</dc:creator>
    </item>
    <item>
      <title>WPF Composite Application Guidance is Live</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124229&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;A very common pattern for business focused applications is the &amp;quot;Composite Application Pattern&amp;quot;.&amp;#160;&amp;#160; Over the last few months our P&amp;amp;P team has been working with industry leaders and the product teams in Microsoft to develop an sample application and a framework for building composite applications in WPF.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;img height="221" alt="RIScreenshots_small.png" src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=CompositeWPF&amp;amp;DownloadId=37985" width="612" /&gt;&lt;/p&gt;  &lt;p&gt;If you are looking at building a WPF business focused application, you should really check this out.. all the documentation, source code and even unit tests are included!&lt;/p&gt;  &lt;p&gt;Check it out!&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/library/cc707819.aspx"&gt;Composite Application Guidance for WPF&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8684125" width="1" height="1"&gt;</description>
      <pubDate>Sat, 05 Jul 2008 16:00:00 CDT</pubDate>
      <guid isPermaLink="true">91d46819-8472-40ad-a661-2c78acb4018c:8684125</guid>
      <dc:creator>Brad Abrams</dc:creator>
    </item>
    <item>
      <title>Coolidge Park by night [Flickr]</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124228&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/people/aarongustafson/"&gt;Aaron Gustafson&lt;/a&gt; posted a photo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/aarongustafson/2633299413/" title="Coolidge Park by night"&gt;&lt;img src="http://farm4.static.flickr.com/3082/2633299413_aedff3b814_m.jpg" width="240" height="180" alt="Coolidge Park by night" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EasyReader/~4/325853340" height="1" width="1"/&gt;</description>
      <pubDate>Sat, 05 Jul 2008 13:00:00 CDT</pubDate>
      <guid isPermaLink="true">tag:flickr.com,2005:/photo/2633299413</guid>
      <dc:creator>Aaron Gustafson</dc:creator>
    </item>
    <item>
      <title>Testing Cocoa Controllers with OCMock</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124232&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;For a few releases the Apple development tools have included OCUnit and many developers have now started to write unit tests. There are lots of tutorials that explain how this is done for the straight-forward cases but there&amp;#8217;s one area of testing that has proven difficult on most platforms, and that is testing of the user interface. That said, there are a few things that make this an easier problem to solve with Cocoa and in this post I&amp;#8217;ll explain why.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-44"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s look at an example. &lt;a href="http://ccmenu.sourceforge.net/"&gt;CCMenu&lt;/a&gt; is a small application that displays the status of &lt;a href="http://cruisecontrol.sourceforge.net/"&gt;CruiseControl&lt;/a&gt; continuous integration servers. As part of adding a new project to be monitored the user has to enter the URL for the CruiseControl server and a combox provides a history of previously used servers.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://erik.doernenburg.com/wp-content/uploads/2008/07/ccmenu_snapshot1.png'&gt;&lt;img src="http://erik.doernenburg.com/wp-content/uploads/2008/07/ccmenu_snapshot1.png" alt="" title="CCMenu Snapshot 1" width="449" height="264" class="alignnone size-full wp-image-45" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The same dialog has a matrix of buttons to set the type of the server. Actually, by default CCMenu detects the server type automatically but that&amp;#8217;s beside the point. What we&amp;#8217;re interested in is the piece of functionality that is responsible for selecting the correct server type for the URL chosen by the user. In our case, this would be Cruise Control Dashboard.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://erik.doernenburg.com/wp-content/uploads/2008/07/ccmenu_snapshot2.png'&gt;&lt;img src="http://erik.doernenburg.com/wp-content/uploads/2008/07/ccmenu_snapshot2.png" alt="" title="CCMenu Snapshot 2" width="449" height="264" class="alignnone size-full wp-image-46" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One difference between Cocoa and most other UI frameworks is the fact that the user interface is stored by serialising the objects, rather than generating code. For this reason I&amp;#8217;m happy to not insist on test-first for the actual interface. What I do want to test is the code in the controller classes.&lt;/p&gt;
&lt;p&gt;Obviously, I could load the serialised objects, locate the elements involved and then use methods such as performClick: to trigger the actions. Sounds convoluted? Yes, I agree. Luckily there&amp;#8217;s a better way.&lt;/p&gt;
&lt;p&gt;This is a case where testing is tricky because the object under test interacts with objects that are difficult to deal with. In such cases dynamic mock objects have proven extremely useful. A good introduction can be found &lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;here&lt;/a&gt; and &lt;a href="http://mockobjects.com/"&gt;mockobject.com&lt;/a&gt; lists papers and implementations. For Objective-C I created &lt;a href="http://www.mulle-kybernetik.com/software/OCMock/"&gt;OCMock&lt;/a&gt;. Let&amp;#8217;s look at how this helps us testing our controllers.&lt;/p&gt;
&lt;p&gt;Here are the relevant parts of the interface declaration of the controller. Given that I&amp;#8217;m doing test-driven development there&amp;#8217;s currently no implementation of the methods. I simply created the interface of the controller based on my needs while designing the dialog.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@interface CCMPreferencesController : CCMWindowController
{
    IBOutlet NSComboBox *serverUrlComboBox;
    IBOutlet NSMatrix *serverTypeMatrix;
}

- (IBAction)historyURLSelected:(id)sender;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In my test I want to use mock objects instead of loading the actual user interface. So, in the test setup, after creating my controller, I create appropriate mock objects and set up the controller to use these.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@implementation CCMPreferencesControllerTest

- (void)setUp
{
    controller = [[[CCMPreferencesController alloc] init] autorelease];
    serverUrlComboBoxMock = [OCMockObject mockForClass:[NSComboBox class]];
    [controller setValue:serverUrlComboBoxMock forKey:@"serverUrlComboBox"];
    serverTypeMatrixMock = [OCMockObject mockForClass:[NSMatrix class]];
    [controller setValue:serverTypeMatrixMock forKey:@"serverTypeMatrix"];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You notice that I&amp;#8217;m using key-value coding to set the variables (outlets). I&amp;#8217;m doing this because the variables are not public and at the same time I don&amp;#8217;t want to write accessor methods for them.&lt;/p&gt;
&lt;p&gt;Now, we can start writing the actual test for the functionality. Have a look at the full test first.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- (void)testSelectsServerTypeWhenHistoryURLIsSelected
{
    NSString *selectedUrl = @"http://localhost/cctray.xml";
    [[[serverUrlComboBoxMock stub] andReturn:selectedUrl] stringValue];
    [[serverTypeMatrixMock expect] selectCellWithTag:CCMCruiseControlDashboard];
    [controller historyURLSelected:nil];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What&amp;#8217;s going on here? Firstly, I tell the mock object that stands in for the actual combox box that it should stub the stringValue method. This means that when somebody invokes stringValue on this object it will return the string @&amp;#8221;http://localhost/cctray.xml&amp;#8221;. This is all we&amp;#8217;d have done with the real combo box anyway.&lt;/p&gt;
&lt;p&gt;Secondly, I tell the mock that stands in for the server type matrix that it should expect that the method selectCellWithTag: is called with CCMCruiseControlDashboard as an argument.&lt;/p&gt;
&lt;p&gt;Lastly, I invoke the method I want to test. What happens, once the implementation is complete, is that the code will go the the combo box and ask it for its string value. The first mock will return the stubbed value. Now, the code should do whatever it needs to do to figure out which server type this corresponds to and then set that in the server type matrix by selecting the cell with the appropriate tag, and this is what we&amp;#8217;ve told the second mock to expect.&lt;/p&gt;
&lt;p&gt;Wait, you might say, we don&amp;#8217;t have an implementation yet. So, how does this test fail? It doesn&amp;#8217;t yet. We&amp;#8217;ll have to tell the mock objects to verify that everything we told them to expect actually occurred, and a logical place for this is the test tearDown.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- (void)tearDown
{
    [serverUrlComboBoxMock verify];
    [serverTypeMatrixMock verify];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Strictly speaking, we don&amp;#8217;t have to verify the combo box mock because it doesn&amp;#8217;t have any expectations but it&amp;#8217;s good practice to verify all mocks in the tear down, especially if the same mocks are used for multiple tests. By the way, by default the mocks also have fail-fast behaviour; when they receive a method that wasn&amp;#8217;t stubbed or expected, they raise an exception right away. Detecting something that wasn&amp;#8217;t expected can be done right way, detecting that something that was expected didn&amp;#8217;t occur must be trigger by the user.&lt;/p&gt;
&lt;p&gt;Now, if we run this test with an empty implementation of historyURLSelected: it will fail when we tell the server type matrix mock to verify because the expected method hasn&amp;#8217;t been called. The error message will look something like this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Unknown.m:0: error: -[CCMPreferencesControllerTest testSelectsServerTypeWhenHistoryURLIsSelected] : OCMockObject[NSMatrix]: expected method was not invoked: selectCellWithTag:0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Adding an implementation like the following one adds the right functionality and makes our test pass.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@implementation CCMPreferencesController

- (void)historyURLSelected:(id)sender
{
    NSString *serverUrl = [serverUrlComboBox stringValue];
    [serverTypeMatrix selectCellWithTag:[serverUrl cruiseControlServerType]];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In summary, testing controllers becomes relatively easy when we follow this pattern:&lt;/p&gt;
&lt;p&gt;1. Replace all UI elements with mocks; using key-value coding to access the outlets.&lt;/p&gt;
&lt;p&gt;2. Set up stubs with return values for UI elements that the controller will query.&lt;/p&gt;
&lt;p&gt;3. Set up expectations for UI elements that the controller should manipulate.&lt;/p&gt;
&lt;p&gt;4. Invoke the method in the controller.&lt;/p&gt;
&lt;p&gt;5. Verify the expectations.&lt;/p&gt;
&lt;p&gt;I find tests following this pattern easier to write and understand than tests that load a NIB file and interact with the actual user interface elements.&lt;/p&gt;</description>
      <pubDate>Sat, 05 Jul 2008 11:00:00 CDT</pubDate>
      <guid isPermaLink="true">http://erik.doernenburg.com/?p=44</guid>
      <dc:creator>Erik Doernenburg</dc:creator>
    </item>
    <item>
      <title>Catching up on performance with the SitePen crew</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124233&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;There&amp;#8217;s been so much going on in the performance space lately that I&amp;#8217;ve been snowed under.  It&amp;#8217;s difficult to know where to begin chronicling all of the progress.  I&amp;#8217;ll start with a few updates from Sitepen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Back in April, Kris Zyp had a great article for IBM developerWorks called &lt;a href="http://www.ibm.com/developerworks/web/library/wa-aj-perform/?ca=dgr-lnxw01FasterAjax"&gt;Ajax performance analysis&lt;/a&gt;.  The developerWorks crew puts out some great material, and this is no exception.  Simply put, it&amp;#8217;s one of the best articles I&amp;#8217;ve seen on the topic, and it should be required reading for every Ajax developer.  He discusses Firebug, YSlow, and some client-side instrumentation techniques.&lt;/li&gt;
&lt;li&gt;Old friend of the Perf, Tom Trenka, had a nice post about &lt;a href="http://www.sitepen.com/blog/2008/05/09/string-performance-an-analysis/"&gt;string operations across browsers&lt;/a&gt; in May.  One of the more interesting takeaways is with regards to IE7 versus IE6.  The net &amp;#8212; there&amp;#8217;s no longer any justification, if there ever was, for special casing string concat operations for IE.&lt;/li&gt;
&lt;li&gt;One of my favorite tools, Firebug Lite, has seen some &lt;a href="&lt;a href="http://www.sitepen.com/blog/2008/06/02/firebug-lite-and-dojo-not-just-for-ie/"&gt;&amp;#8220;&gt;dramatic improvements&lt;/a&gt; in the Dojo Toolkit version, as discussed by Mike Wilcox in early June.  The features discussed: a popup mode that remembers size and position, ReCSS (so you can reload stylesheets without reloading the app), a DOM Inspector, an Object inspector, and a command line.  They&amp;#8217;ve definitely taken Firebug Lite a long way past the initial goal of offering a bare subset of Firebug functionality to IE developers.&lt;/li&gt;
&lt;li&gt;A few days ago, Mike posted another article &amp;#8212; this time with a nice addition to the recent swell of client-side profiling articles.  Mike whipped up a nice generic mechanism for &lt;a href="http://www.sitepen.com/blog/2008/07/01/a-quick-javascript-load-profiler/"&gt;tracker client side performance in a cookie&lt;/a&gt; to remove some of the tedium from generating a statistically relevant data set in your own browser.&lt;/li&gt;
&lt;li&gt;Finally, Alex Russell expands on the concept of lazy loading by creating a &lt;a href="http://www.sitepen.com/blog/2008/07/01/dojo-in-6k/"&gt;stub loader for Dojo&lt;/a&gt;.  Weighing in at a slim 6kB (gzipped over the wire), this build of dojo.js is just the bootstrap code necessary for loading the main functionality, all of which is deferred until it&amp;#8217;s actually called within an application.  John Resig &lt;a href="http://ejohn.org/blog/jquery-plugins-size-and-storage/"&gt;posted a follow-up regarding some of the clear downsides of this approach&lt;/a&gt;, such as the potential violation of user expectations.&lt;/li&gt;
&lt;/ul&gt;</description>
      <pubDate>Sat, 05 Jul 2008 08:00:00 CDT</pubDate>
      <guid isPermaLink="true">http://www.ajaxperformance.com/?p=123</guid>
      <dc:creator>Ryan Breen</dc:creator>
    </item>
    <item>
      <title>ASP.NET Ajax Roadmap Published</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124263&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;&lt;a href="http://weblogs.asp.net/bleroy/default.aspx"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/brada/WindowsLiveWriter/ASP.NETAjaxRoadmapPublished_63EE/image_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="133" alt="image" src="http://blogs.msdn.com/blogfiles/brada/WindowsLiveWriter/ASP.NETAjaxRoadmapPublished_63EE/image_thumb.png" width="197" align="right" border="0" /&gt;&lt;/a&gt;Bertrand&lt;/a&gt; recently published our &lt;a href="http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=14924"&gt;roadmap for ASP.NET Ajax&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;Our goal is to describe some of the proposed features that we are considering investing in future releases of ASP.NET AJAX, Visual Web Developer, and the ASP.NET AJAX Control Toolkit.&amp;#160;&amp;#160; &lt;br /&gt;We really appreciate your feedback, so this document is intended as much for you to provide an input to our direction as well as to give some indication of what the teams are investing in.&lt;/p&gt;  &lt;p&gt;We'd love to hear your thoughts!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8689358" width="1" height="1"&gt;</description>
      <pubDate>Fri, 04 Jul 2008 16:00:00 CDT</pubDate>
      <guid isPermaLink="true">91d46819-8472-40ad-a661-2c78acb4018c:8689358</guid>
      <dc:creator>Brad Abrams</dc:creator>
    </item>
    <item>
      <title>My Clutter is Different</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124262&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;On the long weekends, Mark and I make a concerted effort to clean up the house. That means I have to address all my little piles: go through them, recycle what I can, throw out what can&amp;#8217;t be recycled, file others, figure out what to do with the rest. While Mark was helping me bring some of my paper and books downstairs, he nudged me about finishing the living room. &amp;#8220;I know you don&amp;#8217;t like clutter,&amp;#8221; he said. &amp;#8220;Yes, but I know where everything is. Besides, you have clutter, too.&amp;#8221; &amp;#8220;But I don&amp;#8217;t like your clutter,&amp;#8221; he responded. I started to say, &amp;#8220;Yeah, but my clutter is different&amp;#8221; at which point we both cracked up.&lt;/p&gt;
&lt;p&gt;My clutter is comfortable for me, otherwise I would have dealt with it already.�� You could call my clutter technical debt, and you&amp;#8217;d be right. I don&amp;#8217;t mind paying it off on long weekends. Otherwise, I would do something about it more often. But the reason my clutter is different is because it fits with my mental model of the world.�� I&amp;#8217;m sure when Mark reads this, he&amp;#8217;ll try to change my mental models. He&amp;#8217;s unlikely to be successful.&lt;/p&gt;
&lt;p&gt;These same kinds of discussions occur at work, but we tend to laugh at them less. (Maybe we should.) The next time you find yourself perturbed by someone else&amp;#8217;s perspective, consider this question: What would have to be true for the other person to be happy (or content or satisfied) with the situation?�� Partly, my clutter helps me see all the things I do, which is helpful. More clutter does not make it more helpful &lt;img src='http://jrothman.com/blog/mpd/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &amp;#8212; there&amp;#8217;s a point at which even I think there&amp;#8217;s too much clutter. But seeing clutter doesn&amp;#8217;t help Mark, and since we share a house, I need to flex a bit. I&amp;#8217;ll continue cleaning up now.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ManagingProductDevelopment?a=c6VQGJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ManagingProductDevelopment?i=c6VQGJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ManagingProductDevelopment?a=ZlWETJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ManagingProductDevelopment?i=ZlWETJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ManagingProductDevelopment?a=VZaBhj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ManagingProductDevelopment?i=VZaBhj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ManagingProductDevelopment?a=MFRGij"&gt;&lt;img src="http://feeds.feedburner.com/~f/ManagingProductDevelopment?i=MFRGij" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ManagingProductDevelopment?a=oCa3iJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ManagingProductDevelopment?i=oCa3iJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ManagingProductDevelopment?a=cgHMMJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ManagingProductDevelopment?i=cgHMMJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ManagingProductDevelopment/~4/326719261" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 04 Jul 2008 13:00:00 CDT</pubDate>
      <guid isPermaLink="true">http://jrothman.com/blog/mpd/2008/07/my-clutter-is-different.html</guid>
      <dc:creator>Johanna Rothman</dc:creator>
    </item>
    <item>
      <title>On the radio</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124234&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_HOfY71whEUc/SG33efPqV4I/AAAAAAAAAGk/uGp4FUtOvAo/s1600-h/radioshow5.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_HOfY71whEUc/SG33efPqV4I/AAAAAAAAAGk/uGp4FUtOvAo/s320/radioshow5.jpg" alt="" id="BLOGGER_PHOTO_ID_5219099646347597698" border="0" /&gt;&lt;/a&gt;Just in case you were fortunate enough to miss it, I was on the &lt;a href="http://www.redmonk.com/cote/topic/podcasts/ria-weekly/"&gt;RIA Weekly&lt;/a&gt; radio show yesterday.  Actually, The RIA Weekly Show hosted by  Michael Cote of RedMonk (a favorite analyst company) and Ryan Stuart of Adobe (a stand up guy) is a great show. Every week they talk about current events in the RIA industry and mix in a good amount of chuckles.&lt;br /&gt;&lt;br /&gt;I was the guest on &lt;a href="http://www.redmonk.com/cote/2008/07/03/episode-17-curls-richard-monson-haefel-ria-middleware-search-for-flash/"&gt;Episode 17&lt;/a&gt;. I spoke mostly about Curl and how its different from other RIA solutions. We also spoke a little bit about JSF, SOA, programing languages, and other topics. Over all I think it went pretty well, but its never fun to see yourself on video or listen to yourself on a voice recording. Apparently I do an in-take-of-air after every sentence as if I'm living on a respirator and need to get the mask back on or suffocate.</description>
      <pubDate>Fri, 04 Jul 2008 11:00:00 CDT</pubDate>
      <guid isPermaLink="true">tag:blogger.com,1999:blog-7867849070722123199.post-6254929698011580044</guid>
      <dc:creator>Richard Monson-Haefel</dc:creator>
    </item>
    <item>
      <title>Where the hell is Matt?</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124235&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_HOfY71whEUc/SG34RpyYlLI/AAAAAAAAAGs/wtWx8W_W6sY/s1600-h/matt.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_HOfY71whEUc/SG34RpyYlLI/AAAAAAAAAGs/wtWx8W_W6sY/s320/matt.jpg" alt="" id="BLOGGER_PHOTO_ID_5219100525350917298" border="0" /&gt;&lt;/a&gt;"Matt is a 31-year-old deadbeat from Connecticut who used to think that all he ever wanted to do in life was make and play videogames. Matt achieved this goal pretty early and enjoyed it for a while, but eventually realized there might be other stuff he was missing out on. In February of 2003, he quit his job in Brisbane, Australia and used the money he'd saved to wander around Asia until it ran out. He made this site so he could keep his family and friends updated about where he is.A few months into his trip, a travel buddy gave Matt an idea. They were standing around taking pictures in Hanoi, and his friend said "Hey, why don't you stand over there and do that dance. I'll record it." He was referring to a particular dance Matt does. It's actually the only dance Matt does. He does it badly. Anyway, this turned out to be a very good idea."&lt;br /&gt;                                               - Patrick Drury&lt;br /&gt;&lt;br /&gt;See Matt dancing &lt;a href="http://www.wherethehellismatt.com/videos.shtml?fbid=B5TuEj"&gt;video&lt;/a&gt;.</description>
      <pubDate>Fri, 04 Jul 2008 08:00:00 CDT</pubDate>
      <guid isPermaLink="true">tag:blogger.com,1999:blog-7867849070722123199.post-5966389776808303075</guid>
      <dc:creator>Richard Monson-Haefel</dc:creator>
    </item>
    <item>
      <title>Json-lib: 2 years and counting</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124231&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>Yikes! been so busy at work that missed &lt;a href="http://json-lib.sourceforge.net/"&gt;Json-lib&lt;/a&gt;'s second anniversary by two days. Don't have exact download stats as sourceforge.net decided to give broken links for projects statistics for over a week now, last time I checked we were over the 78K mark &lt;img src="http://www.jroller.com/images/smileys/wink.gif" class="smiley" alt=";-)" title=";-)" /&gt;&lt;br/&gt;&lt;br/&gt;20 releases, 71 bug reports, 72 feature requests, 6 patches, 123 forum messages and countless direct emails we are still up and going strong. Thanks to everybody that has contributed to the project, and to the users too, we wouldn't be here if it wasn't because of you.</description>
      <pubDate>Thu, 03 Jul 2008 16:00:00 CDT</pubDate>
      <guid isPermaLink="true">http://www.jroller.com/aalmiray/entry/json_lib_2_years_and</guid>
      <dc:creator>Andres Almiray</dc:creator>
    </item>
    <item>
      <title>“Physical” Request-Scoped Attributes for JSF in Portlets</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124230&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;div class='snap_preview'&gt;&lt;br /&gt;&lt;p&gt;One of the more frustrating parts of portal development is the fact that the Portal Specification does not follow good &amp;#8220;design by contract&amp;#8221; principals.�� One of the more annoying aspects of this deficiency is how the behavior of request-scoped attributes is defined in the portlet specification.&lt;/p&gt;
&lt;p&gt;In the servlet world, there is one Request object for each physical request from the the browser.�� This is called a single-phased request.�� Because of their complexity and the need to enable applications to perform better, the Portlet 1.0 specification introduced a multi-phased request in which certain types of requests are run in response to certain types of requests.�� This means that rendering logic can be light and fast in its implmentation while data-fetching logic and processing could be done only when a portlet is the target of its own request.&lt;/p&gt;
&lt;p&gt;Although this approach has merit, the Portal Specification does not clearly outline the lifespan of a request-scoped attribute.�� Many portal vendors (quite incorrectly in my opinion) say that items added to the request during the processAction will NOT be available durring the render.�� While other vendors, including the R.I. do preserve these attributes between an action and it&amp;#8217;s following render request.�� This means that different containers behave differently depending on their implementation, which is something that directly violates &amp;#8220;Design by Contract&amp;#8221; principals.&lt;/p&gt;
&lt;h2&gt;JSR-301 Portlet Bridge&amp;#8217;s Take&lt;/h2&gt;
&lt;p&gt;The JSR-301 Specification tries to address this inconsistency for JSF applications by stating that Request Attributes which are added during a JSF Action phase of the lifecycle, should be available during the following render and all subsequent renders.�� This allows a situation where a JSF portlet which needs to be rendered as a result of another portlet&amp;#8217;s action, can simply continue by running the render portions of the lifecycle.�� This behavior happens regardless of behavior and although there may be some challanges in dealing with this nuance, it will remain consistent across portal boundries.&lt;/p&gt;
&lt;p&gt;For those attributes that should NOT be around for subsequent renders, like per-request state information, JSR-301 added a special configuration as well as an &amp;#8220;@ExcludeFromManagedRequestScope&amp;#8221; attribute which allows an attribute to remove itself from this feature.�� For example, let&amp;#8217;s say a renderkit stores an attribute on the request which holds a flag telling the renderkit to render in XML (for an Ajax request) rather then html.�� If this bean persisted to multiple requests, you might find that your renderkit would render ajax content directly into your portlet&amp;#8217;s window on the portal page.�� This is NOT the desired result.&lt;/p&gt;
&lt;p&gt;Where JSR-301 falls short, however, is that it does not enforce any sort of consistency when a bean is excluded from the managed request scope, instead it defers to the logic defined by the portal container.�� As such, attributes which are excluded from the managed request scope suffer from the same implementation-specific problems that the Portlet 1.0 containers suffer from.&lt;/p&gt;
&lt;h2&gt;The good stuff&lt;/h2&gt;
&lt;p&gt;There are several ways to handle this situation.�� The first is to make sure that beans are able to be re-created on an as-needed basis, even from a portlet render request.�� This is a challange in a portlet environment because parameters which are passed into the action are not available durring the subsequent render request unless they are explicitly added.�� Furthermore, if the parameters are added, they will be added to every Render request until either a render request is called specifically or until antoher action is called on the portlet.�� In either case, this suffers the same pitfalls as the bridge&amp;#8217;s managed request scope, so if your initializaion state is dependent on incomming parameters for your initialization, it will be very difficult for you to manage this manually.&lt;/p&gt;
&lt;p&gt;Another approach, and the one which I will concentrate on here, is to develop your own mechanism for preserving request attributes from action to render.�� Before I get started, I also want to make some comments about the code.�� This code it an example which I&amp;#8217;m using to illustrate an idea.�� As such, I&amp;#8217;m not worrying about thread safety and robustness so much as I&amp;#8217;m trying to illustrate an idea.�� If you want a pre-canned solution, I will likely be adding one to the configurator mechanism that I currently have under development, so keep watching this blog for further details.&lt;/p&gt;
&lt;p&gt;The code below outlines the usage of a custom FacesContext Decorator.&lt;/p&gt;
&lt;pre name="code" class="java"&gt;

  public class FacesContextImpl implements FacesContext
  {
    private FacesContext _orig;
    public static final String STATE_NAME = &amp;quot;scottobryan.STATE&amp;quot;;
    public FacesContextImpl(FacesContext context)
    {
      _orig = context;
      ExternalContext ec = getExternalContext();
      Map&amp;lt;String, Object&amp;gt; saved = null;
      if(ec.getRequest() instanceof RenderRequest)
      {
        /*
         *First we look to see if we have a stored state
         *For this example I&amp;#039;m using the session but you can
         *use other scopes
         */
        saved = (Map&amp;lt;String, Object&amp;gt;)ec.getSessionMap()
                                         .remove(STATE_NAME);
      }

      if(saved == null)
      {
        saved = new HashMap&amp;lt;String, Object&amp;gt;();
      }

      ec.getRequestMap().put(STATE_NAME, saved);

      //TODO your other logic here
    }

    //TODO all other methods should delegate except release
    @Override
    public void release()
    {
      ExternalContext ec = getExternalContext();
      if (ActionRequest) instanceof ec.getRequest())
      {
        Map&amp;lt;String, Object&amp;gt; state =
         (Map&amp;lt;String, Object&amp;gt;)ec.getRequestMap()
                                  .remove(STATE_NAME);
        ec.getSessionMap().put(STATE_NAME, state);
      }

      _orig.release();
    }
  }
&lt;/pre&gt;
&lt;p&gt;Lines 17 and 18 are responsible for trying to get the state off the session if it exists.�� If it does not then a new state map is created regardless of environment.&lt;/p&gt;
&lt;p&gt;Lines 33 to 46 will save the map to the session when the FacesContext is release by the bridge.�� It will only do this on an action request since that&amp;#8217;s the only usecase we care about.�� For cleanliness I go ahead and remove it from the request, but an uglier (albeit faster) technique might be to try to leave it on the request so that durring the next render you can figure out whether you are in a container which preserves request attributes and are therefore able to disable this caching alltogether.&lt;/p&gt;
&lt;p&gt;The code will make sure that there will be a map stored on the request attributes by the name of STATE_NAME and that any attributes which are appended to it will be available throughout the lifetime of the physical request.�� If you have a container that is not tolerant of non-serializable data on the session (by spec it should be, just not for failover), you can either make all your stuff serializable or you can play around with appending it to the Application scope.&lt;/p&gt;
&lt;p&gt;Also, it might be good to be able to encode some sort of id that can be used to tell whether the state belongs to a certain render request or not in case something happens and the render does not follow the action for which is was intended.�� This could happen as a result of a network hickup on a remote (WSRP) portal, but I&amp;#8217;m hoping that in such curcumstances portals are able to recover better.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/scottobryan.wordpress.com/28/" /&gt; &lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/scottobryan.wordpress.com/28/" /&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scottobryan.wordpress.com/28/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scottobryan.wordpress.com/28/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scottobryan.wordpress.com/28/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scottobryan.wordpress.com/28/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scottobryan.wordpress.com/28/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scottobryan.wordpress.com/28/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scottobryan.wordpress.com/28/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scottobryan.wordpress.com/28/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scottobryan.wordpress.com/28/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scottobryan.wordpress.com/28/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scottobryan.wordpress.com&amp;blog=4005520&amp;post=28&amp;subd=scottobryan&amp;ref=&amp;feed=1" /&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 03 Jul 2008 13:00:00 CDT</pubDate>
      <guid isPermaLink="true">http://scottobryan.wordpress.com/?p=28</guid>
      <dc:creator>Scott  O'Bryan</dc:creator>
    </item>
    <item>
      <title>Across the bridge [Flickr]</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124227&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/people/aarongustafson/"&gt;Aaron Gustafson&lt;/a&gt; posted a photo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/aarongustafson/2634122288/" title="Across the bridge"&gt;&lt;img src="http://farm4.static.flickr.com/3156/2634122288_fe5a3f1817_m.jpg" width="240" height="180" alt="Across the bridge" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EasyReader/~4/325853337" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 03 Jul 2008 11:00:00 CDT</pubDate>
      <guid isPermaLink="true">tag:flickr.com,2005:/photo/2634122288</guid>
      <dc:creator>Aaron Gustafson</dc:creator>
    </item>
    <item>
      <title>Links for 2008-07-02 [ma.gnolia]</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124223&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://uk.youtube.com/watch?v=9qCySJG_xrg"&gt;Composition&lt;/a&gt;&lt;br/&gt;
&lt;p&gt;&lt;a href="http://uk.youtube.com/watch?v=9qCySJG_xrg"&gt;&lt;img alt="Composition" src="http://ma.gnolia.com/bookmarks/vufashota/thumbnail" /&gt;&lt;/a&gt;&lt;/p&gt;
                
&lt;p&gt;Somewhere in this film is one of my photos of the Sydney Opera House. Very cool short film.&lt;/p&gt;

&lt;p&gt;Saved By: &lt;a href="http://ma.gnolia.com/people/aarongustafson" title="Visit Aaron Gustafson on Ma.gnolia"&gt;Aaron Gustafson&lt;/a&gt; | &lt;a href="http://ma.gnolia.com/people/aarongustafson/bookmarks/vufashota" title="View Composition on Ma.gnolia"&gt;View Details&lt;/a&gt; | &lt;a href="http://ma.gnolia.com/bookmarks/vufashota/thanks/feed/confirm"&gt;Give Thanks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://ma.gnolia.com/people/aarongustafson/tags/%22Sydney+Opera+House%22" rel="tag" title="Find aarongustafson bookmarks tagged '&amp;quot;Sydney Opera House&amp;quot;'"&gt;"Sydney Opera House"&lt;/a&gt;, &lt;a href="http://ma.gnolia.com/people/aarongustafson/tags/film" rel="tag" title="Find aarongustafson bookmarks tagged 'film'"&gt;film&lt;/a&gt;, &lt;a href="http://ma.gnolia.com/people/aarongustafson/tags/creative+commons" rel="tag" title="Find aarongustafson bookmarks tagged 'creative commons'"&gt;creative commons&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/EasyReader/~4/325484279" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 03 Jul 2008 08:00:00 CDT</pubDate>
      <guid isPermaLink="true">http://ma.gnolia.com/people/aarongustafson/bookmarks#2008-07-02</guid>
      <dc:creator>Aaron Gustafson</dc:creator>
    </item>
    <item>
      <title>Hidden folders in OS X file dialogs</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124211&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;Found a good shortcut for getting access to hidden folders in OS X file dialogs and the Finder. It requires some typing and it doesn&amp;#8217;t auto-complete like Linux does, but it is better than nothing. Just hit Shift-Command-G to open the &amp;#8220;Go To Folder&amp;#8221; dialog and then type the path to the hidden file or folder. The path can be relative.&lt;/p&gt;
&lt;p&gt;Now, just need to figure out how to access hidden files from the Finder and file dialogs.&lt;/p&gt;</description>
      <pubDate>Wed, 02 Jul 2008 16:00:00 CDT</pubDate>
      <guid isPermaLink="true">http://brian.pontarelli.com/2008/07/01/hidden-folders-in-os-x-file-dialogs/</guid>
      <dc:creator>Brian Pontarelli</dc:creator>
    </item>
    <item>
      <title>Compass 2.1.0 M1 Released</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124214&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;&lt;a href="http://www.compass-project.org"&gt;Compass&lt;/a&gt; version 2.1.0 M1 released. The release includes several features including a much improved XSEM support (namespace xpath, better stax integration, jdom integration), &lt;a href="http://www.kimchy.org/dynamic-mappings-settings-with-compass/"&gt;Dynamic mappings removal and additions&lt;/a&gt;, &lt;a href="http://www.kimchy.org/json-mappings-with-compass/"&gt;JSEM - JSON to Search Engine Mapping&lt;/a&gt; support, and &lt;a href="http://www.kimchy.org/collocated-indexing-and-distributed-search-with-gigaspaces/"&gt;Collocated integration and distributed search with GigaSpaces&lt;/a&gt;. It also includes several bug fixes (with the important ones backported to 2.0 branch). Enjoy!.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/kimchyblog/~4/324347569" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 02 Jul 2008 13:00:01 CDT</pubDate>
      <guid isPermaLink="true">http://www.kimchy.org/compass-210-m1-released/</guid>
      <dc:creator>Shay Banon</dc:creator>
    </item>
    <item>
      <title>Where the hell is Matt?</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124216&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.wherethehellismatt.com/videos.shtml?fbid=B5TuEj"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_HOfY71whEUc/SGuUHmPlrCI/AAAAAAAAAF8/m7DZXMi5gh8/s320/wherethehellismatt.jpg" alt="" id="BLOGGER_PHOTO_ID_5218427451484777506" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.wherethehellismatt.com/videos.shtml?fbid=B5TuEj"&gt;I really needed this today&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;"Matt is a 31-year-old deadbeat from Connecticut who used to think that all he ever wanted to do in life was make and play videogames. Matt achieved this goal pretty early and enjoyed it for a while, but eventually realized there might be other stuff he was missing out on. In February of 2003, he quit his job in Brisbane, Australia and used the money he'd saved to wander around Asia until it ran out. He made this site so he could keep his family and friends updated about where he is.A few months into his trip, a travel buddy gave Matt an idea. They were standing around taking pictures in Hanoi, and his friend said "Hey, why don't you stand over there and do that dance. I'll record it." He was referring to a particular dance Matt does. It's actually the only dance Matt does. He does it badly. Anyway, this turned out to be a very good idea."&lt;br /&gt;                                                   - Patrick Drury</description>
      <pubDate>Wed, 02 Jul 2008 11:00:00 CDT</pubDate>
      <guid isPermaLink="true">tag:blogger.com,1999:blog-7867849070722123199.post-5966389776808303075</guid>
      <dc:creator>Richard Monson-Haefel</dc:creator>
    </item>
    <item>
      <title>It’s ok to wet yourself every once in awhile</title>
      <link>http://www.nofluffjuststuff.com/blog_detail.jsp?rssItemId=124215&amp;utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;Dan North, the veritable progenitor of &lt;a href="http://dannorth.net/introducing-bdd"&gt;behavior driven development&lt;/a&gt; (or BDD), &lt;a href="http://dannorth.net/2008/06/let-your-examples-flow"&gt;recently blogged&lt;/a&gt; about unnecessary &lt;a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself"&gt;DRY&lt;/a&gt;ness (meaning don&amp;#8217;t repeat yourself) with respect to &lt;em&gt;clarity of intent&lt;/em&gt; when it comes to testing (in generic terms of the word). Essentially, in the case of a &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt; test, for example, by utilizing a &lt;code&gt;setUp&lt;/code&gt; method and  possibly other helper methods, the test itself becomes somewhat cluttered&amp;#8211; one must jump around the code to truly understand the intention of the test in the first place. &lt;img style="PADDING-LEFT: 0.5em; PADDING-RIGHT: 1.0em; PADDING-TOP: 1.0em; FLOAT: LEFT; PADDING-BOTTOM: 1.0em" src="http://thediscoblog.com/images/shhh.jpg" alt="shh!" width="384" height="263"/&gt;&lt;/p&gt;
&lt;p&gt;In fact, Dan says it quite nicely&amp;#8211; tests (or stories, baby) are:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
&amp;#8220;examples [that] tell a story about what the code does&amp;#8230; [and] clarity of intent is found in the quality of the narrative, not necessarily in minimising duplication.&amp;#8221;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Thus, over &lt;em&gt;utilizing&lt;/em&gt; the DRY principle can be ineffective when it comes to testing; indeed, he makes a great point! If tests or stories are intended to serve as &amp;#8220;executable documention&amp;#8221; doesn&amp;#8217;t it make sense to make them as easy to read and understand as possible?  &lt;/p&gt;
&lt;p&gt;As such, because it&amp;#8217;s my bag, I took the liberty of pondering the depth of favored term DRY and decided that when it comes to clearly expressing intent with respect to stories (as in the case of &lt;a href="http://easyb.org/"&gt;easyb&lt;/a&gt;) or tests, it often pays to be &lt;em&gt;WET&lt;/em&gt;&amp;#8211; that is, &lt;u&gt;w&lt;/u&gt;holly &lt;u&gt;e&lt;/u&gt;xpress your &lt;u&gt;t&lt;/u&gt;actics, baby. &lt;/p&gt;
&lt;p&gt;You see, applying WET to, say, an &lt;a href="http://easyb.org/howtos.html"&gt;easyb story&lt;/a&gt; then yields perhaps more &lt;em&gt;text&lt;/em&gt;, but it leaves no room for misinterpretation, man. For example, imagine a story regarding discounts (this is my touchstone example that is in danger of itself becoming dry&amp;#8211; no pun intended either, man). The high level story is such that VIP customers receive varying discounts depending on the amount of money a particular order has&amp;#8211; you could even require a minimum number of items too (if you were attempting to move inventory). Thus, one scenario could be:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;scenario "VIP customer with 3 items, over $30 receiving 10% discount", {
  given "a VIP customer"
  and "given they have at least 3 items totaling over $30"
  when "they proceed to checkout"
  then "they should receive a 10% discount"
} &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Of course, from here, stakeholders, through a collaborative effort, realize more scenarios are possible&amp;#8211; for instance, the VIP customer has 3 items totaling over $100&amp;#8211; thus, a higher discount is applied. A first stab of staying WET (that is, &lt;u&gt;w&lt;/u&gt;holly &lt;u&gt;e&lt;/u&gt;xpressing your &lt;u&gt;t&lt;/u&gt;actics, man) yields this scenario: &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;scenario "VIP customer with 3 items, over $100 receiving 15% discount", {
  given "a VIP customer"
  and "given they have at least 3 items totaling over $100"
  when "they proceed to checkout"
  then "they should receive a 15% discount"
} &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Reading these scenarios (which are executable, by the way!) leaves no room for missing the boat&amp;#8211; the tactics involved are wholly expressed!!&amp;#8211; reading them is somewhat effortless from the standpoint that you don&amp;#8217;t necessarily need to jump around the file to gain a clear understanding of context. &lt;/p&gt;
&lt;p&gt;If you prefer staying DRY, the story can become more concise&amp;#8211; &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;before_each "a VIP customer with 3 items is assumed", {
  given "a VIP customer"
  and "given they have at least 3 items"
}

scenario "VIP customer with 3 items, over $30 receiving 10% discount", {
  given "the 3 items total at least $30"
  when "they proceed to checkout"
  then "they should receive a 10% discount"
} 

scenario "VIP customer with 3 items, over $100 receiving 15% discount", {
  given "the 3 items total at least $100"
  when "they proceed to checkout"
  then "they should receive a 15% discount"
} &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Both stories convey intent&amp;#8211; it is just that the WET one is more clearly expressed&amp;#8211; in the DRY example, as more and more scenarios are added (and they surely will), one needs to jump to the top to gain an understanding of the underlying assumption (that is, a VIP customer with 3 items in their shopping cart). &lt;/p&gt;
&lt;p&gt;DRY is fundamentally a sound principle&amp;#8211; I&amp;#8217;m not here to deny that; however, like all good things, it can be overused without regard for a particular situation. In fact, &lt;a href="http://en.wikipedia.org/wiki/Goethe"&gt;Johann Wolfgang von Goethe&lt;/a&gt; (of Faust fame, baby) is quoted thus: &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
&amp;#8220;The phrases that men hear or repeat continually, end by becoming convictions and ossify the organs of intelligence.&amp;#8221;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Because it is everyone&amp;#8217;s bag, baby, think through DRYness from time to time and realize that in some cases, it is perfectly acceptable to WET yourself (I mean, to practice WET).  Can you dig it, man?&lt;/p&gt;
 &lt;p&gt;&lt;center&gt;I also blog at &lt;a href="http://www.testearly.com"&gt;testearly.com&lt;/a&gt; | &lt;a href="http://www.stelligent.com/"&gt;My company&lt;/a&gt; is &lt;a href="http://www.stelligent.com/content/view/8/39/"&gt;hiring gurus&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 02 Jul 2008 08:00:00 CDT</pubDate>
      <guid isPermaLink="true">http://thediscoblog.com/2008/07/02/its-ok-to-wet-yourself-every-once-in-awhile/</guid>
      <dc:creator>Andrew Glover</dc:creator>
    </item>
  </channel>
</rss>

