<?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>Xebia Blog &#187; Robert van Loghem</title>
	<atom:link href="http://blog.xebia.com/author/rvanloghem/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.xebia.com</link>
	<description>Software development done right!</description>
	<lastBuildDate>Wed, 01 Feb 2012 00:30:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>iOS + XCode 4 + GHUnit = Mobile TDD+Continuous testing part 2 of n</title>
		<link>http://blog.xebia.com/2011/03/23/ios-xcode-4-ghunit-mobile-tddcontinuous-testing-part-2-of-n/</link>
		<comments>http://blog.xebia.com/2011/03/23/ios-xcode-4-ghunit-mobile-tddcontinuous-testing-part-2-of-n/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 10:51:07 +0000</pubDate>
		<dc:creator>Robert van Loghem</dc:creator>
				<category><![CDATA[ios]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Tools]]></category>

	<!-- AutoMeta Start -->
	<category>ghunit</category>
	<category>xcode</category>
	<category>ghunitios</category>
	<category>simulator</category>
	<category>iphone</category>
	<category>ocunit</category>
	<category>gabriel</category>
	<category>nsstring</category>
	<category>ghunit</category>
	<category>xcode</category>
	<category>ghunitios</category>
	<category>simulator</category>
	<category>iphone</category>
	<category>ocunit</category>
	<category>gabriel</category>
	<category>nsstring</category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=6482</guid>
		<description><![CDATA[Last time I explained why I think doing TDD for mobile is imperative, and why I do it. But now it&#8217;s time to get technical, and explain to you how to set up, GHUnit in XCode 4 and run unit tests, not only in the iPhone and iPad simulator but also on your own physical [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.xebia.com/2011/03/09/why-tddcontinous-testing-is-imperative-for-mobile-apps-part-1-of-n/">Last time</a> I explained why I think doing TDD for mobile is imperative, and why I do it. But now it&#8217;s time to get technical, and explain to you how to set up, <a href="http://gabriel.github.com/gh-unit/">GHUnit</a> in XCode 4 and run unit tests, not only in the iPhone and iPad simulator but also on your own physical device!, it&#8217;s in text and images but also in <a href='http://www.youtube.com/watch?v=zk2PXso_WHQ'>video form on YouTube</a>.</p>
<p><a href="http://www.youtube.com/watch?v=zk2PXso_WHQ"><img src="http://blog.xebia.com/wp-content/uploads/2011/03/youtubeScreenshot-300x183.png" alt="" title="Video on how to setup GHUnit in XCode 4 on YouTube" width="300" height="183" class="aligncenter size-medium wp-image-6533" /></a></p>
<p><em>Note, if you want to know why i chose GHUnit over OCUnit, just scroll down to the end of the post.</em></p>
<p><span id="more-6482"></span></p>
<p><strong>But wait….</strong></p>
<p>Before I begin, I want to make one thing very clear, the difference between <em>code</em> unit testing and <em>UI</em> testing. Unfortunately, UI development can be hard to do in a TDD fashion. Especially when you want to test UI components. e.g. When I send a TouchEvent will the View respond and trigger my method in my controller.<br />
My advice; don&#8217;t do UI testing with a Unit testing framework (OCUnit, JUnit, GHUnit), do it with for example the <a href="http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/Introduction/Introduction.html%23//apple_ref/doc/uid/TP40004652">iOS automation API</a>, which has been created specifically to test those UI components. I&#8217;ll also get back to you in a later post on how to do UI testing on Android.</p>
<p>What do you test with Unit testing frameworks? Well you test just the code, nothing more. Model and Controller code, not the View! You might need the help of a mocking framework to make it testable, because the view is missing and needs to be wired up for the controller and model to work properly, or it might need other controllers etc..</p>
<p><strong>Let&#8217;s begin setting up!</strong></p>
<p>With that in mind, let&#8217;s set up our own iPhone XCode 4 project! add GHunit, create a test and run it in the simulator or your own iOS device, iPhone, iPod Touch or iPad.</p>
<p><em>1.</em> First of all download the GHUnitIOS version (0.4.28 at this time) at <a href="https://github.com/gabriel/gh-unit/archives/master">https://github.com/gabriel/gh-unit/archives/master</a><br />
<em>2.</em> Unpack the downloaded zip file somewhere in your home directory, you should get the GHUnitIOS.framework directory</p>
<blockquote><p>NOTE; I first placed it in /Developer/Library/Frameworks but XCode 4 didn&#8217;t like it and when compiling it could not find the header files, therefore I placed them somewhere in my home directory (e.g. /Users/rvanloghem/Development/Frameworks/GHUnitIOS.framework)</p></blockquote>
<p><a href="http://blog.xebia.com/wp-content/uploads/2011/03/ghunitFrameworkDir.png"><img src="http://blog.xebia.com/wp-content/uploads/2011/03/ghunitFrameworkDir-150x150.png" alt="" title="Place where my GHUnitIOS.framework dir is located" width="150" height="150" class="aligncenter size-thumbnail wp-image-6498" /></a></p>
<p><strong>Right, you are now ready to set up your GHUnit ready XCode 4 project.</strong></p>
<p><em>3.</em> For example purposes, I&#8217;m choosing a normal, navigation-based application but you might have an existing project.<br />
- NOTE; Don&#8217;t check the Include Unit Tests, because we are going to supply our own unit testing framework and not rely on OCUnit, which is supplied by default in XCode</p>
<p><a href="http://blog.xebia.com/wp-content/uploads/2011/03/selectNewProjectTemplate.png"><img src="http://blog.xebia.com/wp-content/uploads/2011/03/selectNewProjectTemplate-150x150.png" alt="" title="Select XCode 4 project template" width="150" height="150" class="aligncenter size-thumbnail wp-image-6491" /></a></p>
<p><em>4.</em> In your XCode project settings (blue root icon in the tree browser) add a Target which you can call Tests, i usually base the project on a simple View-based Application (a Target named Tests will be added + a folder named Tests with all the Tests target files in them)</p>
<p><a href="http://blog.xebia.com/wp-content/uploads/2011/03/addTestsTarget.png"><img src="http://blog.xebia.com/wp-content/uploads/2011/03/addTestsTarget-150x150.png" alt="" title="Click to add a new target named Tests" width="150" height="150" class="aligncenter size-thumbnail wp-image-6514" /></a></p>
<p><em>5.</em> Next go back to the Tests target (click on the Tests Target) and add the GHUnitIOS.framework which you downloaded and unpacked in step 1 and 2. (click on the Build Phases tab, open up the Link Binary with Libraries, hit the + button, click Add Other and navigate+select the GHUnitIOS.framework directory on your filesystem)<br />
<em>6.</em> Optional, but nice, move the GHUnitIOS.framework in your Tree to the Frameworks folder, to tidy things up</p>
<p><a href="http://blog.xebia.com/wp-content/uploads/2011/03/addFrameworkToTestsTarget.png"><img src="http://blog.xebia.com/wp-content/uploads/2011/03/addFrameworkToTestsTarget-150x150.png" alt="" title="Adding the GHUnitIOS framework to the Tests target" width="150" height="150" class="aligncenter size-thumbnail wp-image-6516" /></a></p>
<p>7. Set the -ObjC and -all_load in the other linker flags on the Tests Target (Select the Tests Target, select the Build Settings, search for other linker flags, and add the 2 flags)</p>
<p><a href="http://blog.xebia.com/wp-content/uploads/2011/03/setOtherLinkerFlags.png"><img src="http://blog.xebia.com/wp-content/uploads/2011/03/setOtherLinkerFlags-150x150.png" alt="" title="Setting -ObjC and -all_load on the other linker flags in the Tests target" width="150" height="150" class="aligncenter size-thumbnail wp-image-6518" /></a></p>
<p>8. Now you can delete some files which are not necessary, all the files in the Tests folder. (Note, Not! the Supporting Files folder as well, just the files!)<br />
9. Delete the main.m file in the Supporting Files folder</p>
<p><a href="http://blog.xebia.com/wp-content/uploads/2011/03/deleteTestsFiles.png"><img src="http://blog.xebia.com/wp-content/uploads/2011/03/deleteTestsFiles-150x150.png" alt="" title="Delete unneeded files from your Tests target" width="150" height="150" class="aligncenter size-thumbnail wp-image-6520" /></a></p>
<p>10. In the Tests-Info.plist file (again, in the Supporting Files folder), clear out the Main nib file base name value</p>
<p><a href="http://blog.xebia.com/wp-content/uploads/2011/03/clearMainNibName.png"><img src="http://blog.xebia.com/wp-content/uploads/2011/03/clearMainNibName-150x150.png" alt="" title="Clear value of man nib file base name in the ?-Info.plist file" width="150" height="150" class="aligncenter size-thumbnail wp-image-6519" /></a></p>
<p><strong>Time to create the GHUnit test runner, which will scan for our Unit Test Cases and run them.</strong></p>
<p>11. Create an Objective-C class in the Tests folder named GHUnitIOSTestMain and make sure it is only! added to the Tests target</p>
<p><a href="http://blog.xebia.com/wp-content/uploads/2011/03/createTestRunner.png"><img src="http://blog.xebia.com/wp-content/uploads/2011/03/createTestRunner-150x150.png" alt="" title="Create the GHUnitTestRunner main which will run your test cases" width="150" height="150" class="aligncenter size-thumbnail wp-image-6521" /></a></p>
<p>12. You can delete the GHUnitIOSTestMain.h file<br />
13. Copy and paste source code from (http://github.com/gabriel/gh-unit/blob/master/Project-IPhone/GHUnitIOSTestMain.m) in your GHUnitIOSTestMain.m file</p>
<p><strong>And now it&#8217;s time to create our own test case which will fail <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </strong></p>
<p>14. Again create an Objective-C class in the Tests folder and as this is an example, name it ExampleTest, also make sure it is added to the Tests Target only!<br />
15. You can delete the ExampleTest.h file<br />
15. Copy and paste the next piece of code which is 99% copy/pasted from the example code from GHUnit (http://gabriel.github.com/gh-unit/_examples.html)</p>
<pre class="brush: cpp; title: ; notranslate">// For iOS
#import &lt;GHUnitIOS/GHUnit.h&gt;
// For Mac OS X
//#import &lt;GHUnit/GHUnit.h&gt;

@interface ExampleTest : GHTestCase { }
@end

@implementation ExampleTest

- (BOOL)shouldRunOnMainThread {
    // By default NO, but if you have a UI test or test dependent on running on the main thread return YES
    return NO;
}

- (void)setUpClass {
    // Run at start of all tests in the class
}

- (void)tearDownClass {
    // Run at end of all tests in the class
}

- (void)setUp {
    // Run before each test method
}

- (void)tearDown {
    // Run after each test method
}  

- (void)testFoo {
    NSString *a = @&quot;foo&quot;;
    GHTestLog(@&quot;I can log to the GHUnit test console: %@&quot;, a);

    // Assert a is not NULL, with no custom error description
    GHAssertNotNULL(a, nil);

    // Assert equal objects, add custom error description
    NSString *b = @&quot;bar&quot;;
    GHAssertEqualObjects(a, b, @&quot;A custom error message. a should be equal to: %@.&quot;, b);
}

- (void)testBar {
    GHAssertTrue(TRUE, @&quot;Yes it worked&quot;);
}

@end
</pre>
<p><strong>Right, ready to run!</strong></p>
<p>16. Launch your Tests target (iTunes-like play button arrow) and run it against the simulator-scheme and your Unit test app should start</p>
<p><a href="http://blog.xebia.com/wp-content/uploads/2011/03/readyToRunGHUnit.png"><img src="http://blog.xebia.com/wp-content/uploads/2011/03/readyToRunGHUnit-150x150.png" alt="" title="Selecting the scheme to run your unit test case and hitting run in XCode 4" width="150" height="150" class="aligncenter size-thumbnail wp-image-6528" /></a></p>
<p>17. Now in the app in the simulator hit the blue run button and your tests will execute. (and testFoo will fail!, you can click on it to see why it failed)</p>
<p><a href="http://blog.xebia.com/wp-content/uploads/2011/03/runningTheTest.png"><img src="http://blog.xebia.com/wp-content/uploads/2011/03/runningTheTest-150x150.png" alt="" title="Running the GHUnit test in the iOS iPhone simulator" width="150" height="150" class="aligncenter size-thumbnail wp-image-6529" /></a></p>
<p><strong>And now it&#8217;s time to fix it&#8230;</strong></p>
<p>18. Change the <code>NSString *b = @"bar";</code> in the testFoo method to <code>NSString *b = @"foo";</code><br />
19. Run the Test app again and re-run the test and they should be green or in this case black, which means your tests are ok</p>
<p><strong>Showing the power of GHUnit</strong></p>
<p>20. Run the app against your own iOS device-scheme. (Select iOS-device-scheme and click the iTunes like run button)</p>
<p><a href="http://blog.xebia.com/wp-content/uploads/2011/03/testsRunningActuallyOnThePhone.png"><img src="http://blog.xebia.com/wp-content/uploads/2011/03/testsRunningActuallyOnThePhone-150x150.png" alt="" title="GHUnit running on an actual iPhone 4" width="150" height="150" class="aligncenter size-thumbnail wp-image-6530" /></a></p>
<p><strong>Why i chose GHUnit over OCUnit</strong></p>
<p>IMHO, this shows the real power of the GHUnit testing framework, not only does it run in the simulator but it also runs on your own iPhone, iPad, etc. Whereas OCUnit can only run as part of your build on your own machine, not on your phone and not in the simulator, this for me, is a big dealbreaker.<br />
The closer you can get your unit tests running against a real-world environment the better it will be. Why? Because you are making use of the real devices processor (not the intel x86), real memory management, or lack there-of, the real API&#8217;s etc. If my Unit tests run on my phone, i&#8217;m 99.999% certain that the code under test will actually run on, yes, you guessed it, my phone.</p>
<p>There is of-course a downside to GHUnit, OCUnit (bundled with XCode) can be run automatically prior to you compiling your own app, this makes getting feedback about regression a lot faster, GHUnit is something which you have to run manually, in this case. But to solve that problem, or at least make it a whole lot better, we can use continuous integration aka build server to do the auto-running-of-unit-tests for us. There is a very <a href="http://paulsolt.com/2010/11/iphone-unit-testing-explained-part-1/">nice blog post</a> which compares various iOS unit testing frameworks.</p>
<p>So what is next? Well, the topic for my next blog and video in this series is hooking up a XCode project + GHUnit to Jenkins (or Hudson for the Oracle minded people out there).</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2011/03/23/ios-xcode-4-ghunit-mobile-tddcontinuous-testing-part-2-of-n/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2011%2F03%2F23%2Fios-xcode-4-ghunit-mobile-tddcontinuous-testing-part-2-of-n%2F&amp;title=iOS%20%2B%20XCode%204%20%2B%20GHUnit%20%3D%20Mobile%20TDD%2BContinuous%20testing%20part%202%20of%20n" id="wpa2a_2"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2011/03/23/ios-xcode-4-ghunit-mobile-tddcontinuous-testing-part-2-of-n/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Why TDD+ Continuous testing is imperative for mobile apps (part 1 of n)</title>
		<link>http://blog.xebia.com/2011/03/09/why-tddcontinous-testing-is-imperative-for-mobile-apps-part-1-of-n/</link>
		<comments>http://blog.xebia.com/2011/03/09/why-tddcontinous-testing-is-imperative-for-mobile-apps-part-1-of-n/#comments</comments>
		<pubDate>Wed, 09 Mar 2011 11:06:04 +0000</pubDate>
		<dc:creator>Robert van Loghem</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[Methodology]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Testing]]></category>

	<!-- AutoMeta Start -->
	<category>apps</category>
	<category>ipad</category>
	<category>mobile</category>
	<category>robust</category>
	<category>jenkins</category>
	<category>functionality</category>
	<category>android</category>
	<category>regression</category>
	<category>apps</category>
	<category>ipad</category>
	<category>mobile</category>
	<category>robust</category>
	<category>jenkins</category>
	<category>functionality</category>
	<category>android</category>
	<category>regression</category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=6301</guid>
		<description><![CDATA[Since a couple of months I&#8217;ve been developing mobile applications, some are for the business at home (girlfriend-shopping-list app that actually works and augmented reality garden iPad app) and some are for work. I have experienced that TDD and Continuous testing (Test Driven Development) is a way of working that leads to fewer bugs and [...]]]></description>
			<content:encoded><![CDATA[<p>Since a couple of months I&#8217;ve been developing mobile applications, some are for the business at home (girlfriend-shopping-list app that actually works and augmented reality garden iPad app) and some are for work. I have experienced that TDD and Continuous testing (<em>Test Driven Development</em>) is a way of working that leads to fewer bugs and regression problems and better design in my software, it&#8217;s my preferred way of programming, not testing.</p>
<p><img src="http://blog.xebia.com/wp-content/uploads/2011/03/iPad-TDD-150x150.png" alt="Mobile TDD is imperitive" title="iPad TDD" width="150" height="150" class="alignright size-thumbnail wp-image-6302" /></p>
<p>And to start off, here&#8217;s how I benefit from doing TDD:</p>
<ol>
<li>Robust</li>
<li>Better code design, no really!</li>
<li>Find regression problems early on</li>
</ol>
<p>and you can read more on TDD and Continuous testing <a href="http://blog.objectmentor.com/articles/2007/09/20/continuous-testing-explained">here</a>.</p>
<p>The thing is, writing a mobile app takes about 20% of the time it would take me to write a web+client+server based app. Which of-course is really nice, because I can write lots of apps. It also means that whenever i need to fix a bug or add new functionality, I need to have developed it in a TDD fashion, otherwise i cannot guarantee reliability. So let me explain why…</p>
<p><span id="more-6301"></span></p>
<p><strong>Previous experience</strong></p>
<p>The last complex software piece I&#8217;ve worked on is a product called Deployit, which can deploy java applications to application servers, not just one, but many different type of servers and the deploy part is encapsulated in a piece called a plugin. For every plugin we have written lots and lots of tests and boy do they prove to be a lifesaver. </p>
<p>As a developer I&#8217;m not just working on a single plugin, I&#8217;m working on the entire product (partly, because we are a small team and i like to do so), that means that for a single week I&#8217;m adding new deployment logic to plugin A and next week fixing a bug in plugin B. I&#8217;m a good programmer with a good memory but working on so many plugins and quickly fixing problems or adding functionality is hard. I have to context switch between intricacies of plugin D and the complexity of plugin W, I am bound to make a mistake or two, which will delay the release or upset users because functionality that used to work is now broken.</p>
<p>So how does this compare with mobile apps? It&#8217;s simple, plugins, resemble for me, apps. In the mobile world, you are bound to work on multiple apps in a short amount of time, that means, you need help to keep those apps stable when you are working on them. </p>
<p><strong>Translation of TDD+Continuous testing to mobile development</strong></p>
<p>Did you ever update an app that you worked on 2 months ago and broke per accident some old functionality? Then you must have seen what happened with your user ratings, it went down, right? People expect functionality that have always worked to still keep working, otherwise you will get 1-star or worse, it gets deleted! New functionality can have some bugs, because it is new, existing functionality should just work, there is no excuse for it to not do so.</p>
<p>Unless your brain can keep track of what the code of every app that you might work on is doing, which I don&#8217;t think it can, if it would you would work at NASA on &#8220;Space Bus 3.0&#8243;. That is where your automated tests come in, they really help you, make a fix and guaranteeing that your old functionality does not break. </p>
<p>It also helps you make new functionality more robust, don&#8217;t just test the happy flow, also test the monkey flow, input some weird data, trigger some weird touch-events, see if you can make your app crash, and do this automated. Your app becomes much more robust and your users will love you for it.</p>
<p><strong>What is next&#8230;</strong></p>
<p>The above words are all fine, but how do we actually do this ? In the next couple of blog posts I will go into technical detail how to do;<br />
1. Unit testing (cheap testing at code level, <a href="http://developer.apple.com/tools/unittest.html">OCUnit</a>, <a href="http://developer.android.com/resources/tutorials/testing/helloandroid_test.html">JUnit</a>)<br />
2. Continuous Integration (using <a href="http://jenkins-ci.org/">Jenkins</a>)<br />
3. UI testing (not so cheap testing at the UI level, Automation API&#8217;s, mock framework)<br />
and do this for iOS and Android platforms.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2011/03/09/why-tddcontinous-testing-is-imperative-for-mobile-apps-part-1-of-n/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2011%2F03%2F09%2Fwhy-tddcontinous-testing-is-imperative-for-mobile-apps-part-1-of-n%2F&amp;title=Why%20TDD%2B%20Continuous%20testing%20is%20imperative%20for%20mobile%20apps%20%28part%201%20of%20n%29" id="wpa2a_4"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2011/03/09/why-tddcontinous-testing-is-imperative-for-mobile-apps-part-1-of-n/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Continuous deployment impressions at #JFall 2010, NL</title>
		<link>http://blog.xebia.com/2010/11/11/continuous-deployment-impressions-at-jfall-2010-nl/</link>
		<comments>http://blog.xebia.com/2010/11/11/continuous-deployment-impressions-at-jfall-2010-nl/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 15:33:07 +0000</pubDate>
		<dc:creator>Robert van Loghem</dc:creator>
				<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Middleware]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Xebia Labs]]></category>

	<!-- AutoMeta Start -->
	<category></category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=5462</guid>
		<description><![CDATA[Last week (november 3rd) Andrew Phillips and myself did a presentation on continuous deployment at the awful (so we thought) hour of 8 o&#8217;clock in the morning for the NLJUG. We only expected a handful of attendees but fortunately the day before we were told that we had moved to a bigger conference room because [...]]]></description>
			<content:encoded><![CDATA[<p>Last week (november 3rd) <a href="http://blog.xebia.com/author/aphillips/">Andrew Phillips</a> and <a href="http://blog.xebia.com/author/rvanloghem/">myself</a> did a presentation on <a href="http://toni.org/2010/05/19/in-praise-of-continuous-deployment-the-wordpress-com-story/">continuous deployment</a> at the awful (so we thought) hour of 8 o&#8217;clock in the morning for the <a href="http://www.nljug.org/">NLJUG</a>. We only expected a handful of attendees but fortunately the day before we were told that we had moved to a bigger conference room because of the great number of people signing up! So at 8 o&#8217;clock we had about <100 people in the room! So, if you were there, thanks for coming so early, we really appreciate it. It of-course shows that continuous deployment is a hot topic <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><div id="attachment_5467" class="wp-caption alignright" style="width: 160px"><a href="http://blog.xebia.com/wp-content/uploads/2010/11/MG_8876.jpg"><img src="http://blog.xebia.com/wp-content/uploads/2010/11/MG_8876-150x150.jpg" alt="Doing the continuous deployment talk at JFall" title="Andrew and Robert at JFall" width="150" height="150" class="size-thumbnail wp-image-5467" /></a><p class="wp-caption-text">Doing the continuous deployment talk at JFall</p></div><br />
<span id="more-5462"></span><br />
So what did we actually talk about? Well…</p>
<ol>
<li>Where we are now, <a href="http://hudson-ci.org/">continuous build/integration</a> + storing the results of a build into a big safe aka <a href="http://nexus.sonatype.org/">repository</a>?! and not getting it to the user who is expecting a working application</li>
<li>What the steps are of getting your application ready for continuous deployment</li>
<li>How to do your continuous deployment.</li>
<li>How to do a <a href="http://agiletesting.blogspot.com/2009/07/automated-testing-of-production.html">post-deployment test</a> automatically after a successful deployment</li>
<li>and the live demo of-course <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  By changing some code and checking it in via GIT, our continuous build server, started, building after it discovered the changed code, it kicked off <a href="http://www.xebialabs.com/">Deployit</a> (our deployment automation product) to do the deployment to a WebSphere Network Deployment Application Server + Apache HTTPD Server, finally <a href="http://hudson-ci.org/">Hudson</a>, then triggered <a href="http://jakarta.apache.org/jmeter/">JMeter</a> to test the deployed application, and we fed JMeter host information via Deployit, so it could connect to the right host!</li>
</ol>
<p>All in all it was really cool to do the presentation + live working demo. We think continuous deployment is the next big step in the automation area for development. In the future well definitely go deeper into how we have set this up, by doing some Youtube videos, blog posts and present at more conferences!</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2010/11/11/continuous-deployment-impressions-at-jfall-2010-nl/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2010%2F11%2F11%2Fcontinuous-deployment-impressions-at-jfall-2010-nl%2F&amp;title=Continuous%20deployment%20impressions%20at%20%23JFall%202010%2C%20NL" id="wpa2a_6"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2010/11/11/continuous-deployment-impressions-at-jfall-2010-nl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Future of Deployment &#8211; Part 2.5 Getting your virtual appliance from development to production</title>
		<link>http://blog.xebia.com/2010/08/16/future-of-deployment-part-2-5-getting-your-virtual-appliance-from-development-to-production/</link>
		<comments>http://blog.xebia.com/2010/08/16/future-of-deployment-part-2-5-getting-your-virtual-appliance-from-development-to-production/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 06:25:50 +0000</pubDate>
		<dc:creator>Robert van Loghem</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Middleware]]></category>
		<category><![CDATA[Virtualization]]></category>
		<category><![CDATA[Xebia Labs]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=5181</guid>
		<description><![CDATA[In my previous post, &#8220;future of deployment, part 2&#8243;, i talked about the new ear, which is an image, with an OS and your application. Now before diving into part 3, which gets you going in creating your own virtual appliance aka &#8220;the image&#8221;, there is one really big thing i forgot to mention; Some [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.xebia.com/wp-content/uploads/2010/08/Virtual-Appliance.png"><img src="http://blog.xebia.com/wp-content/uploads/2010/08/Virtual-Appliance.png" alt="Virtual Appliance" title="Virtual Appliance" width="200" height="245" class="alignleft size-full wp-image-5182" /></a></p>
<p>In my previous post, <a href="http://blog.xebia.com/2010/06/13/future-of-deployment-part-2-the-image-in-the-cloud-is-the-new-ear/">&#8220;future of deployment, part 2&#8243;</a>, i talked about the new ear, which is an image, with an OS and your application.<br />
Now before diving into part 3, which gets you going in creating your own <em>virtual appliance aka &#8220;the image&#8221;</em>, there is one really big thing i forgot to mention; Some of the benefits of delivering a virtual appliance and getting it from your own development to the production environment! and i&#8217;ll list the benefits for administrators/ops and developers.<br />
<span id="more-5181"></span><br />
<strong>Ask and thou shall receive, thy environment, immediately <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> </strong></p>
<p>So you start developing your new application &#8220;CuteAnimalPark&#8221; (yes, we at Xebialabs like animals <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ), and you talk to the admins and ask them for 3 environments, Test, Acceptance and Production. They of-course respond, &#8220;that is fine, we&#8217;ll have it up-and-running when you can deliver your application&#8221;, aka &#8220;virtual appliance&#8221; and give you a link where you can download the Virtual Image where you can install your application on.</p>
<p>So what happened here? Well i wanted 3 environments and got none!? But i did get some image which is in fact the image that is going to run in production. The image is hardened, has got security enabled, all user accounts and file-system rights are in order and is tuned for real world serving the interwebs.</p>
<p>The job of the operators is to make sure applications get to production and run reliably and fast. They are the ones getting called out of bed if my application dies at 3 AM. So therefore they want to give you an image which is the SAME that is going to run in production.<br />
That means IMHO, one of the day-time jobs of these guys and gals is to prepare the images (OS + middleware) for applications and give them out to development teams so they can in turn create virtual appliances.</p>
<blockquote><p><em><strong>Action #1</strong></em> Get a production ready image to install the application on.<br />
<em><strong>Benefit for Devs #1</strong></em> You develop and deploy to &#8220;really-really-close-to&#8221; production system<br />
<em><strong>Benefit for Ops #1</strong></em> You get an application that is known to run on a production system</p></blockquote>
<p><strong>Running the production image aka virtual appliance in other environments then production</strong></p>
<p>So when you have installed the application on the image you have to make sure it can be used in other environments then development. The application might need to connect to a database, now the database will mostly differ from one environment to the other, so as soon as the application is placed into the environment, you have to get in there and change the URL and most probably, username and password of the datasource the application is using so it will connect to the e.g. database in test and not the developers own MySQL database on his local machine.</p>
<p>Changing the way an application uses a database should be just as easy by changing the properties on a datasource, and most of the JEE containers make this fairly easy, but i&#8217;ve personally seen lots of other properties which are very environment specific which were in property files, in JAR files that needed changing when moving the application from one environment to the other. Not so easy then ;(</p>
<p>Make sure that when you design and develop your application that environment specific properties are easily accessible and can be changed by operators.</p>
<blockquote><p><em><strong>Action #2 for Devs</strong></em> <a href="http://blog.xebia.com/2010/07/05/customize-this-tailoring-deployment-packages-to-your-target-environments/">Design and Build</a> your application so it can exist in multiple environments<br />
<em><strong>Action #2 for Ops</strong></em> This also applies to Operators, who have to be aware that the image they deliver will need to run in different environments (e.g. use hostnames when installing middleware and don&#8217;t use IP-addresses)<br />
<em><strong>Benefit for Devs #2</strong></em> Your application is portable, it can be moved almost anywhere and administrators can do it without your help<br />
<em><strong>Benefit for Ops #2</strong></em> Easily move images to wherever you want, move stuff from your private cloud to the public, will be a lot easier! per application.</p></blockquote>
<p><a href="http://blog.xebia.com/wp-content/uploads/2010/08/Deploy-Virtual-Appliance1.png"><img src="http://blog.xebia.com/wp-content/uploads/2010/08/Deploy-Virtual-Appliance1.png" alt="Deploy Virtual Appliance" title="Deploy Virtual Appliance" width="500" height="279" class="alignleft size-full wp-image-5193" /></a></p>
<p>After this step, it means that your virtual appliance can now be deployed to the various environments, which of-course are running some sort of virtualization hypervisor from some known <a href="http://www.vmware.com/products/vsphere/esxi-and-esx/index.html">vendor</a>. Every time the appliance is deployed, before it is started the operators configure it. Making sure the Datasource connects to the right database, the Queues connect to the right Message broker, and so on.<br />
After configuring the application you can start up the whole bunch and <em>bask in glory</em>. (make sure the ops know in how to properly start the application and how they can tell it works)</p>
<p><strong>The flow from development to production is that simple, but wait! there&#8217;s more, troubleshooting?</strong></p>
<p>Again here is the flow from the 2 paragraphs above:<br />
<em>- Get a production like image<br />
- Install your application on it<br />
- Allow operators to move your virtual appliance from test to production (without needing your assistance)</em></p>
<p>But of-course stuff can go wrong in production, your application might break, has a race condition under extreme load, and you as a developer want to get your hands on production and find out what is wrong. But alas, the operators will not allow you to access production, most likely they&#8217;ll send you the logs, thread and heap dumps but that is it. So wouldn&#8217;t it be nice if you could have the access to production when it is not used in production?</p>
<p>With virtualization you can get a snapshot of the images running in production, transfer it to your local development environment and really get into finding the problem. There is always the trouble of generating real user requests but this is a very big step forward to get your hands where the real problem occurred.</p>
<blockquote><p><em><strong>Action #3</strong></em> Whenever an issue pops up with an application, create a <a href="http://www.vmware.com/products/labmanager/features.html">snapshot</a> of the image and let the developer have access to it<br />
<em><strong>Benefit for Devs #3</strong></em> You can get to the source of the problem more easily<br />
<em><strong>Benefit for Ops #3</strong></em> You still don&#8217;t need to give access to developers on production if you don&#8217;t want to, just let them have a copy of the current state of production</p></blockquote>
<p><strong>Makes sense?</strong></p>
<p>Well there you have it, this is what i think will be the biggest change in the way we deploy an application from development to production in about 3-5 years. As i mentioned before, post 3 will be about doing it yourself with the current tools available, from <a href="http://www.xebialabs.com/deployit">Xebialabs</a> of-course and <a href="http://www.vmware.com/products/labmanager/">VMWare</a>.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2010/08/16/future-of-deployment-part-2-5-getting-your-virtual-appliance-from-development-to-production/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2010%2F08%2F16%2Ffuture-of-deployment-part-2-5-getting-your-virtual-appliance-from-development-to-production%2F&amp;title=Future%20of%20Deployment%20%26%238211%3B%20Part%202.5%20Getting%20your%20virtual%20appliance%20from%20development%20to%20production" id="wpa2a_8"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2010/08/16/future-of-deployment-part-2-5-getting-your-virtual-appliance-from-development-to-production/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Future of deployment: Part 2 &#8211; The Image in the Cloud is the new EAR</title>
		<link>http://blog.xebia.com/2010/06/13/future-of-deployment-part-2-the-image-in-the-cloud-is-the-new-ear/</link>
		<comments>http://blog.xebia.com/2010/06/13/future-of-deployment-part-2-the-image-in-the-cloud-is-the-new-ear/#comments</comments>
		<pubDate>Sun, 13 Jun 2010 15:09:41 +0000</pubDate>
		<dc:creator>Robert van Loghem</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Middleware]]></category>
		<category><![CDATA[Virtualization]]></category>
		<category><![CDATA[Xebia Labs]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=4875</guid>
		<description><![CDATA[Last December I wrote my first part on the Future of Deployment explaining the difference between big ol&#8217; servers with a gazillion applications and lots of new shiny small servers with each its own application. This time I&#8217;m going to go to the cloud or your virtualized servers and give you my vision of how [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.xebia.com/wp-content/uploads/2010/06/SkyIsTheLimit.png"><img src="http://blog.xebia.com/wp-content/uploads/2010/06/SkyIsTheLimit-300x141.png" alt="SkyIsTheLimit" title="SkyIsTheLimit" width="300" height="141" class="alignleft size-medium wp-image-4876" /></a><br />
Last December I wrote my first part on the <a href="http://blog.xebia.com/2009/12/21/future-of-deployment-part-1-monuments-vs-cheap-housing/">Future of Deployment</a> explaining the difference between big ol&#8217; servers with a gazillion applications and lots of new shiny small servers with each its own application. This time I&#8217;m going to go to the cloud or your virtualized servers and give you my vision of how we are going to package and deploy applications in about 3-5 years.</p>
<p><strong>How we used to deploy an application</strong></p>
<p>Well you all know this one by heart: You get your environment up and running, like, install an application server, setup your database, choose a sql script to run against the database, configure resources and deploy the application in the application server. After everything is in place you start the whole bunch and bask in glory!</p>
<p>Does the above deployment scenario apply to virtualized/cloudy environments. Yes it does, of course! The environment setup is greatly simplified, using stuff like <a href="http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=171">AMIs</a> or virtual images aka <a href="http://www.vmware.com/appliances/">appliances</a> <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  you get your database or application server out of the box but configuring and installing the application and configuration/resources is still the same old boring cumbersome task.<br />
<span id="more-4875"></span><br />
<strong>Taking &#8216;it&#8217; all the way to the top</strong></p>
<p>If you look at a lot of the current images out there, they are basically just an Operating System which you can instantiate. Some of the vendors, like Oracle have <a href="http://www.oracle.com/technology/products/vm/templates/index.html">images</a> that also contain an installed database on top of an OS, like a favorite flavor of Linux. But imagine that you can bundle up your own application with an image which then becomes your own Virtual Appliance. You use your own virtual appliance, (OS + installed application + config files) to set up your environment quickly and voila! no more boring installing application server/database, deploying application per environment.</p>
<p>Sounds too good to be true eh?! In this day and age it unfortunately is.</p>
<p><strong>The &#8216;biggest&#8217; problem</strong></p>
<p>It&#8217;s the size of the virtual image.<br />
Lets say you have created a new release of your application. In total, War + config files + some DDL scripts is about 100MB, not a big deal indeed! Easy to copy across to different environments. Now try and create a virtual image of this release.</p>
<p>Step 1, get image (= 2GB big, OS + installed Application server + installed DB)<br />
Step 2, Install your application on the virtual image (+= 100MB)<br />
Step 3, Prepare image and pack it up.</p>
<p>Total size of your package or if you like <em>bundle</em> (os + appserver + db + app = 2100MB). Try <a href="http://thewebfellas.com/blog/2008/9/1/creating-an-new-ec2-ami-from-within-vmware-or-from-vmdk-files">converting</a> and copying your VMWare 2.1GB to Amazon EC2 over the internet! It will take a while and those are a lot of cups of coffee before you can get it up and running. For the smarter persons out there, just use the AMIs already on Amazon and <em>re-bundle</em> which solves the problem <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><strong>Too simple for you?</strong></p>
<p>So who puts their database on the same virtual server? Nobody, or at least nobody serious <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Well for these folks you can create a second virtual image with the database and package that with your application image. Now you have 2 images that can be used together, but yet again more uploading and perhaps more disk space to waste.</p>
<p>And what about resources you need to connect to which you can&#8217;t package up with your images, like a corporate LDAP or even worse a mainframe system which needs to be accessed via MQSeries and a Message Broker? Well here it still becomes clear that after creating images and instantiating them in environment there are still sometimes activities needed, like for example configuring JMS resources to connect to a remote Queue Manager, to make your application fully-up-and-running-functional. So in a lot of cases we still need <a href="http://www.xebialabs.com/deployment-automation-virtualized-and-cloud-environments">automated deployment</a> to get it all going. And while we&#8217;re at it, you can have a sneek peek at our<a href="http://www.xebialabs.com/deployit-personal-edition-request"> Deployit 1.3-Beta</a> which already is beginning to get some of these packaging concepts, like Deployment Package with, Queues, Datasources etc&#8230; </p>
<p><strong>Still it&#8217;s a nice picture to draw…aka the image is the new EAR</strong></p>
<p>Packaging/bundling up your application with an OS and delivering it as your release. You get to do almost whatever you want to do on that image, whatever is best for YOUR application. Tune not only the application server, but even the OS! Use whatever libraries you want. <em>The sky is the limit!</em> <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  or at least what sysadmins will tolerate.</p>
<p>This is IMHO, the biggest plus! You get to deliver something which is very, very close to the production setup. This will eliminate or greatly reduce runtime and configuration issues which you may face when getting your application running in production.</p>
<p>In part three, I&#8217;ll have a look at where the virtualization/cloud vendors, like <a href="http://www-01.ibm.com/software/webservers/cloudburst/">IBM</a>, <a href="http://www.oracle.com/us/products/middleware/application-server/virtual-assembly-builder-067878.html">Oracle</a>, <a href="http://www.vmware.com/products/labmanager/features.html">VMWare</a> (+ Spring, anyone?) are now. How you can start moving from just delivering a war/ear to delivering virtual images/appliances tomorrow (and not in 3-5 years <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  )</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2010/06/13/future-of-deployment-part-2-the-image-in-the-cloud-is-the-new-ear/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2010%2F06%2F13%2Ffuture-of-deployment-part-2-the-image-in-the-cloud-is-the-new-ear%2F&amp;title=Future%20of%20deployment%3A%20Part%202%20%26%238211%3B%20The%20Image%20in%20the%20Cloud%20is%20the%20new%20EAR" id="wpa2a_10"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2010/06/13/future-of-deployment-part-2-the-image-in-the-cloud-is-the-new-ear/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Future of deployment: Part 1 &#8211; Monuments vs Cheap housing</title>
		<link>http://blog.xebia.com/2009/12/21/future-of-deployment-part-1-monuments-vs-cheap-housing/</link>
		<comments>http://blog.xebia.com/2009/12/21/future-of-deployment-part-1-monuments-vs-cheap-housing/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 17:18:08 +0000</pubDate>
		<dc:creator>Robert van Loghem</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Middleware]]></category>
		<category><![CDATA[Virtualization]]></category>
		<category><![CDATA[Xebia Labs]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=3895</guid>
		<description><![CDATA[I&#8217;m going to start a series on the future of deployment. How and what do we deploy in, say 5 years or so. Of-course this is my opinion and please add your own ideas in the comments below. To start this series off i&#8217;m going to talk about the current state of things, or at [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m going to start a series on the future of deployment. How and what do we deploy in, say 5 years or so. Of-course this is my opinion and please add your own ideas in the comments below.</p>
<p><a href="http://blog.xebia.com/wp-content/uploads/2009/12/MonumentVsCheapHousing.jpg"><img src="http://blog.xebia.com/wp-content/uploads/2009/12/MonumentVsCheapHousing-300x213.jpg" alt="MonumentVsCheapHousing" title="MonumentVsCheapHousing" width="300" height="213" class="alignleft size-medium wp-image-3914" /></a></p>
<p>To start this series off i&#8217;m going to talk about the current state of things, or at least what i see at a lot of enterprise customers. Most of the enterprises i&#8217;ve been at have physical servers which are used by numerous applications from different development teams. Some of these servers are old and have been in maintenance by operations for years (+4 years <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ). That means that the server has changed, lots of deltas, aka, patches, deployments etc. have been applied and as my colleague Vincent has stated <a href="http://blog.xebia.com/2009/08/05/incremental-deployments-vs-full-redeployments/">applying deltas</a> has its cons <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Of-course i&#8217;m talking about servers and not applications and the same rules do not apply, or do they?</p>
<p><span id="more-3895"></span></p>
<p><strong>Deltas on servers are bad, period.</strong></p>
<p>I think the same rules do apply. Applying deltas might be faster but in the end it will become increasingly harder to map out the path you have taken from 4 years ago up till now! and this is oh-so obvious on the servers themselves. Try and rebuild a 4 year old server where every week at least 5 deployments have been executed, every month a patch or two to the OS-Middleware has been applied and every six months some change to the filesystem has taken place. It is just plain hard.</p>
<p><strong>And here is the prime example</strong></p>
<p>A couple of years ago i witnessed a project that was trying to move their entire server and application environment from one location to another and in the meantime trying to get rid of some out-of-date-standards which were lingering on those servers. They had automated deployment scripts for all their applications, so the only thing they needed to do is make sure they had a clean environment in the new server location where they could install the latest and greatest version of their applications. They tried for 6 months to get it working but failed because they could not properly reproduce the servers at the remote location, so much old-out-of-date-stuff on those servers was needed by applications! So finally in the end they gave up and moved all their servers by restoring a server-backup on the remote site. The lesson this company learned was to spread the amount of applications onto different servers. This allowed them to keep their servers and applications more up-to-date and get rid of out-of-date-standards more visibly.</p>
<p><strong>Introducing the new is easy, getting rid of the old, just let it be&#8230;</strong></p>
<p>The company created new servers which were going to be used by new applications. Therefore they could install them almost anyway they wanted to. Those new application deployments could then use the new features of those servers and almost everything was good. Whenever an old application wanted to make use of some of the new functionality only available on new servers they had to adjust their deployment and sometimes code. It was accepted that when using new functionality, you move to a new server with updated JDK, log file paths, more memory, new version of the application server or a portal and so on. Applications had a natural upgrade path, old applications are running on old servers but those servers do not require much maintenance except for the odd patch and clean log files. New applications are running on new servers with better middleware, tools, etc. making maintenance life somewhat easier on a different level.</p>
<p><strong>Different levels of maintenance &#8211; Monuments vs. Cheap housing</strong></p>
<p>How can more servers result in lower maintenance, isn&#8217;t that just weird? Yes it is! But the difference is this; If i have one server for all my applications it becomes hard to make changes to the server and those applications. Just like 40-people-(applications) living in a monumental-building-(server). For every change you have to figure out what the impact is on the building itself and the people living there. In my own experience, every time i wanted to make some change to the server i had to go through a committee to get approval! The committee consisted of not only hardware/OS/Middleware people but also all the applications people! All 40 of them ;( You might feel my frustration as i requested my third change for that particular server in the year. When we moved to smaller-servers-(cheap housing) with less applications-(small families) it got a whole lot easier to make changes <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Ok, ok, so the amount of maintenance wasn&#8217;t the problem, getting consent from 50 people to change and then finding out if it worked in the monument was the problem. Whereas changing something and/or building a brand new cheap house felt like a breeze!</p>
<p><strong>So what about the future then?</strong></p>
<p>In my next post i&#8217;ll explore what is in my opinion the next big thing after the &#8220;Monument&#8221; and &#8220;Cheap housing&#8221;. Of-course it has something to do with cloud/virtualization technologies. It will be all about <a href="http://www.vmware.com/products/labmanager/">moving appliances!</a> and it is something that <a href=http://www.xebialabs.com>Deployit</a> will provide support for.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2009/12/21/future-of-deployment-part-1-monuments-vs-cheap-housing/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2009%2F12%2F21%2Ffuture-of-deployment-part-1-monuments-vs-cheap-housing%2F&amp;title=Future%20of%20deployment%3A%20Part%201%20%26%238211%3B%20Monuments%20vs%20Cheap%20housing" id="wpa2a_12"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2009/12/21/future-of-deployment-part-1-monuments-vs-cheap-housing/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>So what is a deployment really?</title>
		<link>http://blog.xebia.com/2009/07/08/so-what-is-a-deployment-really/</link>
		<comments>http://blog.xebia.com/2009/07/08/so-what-is-a-deployment-really/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 13:21:27 +0000</pubDate>
		<dc:creator>Robert van Loghem</dc:creator>
				<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Xebia Labs]]></category>

	<!-- AutoMeta Start -->
	<category></category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=2502</guid>
		<description><![CDATA[You just baked the first release of your application using Maven. Next you start up the administrative console of the application server in the development environment. Then you deploy the fresh loaf of ear-file to the server and fire up your browser to see if you can reach the application. As you try to load [...]]]></description>
			<content:encoded><![CDATA[<p>You just baked the first release of your application using <a href="http://maven.apache.org/">Maven</a>. Next you start up the administrative console of the application server in the <a href="http://en.wikipedia.org/wiki/Development_environment">development environment</a>. Then you deploy the fresh loaf of <a href="http://en.wikipedia.org/wiki/EAR_(file_format)">ear</a>-file to the server and fire up your browser to see if you can reach the application. As you try to load the page, you get a DNS error, <em>&#8220;Host not found&#8221;</em>. Time to phone Bob! &#8211; the friendly operator of all that funky infrastructure and middleware. Bob is of course happy to add a DNS record that will point www.app-in-dev.com to an <a href="http://httpd.apache.org/">Apache server</a>. <em>&#8220;Wait! An Apache server?&#8221;-you exclaim! &#8220;But it should point to our application server, not an HTTP server thing.&#8221;</em> </p>
<p>Bob, by now used to having to teach young developers the intricacies of modern <a href="http://en.wikipedia.org/wiki/Network_topology">network topologies</a>, calmly explains that all requests coming from a browser first must go through a cluster of HTTP servers before the requests are routed to the <a href="http://en.wikipedia.org/wiki/Application_server">application servers</a>. <em>&#8220;You also need to configure Apache!&#8221;</em> he says. <em>&#8220;But I am developing a Java application, I only need to deploy to an application server and then I am done.&#8221;</em> you respond. Bob, sighs. <em>&#8220;Listen son, pressing the deploy button in the administrative console is only a small sentence in the big deployment story.&#8221;</em><br />
<span id="more-2502"></span><br />
<strong>The goal of a deployment</strong></p>
<p>Before I start talking about the full deployment story, you first have to realize what the goal of a deployment is.<br />
It is: &#8220;Making an application available to end users&#8221;. This means that the end user has opened his/her browser, types <em>&#8220;www.app.com&#8221;</em> and sees the application in production, hence the <em>www.app.com</em> URL, fully functional! </p>
<p>So what is needed to run the application? Let&#8217;s follow the end user&#8217;s browser request and see what components it hits;<br />
<em>First it hits a firewall, then an http server, another firewall, the application server and finally the application running in the application server which uses a database to retrieve some data.</em> In total there are 5 components involved to get the application successfully available: we need to not only configure all 5 components but also place some data on some of those components and make sure they are (re-)started in the correct order to get the pretty picture to the end-user.</p>
<p>If I were to write down all the steps needed to do a full deployment of the application in production it would be something like</p>
<blockquote><p><em><strong>a.</strong> Run create table definition SQL scripts against the database.<br />
<strong>b.</strong> Configure JDBC data source in the application server<br />
<strong>c.</strong> Configure http ports and virtual hosts in the application server so the application is reachable for http requests<br />
<strong>d.</strong> Install the application on the application server<br />
<strong>e.</strong> Start the application<br />
<strong>f.</strong> Configure the firewall, by opening ports to allow communication between the http server and the application server<br />
<strong>g.</strong> Configure an http server so requests that are coming in for &#8220;www.app.com&#8221; that do NOT end with e.g. .js,.html,.gif are routed through to the application server<br />
<strong>h.</strong> Place the static html content on the http server<br />
<strong>i.</strong> (re-)Start the http server so it reads in the new configuration<br />
<strong>j.</strong> Configure the outside firewall, to allow access from &#8220;www.app.com&#8221; to route to the right http server<br />
</em></p></blockquote>
<p>Of course, a more complex environment just adds steps to the deployment step list. For example, in a high available clustered environment, I have to do everything at least twice and make sure that all the components are configured and (re-)started to run in that clustered environment.</p>
<p><strong>A deployment really is&#8230;</strong></p>
<p>The above steps make sure that &#8220;an application is available to end users&#8221; in production. They can generally be broken down into the following deployment categories, and thus this is what a deployment really is:</p>
<blockquote><p><em><strong>1.</strong> Installing applications (Step d.)</em><br />
This is the core part of the deployment, where the actual application logic is installed on the server, in J(2)EE/Java this usually means installing an EAR or WAR file.</p>
<p><em><strong>2.</strong> Configuring resources (Step b.)</em><br />
The application might need data from other systems, like databases or mainframes. The application can use resources to query for or receive data. Resources are typically configured in the application server.</p>
<p><em><strong>3.</strong> Configuring middleware components (Step a, c, f, g, h, j.)</em><br />
To reach the application or to provide an instance where the application can run or house data on (e.g. create application server clusters, http server instances, create database instance, create/update tables) middleware must be configured.</p>
<p><em><strong>4.</strong> Starting/Stopping components (Step e, i.)</em><br />
To make sure that a component can function properly, it might need to be (re-)started.</p>
<p><em><strong>5.</strong> and doing all the above (1, 2, 3, 4) in the right order.</em><br />
To make sure the application starts up nicely, without errors some order has to be maintained as what component needs to (re-)start at what time. E.g. If you install the application (step d.) and start it before the data source is configured (step b), the application might not start up properly. This becomes even more important when deploying a new version of your application in a high available clustered environment.</p>
<p>There is one additional category for companies that use a DTAP (Development, Test, Acceptance, Production) environment setup:<br />
<em><strong>6.</strong> Configuring the installed application for different environments</em><br />
A deployment must make sure to customize the configuration to suit a specific environment. E.g. when you install an application on development it needs some data from the development database, the same application in test needs data from the database in test, and so on.
</p></blockquote>
<p><strong>What a deployment is not&#8230;</strong></p>
<p>A lot of people seem to think that installing the application on an application server is the actual deployment. Sure, the button in the application server administration console says, <em>&#8220;Deploy application&#8221;</em> but that will only do the application server part and will only work in simple environments, like the development or developer workstation environments. As soon as the application reaches a more complex environment with multiple middleware components it just does not cut it anymore and you need additional steps to make the application accessible to test/end users.</p>
<p><strong>What or who can do a real deployment</strong></p>
<p>Most people are relying on other people to make the real deployment happen, manually configuring middleware, pressing the deploy button in the administration console and all that other stuff. Some are trying to automate deployments and are relying on deployment scripts or products like Phurnace or Buildforge, but these will only do a very small part of the real deployment, only installing applications (see category 1 above) and configuring resources (see category 2 above). There aren&#8217;t many products around on the market that can do &#8220;real&#8221; deployment. <a href="http://www.xebialabs.com/">XebiaLabs</a> offers a product named <a href="http://www.xebialabs.com/deployit-automated-deployment-java-applications">Deployit</a> that has supports for all 6 deployment categories. </p>
<p><strong>Be aware of what it takes</strong></p>
<p>So if you aren&#8217;t in the lucky position of having access to a product that does real deployment, be aware of what needs to be done to get your application available to the end user. Do some scripting, make use of deployment tools and reserve time in your project to let (operations) people configure those middleware components manually.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2009/07/08/so-what-is-a-deployment-really/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2009%2F07%2F08%2Fso-what-is-a-deployment-really%2F&amp;title=So%20what%20is%20a%20deployment%20really%3F" id="wpa2a_14"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2009/07/08/so-what-is-a-deployment-really/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multimedia Communication: When to use screencasts/movies in demos.</title>
		<link>http://blog.xebia.com/2009/04/24/multimedia-communication-when-to-use-screencastsmovies-in-demos/</link>
		<comments>http://blog.xebia.com/2009/04/24/multimedia-communication-when-to-use-screencastsmovies-in-demos/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 08:46:32 +0000</pubDate>
		<dc:creator>Robert van Loghem</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Multimedia]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Xebia Labs]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=1484</guid>
		<description><![CDATA[For the last 9 months I&#8217;ve been working as a team member of Xebialabs on a product called Deployit. The product automates deployments of applications. As any Xebia team we use SCRUM for our development. Now at the end of our two week sprint we give a demo to the product owner and stakeholders of [...]]]></description>
			<content:encoded><![CDATA[<p>For the last 9 months I&#8217;ve been working as a team member of <a href="http://www.xebialabs.com">Xebialabs</a> on a product called <a href="http://www.xebialabs.com/content/deployit">Deployit</a>. The product automates deployments of applications. As any Xebia team we use <a href="http://en.wikipedia.org/wiki/Scrum_(development)">SCRUM</a> for our development. Now at the end of our two week sprint we give a demo to the product owner and stakeholders of what we&#8217;ve been building.</p>
<p>We demo deploying applications onto a variety of Application Servers and other Middleware, like for instance WebSphere/Oracle-Bea Application Server/Portal, MQSeries, HTTP Servers and so on&#8230; Sometimes demo-ing a story, like deploy application A to application server B can take 10 to 15 minutes. That means, for an hour of demo time we can not show every user story that we finished in our sprint. So we only show the important ones. But what happens when demoing a story can take up to 45 minutes? How can can we cram multiple finished stories into the hour?<br />
<span id="more-1484"></span><br />
Multimedia to the rescue! Whenever we have a story that takes a lot of time to demo, we record a <a href="http://en.wikipedia.org/wiki/Screencast">screencast</a> when we are preparing, cut out the long waiting parts and then show it as a movie. Please note; we only do this when we demo a user story where we have to wait for a long time. It also is important to tell the product owner and stakeholders that you are playing a movie that normally takes 45 minutes but has been cut down to 2.</p>
<p>Two months ago we worked on <a href="http://www.ibm.com/software/websphere/portal/">WebSphere Portal</a> deployments. The story; Deploy Portlets, Update Skins-Themes-and-Screens and create Virtual Portal was implemented and added to the <a href="http://fitnesse.org/">Fitnesse</a> test suite. To prepare for the demo, I ran the Portal deployment test case. Fitnesse quickly entered all the necessary data into Deployit. (1 second) Then it hit the &#8220;Deploy&#8221; button and we were off! (sub 1 second). My Macbook Pro&#8217;s CPU fans started spinning up because the deployment to portal was taking place and after 45 minutes it was done! Before i started the test, i recorded my desktop/screen with my favorite screencast software <a href="http://www.telestream.net/screen-flow/overview.htm">ScreenFlow</a>. After the test ran, i edited all the parts out of the recording where there was no activity on the screen. That left me with a screencast/recorded movie of about 2 minutes! Perfectly demo-able!</p>
<p><img src="http://blog.xebia.com/wp-content/uploads/2009/04/deployitscreenflow.png" alt="Screenflow recording Deployit" /><br />
During the demo, we played the movie, we got feedback from the product owner and had lots of time left to demo other user stories. Of course we told the product owner that he shouldn&#8217;t expect the same portal performance <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  (2 vs. 45 mins.) But that was very clear to him.</p>
<p>It might feel a bit like cheating because we aren&#8217;t showing the real &#8220;live&#8221; user story. But sometimes it isn&#8217;t practical. We want feedback from the product owner and stakeholders. The more feedback we get, the better and using screencasts/movies in demos helps us a great deal. </p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2009/04/24/multimedia-communication-when-to-use-screencastsmovies-in-demos/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2009%2F04%2F24%2Fmultimedia-communication-when-to-use-screencastsmovies-in-demos%2F&amp;title=Multimedia%20Communication%3A%20When%20to%20use%20screencasts%2Fmovies%20in%20demos." id="wpa2a_16"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2009/04/24/multimedia-communication-when-to-use-screencastsmovies-in-demos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Persistence API &#8211; Podcast &#8211; JSpring &#8217;09 Preview</title>
		<link>http://blog.xebia.com/2009/04/03/java-persistence-api-podcast-jspring-09-preview/</link>
		<comments>http://blog.xebia.com/2009/04/03/java-persistence-api-podcast-jspring-09-preview/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 09:42:47 +0000</pubDate>
		<dc:creator>Robert van Loghem</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/blog.xebia.com/www/wp-content/plugins/autometa/autometa.php</b> on line <b>303</b><br />
		<category><![CDATA[Podcast]]></category>
		<category><![CDATA[JPA]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=940</guid>
		<description><![CDATA[On the 15th of April the NLJUG (Dutch Java User group) will be holding their J-Spring conference. Four Xebians will be presenting. Every week we&#8217;ll be providing a sneak preview on the podcast of one of those presentations. The second sneak peek is about The Java Persistence API &#8211; How do i build a real [...]]]></description>
			<content:encoded><![CDATA[<p>On the 15th of April the NLJUG (Dutch Java User group) will be holding their <a href="http://www.nljug.org/jspring/">J-Spring conference</a>. Four Xebians will be presenting. Every week we&#8217;ll be providing a sneak preview on the podcast of one of those presentations.</p>
<p>The second sneak peek is about The Java Persistence API &#8211; How do i build a real application by Vincent Partington.</p>
<p>The preview is in Dutch, a full interview in english will be coming in about 4 weeks.</p>
<p>You can find more information <a href="http://www.nljug.org/pages/events/content/jspring_2009/sessions/00027/">here</a> or read Vincent&#8217;s <a href="http://blog.xebia.com/category/jpa/">JPA blog series</a>.</p>
<p>Vincent&#8217;s presentation is from 14.25 to 15.15</p>
<p>So head on over to the <a href="http://podcast.xebia.com/Xebia_Audio_and_Video_Podcast/Entries/2009/4/3_Episode_24_-_JSpring_Preview_-_JPA.html">show page</a> or subscribe to our <a href="http://podcast.xebia.com">podcast</a>!</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2009/04/03/java-persistence-api-podcast-jspring-09-preview/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2009%2F04%2F03%2Fjava-persistence-api-podcast-jspring-09-preview%2F&amp;title=Java%20Persistence%20API%20%26%238211%3B%20Podcast%20%26%238211%3B%20JSpring%20%26%238217%3B09%20Preview" id="wpa2a_18"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2009/04/03/java-persistence-api-podcast-jspring-09-preview/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Software Transactional Memory &#8211; Podcast &#8211; JSpring &#8217;09 Preview</title>
		<link>http://blog.xebia.com/2009/03/28/software-transactional-memory-podcast-jspring-09-preview/</link>
		<comments>http://blog.xebia.com/2009/03/28/software-transactional-memory-podcast-jspring-09-preview/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 11:23:37 +0000</pubDate>
		<dc:creator>Robert van Loghem</dc:creator>
				<category><![CDATA[Podcast]]></category>
		<category><![CDATA[Concurrency Control]]></category>

	<!-- AutoMeta Start -->
	<category></category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://blog.xebia.com/?p=915</guid>
		<description><![CDATA[On the 15th of April the NLJUG (Dutch Java User group) will be holding their J-Spring conference. Four Xebians will be presenting. Every week we&#8217;ll be providing a sneak preview on the podcast of one of those presentations. The first sneak peek is about Software Transactional Memory by Peter Veentjer. You can find more information [...]]]></description>
			<content:encoded><![CDATA[<p>On the 15th of April the NLJUG (Dutch Java User group) will be holding their <a href="http://www.nljug.org/jspring/">J-Spring conference</a>. Four Xebians will be presenting. Every week we&#8217;ll be providing a sneak preview on the podcast of one of those presentations.</p>
<p>The first sneak peek is about <a href="http://en.wikipedia.org/wiki/Software_transactional_memory">Software Transactional Memory</a> by <a href="http://pveentjer.wordpress.com/">Peter Veentjer</a>. </p>
<p>You can find more information at the <a href="http://www.nljug.org/pages/events/content/jspring_2009/sessions/00016/">NLJUG presentation page</a>. </p>
<p>Peter&#8217;s presentation is from 11:20 to 12:10.</p>
<p>Hosted by Robert van Loghem.</p>
<p>This preview is in Dutch. After the 15th we&#8217;ll be doing a full episode in english about STM. </p>
<p>So head on over to the <a href="http://podcast.xebia.com/Xebia_Audio_and_Video_Podcast/Entries/2009/3/28_Episode_23_-_JSpring_Preview_-_STM.html">show page</a> or subscribe to our <a href="http://podcast.xebia.com">podcast</a>!</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="1" href="http://blog.xebia.com/2009/03/28/software-transactional-memory-podcast-jspring-09-preview/"></g:plusone></div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.xebia.com%2F2009%2F03%2F28%2Fsoftware-transactional-memory-podcast-jspring-09-preview%2F&amp;title=Software%20Transactional%20Memory%20%26%238211%3B%20Podcast%20%26%238211%3B%20JSpring%20%26%238217%3B09%20Preview" id="wpa2a_20"><img src="http://blog.xebia.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.com/2009/03/28/software-transactional-memory-podcast-jspring-09-preview/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  blog.xebia.com/author/rvanloghem/feed/ ) in 0.87758 seconds, on Feb 9th, 2012 at 5:08 pm UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Feb 9th, 2012 at 6:08 pm UTC -->
