<?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>Mark Needham</title>
	
	<link>http://www.markhneedham.com/blog</link>
	<description>Thoughts on Software Development</description>
	<lastBuildDate>Sat, 11 Feb 2012 10:56:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/MarkNeedham" /><feedburner:info uri="markneedham" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>MarkNeedham</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Oracle Spatial: java.sql.SQLRecoverableException: No more data to read from socket</title>
		<link>http://feedproxy.google.com/~r/MarkNeedham/~3/zm-Ktf0xrsM/</link>
		<comments>http://www.markhneedham.com/blog/2012/02/11/oracle-spatial-java-sql-sqlrecoverableexception-no-more-data-to-read-from-socket/#comments</comments>
		<pubDate>Sat, 11 Feb 2012 10:55:58 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=3997</guid>
		<description><![CDATA[We&#8217;re using Oracle Spatial on my current project so that we can locate points within geographical regions and decided earlier in the week to rename the table where we store the SDO_GEOMETRY objects for each region. We did that by using a normal table alter statement but then started seeing the following error when we [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re using Oracle Spatial on my current project so that we can locate points within geographical regions and decided earlier in the week to rename the table where we store the <a href="http://docs.oracle.com/cd/B19306_01/appdev.102/b14255/sdo_objrelschema.htm#i1004087">SDO_GEOMETRY</a> objects for each region.</p>
<p>We did that by using a normal table alter statement but then started seeing the following error when we tried to insert test data in that column which takes an SDO_GEOMETRY object:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">org.hibernate.exception.JDBCConnectionException: could not execute native bulk manipulation query
       at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:99)
       at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
       at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:219)
       at org.hibernate.impl.SessionImpl.executeNativeUpdate(SessionImpl.java:1310)
       at org.hibernate.impl.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:396)
       at $Proxy53.insertTariffZone(Unknown Source)    
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
       at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
       at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
       at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
       at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
       at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
       at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
       at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
       at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
       at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
       at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
       at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
       at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
       at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
       at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
       at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:71)
       at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:202)
       at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
       at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.sql.SQLRecoverableException: No more data to read from socket
       at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1157)
       at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
       at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
       at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
       at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
       at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1044)
       at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1329)
       at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
       at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3665)
       at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1352)
       at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
       at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:210)
       ... 39 more</pre></div></div>

<p>We couldn&#8217;t see anything particularly wrong in what we&#8217;d done and none of the error messages we got were being particularly helpful.</p>
<p>Eventually we asked the DBA on our team to help out and he showed us how to look up the Oracle system logs which in our case were located at:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">/u01/app/oracle/diag/rdbms/orcl/orcl/trace</pre></div></div>

<p>We ran the query again and noticed new files were being written to that location, one of which had the following error message:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Exception [type: SIGSEGV, Address not mapped to object] [ADDR:0x40] [PC:0x2FDAE7D, mdidxid()+2563] [flags: 0x0, count: 1]
DDE: Problem Key 'ORA 7445 [mdidxid()+2563]' was flood controlled (0x2) (incident: 3851)
ORA-07445: exception encountered: core dump [mdidxid()+2563] [SIGSEGV] [ADDR:0x40] [PC:0x2FDAE7D] [Address not mapped to object] []
ORA-13203: failed to read USER_SDO_GEOM_METADATA view
ssexhd: crashing the process...
Shadow_Core_Dump = PARTIAL</pre></div></div>

<p>We&#8217;d forgotten to rename the table in the USER_SDO_GEOM_METADATA view, exactly as the message says!</p>
<p>Running the following statement sorted us out:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">UPDATE user_sdo_geom_metadata SET table_name = 'NEW_NAME' where table_name = 'OLD_NAME';</pre></div></div>

