<?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>moandji.blog</title>
	<atom:link href="http://blog.moandjiezana.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.moandjiezana.com</link>
	<description>chronicling myself</description>
	<lastBuildDate>Mon, 29 Mar 2010 08:27:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Eclipse shortcut of the day: Hippie Completion</title>
		<link>http://blog.moandjiezana.com/?p=43</link>
		<comments>http://blog.moandjiezana.com/?p=43#comments</comments>
		<pubDate>Mon, 29 Mar 2010 08:24:21 +0000</pubDate>
		<dc:creator>Moandji Ezana</dc:creator>
				<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://blog.moandjiezana.com/?p=43</guid>
		<description><![CDATA[Key binding: Alt /
Alt / is the “I’m feeling lucky” version of Ctrl Space. Instead of listing suggestions, it takes its best guess.
[via: Tor Norbye and Cédric Beust]
]]></description>
			<content:encoded><![CDATA[<p>Key binding: Alt /</p>
<p>Alt / is the “I’m feeling lucky” version of Ctrl Space. Instead of listing suggestions, it takes its best guess.</p>
<p><em>[via: <a href="http://blogs.sun.com/tor/entry/ide_tips">Tor Norbye</a> and <a href="http://beust.com/weblog2/archives/000258.html">Cédric Beust</a>]</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.moandjiezana.com/?feed=rss2&amp;p=43</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stats for 05/01/2009</title>
		<link>http://blog.moandjiezana.com/?p=36</link>
		<comments>http://blog.moandjiezana.com/?p=36#comments</comments>
		<pubDate>Tue, 05 Jan 2010 18:08:31 +0000</pubDate>
		<dc:creator>Moandji Ezana</dc:creator>
				<category><![CDATA[keziah]]></category>

		<guid isPermaLink="false">http://blog.moandjiezana.com/?p=36</guid>
		<description><![CDATA[
Weight: 4.700kg (+ 1.05kg)
Height: 53.5cm (+2cm)
]]></description>
			<content:encoded><![CDATA[<p><a href="http://moandjiezana.com/blog/wp-content/uploads/2010/01/PC265260-small.jpg"><img class="aligncenter size-medium wp-image-35" title="Super Keziah" src="http://moandjiezana.com/blog/wp-content/uploads/2010/01/PC265260-small-225x300.jpg" alt="Super Keziah" width="225" height="300" /></a></p>
<p>Weight: 4.700kg (+ 1.05kg)<br />
Height: 53.5cm (+2cm)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.moandjiezana.com/?feed=rss2&amp;p=36</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Devoxx 2OO9 &#8211; Day 1</title>
		<link>http://blog.moandjiezana.com/?p=29</link>
		<comments>http://blog.moandjiezana.com/?p=29#comments</comments>
		<pubDate>Thu, 19 Nov 2009 00:18:31 +0000</pubDate>
		<dc:creator>Moandji Ezana</dc:creator>
				<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://blog.moandjiezana.com/?p=29</guid>
		<description><![CDATA[http://www.devoxx.com/display/DV09/The+Java+EE+6++Platform The Java EE 6 Platform by Antonio Goncalves
A laundry list presentation of the new concepts, new specs and new features added to existing specs in JEE 6. It&#8217;s funny how &#8220;new&#8221; actually means &#8220;stuff that implementations (Hibernate, JSF libraries, etc.) have gotten right and that we&#8217;re importing.&#8221;
Antonio mentioned that the full JEE 6 spec [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">http://www.devoxx.com/display/DV09/The+Java+EE+6++Platform The Java EE 6 Platform by Antonio Goncalves</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">A laundry list presentation of the new concepts, new specs and new features added to existing specs in JEE 6. It&#8217;s funny how &#8220;new&#8221; actually means &#8220;stuff that implementations (Hibernate, JSF libraries, etc.) have gotten right and that we&#8217;re importing.&#8221;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Antonio mentioned that the full JEE 6 spec contains 28 other specs and is 8000 pages long! As Alex astutely pointed out to me afterwards, this essentially prevents new players from entering a market which has been reduced to essentially 3 (Weblogic/Oracle Server/GlassFish, WebSphere &amp; JBoss).</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Here&#8217;s where Web Profile http://www.devx.com/Java/Article/42351 comes to the rescue: a spec stripped down to the stuff that 80% of apps actually use. The fact that it can run in a JSE environment, coupled with a few new annotations (@Asynchronous, @Inject) make combine to make the EJB component model a lot more attractive than it has been until now. A lightweight server implementing it would be nice.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">If you speak french and want to hear more of Antonio, you should listen to the excellent Les CastCodeurs podcast and its all-star line-up.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">http://www.devoxx.com/display/DV09/Writing+Asynchronous+Web+application+%28Comet%29+using+the+Atmosphere+Framework Writing Asynchronous Web application (Comet) using the Atmosphere Framework by Jean-Francois Arcand and Paul Sandoz</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Atmosphere is a really nice framework to hide the http://java.dzone.com/articles/servlet-30-async-api-or ugliness of hand-coded server-side AJAX push and the bizarre workarounds necessary to get it to work in all browsers. For example, for it to work in WebKit, they initially return lots of &#8220;&lt;!&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8211;!&gt;&#8221;. As I said, bizarre.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Not much to say about this presentation, as it really was an introduction to the framework.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Distributed Programming the Google Way by Gregor Hohpe</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">This session divided into two parts: a brief presentation of some of Google&#8217;s infrastructure (Google File System, BigTable, MapReduce and Sawzall) and a discussion of the higher-level &#8220;Underlying Considerations&#8221; that drive their implementation. These were:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Sharding.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Less is more. Give up some features to gain others. e.g. BigTable abandons many fundamental features of relational databases to gain distribution and scalability.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Expect failure. Failure will happen, all the more frequently when running on vast clusters of commodity hardware. Coping mechanisms include replication, re-starting and even accepting certain forms of data loss.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Autonomy. Individual components should be able to survive the failure of a node by carrying on with the information they were able to retrieve. In GFS, clients look up chunk servers through a &#8220;master,&#8221; but read directly from the chunk server so that they can function even if the master subsequently fails.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Empower the runtime.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Favour Stateless.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Separate stateless from stateful.  Three related points. Higher-level, functional, declarative programming gives the runtime more freedom to optimise, parallelise, etc. Carefully decomposing and bounding stateful contexts from stateless ones has similar benefits. In general, this means separating data gathering and aggregation from data processing.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Precision vs. speed. You can&#8217;t always have both, so know when you need one or the other.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">While these points aren&#8217;t really new, it&#8217;s always interesting to hear about the kinds of architectural trade-offs you have to engage in once you reach a certain scale.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Fantom on the JVM (BOF)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">You may be wondering what &#8220;Fantom&#8221; is. It&#8217;s The Language Formerly Known As Fan http://fantom.org/. Although not quite as hyped as Scala, I feel like Java -&gt; Fantom is, from a language point of view, a much easier transition than Java -&gt; Scala. It just seems to try to solve a lot of everyday problems developers have through a fairly simple, pragmatic language.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">I&#8217;d looked at Fan(tom) before and nodded appreciatively, but  this whirlwind tour of its features boosted my desire to really dig into it. Some of the things I really like about it are the native JavaScript compiler, null-safe types, optional dynamic typing, the build system and, of course, the functional aspects. The time literals for hours, minutes, nanoseconds, etc. seem a little arbitrary and weird; I just hope the Fantom approach won&#8217;t lead to too many warts.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">They&#8217;re getting close to a 1.0 release, maybe adoption will start then.</div>
<p>Unfortunately, I arrived really late and missed the big announcement: closures in Java 7! Rejoice! (or <a href="http://puredanger.com/tech/2009/11/18/closures-after-all/">not</a>)</p>
<p>Below is a summary of what I did get to see.</p>
<h3><a href="http://www.devoxx.com/display/DV09/The+Java+EE+6++Platform">The Java EE 6 Platform</a> by Antonio Goncalves</h3>
<p>A laundry list presentation of the new concepts, new specs and additions to existing specs in JEE 6. It&#8217;s funny how &#8220;new&#8221; actually means &#8220;stuff that implementations (Hibernate, JSF libraries, etc.) have gotten right and that we&#8217;re importing.&#8221;</p>
<p>Apparently, the full JEE 6 spec contains 28 other specs and is 8000 pages long! As <a href="http://www.jroller.com/greenhorn/">Alex</a> astutely pointed out to me afterwards, this essentially prevents new players from entering a market which has been reduced to roughly 3 vendors (Weblogic/Oracle Server/GlassFish, WebSphere &amp; JBoss).</p>
<p>That&#8217;s where the <a href=" http://www.devx.com/Java/Article/42351">Web Profile</a> comes to the rescue: a spec stripped down to the stuff that 80% of web apps actually use. A lightweight server implementing it would be nice.</p>
<p>The fact that EJB 3.1 (a.k.a. EJB Lite) can run in a JSE environment and a few sweet new annotations (@Asynchronous, @Inject) make the EJB component model a lot more attractive than was, even in 3.0.</p>
<p>If you speak french and want to hear more of Antonio, you should listen to the excellent <a href="http://lescastcodeurs.org/">Les CastCodeurs podcast</a> and its all-star line-up.</p>
<h3><a href="http://www.devoxx.com/display/DV09/Writing+Asynchronous+Web+application+%28Comet%29+using+the+Atmosphere+Framework ">Writing Asynchronous Web application (Comet) using the Atmosphere Framework</a> by Jean-Francois Arcand and Paul Sandoz</h3>
<p>Atmosphere is framework that hides the <a href="http://java.dzone.com/articles/servlet-30-async-api-or">ugliness</a> of hand-coded server-side AJAX push and the bizarre workarounds necessary to get it to work in all browsers. For example, in WebKit, they must initially return lots of &#8220;&lt;!&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8211;!&gt;&#8221;. As I said, bizarre. Atmosphere also abstracts away server-specific implementations.</p>
<p>Not much to say about this presentation, as it really was an introduction to the framework, but it looked very clean and simple and played nicely with JAX-RS, which is a very good API.</p>
<h3><a href="http://www.devoxx.com/display/DV09/Distributed+Programming+the+Google+Way">Distributed Programming the Google Way</a> by Gregor Hohpe</h3>
<p>This session divided into two parts: a brief presentation of some of Google&#8217;s infrastructure (Google File System, BigTable, MapReduce and Sawzall) and a discussion of the higher-level &#8220;Underlying Considerations&#8221; that drive their implementation. These were:</p>
<ol>
<li>Sharding.</li>
<li>Less is more. Give up some features to gain others. e.g. BigTable abandons many fundamental features of relational databases to gain distribution and scalability.</li>
<li>Expect failure. Failure will happen, all the more frequently when running on vast clusters of commodity hardware. Coping mechanisms include replication, re-starting and even accepting certain forms of data loss.</li>
<li>Autonomy. Individual components should be able to survive the failure of a node by carrying on with the information they were able to retrieve. In GFS, clients look up chunk servers through a &#8220;master,&#8221; but read directly from the chunk server so that they can function even if the master subsequently fails.</li>
<li>Empower the runtime.</li>
<li>Favour Stateless.</li>
<li>Separate stateless from stateful. Three related points. Higher-level, functional, declarative programming gives the runtime more freedom to optimise, parallelise, etc. Carefully decomposing and bounding stateful contexts from stateless ones has similar benefits. In general, this means separating data gathering and aggregation (stateful) from data processing (stateless).</li>
<li>Precision vs. speed. You can&#8217;t always have both, so know when you need one or the other.</li>
</ol>
<p>While these points aren&#8217;t really new, it&#8217;s always interesting to hear about the kinds of architectural trade-offs you have to engage in at a certain scale.</p>
<h3><a href="http://www.devoxx.com/display/DV09/Fan+on+the+JVM">Fantom on the JVM</a> (BOF) by Dror Bereznitsky, Frederic Simon and uncredited English guy</h3>
<p>You may be wondering what &#8220;Fantom&#8221; is. It&#8217;s The Language Formerly Known As <a href="http://fantom.org/">Fan</a>. Although not quite as hyped as Scala, I feel Java -&gt; Fantom is, from a language point of view, a much easier transition than Java -&gt; Scala. Fantom seems to try to solve a lot of everyday problems developers have, in a fairly simple language with a relatively low learning curve.</p>
<p>I&#8217;d looked at Fan(tom) before and nodded appreciatively, but  this whirlwind tour of its features boosted my desire to really dig into it. Some of the things I really like are the native JavaScript compiler, null-safe types, optional dynamic typing, the build system and, of course, the functional aspects. The time literals for hours, minutes, nanoseconds, etc. seem a little arbitrary and weird; I just hope the Fantom approach won&#8217;t lead to too many warts.</p>
<p>They&#8217;re getting close to a 1.0 release, maybe adoption will start then.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.moandjiezana.com/?feed=rss2&amp;p=29</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Object-XML Mapping in Spring 3.0: when indirection gets out of hand</title>
		<link>http://blog.moandjiezana.com/?p=21</link>
		<comments>http://blog.moandjiezana.com/?p=21#comments</comments>
		<pubDate>Sun, 08 Nov 2009 21:12:31 +0000</pubDate>
		<dc:creator>Moandji Ezana</dc:creator>
				<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://blog.moandjiezana.com/?p=21</guid>
		<description><![CDATA[
Meet the Object/XML mapping support in Spring is an introduction to the Marshaller and Unmarshaller interfaces that have been rolled into Spring 3.0 from Spring WS.
In summary:

Application code uses the two interfaces and delegates the object-to-XML-and-back (or OXM) work to them.
The application context is configured to use Spring&#8217;s wrapper around an OXM framework.
The wrapper is [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://moandjiezana.com/blog/wp-content/uploads/2009/11/cookies.jpg"><img class="aligncenter size-medium wp-image-25" title="how many layers?" src="http://moandjiezana.com/blog/wp-content/uploads/2009/11/cookies-300x225.jpg" alt="how many layers?" width="300" height="225" /></a><a href="http://www.ibm.com/developerworks/java/library/x-springXOM/index.html?ca=drs-"><br />
Meet the Object/XML mapping support in Spring</a> is an introduction to the <a title="Spring WS OXM documentation" href="http://static.springsource.org/spring-ws/site/reference/html/oxm.html">Marshaller and Unmarshaller interfaces</a> that have been rolled into Spring 3.0 from Spring WS.</p>
<p>In summary:</p>
<ol>
<li>Application code uses the two interfaces and delegates the object-to-XML-and-back (or OXM) work to them.</li>
<li>The application context is configured to use Spring&#8217;s wrapper around an OXM framework.</li>
<li>The wrapper is injected into the bean.</li>
<li>The OXM framework also needs to be added to the classpath and configured.</li>
</ol>
<p>To me, there are two levels of indirection too many here, already. Add another level if the application wraps this up in an XmlService interface and corresponding implementation.</p>
<p>Furthermore, it turns out that the <a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html">abstraction is leaky</a>! From the Spring WS docs:</p>
<blockquote><p>Although the marshal method accepts a plain object as its first parameter, most Marshaller implementations cannot handle arbitrary objects. Instead, an object class must be mapped in a mapping file, registered with the marshaller, or have a common base class. Refer to the further sections in this chapter to determine how your O/X technology of choice manages this.</p></blockquote>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 339px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Note</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 339px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Although the marshal method accepts a plain object as its first parameter, most Marshaller implementations cannot handle arbitrary objects. Instead, an object class must be mapped in a mapping file, registered with the marshaller, or have a common base class. Refer to the further sections in this chapter to determine how your O/X technology of choice manages this.</div>
<p>Despite all that indirection, you still need to know which OXM is being used. If you have to know what you&#8217;re using, why not work more directly with the OXM and avoid the <a title="a paraphrase of Security Theater" href="http://en.wikipedia.org/wiki/Security_theater">decoupling theater</a>?</p>
<p>I would go so far as to argue that, not only is the indirection not buying you anything, it&#8217;s probably going to end up costing you, by making the application&#8217;s wiring more difficult to understand and maintain.</p>
<p>I&#8217;ve been working with <a href="http://code.google.com/p/google-guice/">Guice</a> of late. Its focus on programmatic configuration encourages you to  &#8221;touch&#8221; 3rd-party APIs directly. This feels lean and natural compared to Spring&#8217;s often unnecessary infinite indirection.</p>
<p>Apply DAO design to XML and you&#8217;ll find that a few simple methods are enough to decouple you from your OXM in the same way a DAO decouples your from your ORM. For example:</p>
<p>void save(Object entity) <span style="color: #008000;">// serialises to XML</span><br />
&lt;T&gt; T get(Class&lt;T&gt; myClass, String xml) <span style="color: #008000;">/* converts from XML to object of type T<br />
Replace String with File or InputStream as needed */</span></p>
<p>Even if for some bizarre reason you need two OXM frameworks at the same time, the XML DAO should be injected with both OXM classes and decide which one to use based on the class of the object passed into the save() method.</p>
<p>To be really fancy, apply the Interface Segregation Principle (<a href="http://www.objectmentor.com/resources/articles/isp.pdf">PDF</a>): have the XML DAO implement two interfaces and let clients choose the one they&#8217;re interested in. These might be drawn from the problem domain (UserXmlDao, ArticleXmlDao) or the solution domain (CastorXmlDao, JaxbXmlDao) [1].</p>
<p>In conclusion: indirection has advantages, but it also has a cost. Using it indiscriminately for trivial things leads to <a href="http://97-things.near-time.net/wiki/simplify-essential-complexity-diminish-accidental-complexity">accidental complexity</a> and confusion through over-engineering.</p>
<p>[1] See Tim Ottinger&#8217;s <a href="http://www.objectmentor.com/resources/articles/naming.htm">paper on variable naming</a> for the concept of problem and solution domains.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.moandjiezana.com/?feed=rss2&amp;p=21</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Unit-testing convenience methods</title>
		<link>http://blog.moandjiezana.com/?p=7</link>
		<comments>http://blog.moandjiezana.com/?p=7#comments</comments>
		<pubDate>Thu, 05 Nov 2009 02:13:10 +0000</pubDate>
		<dc:creator>Moandji Ezana</dc:creator>
				<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://blog.moandjiezana.com/?p=7</guid>
		<description><![CDATA[An easy way to unit test convenience methods: bootstrap them with the already-tested methods they&#8217;re simplifying the interface of.
The advantage is that you&#8217;re doing state-based rather than interaction-based testing and the assertions are fairly readable (and would be even more so with FEST-Assert).

]]></description>
			<content:encoded><![CDATA[<p>An easy way to unit test convenience methods: bootstrap them with the already-tested methods they&#8217;re simplifying the interface of.</p>
<p>The advantage is that you&#8217;re doing state-based rather than interaction-based testing and the assertions are fairly readable (and would be even more so with <a href="http://fest.easytesting.org/assert/wiki/pmwiki.php">FEST-Assert</a>).</p>
<p><script src="http://gist.github.com/226640.js"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.moandjiezana.com/?feed=rss2&amp;p=7</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
