<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Shaun Smith</title>
	<atom:link href="http://shaun.boyblack.co.za/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://shaun.boyblack.co.za/blog</link>
	<description>Flex, Ruby, Mongo - London, UK</description>
	<lastBuildDate>Fri, 30 Mar 2012 15:35:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Flex App Scaling Issue</title>
		<link>http://shaun.boyblack.co.za/blog/2012/03/29/flex-app-scaling-issue/</link>
		<comments>http://shaun.boyblack.co.za/blog/2012/03/29/flex-app-scaling-issue/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 21:25:18 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=1098</guid>
		<description><![CDATA[Just in case you were silly enough to deploy a fullscreen Flash/Flex app to the web, browse to it on a Flash enabled mobile device or tablet, and expect it to look nice: To be fair, it&#8217;s not a Flash/Flex issue at all, but rather a mobile browser detail worth knowing about: http://www.html-5.com/metatags/index.html#viewport-meta-tag Essentially, mobile browsers assume a default viewport width of 980px at 72dpi for any given web page and scale the content according to the actual device DPI. &#8230; <a href="http://shaun.boyblack.co.za/blog/2012/03/29/flex-app-scaling-issue/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Just in case you were silly enough to deploy a fullscreen Flash/Flex app to the web, browse to it on a Flash enabled mobile device or tablet, and expect it to look nice:</p>
<div id="gist-2243929" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="nt">&lt;meta</span> <span class="na">name=</span><span class="s">&quot;viewport&quot;</span> <span class="na">content=</span><span class="s">&quot;width=device-width, initial-scale=1.0,</span></div><div class='line' id='LC2'><span class="s">  minimum-scale=1.0, maximum-scale=1.0, user-scalable=no,</span></div><div class='line' id='LC3'><span class="s">  target-densitydpi=device-dpi&quot;</span><span class="nt">/&gt;</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/2243929/4688cfa1de671d838182968fcb8852a17f18f21a/gistfile1.html" style="float:right;">view raw</a>
            <a href="https://gist.github.com/2243929#file_gistfile1.html" style="float:right;margin-right:10px;color:#666">gistfile1.html</a>
            <a href="https://gist.github.com/2243929">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>To be fair, it&#8217;s not a Flash/Flex issue at all, but rather a mobile browser detail worth knowing about:</p>
<p><a href="http://www.html-5.com/metatags/index.html#viewport-meta-tag">http://www.html-5.com/metatags/index.html#viewport-meta-tag</a></p>
<p>Essentially, mobile browsers assume a default viewport width of 980px at 72dpi for any given web page and scale the content according to the actual device DPI.</p>
<p>Good for HTML; probably not want you want for your fullscreen Flash/Flex app. Use the tag above to prevent scaling.</p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2012/03/29/flex-app-scaling-issue/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Level Up</title>
		<link>http://shaun.boyblack.co.za/blog/2012/03/12/level-up/</link>
		<comments>http://shaun.boyblack.co.za/blog/2012/03/12/level-up/#comments</comments>
		<pubDate>Mon, 12 Mar 2012 16:58:14 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[learning]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=1086</guid>
		<description><![CDATA[Holy crap, it&#8217;s only a week away! What surprised me most about the first Try { Harder } was just how intense the whole thing was. At other conferences you can often just sit back and learn at your own pace (provided the material is actually technical enough to keep you interested). T{H}2011 was different. I remember feeling completely exhausted at the end of each day &#8211; but it was accompanied by that lovely feeling you get when you know &#8230; <a href="http://shaun.boyblack.co.za/blog/2012/03/12/level-up/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Holy crap, it&#8217;s only a week away!</p>
<p>What surprised me most about the first <a title="Try Harder" href="http://www.tryharder.org.uk/">Try { Harder }</a> was just how intense the whole thing was. At other conferences you can often just sit back and learn at your own pace (provided the material is actually technical enough to keep you interested). <a href="http://www.tryharder.org.uk/how-try-harder-works/tryharder-2011/">T{H}2011</a> was different.<span id="more-1086"></span></p>
<p>I remember feeling completely exhausted at the end of each day &#8211; but it was accompanied by that lovely feeling you get when you know you&#8217;ve worked and grown as much as you can in a single day. Sleep is pretty epic after days like that!</p>
<p>However, it wasn&#8217;t just the talks and workshops that did this, it was meeting and talking to those folks whose blogs you read. Those people who you chat to on twitter but haven&#8217;t met in real life. That was, perhaps, the best part for me.</p>
<p>Now, I&#8217;m not the most social person in the world at the best of times, so this aspect was also quite overwhelming. Fortunately the week started off with an amazing talk that helped put everyone at ease. I can&#8217;t share the details but everyone agreed: it was the perfect way to reduce the inevitable resultant anxiety of a bunch of smart nerds meeting each other for the first time. This is just one example of the thought that went into the conference as a whole.</p>
<h3>Try { Harder } Level Up: 19th &#8211; 23rd March 2012</h3>
<p>I believe there are a couple of spots left for T{H}LU. If you can, you should come join us next week. It&#8217;ll be fun!</p>
<p><a href="http://www.tryharder.org.uk/level-up-2012/">http://www.tryharder.org.uk/level-up-2012/</a></p>
<p><strong>Update</strong>: Pricing for freelancers has dropped to £699 (including accommodation).</p>
<p><strong>Update2</strong>: <a href="http://www.jetbrains.com/">JetBrains</a> are supporting the event by offering personal licences of <a href="http://www.jetbrains.com/idea/">IntelliJ IDEA</a> to all attendees!</p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2012/03/12/level-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Readme</title>
		<link>http://shaun.boyblack.co.za/blog/2012/02/04/readme/</link>
		<comments>http://shaun.boyblack.co.za/blog/2012/02/04/readme/#comments</comments>
		<pubDate>Sat, 04 Feb 2012 17:04:25 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Banter]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Resources]]></category>
		<category><![CDATA[Robotlegs]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[readme]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=1069</guid>
		<description><![CDATA[Have I mentioned that I love GitHub? When you put a readme file into a folder that file is formatted and presented nicely through GitHub&#8217;s file browser. For example: https://github.com/visionmedia/uikit Scrolling down a little we can see a nicely formatted readme file. GitHub strongly recommends adding a readme file to the root of your repository, but what I didn&#8217;t realise until recently was that it works for any folder in your repo. GitHub already has the best online file browser &#8230; <a href="http://shaun.boyblack.co.za/blog/2012/02/04/readme/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Have I mentioned that I love <a href="https://github.com/">GitHub</a>?</p>
<p>When you put a readme file into a folder that file is formatted and presented nicely through GitHub&#8217;s file browser. For example:</p>
<p><a href="https://github.com/visionmedia/uikit">https://github.com/visionmedia/uikit</a></p>
<p>Scrolling down a little we can see a nicely formatted readme file.<span id="more-1069"></span></p>
<p>GitHub strongly recommends adding a readme file to the root of your repository, but what I didn&#8217;t realise until recently was that it works for any folder in your repo. GitHub already has the best online file browser out there, but this specific feature can turn your source tree into your documentation.</p>
<p>For <a href="https://github.com/robotlegs/robotlegs-framework">Robotlegs 2</a> I decided to try it out:</p>
<p><a href="https://github.com/darscan/robotlegs-framework/tree/version2/src/robotlegs/bender/core/async">Async</a><br />
<a href="https://github.com/darscan/robotlegs-framework/tree/version2/src/robotlegs/bender/core/messaging">MessageDispatcher</a><br />
<a href="https://github.com/darscan/robotlegs-framework/tree/version2/src/robotlegs/bender/extensions">Extensions</a></p>
<p>Almost every package in the entire repo has a readme file. The best way to learn about Robotlegs 2 is to browse the <a href="https://github.com/robotlegs/robotlegs-framework">source and readme files</a> on GitHub.</p>
<p><img class="alignnone size-full wp-image-1075" title="github-logo" src="http://shaun.boyblack.co.za/blog/wp-content/uploads/2012/02/github-logo.png" alt="" width="512" height="512" /></p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2012/02/04/readme/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>RL Reloaded</title>
		<link>http://shaun.boyblack.co.za/blog/2012/01/23/rl-reloaded/</link>
		<comments>http://shaun.boyblack.co.za/blog/2012/01/23/rl-reloaded/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 12:03:13 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Banter]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Robotlegs]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=1023</guid>
		<description><![CDATA[I&#8217;ve been worried for quite a long time. Robotlegs 1 is small and simple but a little difficult to extend. I want Robotlegs 2 to be flexible without becoming overly large or complex. Timing To extend any framework you need to be able to hook into that framework&#8217;s initialization process. That Damned Context The Robotlegs 1 context class was, to be frank, rubbish &#8211; it set defaults, configured dependencies and controlled initialization. Worse, to hook into the initialization process or &#8230; <a href="http://shaun.boyblack.co.za/blog/2012/01/23/rl-reloaded/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been worried for quite a long time. <a href="http://www.robotlegs.org/">Robotlegs 1</a> is small and simple but a little difficult to extend. I want <a href="https://github.com/robotlegs/robotlegs-framework">Robotlegs 2</a> to be flexible without becoming overly large or complex.</p>
<h2>Timing</h2>
<p>To extend any framework you need to be able to hook into that framework&#8217;s initialization process.</p>
<h2>That Damned Context</h2>
<p>The Robotlegs 1 context class was, to be frank, rubbish &#8211; it set defaults, configured dependencies and controlled initialization. Worse, to hook into the initialization process or change the defaults, users had to extend the class itself resulting in the proliferation of funny looking words like SignalDrivenCovariantlyMediatedModularShellContext.<span id="more-1023"></span></p>
<h2>How Could You Let That Happen?</h2>
<p>Extending the context was a silly idea &#8211; and I knew it at the time. It made me sad, deep down inside, but I knew that if I waited for a better solution to emerge the framework might never ship.</p>
<p>Also, my goals for Robotlegs 1 were:</p>
<p>1. Make it small<br />
2. Make it fast<br />
3. Release it</p>
<p>A ton of compromises were made to keep the number of classes down to an absolute minimum. That&#8217;s not how I usually write code. Besides&#8230;</p>
<h2>Small Only Goes So Far</h2>
<p>I always start by doing the simplest thing possible &#8211; it&#8217;s a good way to feel out a problem space. &#8220;<strong>What</strong> am I trying to do?&#8221;. The &#8220;<strong>how</strong>&#8221; doesn&#8217;t matter yet, but becomes important much later when I ask &#8220;How would I <strong>like</strong> to do this?&#8221;.</p>
<p>When writing actual code, however, I&#8217;m constantly faced with this annoying question: &#8220;Should I break this out?&#8221;. When doing the simplest thing possible I often decide against extraction: I&#8217;ve got a specific task to complete (like getting a test to pass) and I can refactor later if the idea proves itself to be worthwhile. Also, I know that extraction inevitably leads to a new set of design decisions. And I&#8217;ll have to start with a test &#8211; for something whose purpose I am only just discovering. And it ups the class count.</p>
<p>Keeping class count down for it&#8217;s own sake is almost always a bad idea. However, I don&#8217;t think Robotlegs 1 would have experienced the same adoption if it had had hundreds of classes instead of the quite digestible 15 presently in its belly. OK, 24 total if you add the interfaces.</p>
<p>When browsing open source libraries I get happy feelings from projects with a limited number of source files &#8211; it gives me a sense that if I really wanted to I could read through the entire codebase and understand it.</p>
<p>But there&#8217;s a point where that simplicity inverts. Profit becomes debt. Without good abstractions in place every participant in the system ends up doing too much. At that point the question becomes: &#8220;Do I need to introduce a new layer of abstraction?&#8221;.</p>
<h2>Now You Have Two Problems</h2>
<p>The introduction of a system wide abstraction layer fueled by a mid feature code extraction will do one of two things: it will strengthen the system or it will weaken it. A bad abstraction might solve the immediate design issues (like duplication) just fine but end up adding complexity and reducing quality overall.</p>
<h2>Extensions? Timing?</h2>
<p>So anyway, I want Robotlegs to be extensible in a sensible way. Users should be able to install custom extensions easily. Those extensions need a way to hook into the context initialization process:</p>
<p>Some extensions may need to be configured before others. Some may need to pause the initialization process and wait for a resource to become available. Some might directly depend on others and may need to wait for those extensions to be fully configured before self initializing. Some may only come to life after the entire context has been initialized.</p>
<p>It&#8217;s clear that the initialization process needs to be asynchronous. But without a good abstraction in place for dealing with asynchronous processing the context will be burdened with co-ordinating a complex series of events. Event soup is not delicious.</p>
<h2>Events, Signals, Tokens, Tasks, Promises, Futures, Callbacks</h2>
<p>There are a number of patterns for dealing with asynchronous processes. They have wildly different properties.</p>
<p>Some are low level, like the callback pattern. Some are high level, like the promise pattern. Some are guaranteed to be asynchronous, while others have the potential to be synchronous. Some are only good for observing. Some can be terminated, while others can be suspended and resumed. Some can be composed and chained. Some necessitate the instantiation of throw-away objects and put stress on the garbage collector. Some put stress on the stack.</p>
<h2>Take Your Pick</h2>
<p>I wanted something fairly low level that enabled asynchronous processing without adding unnecessary overhead in the cases where things could be synchronous (or skipped entirely).</p>
<p>I tried a number of things. For the most part: floppy, verbose and annoying implementations that moved the core problems around in less-than-useful ways.</p>
<h2>Dispatch</h2>
<p>Slowly it dawned on me. In this case all I wanted was an asynchronous message dispatcher. With a well defined set of callback conventions I could write something resembling an Event Dispatcher but without the overhead of creating throw-away objects (events) and with the ability to suspend and resume the dispatch when desired:</p>
<p><a title="Async Conventions" href="https://github.com/robotlegs/robotlegs-framework/blob/version2/src/robotlegs/bender/core/async/readme.md">Some Async Conventions</a></p>
<p><a href="https://github.com/robotlegs/robotlegs-framework/blob/version2/src/robotlegs/bender/core/messaging/readme.md">The Message Dispatcher</a></p>
<h2>Initialization, Extension, Please Continue</h2>
<p>Very well. Suppose that context initialization comprises 3 steps: preInitialize, selfInitialize and postInitialize. When told to initialize the context moves through those steps in sequence. Anyone can listen in and halt the process as required at any point. What we end up with is in essence just a simple state machine where the observers have the potential to be guards.</p>
<h2>The End</h2>
<p>Well, that&#8217;s where the re-write started anyway.</p>
<p><a href="https://github.com/robotlegs/robotlegs-framework/tree/version2/src">Robotlegs 2</a></p>
<p><img class="alignnone size-full wp-image-1083" title="Robotlegs Logo" src="http://shaun.boyblack.co.za/blog/wp-content/uploads/2012/01/RobotlegsDrop512.png" alt="" width="512" height="512" /></p>
<p>p.s. I dropped a bunch of stuff from the version2 branch. I&#8217;ll be going back to pull out any functionality that might have been lost shortly. If you come across anything that&#8217;s missing feel free to adapt it to the new codebase and send a pull request. Or drop an issue on the tracker. For quick reference, here&#8217;s the old version2 branch: <a href="https://github.com/robotlegs/robotlegs-framework/tree/version2-old">version2-old</a></p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2012/01/23/rl-reloaded/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Unit Testing: My problem with assertThat()</title>
		<link>http://shaun.boyblack.co.za/blog/2012/01/12/unit-testing-my-problem-with-assertthat/</link>
		<comments>http://shaun.boyblack.co.za/blog/2012/01/12/unit-testing-my-problem-with-assertthat/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 02:35:00 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Banter]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[unit-testing]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=1017</guid>
		<description><![CDATA[I write &#8220;ass&#8221; a lot while I&#8217;m coding.]]></description>
			<content:encoded><![CDATA[<p>I write &#8220;ass&#8221; a lot while I&#8217;m coding.</p>
<p><img class="size-full wp-image-1018 alignleft" title="ass" src="http://shaun.boyblack.co.za/blog/wp-content/uploads/2012/01/ass.png" alt="" width="531" height="421" /></p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2012/01/12/unit-testing-my-problem-with-assertthat/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Commit Messages</title>
		<link>http://shaun.boyblack.co.za/blog/2011/11/09/commit-messages/</link>
		<comments>http://shaun.boyblack.co.za/blog/2011/11/09/commit-messages/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 18:29:56 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Banter]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=1009</guid>
		<description><![CDATA[When reviewing a commit I&#8217;m not interested in what you did. A commit is a codebase transformation. I&#8217;m interested in what will happen to my codebase when I apply your commit. Bad &#8220;I did this&#8221; form: I had a cup of coffee, went for a walk, and changed some code. &#160; Better &#8220;This commit does this&#8221; form: Adds unmap() to the command map API. A commit message should describe the commit, not the process you went through to create it &#8230; <a href="http://shaun.boyblack.co.za/blog/2011/11/09/commit-messages/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>When reviewing a commit I&#8217;m not interested in what you did. A commit is a codebase transformation. I&#8217;m interested in what will happen to my codebase when I apply your commit.</p>
<h4>Bad &#8220;I did this&#8221; form:</h4>
<pre>I had a cup of coffee, went for a walk, and changed some code.</pre>
<p>&nbsp;</p>
<h4>Better &#8220;This commit does this&#8221; form:</h4>
<pre>Adds unmap() to the command map API.</pre>
<p>A commit message should describe the commit, not the process you went through to create it &#8211; it is not a diary.</p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2011/11/09/commit-messages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unit Testing: Why I prefer assertThat()</title>
		<link>http://shaun.boyblack.co.za/blog/2011/11/08/unit-testing-why-i-prefer-assertthat/</link>
		<comments>http://shaun.boyblack.co.za/blog/2011/11/08/unit-testing-why-i-prefer-assertthat/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 17:57:41 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Banter]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[unit-testing]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=1003</guid>
		<description><![CDATA[Consider: [Test] public function null_criteria_should_not_match():void { assertFalse("passing null should return false", instance.match(null)); } When reading the test above I have to do a lot of scanning. First I see the string message in the middle because it jumps out. The message is redundant as it&#8217;s included in the test name. If I change the test I&#8217;ll need to change both the method name and the string description. I can see that the string message would be useful for a test &#8230; <a href="http://shaun.boyblack.co.za/blog/2011/11/08/unit-testing-why-i-prefer-assertthat/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Consider:</p>
<pre>[Test]
public function null_criteria_should_not_match():void
{
  assertFalse("passing null should return false", instance.match(null));
}</pre>
<p>When reading the test above I have to do a lot of scanning.<span id="more-1003"></span></p>
<p>First I see the string message in the middle because it jumps out. The message is redundant as it&#8217;s included in the test name. If I change the test I&#8217;ll need to change both the method name and the string description. I can see that the string message would be useful for a test with multiple asserts, but that&#8217;s generally not a good idea.</p>
<p>After reading the string I look to the right to see what is being tested and mentally try to evaluate it.</p>
<p>Then I look to the left to see what the expectation is, possibly flipping the evaluation I just did to match the expectation.</p>
<p>It&#8217;s disconnected, and it&#8217;s hard work.</p>
<p>Consider this instead:</p>
<pre>[Test]
public function null_criteria_should_not_match():void
{
  assertThat(matcher.match(null), isFalse());
}</pre>
<p>Now I just read normally: top-to-bottom, left-to-right. I read the test name, look at what is being evaluated and see what is expected.</p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2011/11/08/unit-testing-why-i-prefer-assertthat/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Show Me Your Tree!</title>
		<link>http://shaun.boyblack.co.za/blog/2011/08/16/show-me-your-tree/</link>
		<comments>http://shaun.boyblack.co.za/blog/2011/08/16/show-me-your-tree/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 18:26:12 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Questions]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[display list]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=996</guid>
		<description><![CDATA[What does your display list look like? While doing some work on multi-context view auto-wiring I wrote a little utility that iterates through the containers in a given display object container and builds some useful stats. If you have a moment I would love it if you could run it against your Flex or Flash app and post the results in the comments. Please also indicate whether you ran it against a single complex component or an entire app, and &#8230; <a href="http://shaun.boyblack.co.za/blog/2011/08/16/show-me-your-tree/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>What does your display list look like?</p>
<p>While doing some work on multi-context view auto-wiring I wrote a little utility that iterates through the containers in a given display object container and builds some useful stats.<span id="more-996"></span></p>
<p>If you have a moment I would love it if you could run it against your Flex or Flash app and post the results in the comments. Please also indicate whether you ran it against a single complex component or an entire app, and whether it was Flash, Flex or Mobile.</p>
<p>GitHub: <a href="https://github.com/darscan/boyblack-toolkit">https://github.com/darscan/boyblack-toolkit</a></p>
<p>ZIP download: <a href="http://shaun.boyblack.co.za/blog/wp-content/uploads/2011/08/boyblack-toolkit.zip">boyblack-toolkit</a></p>
<p>Usage:</p>
<pre>trace(new DocStats(doc));</pre>
<p>Sample output:</p>
<pre>Display Object Container Stats

All Container Stats
Containers:             521 total
Children per container: 8 max, 1.16 avg
Depths (distance):      29 max, 18.45 avg
Unique container types: 86 total

Unfiltered Container Stats
Containers:             153 total
Children per container: 8 max, 1.69 avg
Depths (distance):      26 max, 16.98 avg
Unique container types: 65 total

Filtered (mx., spark., flash.) Container Stats
Containers:             368 total
Children per container: 8 max, 0.94 avg
Depths (distance):      29 max, 19.07 avg
Unique container types: 21 total</pre>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2011/08/16/show-me-your-tree/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Robotlegs &#8211; The Book</title>
		<link>http://shaun.boyblack.co.za/blog/2011/08/10/robotlegs-the-book/</link>
		<comments>http://shaun.boyblack.co.za/blog/2011/08/10/robotlegs-the-book/#comments</comments>
		<pubDate>Wed, 10 Aug 2011 11:49:00 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Resources]]></category>
		<category><![CDATA[Robotlegs]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=993</guid>
		<description><![CDATA[It&#8217;s here! The ActionScript Developer’s Guide to Robotlegs: http://oreilly.com/catalog/0636920021216 Written by the amazing @stray_and_ruby and @jhooks]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s here! The ActionScript Developer’s Guide to Robotlegs:</p>
<p><a href="http://oreilly.com/catalog/0636920021216">http://oreilly.com/catalog/0636920021216</a></p>
<p>Written by the amazing <a href="http://www.xxcoder.net/actionscript-developers-guide-to-robotlegs-done">@stray_and_ruby</a> and <a href="http://joelhooks.com/2011/07/16/robotlegs-book-actionscript-developer%E2%80%99s-guide-to-robotlegs/">@jhooks</a></p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2011/08/10/robotlegs-the-book/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Why X Is Better Than Robotlegs</title>
		<link>http://shaun.boyblack.co.za/blog/2011/08/06/why-x-is-better-than-robotlegs/</link>
		<comments>http://shaun.boyblack.co.za/blog/2011/08/06/why-x-is-better-than-robotlegs/#comments</comments>
		<pubDate>Sat, 06 Aug 2011 21:31:14 +0000</pubDate>
		<dc:creator>shaun</dc:creator>
				<category><![CDATA[Inspiration]]></category>
		<category><![CDATA[Robotlegs]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://shaun.boyblack.co.za/blog/?p=985</guid>
		<description><![CDATA[While the core Robotlegs developers do some preparatory undercover work on Robotlegs 2, some adventurous Robotlegs users have decided to take things into their own hands and start building their own ideal frameworks. I think this is great. The best ideas will almost certainly make their way back into RL2 in some shape or form. Some things that these framework experiments will probably have in common: Support for the Mediator pattern Support for the Command pattern Display-list processing (auto-wire) Dependency &#8230; <a href="http://shaun.boyblack.co.za/blog/2011/08/06/why-x-is-better-than-robotlegs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>While the core Robotlegs developers do some preparatory undercover work on <a href="http://knowledge.robotlegs.org/discussions/suggestions/63-robotlegs-20-the-path-from-here">Robotlegs 2</a>, some adventurous Robotlegs users have decided to take things into their own hands and start building their own ideal frameworks. I think this is great. The best ideas will almost certainly make their way back into RL2 in some shape or form.<span id="more-985"></span></p>
<p>Some things that these framework experiments will probably have in common:</p>
<p>Support for the Mediator pattern<br />
Support for the Command pattern<br />
Display-list processing (auto-wire)<br />
Dependency Injection through <a href="https://github.com/tschneidereit/SwiftSuspenders">Swiftsuspenders</a></p>
<p>The first of these is <a href="https://github.com/squeedee/Boiler">Boiler</a> by <a href="http://devblog.vworkapp.com/">Rasheed Abdul-Aziz</a> (<a href="http://twitter.com/#!/squeedee">@squeedee</a>): <a href="http://devblog.vworkapp.com/post/8538689880/r">http://devblog.vworkapp.com/post/8538689880/r</a></p>
<p>Please have a look and give Squeedee some feedback. Some things that I like: convention over configuration, avoiding inheritance, the name!</p>
]]></content:encoded>
			<wfw:commentRss>http://shaun.boyblack.co.za/blog/2011/08/06/why-x-is-better-than-robotlegs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.616 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-05-10 19:19:46 -->
<!-- Compression = gzip -->
