<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Objectopia</title>
	<atom:link href="http://objectopia.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://objectopia.com</link>
	<description></description>
	<lastBuildDate>Fri, 23 Dec 2011 12:33:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='objectopia.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Objectopia</title>
		<link>http://objectopia.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://objectopia.com/osd.xml" title="Objectopia" />
	<atom:link rel='hub' href='http://objectopia.com/?pushpress=hub'/>
		<item>
		<title>A story of an awful tirade from an awful woman</title>
		<link>http://objectopia.com/2011/12/23/getting-shouted-at-by-an-awful-stranger-why-do-you-let-them-talk-to-you-like-that/</link>
		<comments>http://objectopia.com/2011/12/23/getting-shouted-at-by-an-awful-stranger-why-do-you-let-them-talk-to-you-like-that/#comments</comments>
		<pubDate>Fri, 23 Dec 2011 12:27:31 +0000</pubDate>
		<dc:creator>Jon Court</dc:creator>
				<category><![CDATA[Grrrr...]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://objectopia.com/?p=403</guid>
		<description><![CDATA[I got verbally abused yesterday by a horrible woman in my own front yard and I let it happen! Why the hell did I let it happen - it was totally unacceptable behaviour I was subjected to and now I'm just mad mad mad at my 'weakness' and not sleeping well.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=403&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m mad, very mad and a bit ashamed of myself for cow-towing to an awful woman who had the audacity to berate me in my own home about the state of my garden! My biggest question is why the hell did I let her speak to me like that! And why couldn&#8217;t she just ask if I could do something about a particular weed that was seeding to her garden.</p>
<h3>A story of an awful tirade from an awful woman</h3>
<p>Yesterday morning I was working at home minding my business when I was hailed from a complete stranger coming up my drive. Being polite and friendly I wandered out and said hello thinking that it was a delivery or perhaps someone needed some help (I was expecting a question about directions or something). I live in a very nice neighbourhood where I know all my closest neighbours and all the local shop keepers; my kids are friends with many of my neighbours kids too. I was expecting another of these pleasant conversations &#8211; hey it was a sunny day and I was in a good mood. Christmas in a couple of days.</p>
<p>What followed was an awful tirade from an awful woman starting with &#8216;HOW CAN YOU LIVE LIKE THIS, IT&#8217;S DISGUSTING, WHY AREN&#8217;T YOU DOING SOMETHING ABOUT IT&#8217;. Completely taken aback and immediately on the back foot I&#8217;ve gone down the appeasement track &#8211; &#8216;Yes, I completely agree it&#8217;s messy, we&#8217;ve got plans in the pipeline to remedy it but we&#8217;re not ready yet&#8217;. This is the truth, I find little point in working for hours clearing and preening the garden when we&#8217;re planning to reshape it with a big digger soon &#8211; we have often put time in though, particularly my wife has spent days pulling up some of the weeds only for them to grow back (we spray too from time to time), but we have a family and like to spend time doing things we care more about &#8211; as would many people I expect. Well, the appeasement didn&#8217;t work, I got &#8216;THAT&#8217;S NOT GOOD ENOUGH, YOU&#8217;VE GOT MUSCLES, PULL ALL THIS OUT&#8217;. I say &#8216;I agree it&#8217;s a mess, I don&#8217;t really have time to fix it we&#8217;re quite busy&#8217;. I get &#8216;WE&#8217;RE ALL BUSY&#8217;&#8230;. blah blah you get the point. It went on for about 10 minutes. The simple truth is that for us it&#8217;s not a priority.</p>
<p>So, smarting, shocked and a little ashamed of myself I get to work finding someone who can clear the plot quick smart before I get another berating. I found someone, they&#8217;ve been a bit pricey, but they&#8217;ve come around and cleared it out today. I&#8217;ve also used the opportunity of a day off and a skip bin on the property to break up an old fish pond that&#8217;s been bothering be for a while. So net net it&#8217;s a positive result right? Wrong!!</p>
<h3>Now I&#8217;m so mad I can&#8217;t sleep</h3>
<p>Now that I&#8217;ve woken from my &#8216;trance&#8217; I&#8217;m left thinking what the &#8216;hell happened to me, why the hell did I do that?!&#8217; I just let a horrible person blithely walk all over me while I moped around like a troublesome schoolboy and then quick smart did as I was told. I&#8217;m 38, I&#8217;ve worked in banks where I&#8217;ve been shouted at by the stereotypical equities trader &#8211; and not put up with it. How did this woman put me immediately on the back foot and in cow-towing mode rather that me telling her to piss off and come back when she can talk to me as an equal. I certainly wouldn&#8217;t let my kids talk to me like that.</p>
<p>I&#8217;m left so mad half at her and half at myself I&#8217;m struggling to sleep. I can only envision the smugness. Horribleness wins the day again dammit!</p>
<h3>So why did I cave?</h3>
<p>Generally I think it&#8217;s because when it&#8217;s unexpected you&#8217;re on the back foot and not sure if they have a point? You&#8217;re immediately apologetic (well you are if you want to be generally a decent person anyway). It&#8217;s not until later when you review the situation for probably the 100th time in your head that you start to berate yourself and imagine other responses and lament that you weren&#8217;t quick enough, or that you&#8217;re just not good enough at arguing, etc&#8230; etc&#8230;</p>
<p>In my current case there are a few reasons I think:</p>
<ol>
<li>she has a point &#8211; the garden is a mess, an her main concern is a particular weed which is close to seeding &#8211; probably into her garden (I don&#8217;t know where she lives, must be close by though);</li>
<li>it was a bolt from the blue so I was gobsmacked and mentally unprepared to put this kind of childish behaviour down;</li>
<li>she&#8217;s obviously very upset and has probably been stewing on it for a while (perhaps she needed to be angry to have the courage to come up the drive) &#8211; I hate for people to be feeling like that;</li>
<li>I hate to think all our neighbours are getting upset with us &#8211; I like this community (this is the main reason I actually did something about it);</li>
<li>I&#8217;m busy thinking fast about all these scenarios while in the background she&#8217;s stomping around ranting in an epic tantrum so I continue to be unprepared to put the stroppy behaviour down;</li>
<li>I&#8217;m unsure of my position &#8211; perhaps harking back to some natural hierarchy encoding or something, she is older an wiser (perhaps not in this case) than me.</li>
</ol>
<h3>So what should I have done?</h3>
<p>With 20/20 hindsight I think an opening salvo of appeasement was the correct response in this case and in so doing I gave her the benefit of the doubt that she is actually just an upset nice person. That not working? then a firm &#8216;cease and desist the personal attack&#8217; and a request to discuss the matter civilly would have been the correct next action.</p>
<p>The &#8216;cease and desist&#8217; action may or may not have worked &#8211; but at least I wouldn&#8217;t have stewed over my weakness in the situation for the last couple of days. It&#8217;s going to cost years at the end of my life I expect. I would still have gone ahead with the section clear &#8211; if just for reason 4 above &#8211; but at least I would have been clear on my reasons and she would have been clear that the kind of childish temper tantrum she was displaying would not be tolerated.</p>
<h3>As it stand&#8217;s I&#8217;m still mad and trying to find a way through</h3>
<p>Christmas is coming and the only person really being hurt by this whole debacle is me. What do I do to get past it?</p>
<p>Well, writing this is helping I think. I&#8217;m thinking just now that perhaps I need to change my view of an awful woman to just a &#8216;upset nice person&#8217; and perhaps apologise for my tardiness? Perhaps the tantrum was very out of character for her? I would expect a thank-you and a sincere apology in that case, I&#8217;m open-minded to it but not hopeful.</p>
<h3>It is unacceptable to behave like that though &#8211; especially straight off the bat</h3>
<p>It was a childish temper tantrum &#8211; there&#8217;s no doubt about that. Be she a &#8216;upset nice person&#8217; or just a born and bred &#8216;awful person&#8217; it still stands that it was unacceptable to personally attack me and my family with a tirade of abuse straight off the bat. All it&#8217;s done is left bad feeling and sleep for us&#8230; I suspect she&#8217;s sleeping soundly.</p>
<h3>She only needed to ask!!</h3>
<p>We&#8217;re friendly and nice, we&#8217;d bend over backwards if asked by any of our neighbours. A simple request to &#8216;take out that thistle weed please&#8217; would have been enough and would have been an excellent goodwill exercise. Instead she&#8217;s assumed we&#8217;re bad people and out to ruin her garden with our terrible weeds and I&#8217;m left running scenarios for what I&#8217;m going to say next time I run into her and feeling generally rather bad (seems like a grieving process). That&#8217;s very unfriendly, disrespectful and just not nice behaviour. I don&#8217;t like this woman and I&#8217;ve only just met her. Jeez if I was an unfriendly type I might have clocked her.</p>
<p>I certainly hope it doesn&#8217;t happen again.</p>
<address> </address>
<address>Regards,</address>
<address>Jon</address>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/objectopia.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/objectopia.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/objectopia.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/objectopia.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/objectopia.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/objectopia.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/objectopia.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/objectopia.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/objectopia.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/objectopia.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/objectopia.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/objectopia.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/objectopia.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/objectopia.wordpress.com/403/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=403&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://objectopia.com/2011/12/23/getting-shouted-at-by-an-awful-stranger-why-do-you-let-them-talk-to-you-like-that/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ddc6e9ae66ab24ffd7fcf82cea3c8d7?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">Jon Court</media:title>
		</media:content>
	</item>
		<item>
		<title>Hibernate and sets &#8211; use at your peril</title>
		<link>http://objectopia.com/2011/12/06/hibernate-and-sets-use-at-your-peril/</link>
		<comments>http://objectopia.com/2011/12/06/hibernate-and-sets-use-at-your-peril/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 23:52:56 +0000</pubDate>
		<dc:creator>Chris Clark</dc:creator>
				<category><![CDATA[Java etc...]]></category>

		<guid isPermaLink="false">http://objectopia.com/?p=389</guid>
		<description><![CDATA[For the past 3 weeks I&#8217;ve spent hours tuning the performance in one of the applications we use. Unfortunately rather than spend some time and come up with a proper reporting solution I was tasked to fix the existing solution which is to report off our live transactional system. We use EJB3 on JBoss so [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=389&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>For the past 3 weeks I&#8217;ve spent hours tuning the performance in one of the applications we use. Unfortunately rather than spend some time and come up with a proper reporting solution I was tasked to fix the existing solution which is to report off our live transactional system. We use EJB3 on JBoss so hibernate it is, which I personally think is an excellent framework for getting your application up and running quickly. Hibernate have always stated that performance isn&#8217;t it&#8217;s goal so I can&#8217;t blame hibernate for anything I&#8217;ve found. I tackled the problem in the usual way, add some sql logging and see what&#8217;s really happening and look for the usual suspects, lazy loading, code structure etc. Where I saw collections being loaded up separately I added Join fetches and rerun the reports. This worked really well then I noticed that no matter how I wrote the JPQL it always seemed to be running seperate queries for some of the realtionships. That&#8217;s when the bulb flashed they were defined as Sets!!</p>
<p>An example of such a thing:</p>
<p><pre class="brush: java; light: true;">
@OneToMany(mappedBy=&quot;transaction&quot;)
private Set taxComponents = new HashSet(1);
</pre></p>
<p>I understand why sets are used but as I&#8217;m in control of what gets put in I can safely use:</p>
<p><pre class="brush: java; light: true;">
@OneToMany(mappedBy=&quot;transaction&quot;)
 private Collection taxComponents = new ArrayList(1);
 </pre></p>
<p>So using set&#8217;s is great but it comes at a cost and beware it&#8217;s not just fetches but deletes and inserts have a similar issue in that they get deleted one by one and then reinserted to ensure uniqueness, so if you do update the set it also has a performance hit.</p>
<p>The performance of the major report moved from 30 mins to 6 mins, still not lightning fast but a good improvement. I could of course move to native SQL but I didn&#8217;t want to have to rewrite a load of code to do that.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/objectopia.wordpress.com/389/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/objectopia.wordpress.com/389/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/objectopia.wordpress.com/389/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/objectopia.wordpress.com/389/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/objectopia.wordpress.com/389/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/objectopia.wordpress.com/389/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/objectopia.wordpress.com/389/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/objectopia.wordpress.com/389/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/objectopia.wordpress.com/389/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/objectopia.wordpress.com/389/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/objectopia.wordpress.com/389/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/objectopia.wordpress.com/389/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/objectopia.wordpress.com/389/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/objectopia.wordpress.com/389/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=389&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://objectopia.com/2011/12/06/hibernate-and-sets-use-at-your-peril/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cb4e8f1d97dd63efbba72b45e6130bb0?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">chrisclark78</media:title>
		</media:content>
	</item>
		<item>
		<title>Weld JUnit 4 Runner</title>
		<link>http://objectopia.com/2011/05/29/weld-junit-4-runner/</link>
		<comments>http://objectopia.com/2011/05/29/weld-junit-4-runner/#comments</comments>
		<pubDate>Sun, 29 May 2011 02:18:54 +0000</pubDate>
		<dc:creator>Chris Burnley</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://objectopia.com/?p=362</guid>
		<description><![CDATA[I&#8217;ve been having a look at Weld recently and wanted to be able to try some stuff out without a container in JUnit, but couldn&#8217;t find a JUnit Runner class to do it for me. I was really suprised how simple it was: Now you can do this : Because your test class is just [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=362&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been having a look at <a title="Weld" href="http://seamframework.org/Weld">Weld</a> recently and wanted to be able to try some stuff out without a container in JUnit, but couldn&#8217;t find a JUnit Runner class to do it for me.</p>
<p>I was really suprised how simple it was:</p>
<p><pre class="brush: java; light: true;">
package org.objectopia.test;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.InitializationError;

public class WeldJUnit4Runner extends BlockJUnit4ClassRunner {

    private final Class klass;
    private final Weld weld;
    private final WeldContainer container;

    public WeldJUnit4Runner(final Class klass) throws InitializationError {
        super(klass);
        this.klass = klass;
        this.weld = new Weld();
        this.container = weld.initialize();
    }

    @Override
    protected Object createTest() throws Exception {
        final Object test = container.instance().select(klass).get();

        return test;
    }
}
</pre></p>
<p>Now you can do this :</p>
<p><pre class="brush: java; light: true;">
@RunWith(WeldJUnit4Runner.class)
public class PersistenceTest {

    @Inject UserRepository repository;

    ...
}
</pre></p>
<p>Because your test class is just another CDI bean, you can inject any bean reference you require.</p>
<p>This is where the power of CDI comes in to play, you can do something like this:</p>
<p><pre class="brush: java; light: true;">
    @Inject @Mock UserRepository userRepository;
</pre></p>
<p>And create a producer method to mock it out:</p>
<p><pre class="brush: java; light: true;">
    @Produces @Mock UserRepository createUserRepository() { ... }
</pre></pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/objectopia.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/objectopia.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/objectopia.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/objectopia.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/objectopia.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/objectopia.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/objectopia.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/objectopia.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/objectopia.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/objectopia.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/objectopia.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/objectopia.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/objectopia.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/objectopia.wordpress.com/362/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=362&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://objectopia.com/2011/05/29/weld-junit-4-runner/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ea90ab2b972631952cf64bb4228e6f76?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">chris</media:title>
		</media:content>
	</item>
		<item>
		<title>The arrogance of Gantt charts</title>
		<link>http://objectopia.com/2009/11/17/the-arrogance-of-gantt-charts/</link>
		<comments>http://objectopia.com/2009/11/17/the-arrogance-of-gantt-charts/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 21:34:40 +0000</pubDate>
		<dc:creator>Chris Burnley</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://objectopia.wordpress.com/2009/11/17/the-arrogance-of-gantt-charts/</guid>
		<description><![CDATA[Gantt charts, popularized by Microsoft Project, are a mechanism for managing projects. The idea is that you list all the tasks required to complete a project. You then estimate how long each task will take. Once you figure out the dependencies between the tasks you the layout a plan from left to right connecting up [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=295&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Gantt charts, popularized by Microsoft Project, are a mechanism for managing projects. The idea is that you list all the tasks required to complete a project. You then estimate how long each task will take. Once you figure out the dependencies between the tasks you the layout a plan from left to right connecting up all the dependent tasks. This allows for some parallelism between non dependent tasks. Given the project start date and all the durations you get the project end date.</p>
<p>As long as everyone sticks to the plan, then the project will be completed on time.</p>
<p>Simple, eh? Err &#8211; not so fast! The major flaw is that Gantt charts are task focused so when a new task is discovered the project is guaranteed to be late. The reason behind this is that developers are focused on delivery of the tasks they are assigned &#8211; not value to the client. Coupled with the truism that tasks will take as much time as they are given and you <em>will</em> be late.</p>
<p>The task-centric approach only hints at the real problem with  Gantt charts: that better planning and task discovery up front would have resolved these issues. This is the most deplorable aspect: God-like wisdom <em>can</em> be achieved and would have fixed the problem.</p>
<p>Historically, software development has used the notion of &#8220;defined process control&#8221; where all aspects of the plan can be controlled, to a low-level and to a high-degree of accuracy. This does not work for most software projects because software development is not a simple undertaking- it is usually a complex process where small changes in the inputs can greatly affect the outcome.</p>
<p>Big, upfront planning that depends on infinite wisdom does not work and the only mechanism we have for complex problems is Empirical Process Control. This is the notion of frequent inspection and adaptation to a process. </p>
<p>Emperical control is _the_ key to Agile software. You&#8217;re not are Agile if you don&#8217;t have a regular process for improvement &#8211; you&#8217;re just hacking away.</p>
<p>Gantt charts have no place in an agile process; they are the tool of bluff used by the project manager that really doesn&#8217;t understand software development.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/objectopia.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/objectopia.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/objectopia.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/objectopia.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/objectopia.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/objectopia.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/objectopia.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/objectopia.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/objectopia.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/objectopia.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/objectopia.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/objectopia.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/objectopia.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/objectopia.wordpress.com/295/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=295&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://objectopia.com/2009/11/17/the-arrogance-of-gantt-charts/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ea90ab2b972631952cf64bb4228e6f76?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">chris</media:title>
		</media:content>
	</item>
		<item>
		<title>Securing your JBoss JMX Invoker Layer</title>
		<link>http://objectopia.com/2009/10/01/securing-jmx-invoker-layer-in-jboss/</link>
		<comments>http://objectopia.com/2009/10/01/securing-jmx-invoker-layer-in-jboss/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 04:53:18 +0000</pubDate>
		<dc:creator>Jon Court</dc:creator>
				<category><![CDATA[Java etc...]]></category>
		<category><![CDATA[AuthenticationInterceptor]]></category>
		<category><![CDATA[AuthorizationInterceptor]]></category>
		<category><![CDATA[Invoker Layer]]></category>
		<category><![CDATA[jaas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[JBoss 4.2.1.GA]]></category>
		<category><![CDATA[JMX]]></category>
		<category><![CDATA[JMX Security]]></category>
		<category><![CDATA[jmx-console]]></category>
		<category><![CDATA[jmx-invoker]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[MBean]]></category>
		<category><![CDATA[twiddle]]></category>
		<category><![CDATA[XMBean]]></category>

		<guid isPermaLink="false">http://objectopia.com/?p=154</guid>
		<description><![CDATA[If you use JBoss you would have secured the JMX Console and the Web Console (or you should have) but did you also secure the invoker layer? Or put another way - can any old monkey with the knowledge shutdown your container even though you've secured your JMX &#38; Web consoles?<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=154&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>If you use JBoss and have a nicely secured JMX Console and/or Web Console it&#8217;s a fairly safe bet that, like me, you haven&#8217;t secured the invoker layer; meaning any old monkey can most likely shutdown your container whenever they feel like it.</p>
<p>Recently I implemented an MBean in JBoss to use as a batch trigger from a ControlM implementation and was surprised (probably shouldn&#8217;t have been though) that all my carefully crafted security for the JMXConsole and Web Console was ignored with complete impunity by the tool (twiddle.sh) that I used to invoke my MBean. Since then I&#8217;ve been through a pile of pain trying to get an RMI call to a JBoss XMBean to require authentication and I thought I&#8217;d put some instructions in plain language on how to do it.</p>
<p>I do this for two reasons:</p>
<ol>
<li>because I bet a lot of developers miss this one; and</li>
<li>because the documentation and other information I find online is limited and confusing.</li>
</ol>
<p>For demonstration I&#8217;m going to use a standard JBoss MBean for setting system properties in a running application container.</p>
<h3>A Simple Example of Setting a System Property in JBoss using Twiddle</h3>
<p>Using the default JBoss version of twiddle.sh (in the bin directory beneath JBoss home) against the default JNP location of JBoss (localhost:1099) you can execute the following to set a system property in a running container.</p>
<p><pre class="brush: bash; light: true;">
# this assumes you're in the bin directory of JBoss Home.
./twiddle.sh -s localhost:1099 invoke &quot;jboss:type=Service,name=SystemProperties&quot; set myprop mypropvalue
'null'
</pre></p>
<p>To verify that you have been succesful (assuming you didn&#8217;t get an exception in the last operation) you can do the following:</p>
<p><pre class="brush: bash; light: true;">
# this assumes you're in the bin directory of JBoss Home.
./twiddle.sh -s localhost:1099 invoke &quot;jboss:type=Service,name=SystemProperties&quot; get myprop
mypropvalue
</pre></p>
<p>This example will work from anywhere on your network where you&#8217;re not prevented from reaching the JNP URL of the container (prevented by a firewall or IP filter for example) regardless of the JMX Console and Web Console security you&#8217;ve put in place (there is plenty of documentation around for securing the JMX Console and Web Console). This is because the JMX Console and Web Console are HTTP based and as such are secured in the normal way you would secure a website on JBoss (i.e. in web-inf.xml and jboss-web.xml) whereas the invoker layer is not HTTP based and as such must use an alternate method of security; the key file in this operation is the jmx-invoker-service.xml file in the JBoss deploy directory.</p>
<h3><strong>Securing the Invoker Layer</strong></h3>
<p>The invoker layer is the one you are calling through when you query or invoke on an MBean via RMI (i.e. with twiddle.sh &#8211; as above). This layer is <strong>not </strong>subject to the security constraints you <strong>will </strong>have placed on your HTTP based JMX Console or Web Consoles.</p>
<p>To make this layer secure the key file you&#8217;re interested in is the jmx-invoker-service.xml in the JBoss deploy directory; and the key operation configuration you will need to change is for &#8216;invoke&#8217;.</p>
<p>The <strong>default </strong>configuration of the invoke operation in this file is:</p>
<p><pre class="brush: xml; highlight: [24,25];">
&lt;server&gt;

	&lt;!-- excluded for brevity --&gt;

	&lt;mbean code=&quot;org.jboss.jmx.connector.invoker.InvokerAdaptorService&quot; name=&quot;jboss.jmx:type=adaptor,name=Invoker&quot; xmbean-dd=&quot;&quot;&gt;
		&lt;xmbean&gt;
			&lt;description&gt;The JMX Detached Invoker Service&lt;/description&gt;
			&lt;class&gt;org.jboss.jmx.connector.invoker.InvokerAdaptorService&lt;/class&gt;

			&lt;!-- excluded for brevity --&gt;

			&lt;operation&gt;
				&lt;description&gt;The detached invoker entry point&lt;/description&gt;
				&lt;name&gt;invoke&lt;/name&gt;
				&lt;parameter&gt;
					&lt;description&gt;The method invocation context&lt;/description&gt;
					&lt;name&gt;invocation&lt;/name&gt;
					&lt;type&gt;org.jboss.invocation.Invocation&lt;/type&gt;
				&lt;/parameter&gt;
				&lt;return-type&gt;java.lang.Object&lt;/return-type&gt;
				&lt;descriptors&gt;
					&lt;interceptors&gt;

						&lt;!-- Uncomment to require authenticated users --&gt;
						&lt;!-- &lt;interceptor code=&quot;org.jboss.jmx.connector.invoker.AuthenticationInterceptor&quot; securityDomain=&quot;java:/jaas/jmx-console&quot;/&gt; --&gt;

						&lt;!-- Interceptor that deals with non-serializable results --&gt;
						&lt;interceptor code=&quot;org.jboss.jmx.connector.invoker.SerializableInterceptor&quot; policyClass=&quot;StripModelMBeanInfoPolicy&quot;/&gt;

					&lt;/interceptors&gt;
				&lt;/descriptors&gt;
			&lt;/operation&gt;
		&lt;/xmbean&gt;
	&lt;/mbean&gt;
&lt;/server&gt;
</pre></p>
<p>So to switch on authentication we do what it says and &#8216;Uncomment to require authenticated users&#8217;:</p>
<p><pre class="brush: xml; highlight: [24,25];">
&lt;server&gt;

	&lt;!-- excluded for brevity --&gt;

	&lt;mbean code=&quot;org.jboss.jmx.connector.invoker.InvokerAdaptorService&quot; name=&quot;jboss.jmx:type=adaptor,name=Invoker&quot; xmbean-dd=&quot;&quot;&gt;
		&lt;xmbean&gt;
			&lt;description&gt;The JMX Detached Invoker Service&lt;/description&gt;
			&lt;class&gt;org.jboss.jmx.connector.invoker.InvokerAdaptorService&lt;/class&gt;

			&lt;!-- excluded for brevity --&gt;

			&lt;operation&gt;
				&lt;description&gt;The detached invoker entry point&lt;/description&gt;
				&lt;name&gt;invoke&lt;/name&gt;
				&lt;parameter&gt;
					&lt;description&gt;The method invocation context&lt;/description&gt;
					&lt;name&gt;invocation&lt;/name&gt;
					&lt;type&gt;org.jboss.invocation.Invocation&lt;/type&gt;
				&lt;/parameter&gt;
				&lt;return-type&gt;java.lang.Object&lt;/return-type&gt;
				&lt;descriptors&gt;
					&lt;interceptors&gt;

						&lt;!-- Uncomment to require authenticated users --&gt;
						&lt;interceptor code=&quot;org.jboss.jmx.connector.invoker.AuthenticationInterceptor&quot; securityDomain=&quot;java:/jaas/jmx-console&quot;/&gt;

						&lt;!-- Interceptor that deals with non-serializable results --&gt;
						&lt;interceptor code=&quot;org.jboss.jmx.connector.invoker.SerializableInterceptor&quot; policyClass=&quot;StripModelMBeanInfoPolicy&quot;/&gt;

					&lt;/interceptors&gt;
				&lt;/descriptors&gt;
			&lt;/operation&gt;
		&lt;/xmbean&gt;
	&lt;/mbean&gt;
&lt;/server&gt;
</pre></p>
<p>If you haven&#8217;t changed the default security realm for your JMX Console (i.e. java:/jaas/jmx-console) you will now have an invoker layer secured with the same credentials as for your JMX Console. To change this add a new security realm to your global login-config.xml in the conf directory of your container and match the name you give it in the securityDomain attribute of the Authentication Interceptor.</p>
<p>I&#8217;ve not yet delved too deeply into setting a specific set of roles, at this point I set my invoker user to JBossAdmin which means that user can do pretty much anything exposed to JMX. That&#8217;s ok for my purposes tho (feel free to write a response with the details of setting roles for particular JMX functions <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ).</p>
<h3>Invoking on a Secure Invoker Layer</h3>
<p>Ok so now that it&#8217;s secure how do you invoke an operation on it?</p>
<p>With the default JBoss twiddle.sh utility there are arguments -u (or &#8211;user=) for user and -p (&#8211;password=) for password.</p>
<p><pre class="brush: bash; light: true;">
# this assumes you're in the bin directory of JBoss Home.
./twiddle.sh -s localhost:1099 --user=myuser --password=mypassword invoke &quot;jboss:type=Service,name=SystemProperties&quot; get myprop
mypropvalue
</pre></p>
<p>These arguments work fine except your password is now in clear text and even worse is visible in the process list while it&#8217;s executing &#8211; in clear text with &#8216;password=&#8217; conveniently placed for extraction by a simple script!! This seems a bit of an oversight in the tool to me.</p>
<p>To get around this issue in my environment I took the source and modified the main class of twiddle.jar to accept a password from Standard In (patch is below &#8211; no promises or guarantees though) which prevents the password showing in your password list and allows you to use standard encryption utilities to decrypt and pipe it into the process without ever making it visible clear text.</p>
<p>You would now invoke as follows:</p>
<p><pre class="brush: bash; light: true;">
# this assumes you're in the bin directory of JBoss Home.
mypassword | ./twiddle.sh -s localhost:1099 --user=myuser invoke &quot;jboss:type=Service,name=SystemProperties&quot; get myprop
mypropvalue
</pre></p>
<p>or better; from an encrypted password file (or better yet a repository) such as follows:</p>
<p><pre class="brush: bash; light: true;">
# this assumes you're in the bin directory of JBoss Home and have previously encrypted your password and encryption key into ~/.&lt;username&gt;.key and ~/.&lt;username&gt;.psw.
KEY=`cat ~/.&lt;execution username&gt;.key`
PWD=`cat ~/.&lt;execution username&gt;.psw | crypt $KEY`

PWD | ./twiddle.sh -s localhost:1099 --user=myuser invoke &quot;jboss:type=Service,name=SystemProperties&quot; get myprop
mypropvalue
</pre></p>
<p>to encrypt your password to be used as above you might do:</p>
<p><pre class="brush: bash; light: true;">
echo &quot;&lt;password&gt;&quot; | crypt &gt; ~/.&lt;execution username&gt;.psw
</pre></p>
<p>which will request an encryption key which you would save as follows (for this example anyway):</p>
<p><pre class="brush: bash; light: true;">
cat &quot;&lt;encryption key&gt;&quot; &gt; ~/.&lt;execution username&gt;.key
</pre></p>
<p>These files would, of course, be accessable only from your execution user.</p>
<h3>Securing the JMX Console</h3>
<p>For reference the key files you&#8217;re interested in here are:</p>
<ul>
<li>conf/login-config.xml</li>
<li>deploy/jmx-console.war/META-INF/web.xml</li>
<li>deploy/jmx-console.war/META-INF/jboss-web.xml</li>
</ul>
<h3><strong>Securing the JMX Web Console</strong></h3>
<p>For reference the key files you&#8217;re interested in here are:</p>
<ul>
<li>conf/login-config.xml</li>
<li>deploy/management/web-console.war/META-INF/web.xml</li>
<li>deploy/management/web-console.war/META-INF/jboss-web.xml</li>
</ul>
<h3><strong>Stack</strong></h3>
<p>These instructions will apply broadly but for reference purposes the stack I have is:</p>
<ul>
<li>JBoss 4.2.3.GA</li>
<li>Java jdk1.6.0_13</li>
<li>Windows XP or Solaris 10</li>
</ul>
<h3>References</h3>
<p><a title="http://www.jboss.org/community/wiki/Twiddle" href="http://www.jboss.org/community/wiki/Twiddle" target="_blank">http://www.jboss.org/community/wiki/Twiddle</a></p>
<p><a title="http://www.jboss.org/community/wiki/jbossserver-aquicktour" href="http://www.jboss.org/community/wiki/jbossserver-aquicktour#The_JBoss_Server___A_Quick_Tour-The_JMX_Console" target="_blank">http://www.jboss.org/community/wiki/jbossserver-aquicktour</a></p>
<p><a title="https://jira.jboss.org/jira/secure/attachment/12313982/jboss-securejmx.pdf (PDF Document)" href="https://jira.jboss.org/jira/secure/attachment/12313982/jboss-securejmx.pdf">https://jira.jboss.org/jira/secure/attachment/12313982/jboss-securejmx.pdf</a> (PDF Document)</p>
<address> </address>
<address> </address>
<address>Regards,</address>
<address>Jon</address>
<address> </address>
<address> </address>
<p> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Patch For Twiddle to Take Password from StdIn (no promises or guarantees)</p>
<p><pre class="brush: bash; collapse: true; light: false; toolbar: true;">

Index: src/main/org/jboss/console/twiddle/Twiddle.java
===================================================================
--- src/main/org/jboss/console/twiddle/Twiddle.java    (revision 94201)
+++ src/main/org/jboss/console/twiddle/Twiddle.java    (working copy)
@@ -24,8 +24,10 @@
 import gnu.getopt.Getopt;
 import gnu.getopt.LongOpt;

+import java.io.BufferedReader;
 import java.io.File;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -41,7 +43,6 @@
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
-
 import org.jboss.console.twiddle.command.Command;
 import org.jboss.console.twiddle.command.CommandContext;
 import org.jboss.console.twiddle.command.CommandException;
@@ -148,7 +149,7 @@
 }
 };
 }
-
+
 public Command createCommand(final String name)
 throws NoSuchCommandException, Exception
 {
@@ -383,7 +384,7 @@

 out.println(&quot;A JMX client to 'twiddle' with a remote JBoss server.&quot;);
 out.println();
-      out.println(&quot;usage: &quot; + PROGRAM_NAME + &quot; [options] &lt;command&gt; [command_arguments]&quot;);
+      out.println(&quot;usage: [echo &lt;password&gt; | ] &quot; + PROGRAM_NAME + &quot; [options] &lt;command&gt; [command_arguments]&quot;);
 out.println();
 out.println(&quot;options:&quot;);
 out.println(&quot;    -h, --help                Show this help message&quot;);
@@ -397,6 +398,10 @@
 out.println(&quot;    -u, --user=&lt;name&gt;         Specify the username for authentication&quot;);
 out.println(&quot;    -p, --password=&lt;name&gt;     Specify the password for authentication&quot;);
 out.println(&quot;    -q, --quiet               Be somewhat more quiet&quot;);
+      out.println();
+      out.println(&quot;A password should be passed in by echoing it and piping it to the command. If you&quot;);
+      out.println(&quot;use the -p (--password) option your password may be visible in clear text in a &quot;);
+      out.println(&quot;process listing such as `ps -ef`.&quot;);
 out.flush();
 }

@@ -421,6 +426,28 @@
 Getopt getopt = new Getopt(PROGRAM_NAME, args, sopts, lopts);
 int code;

+        /* Get standard in if it's there - assume it's a password. This is to allow a password to be passed and
+         * prevent it showing in a process listing (e.g. ps -ef in Unix). The -p argument will be ignored if
+         * the password is passed through Standard In.
+         */
+        boolean passwordRetrievedFromStdIn = false;
+        if (System.in.available() &gt; 0) {
+            InputStreamReader inp = new InputStreamReader(System.in);
+            BufferedReader br = new BufferedReader(inp);
+            String stdin = br.readLine();
+
+            if (stdin != null &amp;amp;&amp;amp; stdin.trim().length() &gt; 0) {
+                String password = stdin.trim();
+                SecurityAssociation.setCredential(password);
+
+                passwordRetrievedFromStdIn = true;
+
+                if (log.isDebugEnabled()) {
+                    log.debug(&quot;Password retrieved from standard in. Ignoring -p argument.&quot;);
+                }
+            }
+        }
+
 PROCESS_ARGUMENTS:

 while ((code = getopt.getopt()) != -1)
@@ -531,8 +558,13 @@
 SecurityAssociation.setPrincipal(new SimplePrincipal(username));
 break;
 case 'p':
-                 String password = getopt.getOptarg();
-                 SecurityAssociation.setCredential(password);
+                  if (!passwordRetrievedFromStdIn) {
+                     String password = getopt.getOptarg();
+                     SecurityAssociation.setCredential(password);
+
+                     log.warn(&quot;Password retrieved from -p argument. Your password may be visible in cleartext in a process listing during execution. &quot; +
+                             &quot;Consider using Standard In to enter the password instead (i.e. echo \&quot;password\&quot; | twiddle ...)&quot;);
+                  }
 break;

 // Enable quiet operations

</pre></p>
<address> </address>
<address> </address>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:0;width:1px;height:1px;">
<pre> light="true"</pre>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/objectopia.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/objectopia.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/objectopia.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/objectopia.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/objectopia.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/objectopia.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/objectopia.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/objectopia.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/objectopia.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/objectopia.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/objectopia.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/objectopia.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/objectopia.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/objectopia.wordpress.com/154/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=154&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://objectopia.com/2009/10/01/securing-jmx-invoker-layer-in-jboss/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ddc6e9ae66ab24ffd7fcf82cea3c8d7?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">Jon Court</media:title>
		</media:content>
	</item>
		<item>
		<title>Thought for Friday: What are we going to do about the crap code ?</title>
		<link>http://objectopia.com/2009/07/24/what-are-we-going-to-do-about-the-crap-code/</link>
		<comments>http://objectopia.com/2009/07/24/what-are-we-going-to-do-about-the-crap-code/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 01:31:05 +0000</pubDate>
		<dc:creator>Chris Burnley</dc:creator>
				<category><![CDATA[Thought For Friday]]></category>

		<guid isPermaLink="false">http://objectopia.com/?p=183</guid>
		<description><![CDATA[Yesterday, my manager asked me &#8220;What are we going to do about the crap code?&#8221; It&#8217;s a hard question to answer because before we can answer what to do about it; we must understand what crap code is and what causes it. What is crap code? This is still a hard question, but I think [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=183&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Yesterday, my manager asked me &#8220;What are we going to do about the crap code?&#8221;</p>
<p>It&#8217;s a hard question to answer because before we can answer what to do about it; we must understand what <em>crap code is</em> and what causes it.</p>
<p>What is crap code? This is still a hard question, but I think we can at least attempt to answer it by defining what it <em>isn&#8217;t</em>:</p>
<ul>
<li>Crap code isn&#8217;t maintainable</li>
<li>Crap code isn&#8217;t easily      testable</li>
<li>Crap code isn&#8217;t as efficient      as it could be</li>
<li>Crap code isn&#8217;t      understandable without lots of comments</li>
</ul>
<p>What causes crap code? In my experience it is some combination of:</p>
<ul>
<li>Ignorance</li>
<li>Fear</li>
<li>Lack of experience, pride,      oversight, accountability, time and analysis/understanding of the domain</li>
<li>Resume-building perhaps?</li>
</ul>
<p>So what is the solution? There is no silver bullet, it requires vigilance and potentially each of these causes needs to be tackled individually.</p>
<p><strong>Ignorance</strong>: One way of tackling this is encouraging learning, peer review and discussion in the organization. Time needs to be allocated to ensure that project work doesn&#8217;t stop these activities from flourishing.</p>
<p><strong>Fear:</strong> One of the major differences between a good developer and an average one is the fear factor; good developers don&#8217;t have the same fear of changing something, or fixing something since they are confident they are not going to break something without knowing about it. Because of this, fear has the effect of destroying reuse &#8211; copy and paste code thrives in this environment. Besides learning how to study code, unit testing and other forms of automated testing are good for addressing this.</p>
<p><strong>Experience</strong>: You need to install a mentoring system to ensure that the less experienced team members have someone to go to for advice. Team members need to be exposed to different types of development work. E.g. database, business-logic, front-end / web etc. They&#8217;ll never get enough experience doing the same thing day in, day out. Ensure every commit to the code base is emailed to the rest of the team, experienced developers should be reviewing the code and suggesting changes if required.</p>
<p><strong>Pride</strong>: This is a hard one, and probably comes from the side effects of the other causes. One way is to allow team members to look after a particular module, service / sub-system.</p>
<p><strong>Oversight / Accountability</strong>: Oversight is simple &#8211; review code and don&#8217;t compromise on quality &#8211; you&#8217;ll end up regretting it at some point. Generally speaking accountability decreases the more segregated the teams are.  I.e. if you have a team of testers that are separate to your developers, the less responsibility the developers will feel to getting something right &#8211; you&#8217;ll get a &#8220;throw it over the fence&#8221; mentality. Create a team with all disciplines (developers, testers, dbas, infrastructure etc.,,).</p>
<p><strong>Time</strong>: This is about planning properly and ensuring that developers are aware of all the steps to produce bit of functionality. It&#8217;s also about being realistic when it comes to providing your estimates. Make sure you include time for producing your unit and integration tests, and don&#8217;t underestimate just so you get the job. Stress to developers that the job isn&#8217;t done until it is tested and works.</p>
<p><strong>Resume-building</strong>: This is subjective but I&#8217;ve been on projects where the tech lead has read that this new piece of technology is the ducks and they wants to get in on it just so they can put it down on their resume. They manage to get all the newest and greatest stuff in there but at what price? The code under the covers becomes a maintenance nightmare because it is far to complicated for what it needs to do. Ensure that the technology you use is decided up front. Don&#8217;t deviate unless you get further sign-off from the stakeholders. Create a list of &#8220;guiding principles&#8221; (N.B. not coding standards) to decide how you&#8217;re going to go about writing the code &#8211; and enforce code reviews on these.</p>
<p><strong>Understanding the domain</strong>:  When you start a new project it is really important, that at every step in the process you constantly to try to refactor based on your current understanding of the code. Data models are really hard to change once a system goes into production, so you&#8217;ve got to make an effort to get it right. If some aspect of the design doesn&#8217;t feel right, then it probably isn&#8217;t it. <strong>Don&#8217;t be in denial</strong> &#8211; fix it.  I&#8217;ve seen so much bad code and bugs caused because the new requirements or understanding about a system are applied to a broken domain.</p>
<p>The bottom line is, does crap code really matter? Who cares if it works, right? I think it does. And crap code is directly proportional to defects in my experience.  Defects will cost you money fixing them and cleaning up the consequences of them.</p>
<p>Fixing the crap code is no doubt a hard problem. The solutions involve constant vigilance and culture change &#8211; but it is worth it in the end.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/objectopia.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/objectopia.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/objectopia.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/objectopia.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/objectopia.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/objectopia.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/objectopia.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/objectopia.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/objectopia.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/objectopia.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/objectopia.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/objectopia.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/objectopia.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/objectopia.wordpress.com/183/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=183&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://objectopia.com/2009/07/24/what-are-we-going-to-do-about-the-crap-code/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ea90ab2b972631952cf64bb4228e6f76?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">chris</media:title>
		</media:content>
	</item>
		<item>
		<title>EJB 3.0 Injecting The Correct Implementation</title>
		<link>http://objectopia.com/2009/07/24/ejb-3-0-injecting-the-correct-implementation/</link>
		<comments>http://objectopia.com/2009/07/24/ejb-3-0-injecting-the-correct-implementation/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 21:49:07 +0000</pubDate>
		<dc:creator>Chris Clark</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[EJB 3.0 injection]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPA]]></category>

		<guid isPermaLink="false">http://objectopia.com/?p=222</guid>
		<description><![CDATA[When using stateless and stateful session beans I often find that I&#8217;m creating one interface per one implementation, which will be enhanced with the release of the 3.1 spec and implicit interfaces. Anyway on one of the occasions I had actually had multiple implementations of an interface that I wanted to inject, this made me [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=222&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>When using stateless and stateful session beans I often find that I&#8217;m creating one interface per one implementation, which will be enhanced with the release of the 3.1 spec and implicit interfaces. Anyway on one of the occasions I had actually had multiple implementations of an interface that I wanted to inject, this made me stop and think how do I that!! It turns out it was pretty simple with a few annotations.</p>
<p>On your class that is implementing the interface you need to use the name attribute: -</p>
<p><pre class="brush: java;">

@Stateful(name=&quot;xxx.AssetTypeOverrideService&quot;)
public class AssetTypeOverrideService implements OverrideService{

@Stateful(name=&quot;xxxRuleTypeOverrideService&quot;)
public class RuleTypeOverrideService implements OverrideService {

</pre></p>
<p>Then on the bean you want inject these into you use:</p>
<p><pre class="brush: java;">

@EJB(beanName=&quot;xxx.AssetTypeOverrideService&quot;)
private OverrideService assetOverrideService;
	
@EJB(beanName=&quot;xxx.RuleTypeOverrideService&quot;)
private OverrideService ruleTypeOverrideService;

</pre></p>
<p>The name can be anything you want I just think it&#8217;s logical to keep it the same as the class and the beanName obviously is the same value of the bean you want to inject that has the correct implementation. </p>
<p>It seems easy now but it did make me stop and think.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/objectopia.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/objectopia.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/objectopia.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/objectopia.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/objectopia.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/objectopia.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/objectopia.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/objectopia.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/objectopia.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/objectopia.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/objectopia.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/objectopia.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/objectopia.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/objectopia.wordpress.com/222/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=222&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://objectopia.com/2009/07/24/ejb-3-0-injecting-the-correct-implementation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cb4e8f1d97dd63efbba72b45e6130bb0?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">chrisclark78</media:title>
		</media:content>
	</item>
		<item>
		<title>We only hire the best</title>
		<link>http://objectopia.com/2009/07/23/we-only-hire-the-best/</link>
		<comments>http://objectopia.com/2009/07/23/we-only-hire-the-best/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 20:50:30 +0000</pubDate>
		<dc:creator>Chris Burnley</dc:creator>
				<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://objectopia.com/?p=223</guid>
		<description><![CDATA[I was recently having dinner with an acquaintance who works for a massive multinational IT company. He was telling me that at a recent company conference that, despite the economy, the CEO said the company was doing well because &#8220;we only hire the best&#8221;. I almost choked on my steak, trying to contain myself. The [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=223&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I was recently having dinner with an acquaintance who works for a massive multinational IT company. He was telling me that at a recent company conference that, despite the economy, the CEO said the company was doing well because &#8220;we only hire the best&#8221;. </p>
<p>I almost choked on my steak, trying to contain myself. The sad thing was that he actually believed it. How come all companies that I&#8217;ve worked at only hires the best ? Surely all of them can&#8217;t have the best ?</p>
<p>Why do companies maintain this illusion ? Is it some sort of psychological trick so you don&#8217;t quit and join a company full of bozos ? Or do people at the top truly believe it, in some sort of paradoxical delusion ?</p>
<p>I don&#8217;t know, but it&#8217;s odd isn&#8217;t it ? </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/objectopia.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/objectopia.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/objectopia.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/objectopia.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/objectopia.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/objectopia.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/objectopia.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/objectopia.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/objectopia.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/objectopia.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/objectopia.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/objectopia.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/objectopia.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/objectopia.wordpress.com/223/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=223&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://objectopia.com/2009/07/23/we-only-hire-the-best/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ea90ab2b972631952cf64bb4228e6f76?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">chris</media:title>
		</media:content>
	</item>
		<item>
		<title>EJB 3.0 Interceptors</title>
		<link>http://objectopia.com/2009/07/21/ejb-3-0-interceptors/</link>
		<comments>http://objectopia.com/2009/07/21/ejb-3-0-interceptors/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 04:55:23 +0000</pubDate>
		<dc:creator>Chris Clark</dc:creator>
				<category><![CDATA[Java etc...]]></category>
		<category><![CDATA[EJB3 Interceptor]]></category>
		<category><![CDATA[entitylisteners]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPA]]></category>

		<guid isPermaLink="false">http://objectopia.com/?p=152</guid>
		<description><![CDATA[I wanted to carry out some processing when an entity was committed to the db, I could of used the lifecycle annotation @PostPersist in the bean itself but that that would go against leaky abstraction (see post Non-anaemic models). Anywho it was pretty simple to get this working all that I had to use were [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=152&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I wanted to carry out some processing when an entity was committed to the db, I could of used the lifecycle annotation @PostPersist in the bean itself but that that would go against leaky abstraction (see post <a href="http://objectopia.com/2009/05/20/non-anaemic-models-and-service-oriented-architectures/">Non-anaemic models</a>). Anywho it was pretty simple to get this working all that I had to use were a couple of annotations.</p>
<p>The first @EntityListerners which accepts an array of classes that will become your event handlers:</p>
<p><pre class="brush: java;">
@EntityListeners(ErrorListener.class)
public class SystemError implements Serializable {
</pre></p>
<p>The next is to annotate the methods in your listener class that will handle the various events. The annotations that can be used are:</p>
<ol>
@PrePersist 	Executed before the entity manager persist operation is actually executed or cascaded. This call is synchronous with the persist operation.
</ol>
<ol>
@PreRemove	Executed before the entity manager remove operation is actually executed or cascaded. This call is synchronous with the remove operation.
</ol>
<ol>
@PostPersist	Executed after the entity manager persist operation is actually executed or cascaded. This call is invoked after the database INSERT is executed.
</ol>
<ol>
@PostRemove	Executed after the entity manager remove operation is actually executed or cascaded. This call is synchronous with the remove operation.
</ol>
<ol>
@PreUpdate	Executed before the database UPDATE operation.
</ol>
<ol>
@PostUpdate	Executed after the database UPDATE operation.
</ol>
<ol>
@PostLoad	Eexecuted after an entity has been loaded into the current persistence context or an entity has been refreshed.
</ol>
<p>Note that if you are using EJB dependency injection it won&#8217;t work in your listener as it&#8217;s not managed by your container buy you can use jndi: -</p>
<p><pre class="brush: java;">
Context ctx = new InitialContext();
XXXService service = (XXXService) ctx.lookup(&quot;EARNAME/XXXServiceBean/local&quot;);
</pre></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/objectopia.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/objectopia.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/objectopia.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/objectopia.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/objectopia.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/objectopia.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/objectopia.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/objectopia.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/objectopia.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/objectopia.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/objectopia.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/objectopia.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/objectopia.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/objectopia.wordpress.com/152/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=152&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://objectopia.com/2009/07/21/ejb-3-0-interceptors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cb4e8f1d97dd63efbba72b45e6130bb0?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">chrisclark78</media:title>
		</media:content>
	</item>
		<item>
		<title>Routing around damaged processes</title>
		<link>http://objectopia.com/2009/07/16/routing-around-damaged-processes/</link>
		<comments>http://objectopia.com/2009/07/16/routing-around-damaged-processes/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 07:03:29 +0000</pubDate>
		<dc:creator>Chris Burnley</dc:creator>
				<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://objectopia.com/?p=203</guid>
		<description><![CDATA[It is often said that &#8220;The Internet interprets censorship as damage and routes around it&#8221;. I don&#8217;t know how true this statement is, but I have seen this affect applied to organizational processes. When you work at a sufficiently large organization, you&#8217;ll start to employ people who&#8217;s sole responsibility is creating process. The problem with [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=203&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>It is often said that &#8220;The Internet interprets censorship as damage and routes around it&#8221;. I don&#8217;t know how true this statement is, but I have seen this affect applied to organizational processes.</p>
<p>When you work at a sufficiently large organization, you&#8217;ll start to employ people who&#8217;s sole responsibility is creating process. The problem with these roles is that, if no new process is created, then those people are not seen to be doing their job. </p>
<p>Once they get started, there&#8217;ll be a process for each aspect of developing software, production releases, production data changes, process for creating a process, etc. etc. ad nauseam. (I&#8217;m not saying that there is anything wrong with processes, but more that it unsustainable to continue to create them indefinitely).  </p>
<p>This usually has either two outcomes: </p>
<ol>
<li>good people who just want to do their jobs get fed up with the red tape and leave or; </li>
<li>people &#8220;<strong>route around the damage</strong>&#8220;d process.</li>
</ol>
<p>I see #2 happen all the time. The problem is unnecessary risks are taken because it has just gotten too hard to do anything.</p>
<p>How do you solve this ? Ideally, the people that author the process should also have to follow it themselves. At the very least, you should involve the people that have to follow the process in its creation.</p>
<p>The most important thing is, you have to make following the process easy and fast. If you slow people down, they will just route around the damage (you!). </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/objectopia.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/objectopia.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/objectopia.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/objectopia.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/objectopia.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/objectopia.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/objectopia.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/objectopia.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/objectopia.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/objectopia.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/objectopia.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/objectopia.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/objectopia.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/objectopia.wordpress.com/203/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=objectopia.com&amp;blog=8328377&amp;post=203&amp;subd=objectopia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://objectopia.com/2009/07/16/routing-around-damaged-processes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ea90ab2b972631952cf64bb4228e6f76?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">chris</media:title>
		</media:content>
	</item>
	</channel>
</rss>
