<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3351654476885511145</id><updated>2011-11-24T05:55:50.805Z</updated><title type='text'>Goldfish Geek</title><subtitle type='html'>Who am I?  An average geek trying to better... Who am I?  An average geek tr... Who am I? ...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://goldfish-geek.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3351654476885511145/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://goldfish-geek.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Paul Drummond</name><uri>http://www.blogger.com/profile/14865646552693571930</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://3.bp.blogspot.com/_oZkvC9lhwfY/SQnXMfReE7I/AAAAAAAABbU/bw8I_X2dhAM/S220/me_face.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3351654476885511145.post-3615058132146574080</id><published>2008-10-22T12:33:00.001+01:00</published><updated>2008-10-22T12:33:35.711+01:00</updated><title type='text'>Oi, Java programmers... Is this code acceptable?</title><content type='html'>&lt;b&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;&lt;font size="2"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;&lt;font size="2"&gt;static&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;&lt;font size="2"&gt;int&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt;
getNumCarsInXml(XmlType xmlFile) {&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;/span&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;&lt;font size="2"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt; MutableInteger
{ &lt;/font&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;&lt;font size="2"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;&lt;font size="2"&gt;int&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);"&gt;&lt;font size="2"&gt;value&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt;; }&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;&lt;font size="2"&gt;final&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt; MutableInteger
numCars = &lt;/font&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;&lt;font size="2"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt; MutableInteger();&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;/span&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;br&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt;CarUtils.&lt;/font&gt;&lt;i&gt;forAllCarsInXmlFile&lt;/i&gt;&lt;font size="2"&gt;(xmlFile,
&lt;/font&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;&lt;font size="2"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt; CarUtils.CarFunction() {&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;&lt;font size="2"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;&lt;font size="2"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt;
execute(CarXmlType xmlCar) {&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font size="2"&gt;numCars.&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);"&gt;&lt;font size="2"&gt;value&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt;++;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;/span&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font size="2"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font size="2"&gt;});&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 85);"&gt;&lt;font size="2"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt; numCars.&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: rgb(0, 0, 192);"&gt;&lt;font size="2"&gt;value&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;br&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Note: I am using JAXB to transform XML elements into plain old java objects so just think of &lt;span style="font-family: Courier New;"&gt;CarXmlType&lt;/span&gt; as a normal java bean.&lt;br&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;This is an attempt to bring some of the functional style of programming I have adopted from learning &lt;a title="Clojure" href="http://clojure.org/" id="p_-p"&gt;Clojure&lt;/a&gt; to my day job.&amp;nbsp; I haven't really tested the approach much or given it extensive thought yet - just putting it out there to see what traditional object-oriented folk think of the style!&lt;br&gt;&lt;span style="font-family: Arial;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: Arial;"&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

I like it because I have abstracted the details of accumulating all the "cars" away into &lt;span style="font-family: Courier New;"&gt;forAllCarsInXmlFile() &lt;/span&gt;and it's all localised in the single function where it belongs.&amp;nbsp; The &lt;span style="font-family: Courier New;"&gt;MutableInteger&lt;/span&gt; feels like a bodge though.&amp;nbsp; It's a rather crude way of getting around &lt;a title="the way Java's inner classes work" href="http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg04044.html" id="nhdx"&gt;the way Java's inner classes work&lt;/a&gt;.&amp;nbsp; Questions which spring to mind are:&lt;br&gt;&lt;br&gt;&lt;ol&gt;&lt;li&gt;Am I doing it right?&lt;br&gt;&lt;/li&gt;&lt;li&gt;Is there an easier way to do it?&amp;nbsp; &lt;br&gt;&lt;/li&gt;&lt;li&gt;Is this code as easy to read as alternative, more idiomatic alternatives?&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;Of course, what I really want is a language that fully supports &lt;a title="Closures" href="http://iode.co.uk/blog/pdrummond/i_finally_understand_closures.html" id="tvi-"&gt;Closures&lt;/a&gt;! Unfortunately, I can't use Clojure at work so I'll just have to wait for Java 7.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3351654476885511145-3615058132146574080?l=goldfish-geek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goldfish-geek.blogspot.com/feeds/3615058132146574080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3351654476885511145&amp;postID=3615058132146574080' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3351654476885511145/posts/default/3615058132146574080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3351654476885511145/posts/default/3615058132146574080'/><link rel='alternate' type='text/html' href='http://goldfish-geek.blogspot.com/2008/10/oi-java-programmers-is-this-code.html' title='Oi, Java programmers... Is this code acceptable?'/><author><name>Paul Drummond</name><uri>http://www.blogger.com/profile/14865646552693571930</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://3.bp.blogspot.com/_oZkvC9lhwfY/SQnXMfReE7I/AAAAAAAABbU/bw8I_X2dhAM/S220/me_face.jpg'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3351654476885511145.post-634604745680220687</id><published>2008-09-04T16:37:00.001+01:00</published><updated>2008-09-04T17:10:32.434+01:00</updated><title type='text'>Abstracting Away Patterns In Java</title><content type='html'>&lt;h1 id="vxxk"&gt;&lt;span style=" font-weight: normal" id="souo"&gt;&lt;font size="2"&gt;Today, while hacking away at my blub code in my day job, I noticed a very simple pattern in the code.  My first instinct was to create a utility function to abstract away the pattern, then I thought better of it after thinking for a moment about the inevitable effort and whether it would be worth my time - I have a tight deadline after all!  Then, I thought - sod it - lets see how painful this will be.  The end result?  It was quite painful!  This post explains why....&lt;/font&gt;&lt;/span&gt;&lt;/h1&gt;&lt;span id="vxxk0" style="FONT-FAMILY:'Courier New'"&gt; &lt;div id="ihah" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;   &lt;br id="lrzl"&gt; &lt;/div&gt; &lt;div id="lrzl0" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;   &lt;span id="lrzl1" style="FONT-FAMILY:Verdana"&gt;&lt;b id="lh:g"&gt;&lt;font size="4" id="lh:g0"&gt;The pattern&lt;/font&gt;&lt;/b&gt;&lt;/span&gt; &lt;/div&gt; &lt;span style="font-family: Verdana;" id="mksk"&gt;&lt;div id="tcp4"&gt;&lt;br id="tcp40"&gt;&lt;/div&gt;Here's the code with the reoccurring pattern:&lt;/span&gt;&lt;br id="mksk0"&gt;&lt;div id="cf5v1" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;   &lt;div id="cf5v2" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;&lt;br id="tcp41"&gt;&lt;/div&gt;&lt;div id="tcp42" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     public void addReserveDog(String string, int ngrcId, int studBookId) {   &lt;/div&gt;   &lt;div id="cf5v3" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;span id="r6pz1" style="FONT-FAMILY:Verdana"&gt;    &lt;/span&gt;ReserveDogsXmlType xmlReserveDogs = xmlMeeting.getReserveDogs();   &lt;/div&gt;   &lt;div id="cf5v7" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;span id="r6pz3" style="FONT-FAMILY:Verdana"&gt;    &lt;/span&gt;if(xmlReserveDogs == null) {   &lt;/div&gt;   &lt;div id="cf5v11" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;span id="r6pz5" style="FONT-FAMILY:Verdana"&gt;        &lt;span id="r6pz6" style="FONT-FAMILY:'Courier New'"&gt;xmlReserveDogs = new ReserveDogsXmlType();&lt;/span&gt;&lt;/span&gt;   &lt;/div&gt;   &lt;div id="cf5v13" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;span id="r6pz7" style="WHITE-SPACE:pre"&gt;&lt;span id="r6pz8" style="FONT-FAMILY:Verdana; WHITE-SPACE:normal"&gt;    &lt;span id="r6pz9" style="FONT-FAMILY:'Courier New'; WHITE-SPACE:pre"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;   &lt;/div&gt;   &lt;div id="r6pz11" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;span id="r6pz12" style="WHITE-SPACE:pre"&gt;&lt;span id="r6pz13" style="FONT-FAMILY:Verdana; WHITE-SPACE:normal"&gt;&lt;span id="r6pz14" style="FONT-FAMILY:'Courier New'; WHITE-SPACE:pre"&gt;&lt;span id="r6pz15" style="WHITE-SPACE:normal"&gt;&lt;span id="r6pz16" style="FONT-FAMILY:Verdana"&gt;    &lt;/span&gt;xmlMeeting.setReserveDogs(xmlReserveDogs);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;   &lt;/div&gt;   &lt;div id="cf5v23" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     }   &lt;/div&gt;   &lt;div id="m:.w" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;br id="m:.w0"&gt;   &lt;/div&gt;   &lt;div id="m:.w1" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;span id="m:.w2" style="FONT-FAMILY:Verdana"&gt;All over the code I am doing this with different JAXB types.  In this case, I need to add something to the xmlReserveDogs element but it may be null.  So I need to get the element, check for null and if so create it, then set it again.&lt;/span&gt;   &lt;/div&gt;   &lt;div id="k52r" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;br id="k52r0"&gt;        &lt;/div&gt;   &lt;div id="k52r1" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;span id="m:.w4" style="FONT-FAMILY:Verdana"&gt;This same pattern happens everywhere but for different types.  Ideally, I'd like to abstract this pattern into a function such as this:&lt;/span&gt;   &lt;/div&gt;   &lt;div id="jjkw" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;br id="jjkw1"&gt;        &lt;/div&gt;   &lt;div id="jjkw2" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     ReserveDogsXmlType xmlReserveDogs = getOrCreateXmlObject(xmlMeeting, ReserveDogsXmlType.class)   &lt;/div&gt;   &lt;div id="lq57" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;br id="lq571"&gt;        &lt;/div&gt;   &lt;div id="lq572" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;span id="lq573" style="FONT-FAMILY:Verdana"&gt;After messing around for a while I came up with this:&lt;/span&gt;   &lt;/div&gt;   &lt;div id="jjkw4" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;br id="lq574"&gt;   &lt;/div&gt;   &lt;div id="yll03" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     ReserveDogsXmlType xmlReserveDogs = (ReserveDogsXmlType) getOrCreateXmlObject(xmlMeeting, ReserveDogsXmlType.class, "getReserveDogs", "setReserveDogs");   &lt;/div&gt;   &lt;div id="yll06" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;br id="lq575"&gt;   &lt;/div&gt;   &lt;div id="lq576" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;span id="orbn" style="FONT-FAMILY:Verdana"&gt;I needed to pass in the names of the getter and setter methods to get it to work, but I can live with that.  The problem was the pain involved in getting this to work.  &lt;/span&gt;   &lt;/div&gt;   &lt;div id="i1u8" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;br id="i1u81"&gt;   &lt;/div&gt;   &lt;span id="jjkw12" style="FONT-FAMILY:Verdana"&gt;Here is the implementation code:&lt;/span&gt;&lt;br id="koxc"&gt;   &lt;div id="koxc0" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;     &lt;div id="koxc2" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;       &lt;br id="koxc3"&gt;     &lt;/div&gt;     &lt;div id="koxc4" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;       public static Object getOrCreateXmlObject(     &lt;/div&gt;     &lt;div id="koxc5" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           AbstractXmlObject xmlParentObj,      &lt;/div&gt;     &lt;div id="koxc6" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           Class&amp;lt;?&gt; xmlObjectType,      &lt;/div&gt;     &lt;div id="koxc7" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           String getterMethodName,     &lt;/div&gt;     &lt;div id="koxc8" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           String setterMethodName) {     &lt;/div&gt;     &lt;div id="koxc9" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;             &lt;/div&gt;     &lt;div id="koxc11" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;&lt;br id="x0.8"&gt;&lt;/div&gt;&lt;div id="x0.80" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;    Object newXmlObj = ReflectionUtils.invokeMethod(xmlParentObj, getterMethodName);&lt;/div&gt;     &lt;div id="koxc13" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;             &lt;/div&gt;     &lt;div id="koxc15" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           if(newXmlObj == null) {     &lt;/div&gt;     &lt;div id="koxc16" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;        newXmlObj = ReflectionUtils.newInstance(xmlObjectType);&lt;/div&gt;     &lt;div id="koxc19" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           }     &lt;/div&gt;     &lt;div id="koxc20" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;    ReflectionUtils.invokeMethod(xmlParentObj, setterMethodName, xmlObjectType, newXmlObj);&lt;/div&gt;     &lt;div id="koxc22" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;             &lt;/div&gt;     &lt;div id="koxc24" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           return newXmlObj;     &lt;/div&gt;     &lt;div id="koxc25" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;       }     &lt;/div&gt;     &lt;div id="vxxk1"&gt;       &lt;br id="vxxk2"&gt;     &lt;/div&gt;     &lt;div id="orbn0"&gt;       &lt;span id="vd3k" style="FONT-FAMILY:Verdana"&gt;Note that I use several utility methods here.  These are listed below:&lt;/span&gt;     &lt;/div&gt;     &lt;div id="h7rl"&gt;       &lt;span id="h7rl0" style="FONT-FAMILY:Verdana"&gt;       &lt;div id="w26v12" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;         &lt;br id="h7rl1"&gt;       &lt;/div&gt;       &lt;div id="h7rl2" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;         &lt;span id="h7rl3" style="FONT-FAMILY:'Courier New'"&gt;public static Object invokeMethod(Object obj, String methodName) {&lt;/span&gt;       &lt;/div&gt;       &lt;div id="w26v15" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;         &lt;div id="w26v19" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl" style="FONT-FAMILY:'Courier New'"&gt;    Object result = null;&lt;/span&gt;         &lt;/div&gt;         &lt;div id="umz15" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl0" style="FONT-FAMILY:'Courier New'"&gt;    try {&lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v25" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl1" style="FONT-FAMILY:'Courier New'"&gt;        result = obj.getClass().getMethod(methodName).invoke(obj);&lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v27" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl2" style="FONT-FAMILY:'Courier New'"&gt;    } catch (Exception e) {&lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v29" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl3" style="FONT-FAMILY:'Courier New'"&gt;        ////.... error handling .....&lt;/span&gt;         &lt;/div&gt;         &lt;div id="umz16" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl4" style="FONT-FAMILY:'Courier New'"&gt;    }&lt;/span&gt;         &lt;/div&gt;&lt;div id="y4gg" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;&lt;span style="font-family: 'Courier New';" id="y4gg0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div id="y4gg1" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;&lt;br id="y4gg3"&gt;&lt;/div&gt;         &lt;div id="w26v47" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;                     &lt;/div&gt;         &lt;div id="w26v49" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl6" style="FONT-FAMILY:'Courier New'"&gt;public static Object invokeMethod(Object obj, String methodName, Class&amp;lt;?&gt; paramType, Object arg) {&lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v63" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl7" style="FONT-FAMILY:'Courier New'"&gt;    Object result = null;&lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v65" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;                     &lt;/div&gt;         &lt;div id="w26v67" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl9" style="FONT-FAMILY:'Courier New'"&gt;    try {&lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v69" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl10" style="FONT-FAMILY:'Courier New'"&gt;        result = obj.getClass().getMethod(methodName, paramType).invoke(obj, arg);&lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v71" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl11" style="FONT-FAMILY:'Courier New'"&gt;    } catch (Exception e) {&lt;/span&gt;         &lt;/div&gt;         &lt;div id="umz17" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl12" style="FONT-FAMILY:'Courier New'"&gt;        ////.... error handling ....       &lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v73" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl13" style="FONT-FAMILY:'Courier New'"&gt;}&lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v91" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;br id="umz18"&gt;                    &lt;/div&gt;         &lt;div id="umz19" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl15" style="FONT-FAMILY:'Courier New'"&gt;public static Object newInstance(Class&amp;lt;?&gt; xmlObjectType) {&lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v97" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl16" style="FONT-FAMILY:'Courier New'"&gt;    Object newObj = null;&lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v99" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl17" style="FONT-FAMILY:'Courier New'"&gt;    try {&lt;/span&gt;         &lt;/div&gt;         &lt;div id="umz110" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl18" style="FONT-FAMILY:'Courier New'"&gt;        newObj = xmlObjectType.newInstance();&lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v103" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl19" style="FONT-FAMILY:'Courier New'"&gt;    } catch(Exception e) {&lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v105" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl20" style="FONT-FAMILY:'Courier New'"&gt;        ////.... error handling ....&lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v107" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl21" style="FONT-FAMILY:'Courier New'"&gt;    }&lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v109" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl22" style="FONT-FAMILY:'Courier New'"&gt;    return newObj;&lt;/span&gt;         &lt;/div&gt;         &lt;div id="w26v111" style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"&gt;           &lt;span id="wefl23" style="FONT-FAMILY:'Courier New'"&gt;}&lt;/span&gt;         &lt;/div&gt;         &lt;div id="h7rl4"&gt;           &lt;br id="h7rl6"&gt;                    &lt;/div&gt;       &lt;/div&gt;       &lt;/span&gt;     &lt;/div&gt;     &lt;div id="w26v"&gt;       &lt;br id="umz10"&gt;            &lt;/div&gt;     &lt;div id="umz11"&gt;       &lt;span id="umz12" style="FONT-FAMILY:Verdana"&gt;&lt;b id="lh:g1"&gt;&lt;font size="4" id="lh:g2"&gt;Summary&lt;/font&gt;&lt;/b&gt;&lt;/span&gt;     &lt;/div&gt;     &lt;div id="w26v4"&gt;       &lt;br id="w26v6"&gt;            &lt;/div&gt;     &lt;div id="w26v7"&gt;       &lt;span id="jm33" style="FONT-FAMILY:Verdana"&gt;It is obvious from this experiment that the effort involved in abstracting away simple patterns is quite high in comparison to the benefits.  However, I still think it's worth it.  As the code base evolves more and more patterns will be abstracted and there will be less and less code duplication which should make code easier to maintain.  Also, the ReflectionUtils can be reused elsewhere in the code.  &lt;/span&gt;&lt;/div&gt;&lt;div id="w.ou"&gt;&lt;br id="w.ou0"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3351654476885511145-634604745680220687?l=goldfish-geek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goldfish-geek.blogspot.com/feeds/634604745680220687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3351654476885511145&amp;postID=634604745680220687' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3351654476885511145/posts/default/634604745680220687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3351654476885511145/posts/default/634604745680220687'/><link rel='alternate' type='text/html' href='http://goldfish-geek.blogspot.com/2008/09/abstracting-away-patterns-in-java.html' title='Abstracting Away Patterns In Java'/><author><name>Paul Drummond</name><uri>http://www.blogger.com/profile/14865646552693571930</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://3.bp.blogspot.com/_oZkvC9lhwfY/SQnXMfReE7I/AAAAAAAABbU/bw8I_X2dhAM/S220/me_face.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3351654476885511145.post-8759781720542470783</id><published>2007-12-11T12:21:00.000Z</published><updated>2007-12-13T18:06:50.818Z</updated><title type='text'>Bottom-Up Development - Embracing Change</title><content type='html'>I have just read Raganwald's post, &lt;a href="http://weblog.raganwald.com/2007/12/somethings-fishy.html"&gt;Something's Fishy&lt;/a&gt;, and it made me start thinking hard.  One statement in particular caught my attention:
&lt;blockquote&gt;
&lt;i&gt;"Now maybe this [bad software] has absolutely nothing to do with programmers."&lt;/i&gt;
&lt;/blockquote&gt;

which spurred me to start writing.  I was going to add my thoughts as a comment on Raganwald's blog but once I started writing I couldn't stop! Also, I have just started this blog so I thought, why not - I'll publish my brain-dump here.
&lt;p&gt;
In my experience, the fact that writing software is hard is the ultimate driver for all the bureaucracy trust upon developers in medium to large software houses.

&lt;/p&gt;&lt;p&gt;
Managers are scarred by past experiences maintaining bug-ridden, badly designed systems so they inevitably try to find ways minimize risk by enforcing rule upon rule. They embrace the fear of "getting it wrong" and introduce layers of process from pre-planning to lengthy design phases, to requirements re-re-re-analysis and so on.  Often the rules put in place are ad-hoc, subjective and designed to prevent recurrence of specific nightmares from the past which will probably never reoccur again, at least not in exactly the same way.
&lt;/p&gt;&lt;p&gt;
I believe putting blame on bad management and bureaucracy is generally futile because, while not necessarily incorrect in specific circumstances, they are just symptoms of the real problem. The real problem in my opinion is that - even when using popular dynamic languages like Python - writing bad code is way too easy to do and maintaining it can become a nightmare as time goes on and feature creep has it's wicked way with an infrastructure never designed to support the features it is being asked to support.

&lt;/p&gt;&lt;p&gt;
That's why I am so excited about discovering the power of Lisp and in particular when &lt;a href="http://www.paulgraham.com/"&gt;Paul Graham&lt;/a&gt; talks about &lt;a href="http://www.paulgraham.com/progbot.html"&gt;bottom-up&lt;/a&gt; programming.  I believe the main players in the software industry focus far too much on top-down design of extendible and reusable systems.  This is the basis for OO and it has never, ever sat well with me.  How can we, in the real world, really expect anyone to come up with a system that is designed for change when we have no idea what the change will be?  We can guesstimate and plan ahead and sometimes we may get it right, but there always comes a time in a system's lifetime when the customer requests a feature that "the system wasn't designed for".

&lt;/p&gt;&lt;p&gt;
I am very new to Lisp and more generally, functional programming concepts, but when I read about bottom-up programming in &lt;a href="http://www.paulgraham.com/onlisp.html"&gt;On Lisp&lt;/a&gt;, it all makes so much sense! Maybe we shouldn't be designing for change?  Maybe we should accept that code will change in ways we cannot predict, then embrace it, then begin to use tools (like Lisp) that help us to manage and maintain such code elegantly.

&lt;/p&gt;&lt;p&gt;
If tasked with writing a geographical mapping product that tracks ship movements, do we spend months writing an infrastructure to support generic objects and potential features that the customer hasn't asked for, but may well do in the future? Or do we write a geographical mapping product that tracks ship movements?  Your typical OO enthusiast we say, "Oh, you can't create a &lt;code&gt;Ship&lt;/code&gt; class, you should be more generic than that!  Study your &lt;code&gt;Ship&lt;/code&gt; class for a while - I could pick several attributes and behavioural aspects of your class that aren't specific to a ship and come up with about five base classes.  Wham Bam! An extendible and reusable system!".

&lt;/p&gt;&lt;p&gt;
But I just want to write some software that meets the requirements and more importantly... works.  I want to keep it simple to reduce risk and minimise the chance of it not working properly.  If I break-down my &lt;code&gt;Ship&lt;/code&gt; class into multiple base classes I am not going to use (and repeat this approach throughout the system), then I am unnecessarily complicating the code and arguably wasting time and money.

&lt;/p&gt;&lt;p&gt;
Nevertheless, the OO guy has a point.  If I limit my code to exactly what is required now, then it will be difficult to extend in the future.  But, crucially, if the OO guy had his way and generalised the code using a top-down approach, unless he possessed psychic powers he would undoubtedly end up with a system that was just as difficult to extend than mine (except maybe in certain specific ways he had thought of), yet his system would be far more complicated and more difficult to maintain.
&lt;/p&gt;&lt;p&gt;
I believe the bottom-up approach is better because I end up with a simple system that works NOW!  But I still have the problem that my code is very difficult to extend.  What I need is a tool designed to aid, manage and maintain code written in a bottom-up style.

Although I have no experience using Lisp in production environments, from what I have read so far I am pretty sure this is precisely where Lisp shines, primarily because of macros.  &lt;a href="http://en.wikipedia.org/wiki/Macro_%28computer_science%29#Lisp_macros"&gt;Macros&lt;/a&gt; combined with other powerful features of Lisp provide the programmer with the flexibility to generalise code &lt;i&gt;after the fact&lt;/i&gt;.  It allows us to write very specific code that doesn't go any further than meet current requirements (you know - the ones that &lt;i&gt;actually&lt;/i&gt; exist!).  As the system evolves and new requirements are requested by the customer, Lisp allows programmers to elegantly &lt;i&gt;mould&lt;/i&gt; their system into a new beast capable of meeting those requirements.
&lt;/p&gt;&lt;p&gt;
Now, if I were a Lisp expert I would dive into an example of it's power at this point.  But I'm afraid I am just at the beginning of my journey towards &lt;a href="http://www.defmacro.org/ramblings/lisp.html"&gt;Lisp Enlightenment&lt;/a&gt;.  I have just purchased &lt;a href="http://www.ccs.neu.edu/home/matthias/BTLS/"&gt;The Little Schemer&lt;/a&gt;, I am almost finished my first attempt at &lt;a href="http://www.gigamonkeys.com/book/"&gt;Pratical Common Lisp&lt;/a&gt; and I have read the first few chapters of &lt;a href="http://www.paulgraham.com/onlisp.html"&gt;On Lisp&lt;/a&gt;.  So I have a long way to go, and time permitting I will try to record some of my learning experiences here.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3351654476885511145-8759781720542470783?l=goldfish-geek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goldfish-geek.blogspot.com/feeds/8759781720542470783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3351654476885511145&amp;postID=8759781720542470783' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3351654476885511145/posts/default/8759781720542470783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3351654476885511145/posts/default/8759781720542470783'/><link rel='alternate' type='text/html' href='http://goldfish-geek.blogspot.com/2007/12/bottom-up-development-embracing-change.html' title='Bottom-Up Development - Embracing Change'/><author><name>Paul Drummond</name><uri>http://www.blogger.com/profile/14865646552693571930</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://3.bp.blogspot.com/_oZkvC9lhwfY/SQnXMfReE7I/AAAAAAAABbU/bw8I_X2dhAM/S220/me_face.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3351654476885511145.post-156494634030979505</id><published>2007-11-21T16:22:00.000Z</published><updated>2007-12-11T22:17:50.738Z</updated><title type='text'>Candidate For Best Comment Ever!</title><content type='html'>Today, I was given a bug report stating that one of the fields in the system should be 200 by default, yet for some reason it is showing up as 100.  Due to my work load someone else investigated the bug before I had a chance to take a look and shortly after he came over to my desk with a big smile on his face.
&lt;p/&gt;
When he pointed me at the offending code, I instantly realised why he was smiling. Here's my candidate for best comment ever:
&lt;pre&gt;
static const long INITIAL_PING_SECONDS_REMAINING = 100; //TODO: Needs to be 200&lt;/span&gt;
&lt;/pre&gt;
For a few seconds I was stumped.  This can't be my code!  What was I thinking????  Then it hit me and I remembered what I'd done.  I set the constant to 100 during development to make it quicker to debug so I put the TODO there to remind myself to put it back to 200 when finished.  Nothing wrong with that of course, but I could have saved myself considerable embarrassment if a) the comment was a little more descriptive like "&lt;span style="font-style: italic;"&gt;TODO: 100 for debugging, remember to change back to 200&lt;/span&gt;" maybe and b) if I actually checked my TODO's before committing!
&lt;p/&gt;
Oh well, lessons learned I guess :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3351654476885511145-156494634030979505?l=goldfish-geek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goldfish-geek.blogspot.com/feeds/156494634030979505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3351654476885511145&amp;postID=156494634030979505' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3351654476885511145/posts/default/156494634030979505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3351654476885511145/posts/default/156494634030979505'/><link rel='alternate' type='text/html' href='http://goldfish-geek.blogspot.com/2007/11/candidate-for-best-comment-ever.html' title='Candidate For Best Comment Ever!'/><author><name>Paul Drummond</name><uri>http://www.blogger.com/profile/14865646552693571930</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://3.bp.blogspot.com/_oZkvC9lhwfY/SQnXMfReE7I/AAAAAAAABbU/bw8I_X2dhAM/S220/me_face.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3351654476885511145.post-87771897831953403</id><published>2007-11-15T21:13:00.000Z</published><updated>2007-11-15T21:20:10.914Z</updated><title type='text'>The First Post</title><content type='html'>&lt;b&gt;Argh!&lt;/b&gt;  I can't take it anymore. 

&lt;span style="letter-spacing: 0.1cm;"&gt;I NEED TO GET THIS STUFF OUT OF MY HEAD!&lt;/span&gt; 

Here's a wild idea:

&lt;p align="justify"&gt;&lt;i&gt;if I join the masses and start a blog I will be able to dump some of this stuff to make some room for other things (like a life, for a start) but not only that - if what I &lt;em&gt;dump&lt;/em&gt; receives even a little exposure then maybe people will actually help me make sense of it!  Wow, what a great idea!&lt;/i&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3351654476885511145-87771897831953403?l=goldfish-geek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goldfish-geek.blogspot.com/feeds/87771897831953403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3351654476885511145&amp;postID=87771897831953403' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3351654476885511145/posts/default/87771897831953403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3351654476885511145/posts/default/87771897831953403'/><link rel='alternate' type='text/html' href='http://goldfish-geek.blogspot.com/2007/11/first-post.html' title='The First Post'/><author><name>Paul Drummond</name><uri>http://www.blogger.com/profile/14865646552693571930</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://3.bp.blogspot.com/_oZkvC9lhwfY/SQnXMfReE7I/AAAAAAAABbU/bw8I_X2dhAM/S220/me_face.jpg'/></author><thr:total>1</thr:total></entry></feed>