<img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/zm-Ktf0xrsM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2012/02/11/oracle-spatial-java-sql-sqlrecoverableexception-no-more-data-to-read-from-socket/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.markhneedham.com/blog/2012/02/11/oracle-spatial-java-sql-sqlrecoverableexception-no-more-data-to-read-from-socket/</feedburner:origLink></item>
		<item>
		<title>Java: Fooled by java.util.Arrays.asList</title>
		<link>http://feedproxy.google.com/~r/MarkNeedham/~3/jfychlZFZ1k/</link>
		<comments>http://www.markhneedham.com/blog/2012/02/11/java-fooled-by-java-util-arrays-aslist/#comments</comments>
		<pubDate>Sat, 11 Feb 2012 10:29:15 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=3992</guid>
		<description><![CDATA[I&#8217;ve been playing around with the boilerpipe code base by writing some tests around it to check my understanding but ran into an interesting problem using java.util.Arrays.asList to pass a list into one of the functions. I was testing the BlockProximityFusion class which is used to merge together adjacent text blocks. I started off calling [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been playing around with the <a href="http://code.google.com/p/boilerpipe/">boilerpipe</a> code base by writing some tests around it to check my understanding but ran into an interesting problem using <cite>java.util.Arrays.asList</cite> to pass a list into one of the functions.</p>
<p>I was testing the <cite><a href="https://github.com/mneedham/boilerpipe/blob/master/src/main/de/l3s/boilerpipe/filters/heuristics/BlockProximityFusion.java">BlockProximityFusion</a></cite> class which is used to merge together adjacent text blocks.</p>
<p>I started off calling that class like this:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> java.<span style="color: #006633;">util</span>.<span style="color: #003399;">Arrays</span>.<span style="color: #006633;">asList</span><span style="color: #339933;">;</span>
&nbsp;
@Test
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> willCallBlockProximityFustion<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">&#123;</span>    
    TextDocument document <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TextDocument<span style="color: #009900;">&#40;</span>asList<span style="color: #009900;">&#40;</span>contentBlock<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;some words&quot;</span><span style="color: #009900;">&#41;</span>, contentBlock<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;followed by more words&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    BlockProximityFusion.<span style="color: #006633;">MAX_DISTANCE_1</span>.<span style="color: #006633;">process</span><span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">private</span> TextBlock contentBlock<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> words<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    TextBlock textBlock <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TextBlock<span style="color: #009900;">&#40;</span>words, <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BitSet</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, wordCount<span style="color: #009900;">&#40;</span>words<span style="color: #009900;">&#41;</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    textBlock.<span style="color: #006633;">setIsContent</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> textBlock<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Which blows up like this:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">java.<span style="color: #006633;">lang</span>.<span style="color: #003399;">UnsupportedOperationException</span>
	at java.<span style="color: #006633;">util</span>.<span style="color: #003399;">AbstractList</span>.<span style="color: #006633;">remove</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">AbstractList</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">144</span><span style="color: #009900;">&#41;</span>
	at java.<span style="color: #006633;">util</span>.<span style="color: #003399;">AbstractList</span>$Itr.<span style="color: #006633;">remove</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">AbstractList</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">360</span><span style="color: #009900;">&#41;</span>
	at de.<span style="color: #006633;">l3s</span>.<span style="color: #006633;">boilerpipe</span>.<span style="color: #006633;">filters</span>.<span style="color: #006633;">heuristics</span>.<span style="color: #006633;">BlockProximityFusion</span>.<span style="color: #006633;">process</span><span style="color: #009900;">&#40;</span>BlockProximityFusion.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">115</span><span style="color: #009900;">&#41;</span>
	at de.<span style="color: #006633;">l3s</span>.<span style="color: #006633;">boilerpipe</span>.<span style="color: #006633;">filters</span>.<span style="color: #006633;">heuristics</span>.<span style="color: #006633;">BlockProximityFusionTest</span>.<span style="color: #006633;">willCallBlockProximityFustion</span><span style="color: #009900;">&#40;</span>BlockProximityFusionTest.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">63</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>The code around that area is trying to remove an element from an iterator&#8230;</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>113
114
115
116
117
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">                <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>ok<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    prevBlock.<span style="color: #006633;">mergeNext</span><span style="color: #009900;">&#40;</span>block<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    it.<span style="color: #006633;">remove</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    changes <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span></pre></td></tr></table></div>

<p>&#8230;which was created from the list that we passed into the constructor of <cite>TextDocument</cite>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>98
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">        <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>Iterator<span style="color: #339933;">&lt;</span>TextBlock<span style="color: #339933;">&gt;</span> it <span style="color: #339933;">=</span> textBlocks.<span style="color: #006633;">listIterator</span><span style="color: #009900;">&#40;</span>offset<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> it</pre></td></tr></table></div>

<p>The <cite>remove</cite> method is not implemented on the list created by &#8216;Arrays.asList&#8217; which is weird since I thought it created an <cite>ArrayList</cite> which does implement <cite>remove</cite>!</p>
<p>I&#8217;ve now learnt that the <cite>ArrayList</cite> created by &#8216;Arrays.asList&#8217; is actually a private inner class of <cite>Arrays</cite> and doesn&#8217;t implement the <cite>remove</cite> method!</p>
<p>Who knew&#8230;</p>
<img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/jfychlZFZ1k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2012/02/11/java-fooled-by-java-util-arrays-aslist/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.markhneedham.com/blog/2012/02/11/java-fooled-by-java-util-arrays-aslist/</feedburner:origLink></item>
		<item>
		<title>Downloading the JDK 6 source code</title>
		<link>http://feedproxy.google.com/~r/MarkNeedham/~3/JaRXbQrfDXM/</link>
		<comments>http://www.markhneedham.com/blog/2012/02/11/downloading-the-jdk-6-source-code/#comments</comments>
		<pubDate>Sat, 11 Feb 2012 10:02:09 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=3988</guid>
		<description><![CDATA[Every now and then I want to get the JDK source code onto a new machine and it always seems to take me longer than I expect it to so this post is an attempt to help future me! Googling for this takes me to this page and I always think I&#8217;ll just checkout the [...]]]></description>
			<content:encoded><![CDATA[<p>Every now and then I want to get the JDK source code onto a new machine and it always seems to take me longer than I expect it to so this post is an attempt to help future me!</p>
<p>Googling for this takes me to <a href="http://download.java.net/jdk6/6u23/promoted/latest/">this page</a> and I always think I&#8217;ll just checkout the <a href="http://java.net/projects/jdk-jrl-sources/">SVN repository</a> and hook that up but it doesn&#8217;t seem to be available.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ wget -S http://java.net/projects/jdk-jrl-sources/
--2012-02-11 09:51:34--  http://java.net/projects/jdk-jrl-sources/
Resolving java.net (java.net)... 192.9.164.103
Connecting to java.net (java.net)|192.9.164.103|:80... connected.
HTTP request sent, awaiting response... 
  HTTP/1.1 404 Not Found
  Date: Sat, 11 Feb 2012 09:51:34 GMT</pre></div></div>

<p>The alternative is therefore to download the jar provided which we can do like this:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">wget http://www.java.net/download/jdk6/6u23/promoted/b05/jdk-6u23-fcs-src-b05-jrl-12_nov_2010.jar</pre></div></div>

<p>The next step is then to execute the jar which I somehow didn&#8217;t realise until I unpacked it and had a look at the README:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">java -jar jdk-6u23-fcs-src-b05-jrl-12_nov_2010.jar</pre></div></div>

<p>You get asked to choose a folder location for the sources and then the code is under &#8216;src/share/classes&#8217;. So for me I need to give IntelliJ a source path of :</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">/Users/mneedham/github/j2se/src/share/classes</pre></div></div>

<p>You can browse the different versions of the source code by changing the version number at the end of URLs like <a href="http://download.java.net/jdk6/6u23/">this one</a>. At the moment version 23 is the latest one available.</p>
<img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/JaRXbQrfDXM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2012/02/11/downloading-the-jdk-6-source-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.markhneedham.com/blog/2012/02/11/downloading-the-jdk-6-source-code/</feedburner:origLink></item>
		<item>
		<title>Delivery approach and constraints</title>
		<link>http://feedproxy.google.com/~r/MarkNeedham/~3/80gKnZ-2bVA/</link>
		<comments>http://www.markhneedham.com/blog/2012/02/08/delivery-approach-and-constraints/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 22:34:02 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=3984</guid>
		<description><![CDATA[In my latest post I described an approach we&#8217;d been taking when analysing how to rewrite part of an existing system so that we could build the new version in an incremental way. Towards the end I pointed out that we weren&#8217;t actually going to be using an incremental approach as we&#8217;d initially thought which [...]]]></description>
			<content:encoded><![CDATA[<p>In my latest post I described an approach we&#8217;d been taking when analysing how to rewrite part of an existing system so that we could <a href="http://www.markhneedham.com/blog/2012/02/06/looking-for-the-seam/">build the new version in an incremental way</a>.</p>
<p>Towards the end I pointed out that we weren&#8217;t actually going to be using an incremental approach as we&#8217;d initially thought which was due to a couple of constraints that we have to work under.</p>
<h4>Hardware provisioning</h4>
<p>One of the main reasons that we favoured an incremental approach is that we&#8217;d be able to deploy to production early which would allow us to show a quicker return on investment.</p>
<p>Unfortunately we later on came to learn that it takes <strong>around 6-9 months to provision production hardware</strong>.</p>
<p>It therefore didn&#8217;t make a lot of sense to take an approach where we tried to integrate into the existing system since we wouldn&#8217;t be able to deploy that work.</p>
<p>We&#8217;re working under the assumption that in 6-9 months we&#8217;ll probably be able to rewrite the whole thing and can therefore avoid the need to write the code which would allow us to integrate into the existing version.</p>
<p>We couldn&#8217;t see any value in writing bridging code between the existing and new versions of the application if it never sees production &#8211; we&#8217;d put in all the effort for no reward.</p>
<h4>Running two systems side by side</h4>
<p>Even if we had been able to provision hardware in time to release incrementally we came to learn that <strong>the business would be uncomfortable with having two versions of the same application in production at the same time</strong>.</p>
<p>The application is used to do pricing and the worry was that the different versions might produce different results for the same inputs.</p>
<p>It&#8217;s arguably something we may have been able to overcome if we could prove that the new version worked exactly the same as the existing one by running both applications against a set of scenarios and checking that they returned the same results.</p>
<p>Theoretically I suppose the first problem could also be overcome but it&#8217;s a battle we&#8217;ve chosen to leave alone for the moment.</p>
<p>What I found interesting in the discussions about the way we should deliver our solution was that I&#8217;d worked under the assumption that an incremental approach was always a better approach but with these constraints it isn&#8217;t.</p>
<img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/80gKnZ-2bVA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2012/02/08/delivery-approach-and-constraints/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.markhneedham.com/blog/2012/02/08/delivery-approach-and-constraints/</feedburner:origLink></item>
		<item>
		<title>Looking for the seam</title>
		<link>http://feedproxy.google.com/~r/MarkNeedham/~3/jTpxAzjUfEM/</link>
		<comments>http://www.markhneedham.com/blog/2012/02/06/looking-for-the-seam/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 22:22:16 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=3980</guid>
		<description><![CDATA[During December/early January we spent some time analysing an existing system which we were looking to rewrite and our approach was to look for how we could do this in an incremental way. In order to do that we needed to look for what Michael Feathers refers to as a seam: A seam is a [...]]]></description>
			<content:encoded><![CDATA[<p>During December/early January we spent some time analysing an existing system which we were looking to rewrite and our approach was to look for how we could do this in an incremental way.</p>
<p>In order to do that we needed to look for what Michael Feathers refers to as a <a href="http://www.markhneedham.com/blog/2009/06/21/seams-some-thoughts/">seam</a>:</p>
<blockquote><p>
A seam is a place where you can alter behaviour in your program without editing in that place
</p></blockquote>
<p>On previous times when I&#8217;ve been thinking about seams it&#8217;s been at a code level inside a single application but this time there were more than one pieces interacting.</p>
<div style="float:right">
<img src="http://www.markhneedham.com/blog/wp-content/uploads/2012/02/seam.gif" alt="Seam" title="seam.gif" border="0" width="253" height="327" />
</div>
<p>We knew that there was a web application where the user could request a quote which would be calculated offline and then an email sent to them when it was ready to view.</p>
<p>That led us to believe that there was probably some sort of queue being used to store the outstanding requests and there&#8217;d probably be some sort of application processing the requests.</p>
<p>As it turned out the design of the system actually looked like the diagram on the right with the database effectively as a queue.</p>
<p>We then needed to work out which tables we had to read from/write to so that we&#8217;d be able to just replace the &#8216;polling application&#8217; and leave the &#8216;web application&#8217; alone.</p>
<p>We were then able to come up with a design whereby we isolated any interaction with the database into a &#8216;bridging application&#8217; which then farmed requests out to a new application which we could scale horizontally. </p>
<p>It could also take care of writing the quotes back into the database so the existing application could read them back onto the screen.</p>
<p>Although we ended up not using this architecture for other reasons I think it&#8217;s a neat way of looking at systems to work out how we can change them with minimal impact.</p>
<img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/jTpxAzjUfEM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2012/02/06/looking-for-the-seam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.markhneedham.com/blog/2012/02/06/looking-for-the-seam/</feedburner:origLink></item>
		<item>
		<title>Scala: Converting a scala collection to java.util.List</title>
		<link>http://feedproxy.google.com/~r/MarkNeedham/~3/Z-8tYfnlo0Y/</link>
		<comments>http://www.markhneedham.com/blog/2012/02/05/scala-converting-a-scala-collection-to-java-util-list/#comments</comments>
		<pubDate>Sun, 05 Feb 2012 21:40:33 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=3974</guid>
		<description><![CDATA[I&#8217;ve been playing around a little with Goose &#8211; a library for extracting the main body of text from web pages &#8211; and I thought I&#8217;d try converting some of the code to be more scala-esque in style. The API of the various classes/methods is designed so it&#8217;s interoperable with Java code but in order [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been playing around a little with <a href="https://github.com/jiminoc/goose">Goose</a> &#8211; a library for extracting the main body of text from web pages &#8211; and I thought I&#8217;d try converting some of the code to be more scala-esque in style.</p>
<p>The API of the various classes/methods is designed so it&#8217;s interoperable with Java code but in order to use functions like map/filter we need the collection to be a Scala one.</p>
<p>That&#8217;s achieved by importing &#8216;scala.collections.JavaConversions._&#8217; which will apply an implicit conversion to convert the Java collection into a Scala one.</p>
<p>I needed to go back to the Java one again which can be achieved with the following code:</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">import</span> scala.<span style="color: #000000;">collection</span>.<span style="color: #000000;">JavaConversions</span>.<span style="color: #000080;">_</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">val</span> javaCollection <span style="color: #000080;">=</span> seqAsJavaList<span style="color: #F78811;">&#40;</span>Seq<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;abc&quot;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span></pre></div></div>

<p>I also used that function in the <a href="https://github.com/mneedham/goose/blob/94da6fffc30db17a0a7e2060a46fc3317420a83e/src/main/scala/com/gravity/goose/text/StopWords.scala">StopWords.scala</a> object in Goose.</p>
<p>There are a load of other functions available in <a href="https://github.com/scala/scala/blob/master/src/library/scala/collection/JavaConversions.scala">JavaConversions</a> as well for going to a Dictionary, Map, Set and so on.</p>
<img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/Z-8tYfnlo0Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2012/02/05/scala-converting-a-scala-collection-to-java-util-list/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.markhneedham.com/blog/2012/02/05/scala-converting-a-scala-collection-to-java-util-list/</feedburner:origLink></item>
		<item>
		<title>Oracle: dbstart – ORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listener</title>
		<link>http://feedproxy.google.com/~r/MarkNeedham/~3/qxpMMaiZ24k/</link>
		<comments>http://www.markhneedham.com/blog/2012/01/26/oracle-dbstart-oracle_home_listner-is-not-set-unable-to-auto-start-oracle-net-listener/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 21:58:27 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=3970</guid>
		<description><![CDATA[We ran into an interesting problem when trying to start up an Oracle instance using dbstart whereby we were getting the following error: -bash-3.2$ dbstart &#160; ORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listener Usage: /u01/app/oracle/product/11.2.0/dbhome_1/bin/dbstart ORACLE_HOME Processing Database instance &#34;orcl&#34;: log file /u01/app/oracle/product/11.2.0/dbhome_1/startup.log Ignoring the usage message we thought that setting the [...]]]></description>
			<content:encoded><![CDATA[<p>We ran into an interesting problem when trying to start up an Oracle instance using <cite>dbstart</cite> whereby we were getting the following error:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">-bash-3.2$ dbstart
&nbsp;
ORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listener
Usage: /u01/app/oracle/product/11.2.0/dbhome_1/bin/dbstart ORACLE_HOME
Processing Database instance &quot;orcl&quot;: log file /u01/app/oracle/product/11.2.0/dbhome_1/startup.log</pre></div></div>

<p>Ignoring the usage message we thought that setting the environment variable was what we needed to do, but&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">-bash-3.2$ export ORACLE_HOME_LISTNER=$ORACLE_HOME
-bash-3.2$ dbstart
ORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listener
Usage: /u01/app/oracle/product/11.2.0/dbhome_1/bin/dbstart ORACLE_HOME
Processing Database instance &quot;orcl&quot;: log file /u01/app/oracle/product/11.2.0/dbhome_1/startup.log</pre></div></div>

<p>We ended up looking at the source of <cite>dbstart</cite> to see what was going on:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># First argument is used to bring up Oracle Net Listener
ORACLE_HOME_LISTNER=$1
if [ ! $ORACLE_HOME_LISTNER ] ; then
  echo &quot;ORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listener&quot;
  echo &quot;Usage: $0 ORACLE_HOME&quot;</pre></div></div>

<p>The usage message does explain that you&#8217;re supposed to call it like this:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">-bash-3.2$ dbstart $ORACLE_HOME</pre></div></div>

<p>But it still seems a bit weird/misleading to me that you&#8217;d override the value of a global variable from inside a script which doesn&#8217;t suggest that it&#8217;s going to do that!</p>
<p>Such is life in Oracle land..</p>
<img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/qxpMMaiZ24k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2012/01/26/oracle-dbstart-oracle_home_listner-is-not-set-unable-to-auto-start-oracle-net-listener/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.markhneedham.com/blog/2012/01/26/oracle-dbstart-oracle_home_listner-is-not-set-unable-to-auto-start-oracle-net-listener/</feedburner:origLink></item>
		<item>
		<title>Developer machine automation: Dependencies</title>
		<link>http://feedproxy.google.com/~r/MarkNeedham/~3/diooRVhtD_0/</link>
		<comments>http://www.markhneedham.com/blog/2012/01/24/developer-machine-automation-dependencies/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 23:16:52 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=3966</guid>
		<description><![CDATA[As I mentioned in a post last week we&#8217;ve been automating the setup of our developer machines with puppet over the last week and one thing that we&#8217;ve learnt is that you need to be careful about how you define dependencies. The aim is to get your scripts to the point where the outcome is [...]]]></description>
			<content:encoded><![CDATA[<p>As I <a href="http://www.markhneedham.com/blog/2012/01/18/installing-puppet-on-oracle-linux/">mentioned in a post last week</a> we&#8217;ve been automating the setup of our developer machines with puppet over the last week and one thing that we&#8217;ve learnt is that you need to be careful about how you define dependencies.</p>
<p>The aim is to get your scripts to the point where the outcome is reasonably deterministic so that we can have confidence they&#8217;re going to work the next we run them.	</p>
<p>We noticed two ways in which we haven&#8217;t quite achieved determinism yet:</p>
<h4>Accidental Dependencies</h4>
<p>The first few times that we ran the scripts on top of a vanilla image we were doing it on a virtual machine which had VMware tools installed on it.</p>
<p>We&#8217;d forgotten that VMware tools had been installed on those VMs and ran into a problem with Oracle dependencies not being satisfied when we ran puppet on some machines which had CentOS installed directly (i.e. not on a virtual machine).</p>
<p>Those dependencies had been satisfied by our VMware tools installation on the VMs so we didn&#8217;t realise that we hadn&#8217;t explicitly stated those dependencies, something which we have done now.</p>
<h4>External Dependencies</h4>
<p>We couldn&#8217;t find the Firefox version that we wanted install on the default yum repositories so we created a puppet task which linked to a Firefox RPM on an external server and then installed it.</p>
<p>It worked originally but at some stage over the last couple of weeks the URI was changed as a minor version had been upgraded, breaking our script. </p>
<p>We also came across another way that external dependencies can fail today &#8211; if a corporate proxy blocks access to the URL!</p>
<p>We&#8217;re trying to get to the stage where we&#8217;re only relying on artifacts either coming from a <strong>yum repository or an internal repository</strong> where we can store any libraries which aren&#8217;t available through yum.</p>
<h4>Don&#8217;t assume determinism</h4>
<p>While trying to solve these dependency problems in our puppet scripts I made the mistake of assuming that if the script runs through once and works that it&#8217;s always going to be that way in the future.</p>
<p>Since we had achieved that previously in my mind it was impossible for it to fail in future which stopped me from properly investigating why it had stopped working.</p>
<img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/diooRVhtD_0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2012/01/24/developer-machine-automation-dependencies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.markhneedham.com/blog/2012/01/24/developer-machine-automation-dependencies/</feedburner:origLink></item>
		<item>
		<title>Playing around with pomodoros</title>
		<link>http://feedproxy.google.com/~r/MarkNeedham/~3/39u83XjJyv4/</link>
		<comments>http://www.markhneedham.com/blog/2012/01/22/playing-around-with-pomodoros/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 21:25:19 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[pomodoro]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=3961</guid>
		<description><![CDATA[Over the last 3/4 months I&#8217;ve been playing around with the idea of using pomodoros to track all coding/software related stuff that I do outside of work. I originally started using this technique while I was doing the programming assignments for ml-class because I wanted to know how much time I was spending on it [...]]]></description>
			<content:encoded><![CDATA[<p>Over the last 3/4 months I&#8217;ve been playing around with the idea of using <a href="http://www.markhneedham.com/blog/2011/02/20/pomodoro-observations-from-giving-it-a-go/">pomodoros</a> to track all coding/software related stuff that I do outside of work.</p>
<p>I originally started using this technique while I was doing the programming assignments for <a href="http://ml-class.com/">ml-class</a> because I wanted to know how much time I was spending on it each week and make sure I didn&#8217;t run down rabbit holes too often.</p>
<p>One interesting observation that I noticed from keeping the data of these pomodoros was that while during the early programming assignments it would take me 7 or 8 pomodoros to finish, by the end it was down to around 4. </p>
<p>I think this was due to the difficulty of the assignments decreasing as time went on, I didn&#8217;t improve that dramatically!</p>
<p>As I mentioned a few weeks ago I&#8217;ve also been <a href="http://www.markhneedham.com/blog/2011/12/31/yak-shaving-tracking-the-yak-stack/">using pomodoros in combination with a yak stack</a> to make sure I don&#8217;t go off track and it&#8217;s been interesting applying the technique while <a href="http://stackoverflow.com/questions/8949453/jersey-client-thrown-nullpointerexception-on-android">trying to solve a problem I&#8217;m having with using the Jersey client on Android</a>.</p>
<p>It&#8217;s such a fiddly problem and splitting my time into 25 minute slots has forced me to create a plan for what I&#8217;m going to try and do in that pomodoro, whether it be ruling out an approach or trying to understand the underlying code that isn&#8217;t working.  </p>
<p>I haven&#8217;t been successful in solving my problem but I&#8217;m pretty sure that I&#8217;ve spent much less time trying to solve it than I would have otherwise. I can certainly imagine spending hours aimlessly trying things that have no chance of working.</p>
<p>One thing I&#8217;ve been experimenting with is reducing the length of the pomodoro to 15 minutes when I know there&#8217;s something specific that I want to investigate and I&#8217;m fairly sure it won&#8217;t take a full length pomodoro.</p>
<p>Previously I would end up just killing time for 10 minutes or just resetting the pomodoro because I didn&#8217;t have anything else to do.</p>
<p>I generally enjoy coding much more by applying this time constraint and I think the reason for that is explained by <a href="http://www.amazon.co.uk/Progress-Principle-Engagement-Creativity-ebook/dp/B0054KBLBI/ref=sr_1_2?ie=UTF8&#038;qid=1327267340&#038;sr=8-2">The Progress Principle</a>, which I&#8217;m currently reading:</p>
<blockquote><p>
If people are in an excellent mood at the end of the day, it’s a good bet that they have made some progress in their work. If they are in a terrible mood, it’s a good bet that they have had a setback.</p>
<p>To a great extent, inner work life rises and falls with progress and setbacks in the work. This is the progress principle
</p></blockquote>
<p>Using a pomodoro seems to reduce the amount of time that is spent dealing with setbacks and it creates frequent opportunities to discard an approach you&#8217;re taking if it&#8217;s clear that it&#8217;s not going anywhere.</p>
<p>A disadvantage that I&#8217;ve sometimes felt when working on the Jersey/Android problem is that I really don&#8217;t want to spend 25 minutes working on it because I&#8217;ve been getting absolutely nowhere with it for about 6/7 pomodoros now. </p>
<p>I&#8217;d rather delude myself that I&#8217;m going to magically fix it just by fiddling around with the code for an indeterminate period of time!</p>
<p>In a way constraining coding in this way does take some of the fun out of it as well because it&#8217;s now more structured and you tend to have fun when you&#8217;re just randomly doing stuff and lose track of time.</p>
<p>On the other hand I probably end up doing a lot more of the stuff I want to do when I constrain it in this way!</p>
<p>Decisions, decisions&#8230;</p>
<img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/39u83XjJyv4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2012/01/22/playing-around-with-pomodoros/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.markhneedham.com/blog/2012/01/22/playing-around-with-pomodoros/</feedburner:origLink></item>
		<item>
		<title>Installing Puppet on Oracle Linux</title>
		<link>http://feedproxy.google.com/~r/MarkNeedham/~3/bKS6cnty76o/</link>
		<comments>http://www.markhneedham.com/blog/2012/01/18/installing-puppet-on-oracle-linux/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 00:30:59 +0000</pubDate>
		<dc:creator>Mark Needham</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=3956</guid>
		<description><![CDATA[We&#8217;ve been spending some time trying to setup our developer environment on a Oracle Linux 5.7 build and one of the first steps was to install Puppet as we&#8217;ve already created scripts which automate the installation of most things. Unfortunately Oracle Linux builds don&#8217;t come with any yum repos configured so when you run the [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve been spending some time trying to setup our developer environment on a Oracle Linux 5.7 build and one of the first steps was to install Puppet as we&#8217;ve already created scripts which automate the installation of most things.</p>
<p>Unfortunately Oracle Linux builds don&#8217;t come with any yum repos configured so when you run the following command&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">ls -alh /etc/yum.repos.d/</pre></div></div>

<p>&#8230;you don&#8217;t see anything <img src='http://www.markhneedham.com/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>We eventually realised that there are a <a href="http://public-yum.oracle.com/">list of public yum repositories on the Oracle website</a>, of which we needed to download the definition for Oracle Linux 5 like so:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">cd /etc/yum.repos.d
wget http://public-yum.oracle.com/public-yum-el5.repo</pre></div></div>

<p>We then need to edit that file to enable the appropriate repository. In this case we want to enable <cite>ol5_u7_base</cite>:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">[ol5_u7_base]
name=Oracle Linux $releasever - U7 - $basearch - base
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL5/7/base/$basearch/
gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5
gpgcheck=1
enabled=1</pre></div></div>

<p>I made the mistake of enabling <cite>ol5_u5_base</cite> which led to us getting some really weird problems whereby yum got confused as to which version of <cite>libselinux</cite> we had installed and was therefore unable to install <cite>libselinux-ruby</cite> as its dependencies weren&#8217;t being properly satisfied.</p>
<p>Calling &#8216;yum list installed&#8217; suggested that we had <cite>libselinux</cite> 1.33.4.5-7 installed but if we ran &#8216;yum install libselinux&#8217; then it suggested we already had 1.33.4.5-5 installed. Very confusing!</p>
<p>After trying to uninstall and downgrade <cite>libselinux</cite> and pretty much destroying the installation in the process, another colleague spotted my mistake.</p>
<p>We also found that we had to add the epel repo which gave us access to some other packages that we needed:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm</pre></div></div>

<p>After all that was done we were able to run the command to install puppet:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">yum install puppet</pre></div></div>

<p>That installs puppet 2.6.12 as that&#8217;s the latest version in that repo. The latest stable version is 2.7.9 but I think we&#8217;ll need to hook up a puppet specific repo to get that working.</p>
<img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/bKS6cnty76o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.markhneedham.com/blog/2012/01/18/installing-puppet-on-oracle-linux/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.markhneedham.com/blog/2012/01/18/installing-puppet-on-oracle-linux/</feedburner:origLink></item>
	</channel>
</rss>

