<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Jakub Korab</title>
	
	<link>http://www.jakubkorab.net</link>
	<description>Tech, Opinion, and Doing Stuff</description>
	<lastBuildDate>Tue, 13 Oct 2009 22:22:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/JakubKorab" type="application/rss+xml" /><feedburner:browserFriendly></feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>A Better Builder</title>
		<link>http://www.jakubkorab.net/2009/10/a-better-builder.html</link>
		<comments>http://www.jakubkorab.net/2009/10/a-better-builder.html#comments</comments>
		<pubDate>Tue, 13 Oct 2009 22:12:24 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.jakubkorab.net/?p=226</guid>
		<description><![CDATA[The builder pattern should be familiar to anyone who has needed to change data from one format to another. Often called assemblers, translators or similar, they&#8217;re found peppered throughout almost every project. The idea is pretty simple:


public class HouseBuilder {
    public House buildHouse(OtherHouseType otherHouse) {
        [...]]]></description>
			<content:encoded><![CDATA[<p>The builder pattern should be familiar to anyone who has needed to change data from one format to another. Often called assemblers, translators or similar, they&#8217;re found peppered throughout almost every project. The idea is pretty simple:
</p>
<p>
<pre class="brush: java;">public class HouseBuilder {
    public House buildHouse(OtherHouseType otherHouse) {
        House house = new House();
        // copy a whole bunch of properties from the otherHouse....
        for (OtherWallType otherWall : otherHouse.getWalls()) {
            house.addWall(buildWall(otherWall));
        }
        return house;
    }

    private Wall buildWall(OtherWallType otherWall) {
        Wall wall = new Wall();
        // copy another whole bunch of other properties....
        // do something fancy every third Tuesday of the month...
        for (OtherWindowType otherWindow : otherWall.getWindows()) {
            wall.addWindow(buildWindow(otherWindow));
        }
        return wall;
    }

    private Window buildWindow(OtherWindowType otherWindow) {
        Window window = new Window();
        // you get the idea....
        return window;
    }
}</pre>
</p>
<p> It&#8217;s OK for translating small object graphs, but for non-trivial work, these things can turn into huge heaving masses of code. Because they&#8217;re pretty quick to knock out, they&#8217;re generally untested as the above code doesn&#8217;t really lend itself to it. Take the buildWall() method above &#8211; you can&#8217;t really exercise the &#8220;every third Tuesday&#8221; case easily without running through buildHouse(), and then calling buildWindow(). It becomes a pain to construct the data model to pump into test cases, and as we know, anything that&#8217;s not easy or highly visible doesn&#8217;t get tested. Did I just say that? Oops. Sorry, industry secret.
</p>
<p>
One strategy that&#8217;s applied is to write builders for each object type, i.e. HouseBuilder, WallBuilder, WindowBuilder. These are then either wired together via dependency injection (ugly as it exposes internal mechanics), or hard-coded in with a setter to substitute a dependency at test time. There&#8217;s also the drawback of a morass of tiny classes proliferating in a package somewhere. Not necessarily a bad thing, but when doing this sort of work there&#8217;s typically a good amount of refactoring, as well as use of utility classes to enrich data when moving between formats. Personally, not a big fan of this approach.</p>
<p>So, here&#8217;s a cool little trick:</p>
<p>
<pre class="brush: java;">public class MuchImprovedHouseBuilder {
    private MuchImprovedHouseBuilder delegate;

    public MuchImprovedHouseBuilder() {
        delegate = this;
    }

    void substituteInternalBuilder(MuchImprovedHouseBuilder otherBuilder) {
        delegate = otherBuilder;
    }

    public House buildHouse(OtherHouseType otherHouse) {
        House house = new House();
        // copy a whole bunch of properties from the otherHouse....
        for (OtherWallType otherWall : otherHouse.getWalls()) {
            house.addWall(delegate.buildWall(otherWall));
        }
        return house;
    }

    Wall buildWall(OtherWallType otherWall) {
        Wall wall = new Wall();
        // copy another whole bunch of other properties....
        // do something fancy every third Tuesday of the month...
        for (OtherWindowType otherWindow : otherWall.getWindows()) {
            wall.addWindow(delegate.buildWindow(otherWindow));
        }
        return wall;
    }

    Window buildWindow(OtherWindowType otherWindow) {
        Window window = new Window();
        // you get the idea....
        return window;
    }
}</pre>
</p>
<p>All of the translation is done in one builder class. On construction, a private field defines a &#8220;delegate&#8221;. Think of it as a placeholder that will do the &#8220;other bits&#8221; of the translation and set it to &#8220;this&#8221;. A package scoped setter allows a test to overwrite the builder with a mock. So with a bit of reference fiddling, we can then test one method at a time, without having to worry about the implementation details of the other methods in the class. All of the non-public methods are given package scope, so they can be tested straight out of your favourite test framework. So, you can now do this in live code:</p>
<p>
<pre class="brush: java;">
HouseBuilder builder = new HouseBuilder();
House house = builder.build(otherHouseType);
</pre>
</p>
<p>And at the same time write tests like this:</p>
<p>
<pre class="brush: java;">
HouseBuilder builder = new HouseBuilder();
HouseBuilder mockBuilder = EasyMock.createMock(HouseBuilder.class); // the classextension version of EasyMock
EasyMock.expect(mockBuilder.buildWindow(isA(OtherWindowType.class)).andReturn(new Window());
EasyMock.replay(mockBuilder);
builder.substituteInternalBuilder(mockBuilder);
Wall wall = builder.buildWall(otherWallType);
</pre>
</p>
<p>Simple, and you don&#8217;t have to stick in any new tools to achieve it.</p>
<p><img src="http://www.jakubkorab.net/wp-content/uploads/2009/10/bob_the_builder-231x300.jpg" alt="Bob&#039;s girlfriend misunderstood when he said his diet needed more iron." title="Bob&#039;s girlfriend misunderstood when he said his diet needed more iron." width="231" height="300" class="alignnone size-medium wp-image-238" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jakubkorab.net/2009/10/a-better-builder.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Shared Items – August 27, 2009</title>
		<link>http://www.jakubkorab.net/2009/08/shared-items-august-27-2009.html</link>
		<comments>http://www.jakubkorab.net/2009/08/shared-items-august-27-2009.html#comments</comments>
		<pubDate>Thu, 27 Aug 2009 13:31:53 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
				<category><![CDATA[reader]]></category>

		<guid isPermaLink="false">http://www.jakubkorab.net/2009/08/shared-items-august-27-2009.html</guid>
		<description><![CDATA[
Everything “Free” is Subsidized
August 27, 2009 &#8211; This is probably one of the most pressing issues of our time. It&#8217;s the reason why &#8220;proper journalism&#8221; is fading and why newspapers seem to have less and less actual content.
]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://feedproxy.google.com/~r/personalmba/~3/EP4ZwRnUZIA/">Everything “Free” is Subsidized</a></li>
<p>August 27, 2009 &#8211; This is probably one of the most pressing issues of our time. It&#8217;s the reason why &#8220;proper journalism&#8221; is fading and why newspapers seem to have less and less actual content.</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.jakubkorab.net/2009/08/shared-items-august-27-2009.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shared Items – August 11, 2009</title>
		<link>http://www.jakubkorab.net/2009/08/shared-items-august-11-2009.html</link>
		<comments>http://www.jakubkorab.net/2009/08/shared-items-august-11-2009.html#comments</comments>
		<pubDate>Tue, 11 Aug 2009 15:01:56 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
				<category><![CDATA[reader]]></category>

		<guid isPermaLink="false">http://www.jakubkorab.net/2009/08/shared-items-august-11-2009.html</guid>
		<description><![CDATA[
Are You Trying To Be a Robot?
August 7, 2009
Lost Generation
August 6, 2009 
]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://feedproxy.google.com/~r/personalmba/~3/K6onpRZpN34/">Are You Trying To Be a Robot?</a></li>
<p>August 7, 2009
<li><a href="http://feedproxy.google.com/~r/geeksAreSexyTechnologyNews/~3/V9yR3WVy5TA/">Lost Generation</a></li>
<p>August 6, 2009 </ul>
]]></content:encoded>
			<wfw:commentRss>http://www.jakubkorab.net/2009/08/shared-items-august-11-2009.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shared Items – August 4, 2009</title>
		<link>http://www.jakubkorab.net/2009/08/shared-items-august-4-2009.html</link>
		<comments>http://www.jakubkorab.net/2009/08/shared-items-august-4-2009.html#comments</comments>
		<pubDate>Tue, 04 Aug 2009 15:00:08 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
				<category><![CDATA[reader]]></category>

		<guid isPermaLink="false">http://www.jakubkorab.net/2009/08/shared-items-august-4-2009.html</guid>
		<description><![CDATA[
The Secret of World-Class Performance
August 3, 2009 &#8211; There&#8217;s an immortal truth here. One that my mum tried to get through to me when I was a kid, but which I didn&#8217;t understand until quite recently. Do what you enjoy or vice-versa. Everything else leads to mediocrity.
]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://feedproxy.google.com/~r/personalmba/~3/yYCMn7kzOgY/">The Secret of World-Class Performance</a></li>
<p>August 3, 2009 &#8211; There&#8217;s an immortal truth here. One that my mum tried to get through to me when I was a kid, but which I didn&#8217;t understand until quite recently. Do what you enjoy or vice-versa. Everything else leads to mediocrity.</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.jakubkorab.net/2009/08/shared-items-august-4-2009.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing the Untestable</title>
		<link>http://www.jakubkorab.net/2009/07/testing-the-untestable.html</link>
		<comments>http://www.jakubkorab.net/2009/07/testing-the-untestable.html#comments</comments>
		<pubDate>Tue, 28 Jul 2009 22:25:12 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
				<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.jakubkorab.net/?p=193</guid>
		<description><![CDATA[Once upon a time you got sick of writing code and having it fail when you ran, or someone else did, and you learned to unit test your code.
You read the JUnit docs, and wrote tests for those classes which contained discrete, self-contained code. And quickly realised that the world doesn&#8217;t work like that. 
Code [...]]]></description>
			<content:encoded><![CDATA[<p>Once upon a time you got sick of writing code and having it fail when you ran, or someone else did, and you learned to unit test your code.</p>
<p>You read the JUnit docs, and wrote tests for those classes which contained discrete, self-contained code. And quickly realised that the world doesn&#8217;t work like that. </p>
<p>Code relies on other code. Often very complex code. And you discovered dependency injection. You abstracted out the collaborating class, and injected it in to the code. Great! </p>
<p>Now you could use stubs &#8211; code which always behaves in a certain way &#8211; as part of your test, and discretely use them to test the top level code. Awesome! For about two weeks.</p>
<p>The stubs became too inflexible, and every time you changed the interface of the class being stubbed, you had to change the stub too. Not only that, having the stubbed code behave the same way every time was too inflexible. What if you need to test how the top-level code reacts when its collaborators throw errors? </p>
<p>So you looked on the net and you learned about mock objects. It was like getting into a hot bath. Now you could dynamically define the behaviour of collaborating classes in every test. You could test exception handling! Excellent! Until once again, it wasn&#8217;t. </p>
<p>Because the world doesn&#8217;t work like that. Your code style develops. You want to use other patterns, and behaviours, that don&#8217;t fit well with the idea of injection, and which are a code-level implementation detail. Sometimes you just want to instantiate a class and use it. And not have to test it along with the code that uses it. Maybe it&#8217;s builders. Maybe it&#8217;s a stream that you want to write to. Conversely, you don&#8217;t want to litter your Spring config with objects of a tiny ganularity just for the purposes of testing. And you find that your testing tools aren&#8217;t enough. Not only that, they are now driving the design of your code.</p>
<p>What if you could write code at the level of abstraction that makes sense to you? Static helper methods? Builders? Package private classes that get instantiated from inside your code? What if you want to wire the objects in your application at a granularity that makes sense? </p>
<p>&#8220;Surely, you must be smoking!&#8221; I hear you say. &#8220;That is a pipe dream reserved for dynamic language programmers, not us grunting around at the coalface in Java.&#8221; Well, actually, no. The latest generation of unit testing tools allow you to do just that! With Java!</p>
<p>JMockit is one of the latest toolkits in the evolutionary chain of mocking tools. It depends on the instrumentation APIs in Java 6 to enable behaviour that was previously unattainable. One of the prerequisites is that you are using the latest 1.6 JDK for your code, but if you are &#8211; rock and roll. Let me demonstrate:</p>
<p>Let&#8217;s say that you are writing an application that blatantly violates the trademarks of MTV&#8217;s favourite show and tricks out rubbish cars. Here&#8217;s your main code:</p>
<pre class="brush: java;">
package demo;

public class PimpingService {

    private CarDao carDao;

    public void setCarDao(CarDao tradeDao) {
        this.carDao = tradeDao;
    }

    /**
     * Loads a car and pimps it, saving it and returning.
     * representative of a lot of code out in the wild.
     *
     * @param carId The primary key of the car to load.
     * @return The pimped ride.
     */
    public Car pimpRide(Long carId) {
        Car unpimpedCar = carDao.findCar(carId);
        Car pimpedCar = PaintShop.resprayWithFlames(unpimpedCar);

        if (pimpedCar.getValue() &gt; 100000) {
            ElectronicsWizard wizard = new ElectronicsWizard(24);
            pimpedCar = wizard.makeFullySick(pimpedCar);
        }

        try {
            carDao.save(pimpedCar);
        } catch (IllegalStateException isx) {
            // roll back our changes
            pimpedCar = unpimpedCar;
        }
        return pimpedCar;
    }
}
</pre>
<p>You&#8217;ve got some pretty interesting usage patterns here:</p>
<ul>
<li>a dependency injected DAO</li>
<li>use of static methods</li>
<li>object instantiation</li>
</ul>
<p>The first is pretty straightforward to mock up, but the others, not so much.</p>
<p>Let&#8217;s take a look at the other classes:</p>
<pre class="brush: java;">
package demo;

public final class Car {
    private final Double value;

    public Car(Double value) {
        this.value = value;
    }

    public Double getValue() {
        return value;
    }
}
</pre>
<pre class="brush: java;">
package demo;

public class CarDao {

    /**
     * Finds a car by its primary key.
     * @param carId The primary key.
     * @return A car if found, or null.
     */
    public Car findCar(Long carId) {
        // normally there'd  be some kind of jdbc thing here
        return new Car(100000d);
    }

    /**
     * Saves a car.
     * @param car The car.
     */
    public void save(Car car) {
        // ...
    }
}
</pre>
<pre class="brush: java;">
package demo;

public class PaintShop {

    /**
     * Resprays a car, increasing its value.
     * @param car The car.
     * @return A resprayed version of the car.
     */
    public final static Car resprayWithFlames(Car car) {
        Car resprayedCar = new Car(car.getValue() * 2);
        return resprayedCar;
    }

}
</pre>
<pre class="brush: java;">
package demo;

public class ElectronicsWizard {

    private int multiplier;

    public ElectronicsWizard(int multiplier) {
        this.multiplier = multiplier;
    }

    /**
     * Makes a car fully sick.
     * @param car The car to make fully sick.
     * @return A fully sick car.
     */
    public Car makeFullySick(Car car) {
        return new Car(car.getValue() * multiplier);
    }

}
</pre>
<p>So, as we run the code, things happen. We first load the car, and then we keep changing its value depending on what operations we run on it.</p>
<p>Let&#8217;s exercise it using JUnit and JMockit. This code uses JUnit 4 and JMockit 0.98.</p>
<pre class="brush: java;">
package demo;

import mockit.Expectations;
import mockit.Mocked;
import mockit.integration.junit4.JMockit;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertSame;

@RunWith(JMockit.class)
public class TradeServiceTest {

    @Mocked
    private CarDao mockCarDao;
    @Mocked
    private ElectronicsWizard mockWizard;
    @Mocked
    private final PaintShop unusedMockPaintShop = null;
    private PimpingService pimpingService;

    @Before
    public void setUp() {
        pimpingService = new PimpingService();
        pimpingService.setCarDao(mockCarDao);
    }

    /**
     * Checks that happy path to pimping cars.
     */
    @Test
    public void testPimpRide() {
        final Long carId = 1L; // this is the id that we'll look up
        // the ride we'll expect to get back from the process
        final Car fullySickCar = new Car(300000.0);

        new Expectations() {
            { // static block

                // set an expectation on this mock that it will be invoked with
                // a car id
                mockCarDao.findCar(withEqual(carId));
                Car foundCar = new Car(100000.0);
                returns(foundCar); // return value from last mock call

                // this static method will be called next
                PaintShop.resprayWithFlames(withSameInstance(foundCar));
                Car resprayedCar = new Car(200000.0);
                returns(resprayedCar); // set its return value

                new ElectronicsWizard(24);
                returns(mockWizard);

                mockWizard.makeFullySick(withSameInstance(resprayedCar));
                returns(fullySickCar);

                // we're done
                mockCarDao.save(withSameInstance(fullySickCar));
            }
        };

        // all that's left is to invoke our service and see what happens
        Car resprayedCar = pimpingService.pimpRide(carId);
        assertSame(fullySickCar, resprayedCar);
    }

}
</pre>
<p>So what&#8217;s going on here?</p>
<ul>
<li>We import a few JMockit classes (line 11) to help us with the testing. Because of the way that JMockit operates, there are bits and pieces that are required to integrate the toolkit with the testing framework being used. Here, we import the JUnit version.</li>
<li>You need to create placeholders (lines 14-19) for each of the classes that you will be mocking, regardless of whether you want to instantiate them, such as in the case of our unusedMockPaintShop, on which we will just be calling static methods.</li>
<li>You define mock objects behaviour in an Expectations block. This makes use of a syntax similar to JMock, where all your code is defined in a static block (line 38). If you are used to EasyMock, you&#8217;ll immediately notice the change in style. You use static methods of the Expectations class immediately after the expected method calls to define how the mock object will behave. Line 44&#8217;s returns(foundCar) is an instruction for the mockCarDao used on line 42. </li>
</ul>
<p>The rest pretty much looks like a standard unit test. What about some different behaviour from the instantiated class?</p>
<pre class="brush: java;">
    /**
     * Checks that the electronics wizard won't get called in if the paintshop gives us a
     * car with a small value amount.
     */
    @Test
    public void testPimpRideElectronicsWizardNotCalled() {
        final Long carId = 1L;
        // the car we'll expect to get back - look at the new value
        final Car resprayedCar = new Car(50000.0);

        new Expectations() {
            {
                mockCarDao.findCar(withEqual(carId));
                Car foundCar = new Car(100000.0);
                returns(foundCar);

                PaintShop.resprayWithFlames(withSameInstance(foundCar));
                returns(resprayedCar);

                // its return value is &lt; 100,000 so no wizard here
                // if the wizard was invoked, you'd get an error:
                // Unexpected invocation of: demo.ElectronicsWizard#ElectronicsWizard(int)
                // it's @Mocked, remember?

                mockCarDao.save(withSameInstance(resprayedCar));
            }
        };

        Car tradeReturnedFromService = pimpingService.pimpRide(carId);
        assertSame(resprayedCar, tradeReturnedFromService);
    }
</pre>
<p>That&#8217;s all well and good. But what about testing how our code will handle exceptions?</p>
<pre class="brush: java;">
    /**
     * Checks that no wizard work will be done if respraying gives us a
     * car with a small value amount.
     */
    @Test
    public void testPimpRideElectronicsWizardNotCalledSavingBreaks() {
        final Long carId = 1L;
        final Car foundCar = new Car(100000.0);

        new Expectations() {
            {
                mockCarDao.findCar(withEqual(carId));
                returns(foundCar);

                PaintShop.resprayWithFlames(withSameInstance(foundCar));
                Car resprayedCar = new Car(50000.0);
                returns(resprayedCar);

                mockCarDao.save(withSameInstance(resprayedCar));
                // dao throws a humorous antipodean complaint here
                IllegalStateException isx = new IllegalStateException(&quot;Ooh bugger&quot;);
                throwsException(isx);
            }
        };

        Car tradeReturnedFromService = pimpingService.pimpRide(carId);
        // the service should have just returned the car it found
        assertSame(foundCar, tradeReturnedFromService);
    }
</pre>
<p>That&#8217;s nowhere near what you can do with JMockit, but it should give you a good taster. Code that was previously untestable, can now be dealt with as easily as a straightforward class with injected dependencies. Go forth and code in whatever way makes sense to you, DI or not, content in the knowledge that it&#8217;s all good and testable.</p>
<img alt="Man, am I happy I can test my code." src="http://www.buddytv.com/articles/pimp-my-ride/images/mad-mike-1.jpg" title="Mad Mike" width="200" height="150" />
]]></content:encoded>
			<wfw:commentRss>http://www.jakubkorab.net/2009/07/testing-the-untestable.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Shared Items – July 8, 2009</title>
		<link>http://www.jakubkorab.net/2009/07/shared-items-july-8-2009.html</link>
		<comments>http://www.jakubkorab.net/2009/07/shared-items-july-8-2009.html#comments</comments>
		<pubDate>Wed, 08 Jul 2009 15:08:24 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
				<category><![CDATA[reader]]></category>

		<guid isPermaLink="false">http://www.jakubkorab.net/2009/07/shared-items-july-8-2009.html</guid>
		<description><![CDATA[
The Game Doctor: Another Way to Make Kids Hate Their Parents
July 2, 2009 &#8211; My mum would have bought something like this. Super fail.
]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://feedproxy.google.com/~r/geeksAreSexyTechnologyNews/~3/zC5jrJXPPOw/">The Game Doctor: Another Way to Make Kids Hate Their Parents</a></li>
<p>July 2, 2009 &#8211; My mum would have bought something like this. Super fail.</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.jakubkorab.net/2009/07/shared-items-july-8-2009.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shared Items – July 1, 2009</title>
		<link>http://www.jakubkorab.net/2009/07/shared-items-july-1-2009.html</link>
		<comments>http://www.jakubkorab.net/2009/07/shared-items-july-1-2009.html#comments</comments>
		<pubDate>Wed, 01 Jul 2009 10:43:13 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
				<category><![CDATA[reader]]></category>

		<guid isPermaLink="false">http://www.jakubkorab.net/2009/07/shared-items-july-1-2009.html</guid>
		<description><![CDATA[
Android Gets Scripting Support with Python, Lua, Beanshell; Ruby planned
July 1, 2009 &#8211; Superb. Just as I get an Android phone it turns out that I may get to write Groovy code for it soon.
]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.infoq.com/news/2009/06/android-scripting">Android Gets Scripting Support with Python, Lua, Beanshell; Ruby planned</a></li>
<p>July 1, 2009 &#8211; Superb. Just as I get an Android phone it turns out that I may get to write Groovy code for it soon.</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.jakubkorab.net/2009/07/shared-items-july-1-2009.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shared Items – June 23, 2009</title>
		<link>http://www.jakubkorab.net/2009/06/shared-items-june-23-2009.html</link>
		<comments>http://www.jakubkorab.net/2009/06/shared-items-june-23-2009.html#comments</comments>
		<pubDate>Tue, 23 Jun 2009 15:00:09 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
				<category><![CDATA[reader]]></category>

		<guid isPermaLink="false">http://www.jakubkorab.net/2009/06/shared-items-june-23-2009.html</guid>
		<description><![CDATA[
Hemlock: Because immortality might not be such a good thing
June 22, 2009
Genetically Modified Turbine-Powered Rabbit
June 18, 2009 &#8211; Brilliant.
Project Coin Announces Second Candidate List
June 18, 2009 &#8211; Lists some of the proposed changes to the Java language in Java 7. Some of the stuff looks very Groovy inspired &#8211; in particular the features dealing with [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://feedproxy.google.com/~r/geeksAreSexyTechnologyNews/~3/9hBOJJGa8zQ/">Hemlock: Because immortality might not be such a good thing</a></li>
<p>June 22, 2009
<li><a href="http://feedproxy.google.com/~r/geeksAreSexyTechnologyNews/~3/ty874y9_rJA/">Genetically Modified Turbine-Powered Rabbit</a></li>
<p>June 18, 2009 &#8211; Brilliant.
<li><a href="http://www.infoq.com/news/2009/06/coin2">Project Coin Announces Second Candidate List</a></li>
<p>June 18, 2009 &#8211; Lists some of the proposed changes to the Java language in Java 7. Some of the stuff looks very Groovy inspired &#8211; in particular the features dealing with collections. Looking forward to this one. Along with closures, it should be a good release to remove some of the pain-points.
<li><a href="http://feedproxy.google.com/~r/geeksAreSexyTechnologyNews/~3/menrMH1Pi_I/">Computers still struggling with sporting schedules</a></li>
<p>June 18, 2009 &#8211; A real world application of the traveling salesman problem, with far more constraints than you could imagine. Who would have thought scheduling a league fixture was this hard?
<li><a href="http://feedproxy.google.com/~r/techradar/computing-news/~3/KyejAVlaahs/story01.htm">Sonic lasers promise 1000 times faster PCs</a></li>
<p>June 18, 2009 &#8211; Cool.</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.jakubkorab.net/2009/06/shared-items-june-23-2009.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My First Stand-Up</title>
		<link>http://www.jakubkorab.net/2009/06/my-first-stand-up.html</link>
		<comments>http://www.jakubkorab.net/2009/06/my-first-stand-up.html#comments</comments>
		<pubDate>Sat, 20 Jun 2009 11:38:48 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
				<category><![CDATA[comedy]]></category>

		<guid isPermaLink="false">http://www.jakubkorab.net/?p=184</guid>
		<description><![CDATA[It&#8217;s done! After three months of hard work to build up a set I am officially a stand-up comedian!
The video suffered some technical difficulties during recording. Basically all the really funny bits are missing. Honest! You should have been there! No, not really&#8230; It starts with &#8220;There was a guy at the train station asking [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s done! After three months of hard work to build up a set I am officially a stand-up comedian!</p>
<p>The video suffered some technical difficulties during recording. Basically all the really funny bits are missing. Honest! You should have been there! No, not really&#8230; It starts with &#8220;There was a guy at the train station asking for change&#8230;&#8221;<br />
<!-- Smart Youtube --><span class="youtube"><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/hzbLCq8xW5s&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0" /><param name="allowFullScreen" value="true" /><embed wmode="transparent" src="http://www.youtube.com/v/hzbLCq8xW5s&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="355" ></embed><param name="wmode" value="transparent" /></object></span></p>
<p>I came off stage and had no idea what just happened. Did any of it make sense? Did I miss whole paragraphs? Who knows, who cares. They laughed -- hard -- and that was all that mattered.</p>
<p>For anyone who wants to give it a bash, it&#8217;s one of the best extreme sports out there. The fear lasts for weeks beforehand. The pressure to not-choke up, the distinct possibility of public humiliation and the endless self-doubt -- &#8220;is that joke actually funny?&#8221;, &#8220;should I really say that?&#8221;, &#8220;does this shirt bring out my eyes?&#8221; -- all brings together the perfect storm of adrenaline. Awesome! </p>
<p>All the guys out on stage that night were doing it for the first time, and we were seriously buzzing afterwards.</p>
<p>I can&#8217;t wait till my next run out! The best fun I have had in a very long time.</p>
<p>&#8220;When I told my friends I wanted to be a comedian, they laughed. Well, they&#8217;re not laughing now!&#8221; -- Bob Monkhouse</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jakubkorab.net/2009/06/my-first-stand-up.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shared Items – June 16, 2009</title>
		<link>http://www.jakubkorab.net/2009/06/shared-items-june-16-2009.html</link>
		<comments>http://www.jakubkorab.net/2009/06/shared-items-june-16-2009.html#comments</comments>
		<pubDate>Tue, 16 Jun 2009 15:01:44 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
				<category><![CDATA[reader]]></category>

		<guid isPermaLink="false">http://www.jakubkorab.net/2009/06/shared-items-june-16-2009.html</guid>
		<description><![CDATA[
What Pair-Programing is Not
June 16, 2009 &#8211; Clear and simple explanation as to why pairing is a good idea. Easy to grasp when you do it, but not always as easy to explain to someone else.
Complete implementation of MS LINQ for Java released
June 12, 2009 &#8211; No environment&#8217;s an island, and we finally get a [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://feeds.dzone.com/~r/javalobby/frontpage/~3/Dk0miMPoQ0M/what-pair-programing-not">What Pair-Programing is Not</a></li>
<p>June 16, 2009 &#8211; Clear and simple explanation as to why pairing is a good idea. Easy to grasp when you do it, but not always as easy to explain to someone else.
<li><a href="http://feedproxy.google.com/~r/techtarget/tsscom/home/~3/_E3KZ25Q994/thread.tss">Complete implementation of MS LINQ for Java released</a></li>
<p>June 12, 2009 &#8211; No environment&#8217;s an island, and we finally get a LINQ implementation on the JVM. Well worth kicking the tires on this one, even if the underlying providers aren&#8217;t fully complete.
<li><a href="http://feedproxy.google.com/~r/techtarget/tsscom/home/~3/qgkufzbmrko/thread.tss">Oracle Coherence vs. GigaSpaces XAP</a></li>
<p>June 12, 2009 &#8211; Having just gone through an exercise in comparing these two similar-but-different products, this is pretty handy.
<li><a href="http://www.infoq.com/news/2009/06/SpringOne-Keynote-Rod-Johnson">Keynote: The Future of Java Innovation</a></li>
<p>June 11, 2009
<li><a href="http://feedproxy.google.com/~r/geeksAreSexyTechnologyNews/~3/madHcd6kMWc/">Expialidocious : Mary Poppins Electronica Remix</a></li>
<p>June 11, 2009 &#8211; Remixing at its finest. Both video and soundtrack. Amazing.
<li><a href="http://feedproxy.google.com/~r/geeksAreSexyTechnologyNews/~3/RKFEhnADMrU/">Futurama is Back, Baby!</a></li>
<p>June 11, 2009 &#8211; Awesome.</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.jakubkorab.net/2009/06/shared-items-june-16-2009.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
