<?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-16924799</id><updated>2012-02-05T12:29:00.226Z</updated><category term='Java 6.0'/><category term='Spring Batch'/><category term='SOA'/><category term='REST'/><category term='Ant'/><category term='Spring Framework'/><category term='JAXB'/><title type='text'>Pragmatic Integration</title><subtitle type='html'>Thoughts on Software Engineering - development - methodology - experiences - ideas - opinions&lt;br/&gt;&lt;p&gt;&lt;em&gt;"We act as though comfort and luxury were the chief requirements of life, when all that we need to make us happy is something to be enthusiastic about."&lt;/em&gt; -- &lt;a href="http://tinyurl.com/2a49hb"&gt;Charles Kingsley&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;"I’ve been drunk for about a week now, and I thought it might sober me up to sit in a library."&lt;/em&gt; -- &lt;a href="http://tinyurl.com/ymquls"&gt;F. Scott Fitzgerald&lt;/a&gt;&lt;/p&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>60</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-16924799.post-8909624605811929448</id><published>2010-08-24T08:23:00.000Z</published><updated>2010-08-24T08:25:25.099Z</updated><title type='text'>Java boy in a .Net household - hilarious!</title><content type='html'>&lt;iframe src="http://player.vimeo.com/video/12871535" width="400" height="225" frameborder="0"&gt;&lt;/iframe&gt;&lt;p&gt;&lt;a href="http://vimeo.com/12871535"&gt;JavaZone: The World's Geekiest Movie&lt;/a&gt; from &lt;a href="http://vimeo.com/user1392541"&gt;Ibrahim Nergiz&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-8909624605811929448?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/8909624605811929448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=8909624605811929448' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/8909624605811929448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/8909624605811929448'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2010/08/java-boy-in-net-household-hilarious.html' title='Java boy in a .Net household - hilarious!'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-2666310572949952782</id><published>2010-08-20T08:44:00.000Z</published><updated>2010-08-20T08:45:19.272Z</updated><title type='text'>Lady Java</title><content type='html'>&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Mt7zsortIXs?fs=1&amp;amp;hl=en_GB"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Mt7zsortIXs?fs=1&amp;amp;hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-2666310572949952782?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/2666310572949952782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=2666310572949952782' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/2666310572949952782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/2666310572949952782'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2010/08/lady-java.html' title='Lady Java'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-6721688862117531802</id><published>2010-08-14T18:12:00.001Z</published><updated>2010-08-14T18:12:44.347Z</updated><title type='text'>Oyster Stroller</title><content type='html'>&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/m0tmjVCuHIQ?fs=1&amp;amp;hl=en_GB"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/m0tmjVCuHIQ?fs=1&amp;amp;hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-6721688862117531802?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/6721688862117531802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=6721688862117531802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6721688862117531802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6721688862117531802'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2010/08/oyster-stroller.html' title='Oyster Stroller'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-6177223178738496350</id><published>2010-08-02T14:42:00.001Z</published><updated>2010-08-02T14:45:08.098Z</updated><title type='text'>MapReduce in Simple Terms</title><content type='html'>This is the most straightforward, *a-ha* light-bulb moment, descriptions of MapReduce I've seen:&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_3586114"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;br /&gt;&lt;/strong&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/esaliya/mapreduce-in-simple-terms" title="MapReduce in Simple Terms"&gt;MapReduce in Simple Terms&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse3586114" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mapreduce-100329102056-phpapp02&amp;amp;stripped_title=mapreduce-in-simple-terms"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed name="__sse3586114" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mapreduce-100329102056-phpapp02&amp;amp;stripped_title=mapreduce-in-simple-terms" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/esaliya"&gt;Saliya Ekanayake&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-6177223178738496350?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/6177223178738496350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=6177223178738496350' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6177223178738496350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6177223178738496350'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2010/08/mapreduce-in-simple-terms.html' title='MapReduce in Simple Terms'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-2717379357104246520</id><published>2010-07-26T08:07:00.000Z</published><updated>2010-07-26T08:07:54.313Z</updated><title type='text'>Tan Le: A headset that reads your brainwaves | Video on TED.com</title><content type='html'>&lt;a href="http://www.ted.com/talks/tan_le_a_headset_that_reads_your_brainwaves.html"&gt;Tan Le: A headset that reads your brainwaves | Video on TED.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-2717379357104246520?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.ted.com/talks/tan_le_a_headset_that_reads_your_brainwaves.html' title='Tan Le: A headset that reads your brainwaves | Video on TED.com'/><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/2717379357104246520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=2717379357104246520' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/2717379357104246520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/2717379357104246520'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2010/07/tan-le-headset-that-reads-your.html' title='Tan Le: A headset that reads your brainwaves | Video on TED.com'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-8222041845397381782</id><published>2010-07-09T17:12:00.002Z</published><updated>2010-07-09T17:16:31.224Z</updated><title type='text'>Helping to implement a Masonic Research Library</title><content type='html'>I've been asked to assist in implementing a Masonic Research Library at &lt;a href="http://www.warwickshirepgl.org.uk/"&gt;Warwickshire Provincial Grand Lodge&lt;/a&gt; as a labour of love in my spare time ... I've started blogging progress &lt;a href="http://virtuallodge.blogspot.com/2010/06/warwickshire-provincial-grand-lodge.html"&gt;here &lt;/a&gt;and &lt;a href="http://virtuallodge.blogspot.com/2010/07/warwickshire-provincial-grand-lodge.html"&gt;here&lt;/a&gt; over on my other blog....&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've been having great fun with &lt;a href="http://vufind.org/"&gt;VUFind&lt;/a&gt;.... &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-8222041845397381782?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/8222041845397381782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=8222041845397381782' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/8222041845397381782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/8222041845397381782'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2010/07/helping-to-implement-masonic-research.html' title='Helping to implement a Masonic Research Library'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-2625206436291158955</id><published>2010-06-25T12:59:00.001Z</published><updated>2010-06-25T13:03:05.987Z</updated><title type='text'>Changing MOTD on Ubuntu server</title><content type='html'>&lt;p class="MsoNormal"&gt;If you just edit your MOTD (Message of The Day) file it will get overridden following a reboot and you will lose your changes because &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;/etc/motd&lt;/span&gt; is a symbolic link to a file which gets written to during system start-up. So to make the change permanent, create a new file with your new message, remove the old symbolic link and replace it with a symbolic link to your new message file.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;This worked for me:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;// Create your new file&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;$ vi $HOME/my_special_message.motd&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;// Remove the old symbolic link&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;$ sudo rm /etc/motd&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;// Put in a link to your new file&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;$ sudo ln $HOME/my_special_message.motd /etc/motd&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;// Reboot and check it out...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;$ sudo reboot&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;If you want to also remove the last logged in message (not recommended for production systems, but I did it for my local Ubuntu VM) then edit &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;/etc/ssh/sshd_config&lt;/span&gt; and change:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;PrintLastLog yes&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;To &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;PrintLastLog no&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-2625206436291158955?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/2625206436291158955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=2625206436291158955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/2625206436291158955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/2625206436291158955'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2010/06/changing-motd-on-ubuntu-server.html' title='Changing MOTD on Ubuntu server'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-6938450314768837794</id><published>2010-01-05T09:15:00.002Z</published><updated>2010-01-05T09:18:39.506Z</updated><title type='text'>The busy Java developer’s guide to Scala</title><content type='html'>I found this handy collection of articles over on the &lt;a href="http://www.scala-lang.org/node/960"&gt;Scala homepage&lt;/a&gt;:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 13px; color: rgb(34, 34, 34); line-height: 17px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul type="disc"&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 1&lt;span class="apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-scala01228.html?S_TACT=105AGX02&amp;amp;S_CMP=EDU"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Functional programming for the      object oriented&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 2&lt;span class="apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-scala02198.html?S_TACT=105AGX02&amp;amp;S_CMP=EDU"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Class action&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 3&lt;span class="apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-scala03268.html?S_TACT=105AGX02&amp;amp;S_CMP=EDU"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Don’t get thrown for a loop&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 4&lt;span class="apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-scala04298.html?S_TACT=105AGX02&amp;amp;S_CMP=EDU"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Of traits and behaviors&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 5&lt;span class="apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-cobol.html?S_TACT=105AGX02&amp;amp;S_CMP=EDU"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Dead like COBOL&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 6&lt;span class="apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-scala05298.html"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Implementation inheritance&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 7&lt;span class="apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-scala06278.html"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Collection types&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 8&lt;span class="apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-scala07298.html"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Packages and access modifiers&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 9&lt;span class="apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-scala08268.html"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Building a calculator, Part 1&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 10&lt;span class="apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-scala10248.html?S_TACT=105AGX02&amp;amp;S_CMP=EDU"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Building a calculator, Part 2&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 11&lt;span class="apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-scala11218.html?S_TACT=105AGX02&amp;amp;S_CMP=EDU"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Building a calculator, Part 3&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 12&lt;span class="apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-scala12228.html?S_TACT=105AGX02&amp;amp;S_CMP=EDU"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Scala and servlets&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 13&lt;span class="apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-scala02049.html?S_TACT=105AGX02&amp;amp;S_CMP=EDU"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Explore Scala concurrency&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 14 &lt;a href="http://www.ibm.com/developerworks/java/library/j-scala04109.html?S_TACT=105AGX02&amp;amp;S_CMP=EDU"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Dive deeper into Scala concurrency&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 15 &lt;a href="http://www.ibm.com/developerworks/java/library/j-scala05059.html?S_TACT=105AGX02&amp;amp;S_CMP=EDU"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Scala + Twitter = Scitter&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="color:#222222;mso-margin-top-alt:auto;mso-margin-bottom-alt:      auto;line-height:12.75pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:      &amp;quot;Times New Roman&amp;quot;"&gt;Part 16 &lt;a href="http://www.ibm.com/developerworks/java/library/j-scala06029.html?S_TACT=105AGX02&amp;amp;S_CMP=EDU"&gt;&lt;span style="font-size:11.0pt;color:#336299"&gt;Enhancing the Scitter library&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 13px; color: rgb(34, 34, 34); line-height: 17px; "&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-6938450314768837794?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/6938450314768837794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=6938450314768837794' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6938450314768837794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6938450314768837794'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2010/01/busy-java-developers-guide-to-scala.html' title='The busy Java developer’s guide to Scala'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-6701942409864494185</id><published>2009-11-24T14:24:00.002Z</published><updated>2009-11-24T14:26:08.369Z</updated><title type='text'>Dan Brown: The Lost Symbol</title><content type='html'>I blogged a Masonic perspective on &lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px; white-space: pre; "&gt;Dan Brown's novel, The Lost Symbol &lt;a href="http://virtuallodge.blogspot.com/2009/11/dan-brown-lost-symbol.html"&gt;over on my sister blog, Virtual Lodge&lt;/a&gt;.&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-6701942409864494185?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/6701942409864494185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=6701942409864494185' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6701942409864494185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6701942409864494185'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2009/11/dan-brown-lost-symbol.html' title='Dan Brown: The Lost Symbol'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-1465655107749524981</id><published>2009-09-04T13:54:00.003Z</published><updated>2009-09-04T14:01:28.683Z</updated><title type='text'>Sending HTTP Authentication headers with Telnet</title><content type='html'>I’ll keep this entry as brief as possible because when I tried Googling for how to do this I it took me ages to get through all of the crud.&lt;br /&gt;&lt;br /&gt;So what this shows is how to send HTTP authentication headers (username and password) through to a service, like a RESTful based web service when you are using telnet to make the request.&lt;br /&gt;&lt;br /&gt;It’s quite common to telnet into a HTTP server and send requests.  And is a useful debugging and troubleshooting tactic…&lt;br /&gt;&lt;br /&gt;For example to sent a GET request to &lt;a href="http://localhost:8080/MyApp/myservice"&gt;http://localhost:8080/MyApp/myservice&lt;/a&gt; then from the command line just do:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;$ telnet localhost 8080&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And when you are in, do:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;GET /MyApp/myservice HTTP/1.0&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(Hit enter twice!) and you will create a GET request to that URI and your session will display whatever HTTP response code etc comes back from that URL.&lt;br /&gt;&lt;br /&gt;However sometimes services are protected by HTTP authentication – when you access them from a browser, the browser’s default login prompt appears and challenges you for username and password. But to do this from a simple telnet session you need to send in the username and password using the HTTP headers directly.&lt;br /&gt;&lt;br /&gt;Assuming the username is foo and the password is bar then this is what you do:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;$ telnet localhost 8080&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And when you are in, do:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;GET /MyApp/myservice HTTP/1.0&lt;br /&gt;Authorization: BASIC Zm9vOmJhcg==&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(Hit enter twice!!) and you will create a GET request to that URI sending through the authentication headers of username and password&lt;br /&gt;&lt;br /&gt;But… what is that encoded string after the word BASIC?&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;Zm9vOmJhcg==&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is a base64 encoding of both the username and the password in the format&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;username:password&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;foo:bar&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To encode it I just looked online and found &lt;a href="http://www.motobit.com/util/base64-decoder-encoder.asp"&gt;this web site &lt;/a&gt;, there are lots of other ways,  but to do something quickly, this will do the trick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-1465655107749524981?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/1465655107749524981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=1465655107749524981' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/1465655107749524981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/1465655107749524981'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2009/09/sending-http-authentication-headers.html' title='Sending HTTP Authentication headers with Telnet'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-1196915122539221702</id><published>2009-02-27T12:12:00.002Z</published><updated>2009-02-27T12:17:21.788Z</updated><title type='text'>Logging HTTP Requests &amp; Jersey</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;For the record, I've been very impressed with &lt;a href="https://jersey.dev.java.net/"&gt;Jersey&lt;/a&gt;. We recently unplugged a &lt;a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm"&gt;RESTful&lt;/a&gt; framework from our application, which I designed and wrote a couple of years ago and slotting Jersey in was simple and straightforward and it's good to be using a &lt;a href="http://jcp.org/en/jsr/detail?id=311"&gt;JSR&lt;/a&gt; rather than something proprietary.  I'm happy with the annotation approach and the ease at which it integrates nicely with &lt;a href="http://www.springsource.org/"&gt;Spring&lt;/a&gt; and &lt;a href="https://jaxb.dev.java.net/"&gt;JAXB&lt;/a&gt; – I was also &lt;a href="http://wikis.sun.com/display/Jersey/WADL"&gt;pleased to discover&lt;/a&gt; that support for &lt;a href="https://wadl.dev.java.net/"&gt;WADL&lt;/a&gt; is out of the box. I've always liked WADL and was always full of intention to add support for WADL     to my home-grown REST framework but now I don't need to bother &lt;span style="font-family:Wingdings;"&gt;J&lt;/span&gt;&lt;br /&gt;   &lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;One thing I miss from my old framework though is the verbose logging of the HTTP requests and execution time, which when you are working on system integration and other developers are consuming your services, this level of debugging is very very useful. Unfortunately I lost this behaviour when I implemented Jersey and have been keen to get it back. So in a moment of frustration when trying to resolve an issue one of my customers had and finding it very difficult to understand the exact request she had sent in I decided to put logging back in.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;I didn't want to start extending the Spring/Jersey Servlet so I decided to knock up a &lt;a href="http://java.sun.com/products/servlet/Filters.html"&gt;HTTP Servlet Filter&lt;/a&gt; to do the job for me. I'd not written one of these before and so with a little Google Coding have developed this class which does the trick for me. It's not specific to Jersey in any way, but seems to work for me. Under the Java code I've also put the web.xml definition which hooks this into the Jersey servlet:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;package com.talis.soa.jersey;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import java.io.BufferedReader;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import java.io.ByteArrayInputStream;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import java.io.ByteArrayOutputStream;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import java.io.IOException;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import java.io.InputStream;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import java.io.InputStreamReader;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import java.util.Enumeration;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import java.util.HashMap;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import java.util.Map;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import javax.servlet.Filter;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import javax.servlet.FilterChain;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import javax.servlet.FilterConfig;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import javax.servlet.ServletException;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import javax.servlet.ServletInputStream;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import javax.servlet.ServletRequest;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import javax.servlet.ServletResponse;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import javax.servlet.http.HttpServletRequest;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import javax.servlet.http.HttpServletRequestWrapper;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import javax.servlet.http.HttpServletResponse;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;import org.apache.log4j.Logger;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;/**&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt; * Jersey doesn't log it's requests/responses and so this filter intercepts&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt; * Jersey to provide this behaviour.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt; *&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt; * In order to log the request body this class also caches the input stream of the request&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt; * so that the bytes are available to the next process in the filter chain.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt; *&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt; * @author Andy Latham&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt; * @date 25th February 2009&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt; */&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;public class JerseyServletLoggingFilter implements Filter {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    private static final Logger logger = Logger.getLogger(JerseyServletLoggingFilter.class);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    @Override&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    public void init(FilterConfig filterConfig) throws ServletException {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        // This is doing simple logging and so doesn't need to&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        // use or keep a reference to the filter config...&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    @Override&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            FilterChain chain) throws IOException, ServletException&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    {    &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        HttpServletResponse httpServletResponse = (HttpServletResponse)servletResponse;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        long startTime = System.currentTimeMillis();        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        Map&amp;lt;String, String&amp;gt; requestMap = this.getTypesafeRequestMap(httpServletRequest);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        BufferedRequestWrapper bufferedReqest = new BufferedRequestWrapper(httpServletRequest);        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        final String logMessage = new StringBuilder("REST Request - ")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                                        .append("[HTTP METHOD:")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                                        .append(httpServletRequest.getMethod())                                        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                                        .append("] [PATH INFO:")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                                        .append(httpServletRequest.getPathInfo())                                        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                                        .append("] [REQUEST PARAMETERS:")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                                        .append(requestMap)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                                        .append("] [REQUEST BODY:")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                                        .append(bufferedReqest.getRequestBody())                                        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                                        .append("] [REMOTE ADDRESS:")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                                        .append(httpServletRequest.getRemoteAddr())&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                                        .append("]")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                                        .toString();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        StringBuilder initLogMessage = new StringBuilder(logMessage).append(" - is being processed... ");&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        logger.info(initLogMessage);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        chain.doFilter (bufferedReqest, httpServletResponse);        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        long endTime = System.currentTimeMillis();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        double totalTime = endTime - startTime;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        StringBuilder successLogMessage = new StringBuilder(logMessage).append(" - processed succesfully in ").append(totalTime).append("ms ");&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        logger.info(successLogMessage);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    }    &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;    &lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    private Map&amp;lt;String, String&amp;gt; getTypesafeRequestMap(HttpServletRequest request) {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        Map&amp;lt;String, String&amp;gt; typesafeRequestMap = new HashMap&amp;lt;String, String&amp;gt;();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        Enumeration&amp;lt;?&amp;gt; requestParamNames = request.getParameterNames();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        while (requestParamNames.hasMoreElements()) {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            String requestParamName = (String)requestParamNames.nextElement();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            String requestParamValue = request.getParameter(requestParamName);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            typesafeRequestMap.put(requestParamName, requestParamValue);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        return typesafeRequestMap;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    @Override&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    public void destroy() {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        logger.info("REST Web Services Servlet Filter is now shutting down due to container shutdown.");&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    }    &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    private static final class BufferedRequestWrapper extends HttpServletRequestWrapper {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        private ByteArrayInputStream bais = null;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        private ByteArrayOutputStream baos = null;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        private BufferedServletInputStream bsis = null;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        private byte[] buffer = null;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        public BufferedRequestWrapper(HttpServletRequest req)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                throws IOException {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            super(req);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            // Read InputStream and store its content in a buffer.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            InputStream is = req.getInputStream();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            this.baos = new ByteArrayOutputStream();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            byte buf[] = new byte[1024];&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            int letti;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            while ((letti = is.read(buf)) &amp;gt; 0)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                this.baos.write(buf, 0, letti);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            this.buffer = this.baos.toByteArray();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        @Override&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        public ServletInputStream getInputStream()&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            // Generate a new InputStream by stored buffer&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            this.bais = new ByteArrayInputStream(this.buffer);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            // Istantiate a subclass of ServletInputStream&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            // (Only ServletInputStream or subclasses of it are accepted by&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            // the servlet engine!)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            this.bsis = new BufferedServletInputStream(this.bais);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            return this.bsis;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        String getRequestBody() throws IOException&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            BufferedReader reader = new BufferedReader(new InputStreamReader(this.getInputStream()));&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            String line = null;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            StringBuilder inputBuffer = new StringBuilder();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            do {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                line = reader.readLine();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                if (null != line) {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                    inputBuffer.append(line.trim());&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            } while (line != null);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            reader.close();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            return inputBuffer.toString().trim();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    /*&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;     * Subclass of ServletInputStream needed by the servlet engine. All&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;     * inputStream methods are wrapped and are delegated to the&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;     * ByteArrayInputStream (obtained as constructor parameter)!&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;     */&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    private static final class BufferedServletInputStream extends ServletInputStream {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        private ByteArrayInputStream bais;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        public BufferedServletInputStream(ByteArrayInputStream bais) {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            this.bais = bais;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        @Override&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        public int available() {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            return this.bais.available();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        @Override&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        public int read() {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            return this.bais.read();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        @Override&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        public int read(byte[] buf, int off, int len) {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            return this.bais.read(buf, off, len);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;And the web.xml snippet:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    &amp;lt;filter&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &amp;lt;filter-name&amp;gt;JerseyServletLoggingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &amp;lt;filter-class&amp;gt;com.talis.soa.jersey.JerseyServletLoggingFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    &amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &amp;lt;filter-name&amp;gt;JerseyServletLoggingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    &amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    &amp;lt;servlet&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &amp;lt;servlet-name&amp;gt;Jersey Spring Web Application&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &amp;lt;servlet-class&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;            com.sun.jersey.spi.spring.container.servlet.SpringServlet&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &amp;lt;/servlet-class&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &amp;lt;load-on-startup&amp;gt;10&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    &amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &amp;lt;servlet-name&amp;gt;Jersey Spring Web Application&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;        &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-1196915122539221702?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/1196915122539221702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=1196915122539221702' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/1196915122539221702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/1196915122539221702'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2009/02/logging-http-requests-jersey.html' title='Logging HTTP Requests &amp;amp; Jersey'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-4382904365649881632</id><published>2009-02-06T14:19:00.002Z</published><updated>2009-02-06T14:19:53.879Z</updated><title type='text'>Quartz scheduling with Spring</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;I was more than impressed how easy it was to implement a simple scheduling process in my J2EE application. I have a requirement that at defined periods in the week an email will be sent to a mailbox from my application. My application uses &lt;a href='http://www.springsource.org/'&gt;Spring&lt;/a&gt; which has built in support for &lt;a href='http://www.opensymphony.com/quartz/'&gt;Quartz&lt;/a&gt; and so all I had to do was this:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;Add the following lines to my Ivy configuration to get the necessary binaries in the Ant build (it's not too dissimilar if you are using Maven for your POM):&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;&amp;lt;dependency org="opensymphony" name="quartz" rev="1.6.0"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;&amp;lt;dependency org="commons-collections" name="commons-collections" rev="3.2"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;And in my Spring config all I added was:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;    &amp;lt;bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;      &amp;lt;property name="triggers"&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;          &amp;lt;ref bean="simpleTrigger"/&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;      &amp;lt;/property&amp;gt;      &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;    &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;    &amp;lt;bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"&amp;gt;      &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;      &amp;lt;property name="jobDetail" ref="jobDetail"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;    &amp;lt;!-- 10 seconds --&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;        &amp;lt;property name="startDelay" value="10000"/&amp;gt;      &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;      &amp;lt;property name="repeatInterval" value="10000"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;    &amp;lt;bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;      &amp;lt;property name="targetObject" ref="voyagerPaymentSpreadsheetImpl"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;      &amp;lt;property name="targetMethod" value="emailPaymentSpreadsheet"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;      &amp;lt;property name="concurrent" value="true"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;Just to add some notes to this, the &lt;span style='font-family:Courier New'&gt;ShedulerFactoryBean&lt;/span&gt;&lt;br /&gt;    &lt;strong&gt;MUST NOT HAVE &lt;/strong&gt;lazy initialisation otherwise Spring will wait for it to be called before it instantiates it, and therefore not ideal for a background scheduler:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;&amp;lt;bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" &lt;strong&gt;lazy-init="false"&amp;gt;&lt;/strong&gt;&lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;The &lt;span style='font-family:Courier New'&gt;SimpleTrigger&lt;/span&gt; is one I'm using for testing and runs the scheduler every 10 seconds, but in production I'll move this to be a CRON schedule, similar to this:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;&amp;lt;bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;  &amp;lt;property name="jobDetail" ref="exampleJob"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;    &amp;lt;!-- run every morning at 6 AM --&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;  &amp;lt;property name="cronExpression" value="0 0 6 * * ?"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New'&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;Finally the job detail is quite self explanatory but basically says when the scheduler kicks in call the method, &lt;span style='font-family:Courier New'&gt;targetMethod&lt;/span&gt;, on the object, &lt;span style='font-family:Courier New'&gt;targetObject&lt;/span&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;It's as easy as that… just plug and play… Of course I got most of this from the &lt;a href='http://static.springframework.org/spring/docs/1.2.x/reference/scheduling.html'&gt;Spring documentation&lt;/a&gt; and by a bit of fiddling myself to get it working, but it works a treat!&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-4382904365649881632?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/4382904365649881632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=4382904365649881632' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/4382904365649881632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/4382904365649881632'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2009/02/quartz-scheduling-with-spring.html' title='Quartz scheduling with Spring'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-8897308342555451538</id><published>2009-02-02T10:35:00.001Z</published><updated>2009-02-02T10:37:09.758Z</updated><title type='text'>New Entry on Virtual Lodge: A visitors tour of the Masonic Temple</title><content type='html'>I have created a new entry on my other blog, which is a speeh I will be delivering on Friday entitled "&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;a href="http://virtuallodge.blogspot.com/2009/02/visitors-tour-of-masonic-temple.html"&gt;A visitors tour of the Masonic Temple&lt;/a&gt;&lt;/span&gt;".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-8897308342555451538?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/8897308342555451538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=8897308342555451538' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/8897308342555451538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/8897308342555451538'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2009/02/new-entry-on-virtual-lodge-visitors.html' title='New Entry on Virtual Lodge: A visitors tour of the Masonic Temple'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-6882255081633713991</id><published>2008-12-23T15:18:00.001Z</published><updated>2008-12-23T15:18:50.464Z</updated><title type='text'>New Entry on Virtual Lodge - Women and Freemasonry</title><content type='html'>&lt;div&gt;Andy has created a new entry on his other blog, on the subject of Women and Freemasonry &lt;a href="http://virtuallodge.blogspot.com/2008/12/women-and-freemasonry.html"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-6882255081633713991?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/6882255081633713991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=6882255081633713991' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6882255081633713991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6882255081633713991'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/12/new-entry-on-virtual-lodge-women-and.html' title='New Entry on Virtual Lodge - Women and Freemasonry'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-2892470975580350045</id><published>2008-12-22T09:39:00.000Z</published><updated>2008-12-22T09:40:20.854Z</updated><title type='text'>Integration</title><content type='html'>If I've learned anything over the past few years, it is that the biggest challenge when integrating computer systems, is integrating the people behind those systems. If you succeed in the latter; then the technology will just take care of itself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-2892470975580350045?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/2892470975580350045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=2892470975580350045' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/2892470975580350045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/2892470975580350045'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/12/integration_22.html' title='Integration'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-7619508564881170890</id><published>2008-12-19T09:41:00.001Z</published><updated>2008-12-19T09:43:17.446Z</updated><title type='text'>Festive brain teaser</title><content type='html'>Why did the programmer go trick or treating on Christmas Day?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-7619508564881170890?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/7619508564881170890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=7619508564881170890' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/7619508564881170890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/7619508564881170890'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/12/festive-brain-teaser.html' title='Festive brain teaser'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-3533354701640253862</id><published>2008-12-15T13:01:00.004Z</published><updated>2008-12-15T13:09:48.138Z</updated><title type='text'>My take on a healthy (+ spicy) Kedgeree</title><content type='html'>I often make a &lt;a href="http://en.wikipedia.org/wiki/Kedgeree"&gt;Kedgeree&lt;/a&gt; because it is a quick and healthy way to get a good feed from basic store cupboard ingredients and is packed with protein and slow release carbs, so is ideal after a good session in the weights room too. I knocked one up quickly yesterday for me and &lt;a href="http://www.facebook.com/profile.php?id=733245472"&gt;Fred &lt;/a&gt;and promised him the recipe, also &lt;a href="http://www.virtualchaos.co.uk/blog/2008/11/16/chicken-pilau-rice-with-peas/"&gt;Nad tagged me the other week&lt;/a&gt; to blog a favourite recipe so I figured I’d kill two birds with one stone and do this… I would have taken photos as I did it, but frankly I was too keen to get back on the Xbox… :-)&lt;br /&gt;&lt;br /&gt;The following recipe is out of my head and completely made up; the way I look at it Kedgeree is a one pot dish of curried rice, fish &amp;amp; eggs but with an extra kick to feed my chilli addiction. It can be eaten hot or put in the fridge to take for lunch and eaten cold. I sometimes have this for breakfast too as traditionally this is a breakfast dish.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Skill&lt;/span&gt;: Easy&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Time&lt;/span&gt;: 10 minutes prep, 20 to 30 minutes cooking time&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Serves&lt;/span&gt;: 2 people for a good feed or 3 to 4 people for a nice snack&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ingredients&lt;/span&gt;:&lt;br /&gt;Fry light (or olive oil, butter or your fat of choice – I use fry light as it’s got fewer calories)&lt;br /&gt;A large cooking onion chopped small&lt;br /&gt;3 or 4 cloves of garlic, sliced or crushed…&lt;br /&gt;8 birds eye chillies or three scotch bonnets if you can take the heat…&lt;br /&gt;2 tins of mackerel (or sardines/salmon – whatever fish you fancy really), drained&lt;br /&gt;A tin of sweet corn, drained&lt;br /&gt;10 mushrooms, whole…&lt;br /&gt;2 large heaped tablespoons of hot curry powder&lt;br /&gt;A tablespoon of hot chilli powder&lt;br /&gt;A teaspoon of turmeric&lt;br /&gt;A handful of chopped coriander&lt;br /&gt;3 eggs&lt;br /&gt;A litre and a half of stock made with two chicken or vegetable Oxo cubes + and boiling water from the kettle&lt;br /&gt;A cup of basmati rice or brown rice if you prefer&lt;br /&gt;Salt and pepper to taste&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Method&lt;/span&gt;:&lt;br /&gt;Get two pots on the hob, in one pot start boiling the eggs and in the other spray with fry light.&lt;br /&gt;&lt;br /&gt;Throw the onions and garlic in the oil and soften for about 5 minutes stirring continuously.&lt;br /&gt;&lt;br /&gt;When these are starting to brown throw in the chillies and the curry powder, the chilli powder &amp;amp; turmeric and fry them off for about 3 minutes in the onions and a few more squirts of fry light.&lt;br /&gt;&lt;br /&gt;Add the sweet corn and the mushrooms and get them full stirred in and coated in the curry powder. You might want to add a splash of the stock at this point to give it some moisture…&lt;br /&gt;&lt;br /&gt;Add the fish from the tins and stir through so that it flakes into smaller pieces. Keep stirring all of this for a few minutes to get it all cooking and the flavours combining.&lt;br /&gt;&lt;br /&gt;Finally add all of the stock and bring it all to the boil, stirring continuously. When it is boiling turn down the heat to a gentle simmer and add the rice and half of the chopped coriander. Stir it through and pop a lid on the pot and leave it to cook for 10 to 15 – check back every five minutes or so, giving it a gentle stir and make sure that nothing is sticking to the pot.&lt;br /&gt;&lt;br /&gt;In the meantime the eggs should be boiled, so pop them in some cold water for a minute or two before shelling and slicing into about 6 slices each &amp;amp; set them aside…&lt;br /&gt;&lt;br /&gt;If the rice has absorbed all of the stock but isn’t fully cooked yet add a suitable splash of boiling water from the kettle, stir and cover again until the rice is fully cooked and is nice and fluffy. If the rice is cooked but there is still visible moisture remove the lid &amp;amp; turn up the heat so that it reduces – watch it doesn’t stick or burn…! Check for seasoning and add s+p if it’s needed…&lt;br /&gt;&lt;br /&gt;When it is all done, remove from the heat and stir in the rest of the coriander. Dish up onto a couple of serving plates or dishes and top with the eggs..&lt;br /&gt;&lt;br /&gt;Have a cold drink on hand to cool your mouth from the chillies …&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-3533354701640253862?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/3533354701640253862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=3533354701640253862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/3533354701640253862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/3533354701640253862'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/12/my-take-on-healthy-spicy-kedgeree.html' title='My take on a healthy (+ spicy) Kedgeree'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-3982517934770567751</id><published>2008-11-18T11:46:00.003Z</published><updated>2008-11-18T11:52:59.217Z</updated><title type='text'>Hint hint...</title><content type='html'>I've been following the latest craze of peeps over at &lt;a href="http://talisians.com/"&gt;Talisians&lt;/a&gt;, tagging each other to &lt;a href="http://www.virtualchaos.co.uk/blog/2008/11/09/mutton-and-potato-curry/"&gt;post&lt;/a&gt;, &lt;a href="http://www.zachbeauvais.com/archives/pheasant-normandyhereford/"&gt;their&lt;/a&gt; &lt;a href="http://dynamicorange.com/2008/10/23/orecchiette-with-broccoli-and-anchovies/"&gt; favourite &lt;/a&gt; &lt;a href="http://www.virtualchaos.co.uk/blog/2008/11/16/chicken-pilau-rice-with-peas/"&gt;recipies&lt;/a&gt;... Now i'd really like to do one... I just need to be tagged!! (hint hint) ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-3982517934770567751?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/3982517934770567751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=3982517934770567751' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/3982517934770567751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/3982517934770567751'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/11/hint-hint.html' title='Hint hint...'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-5915024790000859000</id><published>2008-11-01T09:24:00.000Z</published><updated>2008-11-01T09:26:04.110Z</updated><title type='text'>New Entry on Virtual Lodge</title><content type='html'>&lt;div&gt;Andy has created a new entry on his other blog &lt;a href="http://virtuallodge.blogspot.com/2008/11/banquet-night-by-brother-rudyard.html"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-5915024790000859000?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/5915024790000859000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=5915024790000859000' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/5915024790000859000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/5915024790000859000'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/11/new-entry-on-virtual-lodge_2902.html' title='New Entry on Virtual Lodge'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-237738114818941392</id><published>2008-11-01T09:10:00.000Z</published><updated>2008-11-01T09:11:08.261Z</updated><title type='text'>New Entry on Virtual Lodge</title><content type='html'>Andy has created a new entry on his other blog &lt;a href="http://virtuallodge.blogspot.com/2008/11/virtual-lodge-todo-list.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-237738114818941392?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/237738114818941392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=237738114818941392' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/237738114818941392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/237738114818941392'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/11/new-entry-on-virtual-lodge_8391.html' title='New Entry on Virtual Lodge'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-2522563297886760755</id><published>2008-11-01T09:08:00.001Z</published><updated>2008-11-01T09:10:24.418Z</updated><title type='text'>New entry on Virtual Lodge</title><content type='html'>Andy has created a new entry on his other blog &lt;a href="http://virtuallodge.blogspot.com/2008/11/lodge-number-one-north-pole.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-2522563297886760755?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/2522563297886760755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=2522563297886760755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/2522563297886760755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/2522563297886760755'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/11/new-entry-on-virtual-lodge_7655.html' title='New entry on Virtual Lodge'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-5564608026664434779</id><published>2008-11-01T09:07:00.001Z</published><updated>2008-11-01T09:07:59.620Z</updated><title type='text'>New Entry on Virtual Lodge</title><content type='html'>Andy has created a new entry on his other blog &lt;a href="http://virtuallodge.blogspot.com/2008/10/let-me-initiate-you-into-mysteries-of.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-5564608026664434779?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/5564608026664434779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=5564608026664434779' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/5564608026664434779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/5564608026664434779'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/11/new-entry-on-virtual-lodge_01.html' title='New Entry on Virtual Lodge'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-194342100076551049</id><published>2008-10-31T11:34:00.006Z</published><updated>2008-10-31T13:41:49.429Z</updated><title type='text'>Beautiful Thinking</title><content type='html'>In the world of Software Engineering we are bound by mathematical rules which we use gracefully and artfully to create our solutions. No matter what we do with object oriented, functional, procedural or even with domain driven languages no matter what objects, data types or algorithms we are building at the end of the day, it all becomes manifested as a set of binary numbers which can be computed by a processor. So at the end of the day, we are bound by rules and through invention, creativity and analytic thinking  we allow these rules to shape our solutions.&lt;br /&gt;&lt;br /&gt;It was with this in mind that I was fascinated to hear about the seven year project, recently completed by the Canadian experimental poet, &lt;a href="http://en.wikipedia.org/wiki/Christian_Bök"&gt;Christian Bok&lt;/a&gt;. Bok has taken a set of rules and applied them with determined linguistic prowess to his latest work, &lt;a href="http://catalogue.bl.uk/F/?func=full-set-set&amp;set_number=048994&amp;set_entry=000001&amp;format=999"&gt;Eunoia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The word &lt;a href="http://en.wikipedia.org/wiki/Eunoia"&gt;eunoia&lt;/a&gt; is the shortest word in the English language containing all five vowels, and means, rather poignantly, “Beautiful Thinking”. The word was first coined by &lt;a href="http://en.wikipedia.org/wiki/Aristotle"&gt;Aristotle&lt;/a&gt; in his work, “&lt;a href="http://en.wikipedia.org/wiki/Nicomachean_Ethics"&gt;Nicomachean Ethics&lt;/a&gt;”.&lt;br /&gt;&lt;br /&gt;According to the &lt;a href="http://news.bbc.co.uk/today/hi/today/newsid_7697000/7697762.stm"&gt;Radio 4 interview&lt;/a&gt; I heard with Bok he became fascinated by the work done by some French poets in the 1960’s who applied mathematical rules to linguistics to experiment with language. What Bok has done is truly amazing and has some suprising results: he has created a book with five chapters. Each chapter is named after a vowel, for example “Chapter A”, “Chapter E”  et cetera, and for each chapter has only used words which contain that one vowel! So for example, Chapter I, only has words in which the only vowel in each word, is I.&lt;br /&gt;&lt;br /&gt;The BBC on the aforementioned interview has published some snippets from the book, this is an interesting one from Chapter O:&lt;br /&gt;&lt;br /&gt;“&lt;span style="font-style:italic;"&gt;Loops on bold fonts now form lots of words for books. Books form cocoons of comfort - tombs to hold bookworms. Profs from Oxford show frosh who do post-docs how to gloss works of Wordsworth. Dons who work for proctors or provosts do not fob off school to work on crosswords, nor do dons go off to dorm rooms to loll on cots. Dons go crosstown to look for bookshops known to stock lots of top-notch goods: cookbooks, workbooks - room on room of how-to-books for jocks (how to jog, how to box), books on pro sports: golf or polo. Old colophons on schoolbooks from schoolrooms sport two sorts of logo: oblong whorls, rococo scrolls - both on worn morocco.&lt;/span&gt;”&lt;br /&gt;&lt;br /&gt;Bok took seven years over his project. He had to read the dictionary seven times in order to firstly catalogue all of the words in English which only contain one vowel. He then divided them into five categories of each vowel. For each category he then split them into grammatical types, such as vowels, adjectives etc etc. Finally he broke them down into subject areas in order to apply semantics to each chapter.&lt;br /&gt;&lt;br /&gt;Why? Why did he do all of this? Well, firstly, I think it was to prove that he could and it has certainly got me thinking &amp; talking about it. I also think he did it to see if the seemingly impossible is possible; to see if you can apply strict syntactical rules to writing on top of the rules bound by grammar and still achieve semantically rich prose. From the snippets I’ve seen it appears that he has certainly achieved his goal. Will I read it? Probably not, but will anyone read the code I write to prove I can do something probably not. Sometimes you just do things to see if you can and to get the cogs turning in your head. And for that I applaud him for his efforts. Great stuff!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-194342100076551049?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/194342100076551049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=194342100076551049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/194342100076551049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/194342100076551049'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/10/beautiful-thinking.html' title='Beautiful Thinking'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-2929528402668800564</id><published>2008-10-28T08:13:00.003Z</published><updated>2008-10-28T08:16:39.270Z</updated><title type='text'>The Nerd Handbook</title><content type='html'>&lt;a href="http://www.randsinrepose.com/archives/2007/11/11/the_nerd_handbook.html"&gt;This&lt;/a&gt; is the best ever description of what goes on in my head. I don't like calling myself a nerd, but, bloody hell I soooo fit this hilarious description. Any nerds out there - pass this onto your partners so give them some insight into what does on upstairs... Great Stuff!! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-2929528402668800564?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/2929528402668800564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=2929528402668800564' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/2929528402668800564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/2929528402668800564'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/10/nerd-handbook.html' title='The Nerd Handbook'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-3101053139452608800</id><published>2008-10-16T21:16:00.005Z</published><updated>2008-11-01T08:04:30.810Z</updated><title type='text'>Introducing my new sister blog, Virtual Lodge</title><content type='html'>Further to&lt;a href="http://pragmaticintegration.blogspot.com/2008/10/lodge-number-one-north-pole.html"&gt; my last post&lt;/a&gt; and following months of deliberation, I've decided that I now wish to blog on another passion and interest of mine.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I pondered for a brief while on writing &lt;a href="http://pragmaticintegration.blogspot.com/2008/10/lodge-number-one-north-pole.html"&gt;"Lodge Number One, The North Pole",&lt;/a&gt; on my &lt;a href="http://pragmaticintegration.blogspot.com/"&gt;Pragmatic Interation&lt;/a&gt; blog and eventually decided, what the hell; my blog is about what is on my mind and not what the blog is about!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, this doesn't sit well with me and mixes concerns in my head. To this end, I'd like to focus some of my attention on what is, after all, a major part of my life, in a seperate blog. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just because I have a passion for software doesn't mean I can't share this with my other interests. That said, I do feel this deserves a seperate blog with a different focus.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've always headlined this blog with the famous &lt;a href="http://en.wikipedia.org/wiki/Charles_Kingsley"&gt;Charles Kinglsey&lt;/a&gt; quote, "&lt;span class="Apple-style-span" style="font-style: italic;"&gt;We act as though comfort and luxury were the chief requirements of life, when all that we need to make us happy is something to be enthusiastic about&lt;/span&gt;". And that still stands, for me personally, about my enthusiasm for software. However another enthusiasm of mine is &lt;a href="http://en.wikipedia.org/wiki/Freemasonry"&gt;Freemasonry &lt;/a&gt;and I'd like to give this some of my attention.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Freemasonry teaches us that you should put your family first, your job and/or business second and your Freemasonry a distant third.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To this end I still remain dedicated to my wonderful girlfriend, my loving family, my group of friends and my crazy little &lt;a href="http://www.facebook.com/album.php?aid=65170&amp;id=559982852"&gt;Springer Spaniel&lt;/a&gt;! My passions for Java/SOA/Integration and software in general, remain steadfast. But a new passion has entered my life and that is Freemasonry. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I do truly admire my friends, like &lt;a href="http://www.virtualchaos.co.uk/blog/"&gt;Nad&lt;/a&gt;, &lt;a href="http://dynamicorange.com/"&gt;Rob &lt;/a&gt;and &lt;a href="http://trafficlightmusings.blogspot.com/"&gt;Sarah &lt;/a&gt;and countless others over at &lt;a href="http://talisians.com/"&gt;Talisians &lt;/a&gt;who can maintain generic blogs to explore their thoughts and everything which comes in their direction. However I think my mind is organised differently, and for the moment, I'd like to seperate the concerns in my head and maintain seperate blogs, and for that I make no apology. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It is for this reason I've also started a sister (Brother? ;-) ) blog called &lt;a href="http://virtuallodge.blogspot.com/"&gt;Virtual Lodge&lt;/a&gt;. I think I'll let it explain it itself, but I have no plans to decomission Pragmatic Integration as I still retain the same zeal that I did when I created it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It is still in it's infancy. I'm not happy with the template at the moment and my head is bursting with ideas for posts. But if you are interested in following it, the feed is &lt;a href="http://virtuallodge.blogspot.com/feeds/posts/default"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-3101053139452608800?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/3101053139452608800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=3101053139452608800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/3101053139452608800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/3101053139452608800'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/10/introducing-my-new-sister-blog-virtual.html' title='Introducing my new sister blog, Virtual Lodge'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-3044737379766521202</id><published>2008-10-16T08:03:00.002Z</published><updated>2008-10-16T08:11:54.799Z</updated><title type='text'>Lodge Number One, The North Pole</title><content type='html'>I love &lt;a href="http://www.thedigitalfreemason.com/index.php?option=com_content&amp;task=view&amp;id=101&amp;Itemid=30"&gt;this &lt;/a&gt;&lt;a href="http://www.warwickshirepgl.org.uk/"&gt;Masonic &lt;/a&gt;festive poem, which I'm hoping to perform at this years Christmas lunch at&lt;a href="http://www.mastermason.com/solihullmasonictemple/"&gt; my mother lodge (Vellum 5845)&lt;/a&gt;, should our &lt;a href="http://en.wikipedia.org/wiki/Worshipful_Master#Worshipful_Master"&gt;Worshipful Master &lt;/a&gt;afford me the privilege. &lt;br /&gt;&lt;br /&gt;I found it on one of my favourite Masonic sites, &lt;a href="http://www.thedigitalfreemason.com"&gt;The Digital Freemason&lt;/a&gt;. It was written by W Bro. Tofique Fatehi, of &lt;a href="http://en.wikipedia.org/wiki/Mumbai"&gt;Mumbai&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/India"&gt;India&lt;/a&gt;. I'm reproducing it here without permission:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;'Twas the Night before Christmas, and down at the&lt;br /&gt;lodge not a gavel was stirring, and in the hodge-podge.&lt;br /&gt;Of aprons and jewels and chairs East and West&lt;br /&gt;You could savour the silence, most gladly divest&lt;br /&gt;All metal and mineral, it mattered not,&lt;br /&gt;Since Christmas was nigh and the coals were still hot. &lt;br /&gt;&lt;br /&gt;In the hearth of your homeplace, all Masons abed,&lt;br /&gt;As visions of trestleboards danced in their head;&lt;br /&gt;When up on the roof there arose such a clatter&lt;br /&gt;Our Tyler jumped up to see what was the matter!&lt;br /&gt;He picked up his sword and ran fast to the door,&lt;br /&gt;Three knocks shook the panels - he wondered 'What for?'&lt;br /&gt;&lt;br /&gt;He answered the knocking with raps of his own,&lt;br /&gt;And once the door opened he saw, with a moan&lt;br /&gt;Of delight it was Santa, all jolly and red&lt;br /&gt;Except for one notable feature instead!&lt;br /&gt;Upon his large finger he wore what we knew&lt;br /&gt;Was compass and square on a background of blue!&lt;br /&gt;&lt;br /&gt;'Why Santa!' he shouted and lowered his blade,&lt;br /&gt;'I see you're a Mason!' the Tiler relayed.&lt;br /&gt;He looked toward the Master's most dignified chair&lt;br /&gt;And said, voice near trembling, 'Most Worshipful there&lt;br /&gt;Is a Gentleman properly clothed at the gate!'&lt;br /&gt;&lt;br /&gt;The Master replied, 'Let's allow him - but wait!&lt;br /&gt;You tell me a Gentleman, but I don't see&lt;br /&gt;His Apron beneath that red suit, can it be&lt;br /&gt;Our visitor hasn't been properly raised?&lt;br /&gt;Must we offer a test that is suitably phrased?&lt;br /&gt;&lt;br /&gt;'I do beg your pardon,' ol' Santa said quick&lt;br /&gt;As he pulled up his coat and displayed not a stick&lt;br /&gt;But a cane with engraving, two balls did appear&lt;br /&gt;And oh, what an apron, he wore and held dear!&lt;br /&gt;Adorned like the Master's, complete with a sign&lt;br /&gt;Of "Lodge Number One, the North Pole" on one line!&lt;br /&gt;&lt;br /&gt;"Now let this man enter," the Master declared,&lt;br /&gt;And once in the Lodge room, the Brethren all stared,&lt;br /&gt;For Santa was wearing a jewel not seen&lt;br /&gt;For many a century - there in between&lt;br /&gt;The fur of his coat and the splendid red collar&lt;br /&gt;Gleamed two golden reindeer that shone line a dollar!&lt;br /&gt;&lt;br /&gt;"It's Donner and Blitzen, who I must confess&lt;br /&gt;"Are actually images brought from the West&lt;br /&gt;By my Warden, a craftsman like none in the world!"&lt;br /&gt;And with a great laugh from his bag he unfurled&lt;br /&gt;An ear of fine corn, and some oil from the East,&lt;br /&gt;"My friend I have plenty, tonight we will feast&lt;br /&gt;&lt;br /&gt;On all that is good! We are Masons, kind sir!"&lt;br /&gt;A murmur went throughout the Lodge, quite a stir,&lt;br /&gt;As presents and promises flew from his sack!&lt;br /&gt;This Santa, a Mason, showed he had a knack&lt;br /&gt;For making this Christmas the best you could glean,&lt;br /&gt;And soon even Deacons were laughing, they'd seen&lt;br /&gt;&lt;br /&gt; On this very night only happiness reigned!&lt;br /&gt;This jolly Saint Nicholas quickly explained&lt;br /&gt;That only a Mason could be so inclined&lt;br /&gt;To make all kids happy, make all people find&lt;br /&gt;A Christmas so special, yes, Santa was right!&lt;br /&gt;Merry Christmas to all, and to all a good night!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-3044737379766521202?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/3044737379766521202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=3044737379766521202' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/3044737379766521202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/3044737379766521202'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/10/lodge-number-one-north-pole.html' title='Lodge Number One, The North Pole'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-5021185122666067347</id><published>2008-10-16T07:35:00.003Z</published><updated>2008-10-16T07:45:23.488Z</updated><title type='text'>What is meant by "Service" anyway?</title><content type='html'>I've not blogged anything for a while due to being a very busy boy... however I took the time to leave a &lt;a href="http://blogs.talis.com/panlibus/archives/2008/10/open-library-environment-project-is-soa-right.php#comment-21530"&gt;pretty large comment&lt;/a&gt; over on our &lt;a href="http://blogs.talis.com/panlibus/"&gt;Talis blog&lt;/a&gt; last week and think it would be worth repeating here as a general consideration on SOA:&lt;br /&gt;&lt;br /&gt;I think we need to be a bit clearer on what SOA is in relation to REST, SOAP and the rest of the WS-* stack.&lt;br /&gt;&lt;br /&gt;SOA is an architectural approach which embraces a number of industry best practices to solve high-level architectural problems. A lot is written about SOA but for me it embraces the key principles of componentised, reusable, loosely coupled and incrementally adoptable “business” services.&lt;br /&gt;&lt;br /&gt;None of these are new ideas but an umbrella term like SOA is beneficial as it gives us a reference point and something to work towards. SOA promises ubiquitous and seamless real-time interoperability between disparate systems in an organisation, delivering massive efficiency saving and end-user benefits.&lt;br /&gt;&lt;br /&gt;However, the adoption of a full SOA stack is enormously challenging for an organisation. I’ve found that the real challenge in implementing an SOA strategy in countless organisations is not a technical challenge but a cultural one. Why are systems in disparate and disconnected silos? Departments have emerged, grown, changed and implemented their own systems and business processes and systems independently of each other over many years and it will take more than some technical glue to get them to marry up.&lt;br /&gt;&lt;br /&gt;SOA is not the silver bullet which will address interdepartmental process and social integration – although it can certainly do the teccy stuff and implementation projects can begin to pragmatically address the business operation issues.&lt;br /&gt;&lt;br /&gt;I made a point of highlighting the word ‘business’ earlier, in “business services”. There is much confusion in the word “service” in the context of SOA and Web Services. For me the word service means different things in each of these areas:&lt;br /&gt;&lt;br /&gt;Service Oriented Architecture (SOA) – Service here refers to business services. Such as circulation, or cataloguing or stock management in the library world. This is not a technical service moreover a core operational activity.&lt;br /&gt;&lt;br /&gt;Web Services - Services here refers to technical services: these are a standards based, machine interfaces to glue systems together. Such as a web service to create a borrower/patron on an LMS/ILS. Web Services come in different flavours, such as XML-RPC, SOAP (WS-*), REST and others…&lt;br /&gt;&lt;br /&gt;It is an unfortunate coincidence that SOA and SOAP are such similar acronyms as they mean different things. SOAP – Simple Object Access Protocol is not SOA, although SOAP can certainly make SOA a reality – but so could REST.&lt;br /&gt;&lt;br /&gt;To this end you can implement SOA without Web Services; it is perfectly feasible to have a componentised, reusable, loosely coupled business services delivered over SIP2 for example. However the emergence of Web Services has enabled the industry to take interoperability outside of domain specific protocols to embrace a more widely adopted standards based (XML/HTTP) approach.&lt;br /&gt;&lt;br /&gt;To echo Richard’s comments: experience has taught us that REST web services (not BIG Web Services such as SOAP) provide a pragmatic and sensible way to address the technical issues and allow us to concentrate on the real challenge of integration and SOA adoption - that of tackling the reasons the systems are in silos in the first place.&lt;br /&gt;&lt;br /&gt;As the Technical Lead for &lt;a href="http://www.talis.com/integration/"&gt;Talis Keystone&lt;/a&gt; I am too excited by the &lt;a href="http://oleproject.org/"&gt;Open Library Environment&lt;/a&gt; initiative and second &lt;a href="http://librarygang.talis.com/"&gt;Richard’s&lt;/a&gt; offer to share our experiences in this fascinating area…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-5021185122666067347?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/5021185122666067347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=5021185122666067347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/5021185122666067347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/5021185122666067347'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/10/what-is-meant-by-service-anyway.html' title='What is meant by &quot;Service&quot; anyway?'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-1095442955681086331</id><published>2008-05-15T08:30:00.008Z</published><updated>2008-12-09T01:57:08.571Z</updated><title type='text'>Lisa on library standards</title><content type='html'>&lt;div align="left"&gt;Found a great Simpsons quote over on &lt;a href="http://www.daveyp.com/blog/"&gt;Dave's blog&lt;/a&gt;:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;em&gt;"My family never talks about library standards. And every time I try to steer the conversation that way, they make me feel like a nerd."&lt;/em&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.snpp.com/episodes/AABF18" target="_new"&gt;&lt;img id="BLOGGER_PHOTO_ID_5200520120702762834" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_dIbvca6pOq8/SCv1fwnCf1I/AAAAAAAAAhI/oy1QSNw36Vc/s320/lisa.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div align="left"&gt;...I feel your pain Lisa ;-)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-1095442955681086331?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/1095442955681086331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=1095442955681086331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/1095442955681086331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/1095442955681086331'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/05/lisa-on-library-standards.html' title='Lisa on library standards'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dIbvca6pOq8/SCv1fwnCf1I/AAAAAAAAAhI/oy1QSNw36Vc/s72-c/lisa.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-4674409106908171647</id><published>2008-04-25T11:33:00.001Z</published><updated>2008-04-25T11:34:47.685Z</updated><title type='text'>Why it's better to live life backwards</title><content type='html'>A friend sent me these wise words from &lt;a href="http://en.wikipedia.org/wiki/Woody_Allen"&gt;Woody Allen&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;em&gt;"In my next life I want to live my life backwards. You start out dead and get that out of the way. Then you wake up in an old people's home feeling better every day. You get kicked out for being too healthy, go collect your pension, and then when you start work, you get a gold watch and a party on your first day. You work for 40 years until you're young enough to enjoy your retirement. You party, drink alcohol, and are generally promiscuous, then you are ready for high school. You then go to primary school, you become a kid, you play. You have no responsibilities, you become a baby until you are born. And then you spend your last 9 months floating in luxurious spa-like conditions with central heating and room service on tap, larger quarters every day and then Voila! You finish off as an orgasm. I rest my case."&lt;/em&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-4674409106908171647?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/4674409106908171647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=4674409106908171647' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/4674409106908171647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/4674409106908171647'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/04/why-its-better-to-live-life-backwards.html' title='Why it&apos;s better to live life backwards'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-6342926443789820500</id><published>2008-04-13T12:48:00.003Z</published><updated>2008-04-13T12:52:28.423Z</updated><title type='text'>Pondering on Object Orientation</title><content type='html'>The last few weeks I’ve been thinking on and off about Object Orientation and moreover when my head started to think in an OO way. I guess what has fuelled my ponderings on this is that on a few occasions I’ve overheard a friend of mine (who is an excellent Perl and UNIX script developer) referring to &lt;em&gt;writing programs&lt;/em&gt;; saying things such as “I’ll write a program which does…” and “I wrote a program to….” etc etc etc.&lt;br /&gt;&lt;br /&gt;I’m not saying anything about functional/procedural programming versus Object Orientation; they all have their place in the correct context for the problem that is being solved. However what got me thinking was the phrase “writing a program”. I can’t remember the last time I ever said this, when after all I am a developer and write lots and lots of code.&lt;br /&gt;&lt;br /&gt;At some point in the past I stopped referring to writing programs and not only am I sure when this was but moreover I’ve been wondering why I no longer think about writing programs anymore.&lt;br /&gt;&lt;br /&gt;I remember when I started in this game, teaching myself to code in my bedroom when I was a young teenager with my first ‘286’, an MS-DOS operating system and this magical tool called QBASIC. There was a simple game which constituted of a gorilla throwing bananas over buildings and you had to adjust the trajectory and force of the throw in order to get the banana over the taller building and ‘bomb’ the buildings at the other end – great fun in those days! Anyway ,I was intrigued by this mysterious code which I found and was behind the game - so I started tinkering, modifying bits and bobs to see what happened and before I knew it I’d bought a QBASIC book and I was off on my own writing myself little programs to see what I could do. Fast forward a few years and I was off to &lt;a href="http://www.aber.ac.uk/"&gt;university &lt;/a&gt;to read &lt;a href="http://www.aber.ac.uk/en/prospectus/courses/compsci-bs.php"&gt;Computer Science&lt;/a&gt;. We learnt programming in the first couple of years using Ada 95 as the programming language and I also did a small snippet of C in my second year. In my year out I was writing programs for the IMB mainframe in a couple of obscure functional languages no-one has ever heard of, but I guess they were similar to COBOL. When I started my third and final year of my degree in 1999 I was introduced to this concept of Object Orientation and was taught to program in Java. I remember my lectures saying that Object Orientation would be difficult because you had to think differently; I didn’t quite understand this to be honest and but just ploughed on anyway and learnt as much as I could to pass my exams. Following uni I went off and became a Junior Java Developer and I’ve never looked back…&lt;br /&gt;&lt;br /&gt;So, at some point in the last 8 years I’ve stopped writing programs because what I think has happened is this concept of ‘thinking differently’ my lectures referred to slowly happened intrinsically and not explicitly as I’ve grown and continue to grow as an Object Oriented developer.&lt;br /&gt;&lt;br /&gt;So to draw a conclusion to this, over the last few weeks I’ve been thinking about what my friend says and I’ve tried to articulate why I no longer think about writing programs and this is the best and simplest reason I can think of:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;In Object Orientation you don’t write programs with functions, you write classes with behaviour. &lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;When you start thinking about behaviour rather than functionality I think this is when your brain starts to stop thinking about writing programs and you start to look at solving problems in an entirely different way. My lecturer was correct when he said you had to think differently when you started learning about OO, I’m just not sure when it happened….&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-6342926443789820500?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/6342926443789820500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=6342926443789820500' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6342926443789820500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6342926443789820500'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/04/pondering-on-object-orientation.html' title='Pondering on Object Orientation'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-633544341738966603</id><published>2008-02-13T14:12:00.006Z</published><updated>2008-02-14T16:56:09.890Z</updated><title type='text'>Cool 10 minute RDFa primer</title><content type='html'>I spotted this neat video over on &lt;a href="http://www.virtualchaos.co.uk/blog/2008/02/03/rdfa-basics/"&gt;my mate Nadeem's blog&lt;/a&gt;. Well worth a look:&lt;br /&gt;&lt;div style="TEXT-ALIGN: center"&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-25059187905c9409" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v16.nonxt3.googlevideo.com/videoplayback?id%3D25059187905c9409%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331706318%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D292528C43BC4CBAC7DB0866B1D6ACC213ACB923C.5B27AAE3A66A9D24AD739F0BEE6062089233D424%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D25059187905c9409%26offsetms%3D5000%26itag%3Dw160%26sigh%3D-_bekSmybYs0kiooz1TsuywZAlI&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v16.nonxt3.googlevideo.com/videoplayback?id%3D25059187905c9409%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331706318%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D292528C43BC4CBAC7DB0866B1D6ACC213ACB923C.5B27AAE3A66A9D24AD739F0BEE6062089233D424%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D25059187905c9409%26offsetms%3D5000%26itag%3Dw160%26sigh%3D-_bekSmybYs0kiooz1TsuywZAlI&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;div style="TEXT-ALIGN: left"&gt;&lt;br /&gt;Like Nadeem says, lots of the examples use &lt;a href="http://www.foaf-project.org/"&gt;FOAF&lt;/a&gt;...! &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-633544341738966603?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=25059187905c9409&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/633544341738966603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=633544341738966603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/633544341738966603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/633544341738966603'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/02/cool-10-minute-rdfa-primer_13.html' title='Cool 10 minute RDFa primer'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-3523584570104071551</id><published>2008-02-01T08:24:00.000Z</published><updated>2008-02-01T08:43:07.357Z</updated><title type='text'>Congratulations to Chal!!</title><content type='html'>I'd like to express my warm congratulations to my old buddy Chal, who has won the &lt;a href="http://www.intellij.net/forums/thread.jspa?threadID=272646&amp;tstart=0"&gt;Team Leader's Choice prize on the IntelliJ Plugin Contest&lt;/a&gt; for his &lt;a href="http://plugins.intellij.net/plugin/?id=1570"&gt;IntelliJad&lt;/a&gt; plugin which integrates the &lt;a href="http://www.kpdus.com/jad.html"&gt;JAD Java decompiler&lt;/a&gt; into the &lt;a href="http://www.jetbrains.com/idea"&gt;IntelliJ IDE&lt;/a&gt;. Well done mate, spend your winnings on &lt;a href="http://www.harrods.com/HarrodsStore/Product/ProductDetail.aspx?ProductID=000000000000001613"&gt;beer&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-3523584570104071551?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/3523584570104071551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=3523584570104071551' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/3523584570104071551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/3523584570104071551'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2008/02/congratulations-to-chal.html' title='Congratulations to Chal!!'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-6557557109761726019</id><published>2007-12-06T14:06:00.000Z</published><updated>2007-12-11T10:48:58.014Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring Batch'/><category scheme='http://www.blogger.com/atom/ns#' term='Java 6.0'/><title type='text'>Very excited about Spring Batch</title><content type='html'>I've been keeping an eye on &lt;a href="http://static.springframework.org/spring-batch/"&gt;Spring Batch&lt;/a&gt; now for a number of months. I'm so pleased that the &lt;a href="http://blog.interface21.com/main/author/rodj/"&gt;Rod Johnson &lt;/a&gt;and the other clever people over at &lt;a href="http://www.springsource.com/"&gt;Spring Source&lt;/a&gt; (formerly Inteface21) have addressed what is a common problem and one which isn't going to go away over night: Batch integration!&lt;br /&gt;&lt;br /&gt;I live in the lovely fluffy world of &lt;a href="http://en.wikipedia.org/wiki/Service-oriented_architecture"&gt;SOA&lt;/a&gt;, real-time integration, reusable &amp;amp; loosely coupled systems, &lt;a href="http://www.w3.org/"&gt;W3C&lt;/a&gt; standards etc etc. I'm a big fan of &lt;a href="http://tomayko.com/articles/2004/12/12/rest-to-my-wife"&gt;RESTful web services&lt;/a&gt; over the pain of BIG Web Services, like &lt;a href="http://www.w3.org/TR/soap/"&gt;SOAP&lt;/a&gt; and the rest of the messy &lt;a href="http://www.tbray.org/ongoing/When/200x/2004/04/01/WS-Mumble"&gt;WS-*&lt;/a&gt; stack. Over the last couple of years I have had the pleasure to be the Technical Lead on &lt;a href="http://www.talis.com/keystone/"&gt;our SOA platform&lt;/a&gt;; designed to be an integration platform and SOA for the library world.&lt;br /&gt;&lt;br /&gt;We craft sophisticated services and put a lot of thought and design into making the architecture completely loosely coupled from the underlying platform. Using design patterns based on the &lt;a href="http://en.wikipedia.org/wiki/Gang_of_Four_%28software%29"&gt;GOF&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Bridge_pattern"&gt;Bridge Pattern&lt;/a&gt; we separate all of our system concerns into components based on object behaviour and glue it all together using the awesome &lt;a href="http://www.springframework.org/"&gt;Spring Framework&lt;/a&gt;'s support for &lt;a href="http://martinfowler.com/articles/injection.html"&gt;dependency injection&lt;/a&gt;. Spring allows us to achieve sophisticated loose coupling - we enable developers to write 'adaptors' into their platform in the scripting language of their choice - Ruby, Perl, PHP etc- powered by Java 6.0's very groovy (pun intended ;-)) &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html"&gt;scripting engine&lt;/a&gt; and adherence to the awesome &lt;a href="http://www.jcp.org/en/jsr/detail?id=223"&gt;JSR-223&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;No matter how many &lt;a href="http://townx.org/blog/elliot/rest-semantics"&gt;excellent debates myself and the team have&lt;/a&gt; over whether HTTP PUT and POST are 'update' or 'create' operations in a &lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete"&gt;CRUD&lt;/a&gt; world of persistent storage, no matter how much we study &lt;a href="http://www.amazon.com/RESTful-Web-Services-Leonard-Richardson/dp/0596529260"&gt;RESTful best practice&lt;/a&gt;, (should we use the &lt;a href="http://www.webdav.org/specs/rfc2518.html#rfc.section.8.2.1"&gt;207 response code&lt;/a&gt;? Answers on a postcard please;-)) and no matter how effort we put into &lt;a href="http://agilemanifesto.org/"&gt;agile development&lt;/a&gt; best practices and &lt;a href="http://www.scrumalliance.org/"&gt;project management&lt;/a&gt; we still as a team have to face the reality that most of the worlds system still aren't ready for real-time interoperability.&lt;br /&gt;&lt;br /&gt;I remember when I first read about the &lt;a href="http://www.oreilly.com/catalog/javawebserv/"&gt;promise of web services&lt;/a&gt; back in early 2002 and became very excited about the possibilities of machines discovering other machines through directory services and consuming their services and so I jumped upon the Web Services bandwagon, absorbing myself in the world of SOAP and &lt;a href="http://www.w3.org/TR/wsdl"&gt;WSDL&lt;/a&gt; and tools like &lt;a href="http://ws.apache.org/axis"&gt;Apache Axis&lt;/a&gt;. Almost 6 years on I'm still building web services (although I'm a REST man these days) and I still don't have a use-case, or requirement or a story where a machine will automatically discover my services and work out how to use them via the service descriptor. In fact I have to face the reality that all of the good things myself and others are doing with SOA and software design and development best practices at the end of the day it's our customers who demand the interoperability requirements and whether this is an all singing, all dancing service discovery intelligent system, or a configured endpoint in a portal to the web service URI or a batch overnight processing job then this is what I have to deliver.&lt;br /&gt;&lt;br /&gt;However I'm not downtrodden about this. The title of this blog is "Pragmatic Integration" and if pragmatism dictates that the most appropriate architectural workflow to meet a customer need is an overnight batch run - and this makes them happy and this helps them to realise their expected benefits and ROI - then I'm damn well going to do it! And I'm going to do it with all the enthusiasm and passion I have when I'm talking with the team about getting the JVM to execute functions in Ruby or deciding whether the creation of the borrower record in the Library system manifests itself as a HTTP PUT or POST on the web service. Moreover, because 'batch' integration has become a dirty word with all of the sophisticated technology we have at our fingertips these days there is no way I am prepared to sacrifice quality of design and quality of development best practice just because batch isn't cool these days.&lt;br /&gt;&lt;br /&gt;I beg to differ - batch has become cool again with the launch of the Spring Batch framework. Why should your batch process which calls your sophisticated web services, based on the SOA platform you have put your heart and soul into creating, be just a crappy program with a crappy design, with no tests and just shoved into a CRON job to become someone poor system administrators' maintenance nightmare? Spring Batch will enable me to still do object oriented design in my batch process. I can still seperate systems concerns into behavioural components with loosely coupled dependencies. I can still do test driven development and reuse my components. Spring Batch uses the core Spring framework to allow me to glue the components together using dependency injection and also comes with a number of out of the box patterns to address the &lt;a href="http://static.springframework.org/spring-batch/batch-principles-guidelines.html"&gt;principles of batch processing&lt;/a&gt; - which I might add are certainly written by people who understand the reality of delivering software on the coal face and are not just heads-in-the-clouds thinking types!&lt;br /&gt;&lt;br /&gt;So a hearty well done to everyone at Spring Source for not only realising the pragmatic need for batch integration, but by tackling it head on with the confidence and skill we have come to expect from your teams. I can't wait to now get my hands dirty and start using it on my next project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-6557557109761726019?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/6557557109761726019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=6557557109761726019' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6557557109761726019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6557557109761726019'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2007/12/very-excited-about-spring-batch.html' title='Very excited about Spring Batch'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-3333577513751610806</id><published>2007-11-30T14:26:00.000Z</published><updated>2007-11-30T15:34:28.682Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ant'/><category scheme='http://www.blogger.com/atom/ns#' term='JAXB'/><category scheme='http://www.blogger.com/atom/ns#' term='Java 6.0'/><title type='text'>Moving JAXB 2.0 applications, built by Ant, to Java 6.0</title><content type='html'>I've just gone through the pain of migrating my J2EE application, which uses JAXB 2.0 over to Java 6.0 from Java 5.0. For a variety of reasons this is not a simple process so I thought I'd share my findings.&lt;br /&gt;&lt;br /&gt;A lot of how I cracked this came from putting my troubleshooting hat on, however &lt;a href="https://jaxb.dev.java.net/guide/Migrating_JAXB_2_0_applications_to_JavaSE_6.html"&gt;I must cite this post on the GlassFish site&lt;/a&gt; as it was a great starter for 10 for me. However I don't use GlassFish....&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step One&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Firstly, Java 6.0 now includes JAXB (which is great!) and so there is no longer any need to include the JAXB libraries in the classpath. So make sure you remove these from your build and runtime environments:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;jaxb-api.jar&lt;/li&gt;&lt;li&gt;jaxb-impl.jar&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you don't do this javac and java will throw a wobbly due to version incompatibility problems.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step Two&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Unfortunately, although the JAXB API and default implementation are now part of the core language, the JAXB XJC binding compiler/generator Ant task is not part of distribution. In the post mentioned above Sun do elude to having aspirations to shipping an Ant task, but at the time of writing, this had not happened.&lt;/p&gt;&lt;p&gt;In addition to this, if you do try to include jaxb-xjc-xxx.jar (available from the GlassFish project) and define the XJC2Task in your Ant build, on execution the task can't find required dependencies. If you add these then they conflict with the JAXB implementation in Java 6.0 as per step one - it all goes horribly wrong and you just wanna run away.&lt;/p&gt;&lt;p&gt;At this point I had two options: use the xjc.exe tool in $JAVA_HOME/bin which or write my own Ant task. I haven't got the time to do the latter and so I thought I'd figure out how to use xjc.exe and embed this in my Ant build using the handy &amp;lt;exec&amp;gt; task. Not the nicest solution, but he-ho... it works.&lt;/p&gt;&lt;p&gt;I have a couple of XJC targets in my build for a couple of separate concerns. I'll show here how they translated over from the XJC2Task to the xjc executable.&lt;/p&gt;&lt;p&gt;This first one generated java classes from JAXB bindings and XML Schema files located throughout a number of sub-directories:&lt;code&gt;&lt;/p&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt; &amp;lt;target name="generate-jaxb" depends="init"&amp;gt;&lt;br /&gt;  &amp;lt;xjc destdir="${src.generated.dir}" extension="true" removeoldoutput="true"&amp;gt;&lt;br /&gt;   &amp;lt;schema dir="${jaxb.schemas.dir}" includes="**/*.xsd" /&amp;gt;&lt;br /&gt;   &amp;lt;binding dir="${jaxb.bindings.dir}" includes="**/*.xjb" /&amp;gt;&lt;br /&gt;  &amp;lt;/xjc&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;After porting it over to xjc.exe it now looks like this:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt; &amp;lt;target name="generate-jaxb" depends="init"&amp;gt;&lt;br /&gt;   &amp;lt;exec executable="xjc"&amp;gt;&lt;br /&gt;     &amp;lt;arg value="-d"/&amp;gt;&lt;br /&gt;     &amp;lt;arg value="${src.generated.dir}"/&amp;gt;&lt;br /&gt;   &amp;lt;arg value="-b"/&amp;gt;&lt;br /&gt;   &amp;lt;arg value="${jaxb.bindings.dir}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${jaxb.schemas.dir}"/&amp;gt;&lt;br /&gt;   &amp;lt;/exec&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;One thing to note here, I tried using wildcards to perform a directory tree scan like in the Ant&lt;br /&gt;task but there is no need to do this with the xjc tool; just provide the root directory and it will traverse through the directories looking for the required xjc and xsd files. Nice :-D&lt;br /&gt;&lt;br /&gt;My second Ant task specified the binding and schema file and also a package. In Java 5.0, using the XJC Ant task, it looked like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt; &amp;lt;target name="generate-rest-services" depends="init" description="Generate Java&lt;br /&gt; bindings for REST Web Services"&amp;gt;&lt;br /&gt;  &amp;lt;xjc schema="${config.dir}/TalisSOA-RESTServices.xsd" package="com.talis.soa.WebServices.rest.config" destdir="${src.generated.dir}" /&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ant now with Java 6.0, using xjc.exe, it now looks like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt; &amp;lt;target name="generate-rest-services" depends="init" description="Generate Java bindings for REST Web Services"&amp;gt;&lt;br /&gt;    &amp;lt;exec executable="xjc"&amp;gt;&lt;br /&gt;      &amp;lt;arg value="-d"/&amp;gt;&lt;br /&gt;      &amp;lt;arg value="${src.generated.dir}"/&amp;gt;&lt;br /&gt;     &amp;lt;arg value="-p"/&amp;gt;&lt;br /&gt;     &amp;lt;arg value="com.talis.soa.WebServices.rest.config"/&amp;gt;&lt;br /&gt;      &amp;lt;arg value="${config.dir}/TalisSOA-RESTServices.xsd"/&amp;gt;&lt;br /&gt;    &amp;lt;/exec&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step Three&lt;/strong&gt;&lt;br /&gt;Now that I had the java binding classes being generated I started to run into compilation problems in my code. I use my own NamespacePrefixMapper in my application and this was failing to compile. After lots of Googling and head scratching I found that this class is now in a different package from the old reference implementation before JAXB was added to Java 6.0.&lt;br /&gt;&lt;br /&gt;In the old reference implementation NamespacePrefixMapper was defined in the package:&lt;br /&gt;&lt;br /&gt;com.sun.xml.bind.marshaller&lt;br /&gt;&lt;br /&gt;However in Java 6.0 it is now defined in the package:&lt;br /&gt;&lt;br /&gt;com.sun.xml.&lt;strong&gt;internal&lt;/strong&gt;.bind.marshaller&lt;br /&gt;&lt;br /&gt;Once I changed this my code finally compiled (in Eclipse - see Step Four).&lt;br /&gt;&lt;br /&gt;One other issue to note here, which won't be picked up by the compiler, is that the property passed to the JAXB marshaller has also changed to reflect this package name change. In Java 5.0 I was adding my custom NamespacePrefixMapper to the marshaller like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;Marshaller marshaller = jaxbContext.createMarshaller();&lt;br /&gt;if ( null != this.namespacePrefixMapper)&lt;br /&gt;{&lt;br /&gt; marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", this.namespacePrefixMapper); &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;But now, using Java 6.0, I had to change the property name so that the NamespacePrefixMapper is added like this:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;Marshaller marshaller = jaxbContext.createMarshaller();&lt;br /&gt;if ( null != this.namespacePrefixMapper)&lt;br /&gt;{&lt;br /&gt; marshaller.setProperty("com.sun.xml.&lt;strong&gt;internal&lt;/strong&gt;.bind.namespacePrefixMapper", this.namespacePrefixMapper); &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step Four&lt;/strong&gt;&lt;br /&gt;The last problem I encountered was that my Ant build was failing to find the 'new' class com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper. This was very odd as Eclipse was finding it perfectly but when I ran Ant from the command line (using Cygwin) the compiler was moaning at me again. After another round of head scratching I used Eclipse to locate where it thought the class was on the project classpath, and it found it in $JAVA_HOME\jre\lib\rt.jar. I though it was odd that Ant could not find rt.jar. I've never had this issue before on earlier versions of Java, and I've been consistent over the years with how I've got my Java development environment set up.&lt;br /&gt;&lt;br /&gt;Anyway, this *might* be an issue with my environment or it might be a gremlin in Java 6.0. To be honest I don't know, at after getting this far I didn't really care I just wanted to get my build working. To resolve this I did two things in my Ant build.&lt;br /&gt;&lt;br /&gt;Firstly, I added a new path attribute which defined the location of the JRE libraries, using the ${java.home} property available in Ant:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt; &amp;lt;path id="jre.libs" description="Java runtime libraries"&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${java.home}\lib" /&amp;gt;&lt;br /&gt; &amp;lt;/path&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Secondly I had to do two things to the javac task. Firstly add this path as a bootclasspathref and also instruct Ant to include the java runtime, using the includeJavaRuntime attribute flag. So now my javac task looks like this&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt; &amp;lt;javac bootclasspathref="jre.libs" includeJavaRuntime="yes" classpathref="third.party.libs" destdir="${build.classes.dir}" optimize="${java.compile.optimize}" debug="${java.compile.optimize}" deprecation="${java.compile.optimize}" includes="**/*.java"&amp;gt;&lt;br /&gt;   &amp;lt;src path="${src.generated.dir}" /&amp;gt;&lt;br /&gt;   &amp;lt;src path="${src.main.dir}" /&amp;gt;&lt;br /&gt;  &amp;lt;/javac&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Only when I added both of these did it work. I also tried setting fork="yes" but that made no difference what so ever.&lt;br /&gt;&lt;br /&gt;Once all of the above was done I was then able to build and deploy and test my code. Hope this helps someone out so that you don't have to waste a morning like I've just had to getting this to work....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-3333577513751610806?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/3333577513751610806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=3333577513751610806' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/3333577513751610806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/3333577513751610806'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2007/11/moving-jaxb-20-applications-built-by.html' title='Moving JAXB 2.0 applications, built by Ant, to Java 6.0'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-5401875018297069857</id><published>2007-06-18T14:55:00.000Z</published><updated>2008-12-09T01:57:08.732Z</updated><title type='text'>SCRUM Master</title><content type='html'>Back in March I was elevated to the status of &lt;a href="http://www.scrumalliance.org/CSM_description"&gt;Certified ScrumMaster&lt;/a&gt; following an excellent and very enjoyable two day course down in London by the &lt;a href="http://www.scrumalliance.org/"&gt;ScrumAlliance&lt;/a&gt; and run by the legendary &lt;a href="http://jeffsutherland.com/"&gt;Jeff Sutherland&lt;/a&gt;, one of the co-creators of Scrum.&lt;br /&gt;&lt;br /&gt;As a member of the ScrumAlliance I can now use the following logo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5077418537233324978" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_dIbvca6pOq8/RnadQh_Gm7I/AAAAAAAAAAY/LFoyVDazY2g/s320/SAlogosmall.jpg" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;And I have been given &lt;a href="http://www.scrumalliance.org/profiles/2324-andy-latham"&gt;my own personal profile on the ScrumAlliance web site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;During the course I had the pleasure of talking to Jeff about Scrum and how we are succefully implementing it at &lt;a href="http://www.talis.com/"&gt;Talis&lt;/a&gt;. During the conversation Jeff kindly agreed to do a podcast with me on behalf of Talis and as part of our &lt;a href="http://talk.talis.com/"&gt;Talking With Talis podcasts&lt;/a&gt;. The podcast can be found &lt;a href="http://talk.talis.com/archives/2007/04/jeff_sutherland.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Jeff also blogged about the podcast on his personal blog &lt;a href="http://jeffsutherland.com/scrum/2007/04/scrum-podcast-andy-lathams.html"&gt;here &lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-5401875018297069857?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/5401875018297069857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=5401875018297069857' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/5401875018297069857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/5401875018297069857'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2007/06/scrum-master.html' title='SCRUM Master'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dIbvca6pOq8/RnadQh_Gm7I/AAAAAAAAAAY/LFoyVDazY2g/s72-c/SAlogosmall.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-1584975994000227913</id><published>2007-06-06T01:46:00.000Z</published><updated>2007-06-17T17:33:20.359Z</updated><title type='text'>The pain of bad software: Vodafone</title><content type='html'>And the award for the most frustrating software in the world goes to: Vodafone!&lt;br /&gt;&lt;br /&gt;Earlier today my mobile phone decided to go for a swim in a glass of gin &amp; tonic. It's resting now, but I fear it may have gone to &lt;a href="http://www.urbandictionary.com/define.php?term=silicon+heaven"&gt;Silicon Heaven&lt;/a&gt;. This sporting event led to a situation:&lt;br /&gt;&lt;br /&gt;Mobileless, I had to find a way to text my beautiful girlfriend. Fortunately my dad had recently upgraded his handset with Vodafone and in return they let him keep his old handset with a pay-as-you-go/talk SIM: fully charged with a whole pounds worth of credit. Woooooo.....&lt;br /&gt;&lt;br /&gt;Ah, ha. So I had a plan; I'll text her with my dad's spare moby! So I sat and tapped away my romantic 'luv ltr' and hit send: BOOM ! FAILURE! Unfortunately, for me, my old man had taken advantage of his windfall and started dipping into the pound. Four pence left! Fair enough, free calls are free calls at the end of the day. Surely it's easy to top-up these pay-as-you-go bad-boys..... hmmmmmmm.&lt;br /&gt;&lt;br /&gt;Picture the moment: it's after eleven o' clock at night now, I've written the text, (over 400 characters of arthritis-is-defo-on-it's-way messaging) I just wanna send it before the hour becomes inappropriate. Crikey, I'm replying to a text she sent before going to bed - I just need to get it sent ASAP, I don't want to wake her but I want to say goodnight!&lt;br /&gt;&lt;br /&gt;I've had a mobile account since the beginning of mobile phone times; when mobiles climbed out of trees and stood up straight. I've had the same number that I agreed with Orange back in 1753 when I first took out my contract. Over the years I've moulded my contract to fit my usage and payment patterns; I'm happy and Orange are happy.&lt;br /&gt;&lt;br /&gt;This pay-as-you-go thing has never really been on my radar - hey, I'm a contract man! But what happens when you've been a contract man for ever and you suddenly realise that you don't have clue what goes on in Spar and Londis shops throughout the country every day?!?!?!? I needed to "pay-as-you-go"; I needed to top it up (?); I needed to text my girlfriend quickly and I'd only got 4p credit!&lt;br /&gt;&lt;br /&gt;Going against my intrinsic nature of "never read the manual", I...er... well, I read the manual. By doing this I broke two urban commandments : 'Men don't read directions/manuals/instructions" and moreover, "Computer Science engineers don't NEED directions/manuals/instructions" ... I just needed to beat the clock.... :-D&lt;br /&gt;&lt;br /&gt;I'd fortunately stored my text to "draft", so I had a certain amount of confidence the phone wouldn't delete my message, so I called 2345 on the handset: The magic number, the answer to my prayers, the proof Fermat really needed for his sums, hmm ....&lt;br /&gt;&lt;br /&gt;It's two thousand and seven, phone calls are answered by computers these days and we press 1 for "this", 2 for "that", 3 to be "cut off". It's an unfortunate delivery of service that as a society we've begun to accept. He ho. All I want to do is pay some money on the account of the phone so that I can send my text - surely Vodafone, as a business want my money? Apparently not.&lt;br /&gt;&lt;br /&gt;What follows is verbatim, as best as I can get it, from Vodafone 2345. All I want to do is put ten quid on this phone and text:&lt;br /&gt;&lt;br /&gt;Vodafone robot: "Welcome to Vodafone Pay As You Talk"&lt;br /&gt;&lt;br /&gt;Me: "Whatcha! How's it going?. OK- I'll just push numbers then...."&lt;br /&gt;&lt;br /&gt;Vodafone robot: "You have four pence credit, to top up press 1"&lt;br /&gt;&lt;br /&gt;Me: 1&lt;br /&gt;&lt;br /&gt;Vodafone robot: "To top up on a credit or debit card press 2"&lt;br /&gt;&lt;br /&gt;Me: 2&lt;br /&gt;&lt;br /&gt;Vodafone robot: Some Vodafone marketing shite. (Apparently VF are great. Hmm Well all I wanna do is text my girlfriend.)&lt;br /&gt;&lt;br /&gt;Vodafone robot: "To register a card press 2"&lt;br /&gt;&lt;br /&gt;Me: 2&lt;br /&gt;&lt;br /&gt;Vodafone robot: "This service is free. will put you though to one of out advisors" (praise the lord, not a real person surely?)&lt;br /&gt;&lt;br /&gt;Vodafone robot: Thanks for calling please disconnect&lt;br /&gt;&lt;br /&gt;And that was it. After 5 minutes of propaganda and menu options they cut me off. All I wanted to do was pay them money. Hoverer, I still haven't got my text sent, the clock is still ticking ... I don't give up that easily:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.vodafone.co.uk/"&gt;http://www.vodafone.co.uk/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The manual says it all. I can top up my mobile phone online. Groovy. To cut a long story short I went trough the registration process; entering my mobile number - getting messages sent through to my phone to activate an account, then finally I get to The Form! I'm almost there. The light is at the end of the tunnel. I'm expecting to be challenged for security information (I've checked the SSL certificate and that is fine). The form challenges me for the following piece of information: "4-digit security number chosen when you registered: ".&lt;br /&gt;&lt;br /&gt;Ahem: I was not asked to provide a security number when I registered.&lt;br /&gt;&lt;br /&gt;I can now no longer continue to register my phone without this mystery number, the first time I've been asked for it is the first time I've heard of it.&lt;br /&gt;&lt;br /&gt;Is this the kind of software we are expected to accept? Going though this pain myself and not texting my girlfriend in the end, has again shown me how shit software can affect our lives.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-1584975994000227913?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/1584975994000227913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=1584975994000227913' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/1584975994000227913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/1584975994000227913'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2007/06/pain-of-bad-software-vodafone.html' title='The pain of bad software: Vodafone'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-4461873233556039064</id><published>2007-06-04T11:15:00.000Z</published><updated>2007-06-04T11:16:42.932Z</updated><title type='text'>Pragmatic web services with REST</title><content type='html'>&lt;p&gt;The forward to the latest book to grace my bookshelf, "&lt;a href="http://www.oreilly.com/catalog/9780596529260/"&gt;RESTful Web Services&lt;/a&gt;", has the most eloquent and accurate statement I think I have ever read on the current state of (big) Web Services. It sums up perfectly, the complicated mess the whole WS-* stack has become:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"The world of web services has been on a fast track to supernova ever since the architect astronauts spotted another meme to rocket out of pragmatism and into the universe of enterprises. But, thankfully, all is not lost. A renaissance of HTTP appreciation is building and, under the banner of REST, shows a credible alternative to what the merchants of complexity are trying to ram down everyone's throats; a simple set of principles that every day developers can use to connect applications in a style native to the Web." &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;br /&gt;-David Heinemeier Hansson&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-4461873233556039064?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/4461873233556039064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=4461873233556039064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/4461873233556039064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/4461873233556039064'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2007/06/pragmatic-web-services-with-rest.html' title='Pragmatic web services with REST'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-7437865302028568350</id><published>2007-02-13T16:31:00.000Z</published><updated>2007-02-13T16:40:53.390Z</updated><title type='text'>Sprint 2 SCRUM retrospective</title><content type='html'>Having implemented all of the actions from &lt;a href="http://pragmaticintegration.blogspot.com/2007/01/first-scrum-sprint-retrospective.html"&gt;Sprint 1 retrospective &lt;/a&gt;we have completed out second sprint very successfully! So without further ado, actions speak louder than words, here is the email I sent the team confirming what we agreed during our Sprint 2 retrospective:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Hi All,&lt;br /&gt;&lt;br /&gt;Thanks again for yet another very productive end of sprint retrospective. I know I promised last time to vary the format a bit but I think it still went really well today and we identified a number of areas for improvement, which is very cool.&lt;br /&gt;&lt;br /&gt;So for the record this is what we committed to implement next sprint:&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- We need to be more formal about dropping stories from the Sprint and introducing new ones. &lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;- Doing this needs to be made explicit and the impact on the velocity and planned units of work need to be defined. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- I want to begin reporting units of work completed against the units of work planned, including percentage complete in my weekly senior management report. I also want to report the velocity and burn down each week. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- I need to be much stricter about sprint distractions. There was an occasion in the previous sprint where an account manager requested some work from Mo which was not planned for, I should have been more disciplined on not letting this happen. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- In the last sprint we each began to describe our morale at each daily scrum meeting. Everyone agrees this is a great thing and we will continue to do this. It's fun and just what you need at the beginning of the day to get into the swing of things with the rest of the team. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- Sarah and I noticed a communication gap between myself, her and Dan in the last sprint which resulted in me not being 100% sure what she was working on. We have agreed to address this next sprint. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- The backlog is not visible enough and does not appear to have any ownership. The backlog also needs expanding to include more information. Gerry will adjust the backlog document to this effect and I will ensure the backlog is made visible in weekly SMT reports and that we define an owner. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- Daily scrums are working well. they have been very regular this sprint. Developers have commented that they get a good awareness of the business space because of the updates in the scrum and also business team members have commented that they are taking in what the developers are doing. It has been commented that there is a good balance between chatting and friendly banter and actual work. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- Adam joined the team this sprint and his introduction to the team has been very smooth and he has settled in well to the team - probably coz he is bursting with enthusiasm. Nice one! &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- Scheduling end of sprint meetings (demo, retrospective) and next sprint planning meetings should be done at the beginning of the sprint. As more and more teams implement SCRUM it's becoming increasingly more difficult to get meeting rooms and key people to attend, so these need to be arranged way in advance. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- On story writing, we need to be much stricter about defining acceptance criteria for each story.&lt;br /&gt;- I am still failing to report my time back to central project office, we've agreed this will be captured informally at each daily scrum meeting. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- We will now physically move stories from 'not started' to 'in progress' to 'waiting acceptance' at the daily scrum meeting. I will commit to accepting (or not accepting stories) stories which are waiting acceptance by the next daily scrum meeting, where I will physically move them from 'waiting acceptance' to completed and we can, as a team, add the "actual" to the story. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- Stories should never be more than 5 units long. Any longer than this then they will need to be broken down. If this is not possible because, for example, an investigation is required, then a small story for scoping will be defined. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- If a story is time boxed then it's boundaries need clear definition and the owner needs to exercise self-discipline to the time boxing and scope of the task. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- Adam is getting a lot from sitting closely to Sarah and it very pleased to be exposed to the business side of the project and not just the technical. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- We shall create stories for non project tasks rather than just estimate their time out of the plans. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- As we are rapidly accelerating our development output we still need to pay attention to spiking for later sprints. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;- Mo and Adam are doing a lot of pair programming and now need to sit next to each other, so we need a seating shuffle.&lt;br /&gt;- We have agreed that Basecamp is becoming an administrative overhead because we are not using it for story tracking and that the stories as well as being visible on the project board are also recorded digitally in MS Project Server for time tracking. We are not going to use Basecamp for sprint 3 stories and see what the impact is. This decision will be reviewed at the sprint 3 retrospective meeting.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;So judging by the feedback from everyone and the demonstration this morning, even though we've identified quite a number of minor areas of improvement we've had a very successful sprint. Well done everybody!&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;&lt;br /&gt;-Andy&lt;br /&gt;&lt;br /&gt;Andy Latham&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Programme Manager,&lt;br /&gt;Talis Information Limited&lt;/em&gt;&lt;br /&gt;&lt;a title="http://www.talis.com/" href="http://www.talis.com"&gt;&lt;em&gt;www.talis.com&lt;/em&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-7437865302028568350?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/7437865302028568350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=7437865302028568350' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/7437865302028568350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/7437865302028568350'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2007/02/sprint-2-scrum-retrospective.html' title='Sprint 2 SCRUM retrospective'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-6103222733893784411</id><published>2007-01-12T14:29:00.000Z</published><updated>2007-01-12T14:44:25.122Z</updated><title type='text'>First SCRUM Sprint Retrospective</title><content type='html'>In celebration of the completion of my first ever SCRUM sprint I thought I'd share the outcomes of my team's first retrospective meeting.&lt;br /&gt;&lt;br /&gt;Retrospectives are vital in any Agile project and are an integral part of the SCRUM process. Retrospectives not only help the team evaluate the sprint by asking the two questions "What did we do well?" and "What could be improved in the next Sprint?" but I feel mark an end point/a goal/a target achieved....&lt;br /&gt;&lt;br /&gt;This is a fabulous morale boost and team building activity. The team can look back on what they have accomplished together and be open about how they can work even better. I remember "post-project-reviews" from my RUP days. In comparison to this they are a pile of crap - actions get filed in a drawer to be lost for ever and the teams disseminate onto new projects, with new people, new process and the same old mistakes....&lt;br /&gt;&lt;br /&gt;As Scrum Master I figured the best way to facilitate this was to be open and candid. I wanted the team to be as open an honest with me as I was prepared to be with them. If I'm messing up I want to know about it so I can do something about it. I started off by saying, "look, I know I've fucked up a few things; like not always running the daily scrum meetings and not knowing when everyone was on holiday before the sprint" - my honesty and informality helped the team to relax and talk openly about the sprint. As Scrum Master I'm not there to provide all of the answers, but just to help facilitate the meeting - it is up to the team as a whole to agree the actions for the next sprint. A retrospective without any actions is just a waste of time and energy.&lt;br /&gt;&lt;br /&gt;Here is the e-mail I sent the team following the retrospective:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Hi All,&lt;br /&gt;&lt;br /&gt;Thanks for the meeting today. I though it was very productive. For confirmation we've agreed the following actions to begin implementing next sprint&lt;br /&gt;&lt;br /&gt;- Story cards will have both an "estimate" and an "actual" box for everyone to record their time spent on the story. And Gerry can use this info for the velocity chart.&lt;br /&gt;&lt;br /&gt;- The project board is not being used due to it's location so we will order a new whiteboard to put next to Sarah desk to give everyone progress visibility.&lt;br /&gt;&lt;br /&gt;- The project board will have 4 categories: Not Started, In Progress, Waiting Acceptance and Completed. It is everyone's responsibility to move the story they are working on to the correct category. When a story is moved to "Waiting Acceptance" an actual time should be recorded on the card and in Basecamp. Sarah and I will agree which stories we will need to accept.&lt;br /&gt;&lt;br /&gt;- The velocity and burn down chart will also be made available at the project board.&lt;br /&gt;&lt;br /&gt;- We will have the daily scrum meeting at the project board and not in the kitchen.&lt;br /&gt;&lt;br /&gt;- In each daily scrum we will make it very clear which stories are in progress and which have been completed.&lt;br /&gt;&lt;br /&gt;- I will endeavour to make sure we have the scum on time every day.&lt;br /&gt;&lt;br /&gt;- I will endeavour to distribute the weekly management report to the team.&lt;br /&gt;&lt;br /&gt;- On story writing; timeboxing has been very useful for high level business analysis stories as it helps reduce scope-creep, so we will do more of this.&lt;br /&gt;&lt;br /&gt;- On communication in the daily scrum; we should always ask when we don't understand something, so if a technical concept is being discussed then it is the responsibility of the person who doesn't understand the technical content to ask for clarification. This also applies to business concepts which are not understood by technical team members.&lt;br /&gt;&lt;br /&gt;- All data, such as holidays etc needs to be known up front for the planning meeting. We will make all units of work clear at the beginning of the planning meeting.&lt;br /&gt;&lt;br /&gt;- And following each sprint we should all go out as a team to celebrate (even if it's just lunch) . Sarah is now self-appointed social secretary and will organise these.&lt;br /&gt;&lt;br /&gt;Hope I've covered everything. If not pls let me know. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Cheers, &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;-Andy&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I'm not saying that these actions are relevant to every SCRUM team. But they are relevant to my team and these are the action we decided upon together&lt;br /&gt;&lt;br /&gt;I'm currently halfway through the Sprint 2 planning meetings. We selected the product backlog this morning and we are about to begin the story writing, prioritisation and estimations. And already we are including the actions and the lessons learned from Sprint 1 that we identified in the retrospective. The team are engaged, relaxed and enthusiastic. I really can't wait for us to get stuck into Sprint 2.....!!&lt;br /&gt;&lt;br /&gt;I'll make sure in my next retrospective I'll vary things a little to stop it becoming stale, as Esther Derby recommends &lt;a href="http://www.scrumalliance.org/index.php/scrum_alliance/for_everyone/resources/weekly_column/weekly_column_3_27_2006"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And I'll also be sharing out our next set of actions....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-6103222733893784411?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/6103222733893784411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=6103222733893784411' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6103222733893784411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/6103222733893784411'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2007/01/first-scrum-sprint-retrospective.html' title='First SCRUM Sprint Retrospective'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-499414402302572562</id><published>2007-01-12T12:01:00.000Z</published><updated>2007-01-12T12:48:27.946Z</updated><title type='text'>My contribution to this five things fad</title><content type='html'>So &lt;a href="http://www.dynamicorange.com/blog/archives/internet-social-impact/five_things_abo.html"&gt;tagging your mates&lt;/a&gt; seems to be the order of the day, to say five things about yourself nobody knows and then pick on five mates to do the same thing. &lt;a href="http://www.dynamicorange.com/blog/archives/five_things.html"&gt;Rob &lt;/a&gt;tagged me - and all by buddies over at &lt;a href="http://talisians.com/"&gt;Talisians&lt;/a&gt; have been tagging each other so much I'm gonna struggle to find five blogging friends to tag. But anyhoo, here are five things you probably never knew about me:&lt;br /&gt;&lt;br /&gt;1) My party trick is to drink a pint of Guinness through a straw faster than someone necking it normally. But I've not done this in a while, so I'm a bit out of practice.&lt;br /&gt;2) I own a professional chef suit which I sometimes wear in the privacy of my own kitchen when cooking up a gastronomic feast.&lt;br /&gt;3) I was once approached by a director of porn films and asked to perform a leading role in one if his productions. Due to the folly of youth I enthusiastically agreed; only to discover it was a very elaborate practical joke my mates and an entire wedding party were playing on me. The director turned out to be my mate's uncle!&lt;br /&gt;4) I sometimes get pissed and dress up as Meat Loaf and sing his hits, much to the annoyance of my very understanding neighbours.&lt;br /&gt;5) Saving the best to last - my 'lame' to fame is: when I was a baby, Renato, from &lt;a href="http://www.youtube.com/watch?v=ScfZJuK_XUU"&gt;Renne and Renato &lt;/a&gt;used to keep my milk bottle warm in his spaghetti! Ask me if you wanna know why :-D&lt;br /&gt;&lt;br /&gt;And the five friends who I choose to continue the chain are:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://trafficlightmusings.blogspot.com/"&gt;Sarah&lt;/a&gt; - who's just started blogging&lt;br /&gt;&lt;a href="http://www.myspace.com/133324914"&gt;Frase&lt;/a&gt; - who is a 'spacer' (although he's nearly 30) ;-)&lt;br /&gt;&lt;a href="http://jessicaproject.blogspot.com/"&gt;Stu&lt;/a&gt; - who runs the Jessica project&lt;br /&gt;&lt;a href="http://wonderfulworldofmrc.blogspot.com/"&gt;Mr. C &lt;/a&gt;- Who has a wonderful world, apparently&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;I have no other blogging friends who haven't yet already been tagged. Maybe this is a good thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-499414402302572562?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/499414402302572562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=499414402302572562' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/499414402302572562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/499414402302572562'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2007/01/my-contribution-to-this-five-things-fad.html' title='My contribution to this five things fad'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-2794976874123707713</id><published>2007-01-11T18:35:00.000Z</published><updated>2007-01-11T18:36:43.587Z</updated><title type='text'>OpenId is gonna be the daddy of Identity Management on the Web</title><content type='html'>It looks as though &lt;a href="http://openid.net/"&gt;OpenId&lt;/a&gt; is rapidly becoming the daddy of user-centric digital identity. And for very good reasons.&lt;br /&gt;&lt;br /&gt;The concept is based on the fact that anyone can identify themselves as unique on the Web, in much the same way that websites are identified as unique and semantic web nodes in &lt;a href="http://www.w3.org/RDF/"&gt;RDF&lt;/a&gt; graphs are identified as unique: - through &lt;a href="http://en.wikipedia.org/wiki/Uniform_Resource_Identifier"&gt;URIs&lt;/a&gt; . So you can use your website or your blog as your identity on the Web. Cool or what?!&lt;br /&gt;&lt;br /&gt;With OpenId a users' digital identity is verified by anyone who supports the protocol. But what are the implications of this? Well, the more and more sites which support OpenId the less and less individuals have to create new online accounts and can use their individual OpenId account for more and more online transactions.&lt;br /&gt;&lt;br /&gt;Interestingly OpenId does not prescribe any authentication mechanism; empowering the identity holder to make their own informed trust decisions on the authentication process of the identity provider. It also empowers the identity provider to design their authentication mechanisms around the use-cases they are satisfying rather than forcing username and password challenges if these aren't really required, for example. Sensitive accounts which require more "security" can implement &lt;a href="http://en.wikipedia.org/wiki/Strong_authentication"&gt;strong authentication &lt;/a&gt;around an OpenId. So there are benefits for both application users and application providers. Everyone is a winner.&lt;br /&gt;&lt;br /&gt;So OpenId is really separating online identity from authentication. A fundamental separation of concerns and a pattern which will further enable the adoption of Web 2.0 applications and the promise of ubiquitous single sign-on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-2794976874123707713?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/2794976874123707713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=2794976874123707713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/2794976874123707713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/2794976874123707713'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2007/01/openid-is-gonna-be-daddy-of-identity.html' title='OpenId is gonna be the daddy of Identity Management on the Web'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-115468788327288914</id><published>2006-08-04T10:32:00.000Z</published><updated>2006-08-04T10:40:41.860Z</updated><title type='text'>Singletonitis extended</title><content type='html'>Further to &lt;a href="http://pragmaticintegration.blogspot.com/2006/02/singletonitis.html"&gt;my previous post on Singletonitis&lt;/a&gt;, this motivational poster just cracked me up....&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/3701/1619/1600/singleton-poster.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/3701/1619/320/singleton-poster.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-115468788327288914?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/115468788327288914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=115468788327288914' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/115468788327288914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/115468788327288914'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2006/08/singletonitis-extended.html' title='Singletonitis extended'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-115279986477258227</id><published>2006-07-13T14:05:00.001Z</published><updated>2006-08-04T10:32:14.336Z</updated><title type='text'>Namespaces for Code reuse</title><content type='html'>I've been thinking a lot lately about namespaces and moreover how by carefully designing namespaces in terms of describing the behaviour they represent can help to promote resuse. A common approach to namespace design is to include the product or project name in the namespace by default. This unfortunately often leads to code replication when working on another product or project.&lt;br /&gt;&lt;br /&gt;Imagine you were working for a company called LathamSoft and you were building a product called "SemWebManager" the traditional approach to the namespace design in this example would be do define it like this&lt;br /&gt;&lt;br /&gt;In Java:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;package com.lathamsoft.semwebmanager&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;In C#:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;namespace LathamSoft.SemWebManager&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And as part of this product, chances are you have some classes which deal with configuration management. So the likely namespace would be:&lt;br /&gt;&lt;br /&gt;Java:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;package com.lathamsoft.semwebmanager.configuration&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;or in C#:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;namespace LathamSoft.SemWebManager.Configuration&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In the next product or project you are working on you again will probably need configuration behaviour. As your new product is called "WizzBangOntology" you do not want to use classes from SemWebManager as they are maintained in a different code line and represent a different concern, because the namespace defines them as part of that product. But because you and your team know that these configuration classes are suitable these are coped into WizzBangOntology and repackaged as:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;package com.lathamsoft.wizzbangontology.configuration&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;or&lt;br /&gt;&lt;code&gt;&lt;pre&gt;namespace LathamSoft.WizzBangOntology.Configuration&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Et voilà you've code code replication, two code lines to maintain, two sets of bugs to fix etc etc. Basically the problems which exist in poorly designed legacy systems.&lt;br /&gt;&lt;br /&gt;However if the namespaces were designed better then it is possible to promote the creation reusable subcomponents and not couple them with a specific product or project implementation. So, for example, when writing the configuration classes as a subcomponent you might end up with a namespace which looks like&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;package com.lathamsoft.components.configuration&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;or&lt;br /&gt;&lt;code&gt;&lt;pre&gt;namespace LathamSoft.Components.Configuration&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Which can then be reused in SemWebManager and in WizzBangOntology. So in conclusion it is generally a good idea to never mention a product or project name in the code line and especially the namespaces (this is a marketing label anyway and will probably change over time) and design your namespaces in terms of behaviour - this the proper OO way of doing it......&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-115279986477258227?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/115279986477258227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=115279986477258227' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/115279986477258227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/115279986477258227'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2006/07/namespaces-for-code-reuse_13.html' title='Namespaces for Code reuse'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-115210118471527768</id><published>2006-07-05T12:05:00.000Z</published><updated>2006-07-05T12:07:32.990Z</updated><title type='text'>Date for your diaries: October 2006</title><content type='html'>&lt;a href="http://www.ftponline.com/special/javaart/technicalgeneralsession/default_pf.aspx"&gt;According to Sun&lt;/a&gt;, this is apparently when &lt;a href="http://java.sun.com/javase/6/"&gt;Mustang (Java 6)&lt;/a&gt; will be released. I've been reading about some of the &lt;a href="http://java.sun.com/developer/technicalArticles/J2SE/Desktop/mustang/beta2.html"&gt;new features in Mustang&lt;/a&gt; ahead of &lt;a href="http://download.java.net/jdk6/"&gt;downloading the beta 2 release&lt;/a&gt; to have a play with. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javase/downloads/index.jsp"&gt;Java 5.0&lt;/a&gt; saw some major core language enhancements, such as &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html"&gt;annotations&lt;/a&gt;, &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html"&gt;enums&lt;/a&gt;,&lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html"&gt;generics&lt;/a&gt; etc - in addition to lots of other cool stuff like &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html"&gt;JMX&lt;/a&gt;. Mustang is now building on top of this to add lots of groovy API features and tools such as &lt;a href="http://jcp.org/en/jsr/detail?id=199"&gt;programmatic access to the Javac compiler &lt;/a&gt;(For the &lt;em&gt;"inner geek"), &lt;/em&gt;an &lt;a href="http://developers.sun.com/prodtech/javadb/"&gt;all Java Database as part of the SDK&lt;/a&gt;, &lt;a href="http://www.onjava.com/pub/a/onjava/2006/04/26/mustang-meets-rhino-java-se-6-scripting.html"&gt;built in support for scripting&lt;/a&gt; and most importantly: &lt;a href="http://blogs.sun.com/roller/page/dannycoward/20060227"&gt;Web Services as part of the core language&lt;/a&gt; - Just like in the &lt;a href="http://msdn.microsoft.com/webservices/"&gt;.Net platform&lt;/a&gt;!!&lt;br /&gt;&lt;br /&gt;I'd encourage everyone to check out the new features and tools and download the beta release and have a play...&lt;br /&gt;&lt;br /&gt;Finally...the other date for the diary is mid 2008, which is when Sun are looking at releasing &lt;a href="https://dolphin.dev.java.net/"&gt;"Dolphin" - JSE 7&lt;/a&gt;...!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-115210118471527768?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/115210118471527768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=115210118471527768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/115210118471527768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/115210118471527768'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2006/07/date-for-your-diaries-october-2006.html' title='Date for your diaries: October 2006'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-114924724379358098</id><published>2006-06-02T11:17:00.000Z</published><updated>2006-06-02T11:20:43.806Z</updated><title type='text'>Axis2 – Performance Testing Round #1</title><content type='html'>&lt;a href="http://www.wso2.net/2006/05/axis2_performance_testing_round_1"&gt;This &lt;/a&gt;is an interesting performance comparison between Axis 1 and &lt;a href="http://blogs.cocoondev.org/dims/archives/004620.html"&gt;Axis 2&lt;/a&gt;. It look like a reasonable and fair test was done. It shows that there has been a &lt;strong&gt;4x-5x improvement in performance&lt;/strong&gt; from Axis 1 to Axis 2 which is very encouraging.&lt;br /&gt;&lt;br /&gt;The Java community are still harping on about &lt;a href="http://xfire.codehaus.org/"&gt;XFire &lt;/a&gt;and &lt;a href="http://www.jboss.com/products/jbossws"&gt;JBoss Web Services&lt;/a&gt;, but I'm still not convinced as &lt;a href="http://xfire.codehaus.org/Stack+Comparison"&gt;neither of them have embraced &lt;/a&gt;the blindingly obvious importance of REST - Axis 2 has REST support built in along-side the SOAP support as still looks to me to be the best Java WS tool which fits my requirements.&lt;br /&gt;&lt;br /&gt;On the performance comparison, I'd be very interested to see a performance comparison between Axis 2 and Net 2.0 as I understand XML generation and parsing was greatly improved here too...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-114924724379358098?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/114924724379358098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=114924724379358098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/114924724379358098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/114924724379358098'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2006/06/axis2-performance-testing-round-1.html' title='Axis2 – Performance Testing Round #1'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-114864996112671320</id><published>2006-05-26T13:18:00.000Z</published><updated>2006-06-06T14:13:50.260Z</updated><title type='text'>Don't say Web 2.0 or O'Reilly will take you to court...!</title><content type='html'>What has happened to the &lt;a href="http://www.oreilly.com/"&gt;O'Reilly&lt;/a&gt; that we all know and love....? Have they gone mad....?&lt;br /&gt;&lt;br /&gt;The Web 2.0 blogoshphere is &lt;a href="http://www.tomrafteryit.net/oreilly-trademarks-web-20-and-sets-lawyers-on-itcork"&gt;buzzing&lt;/a&gt; &lt;a href="http://blogs.talis.com/nodalities/2006/05/legal_insanity_in_web_20land.php"&gt;today&lt;/a&gt; after O'Reilly set it's lawyers on to &lt;a href="http://www.itcork.ie/"&gt;http://www.itcork.ie/&lt;/a&gt;, who are a non-for-profit IT professional networking organisation who are planning to to host the "&lt;a href="http://www.itcork.ie/index.cfm?page=events&amp;eventId=68"&gt;Web 2.0 Half Day Conference&lt;/a&gt;" for it's members.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photo_zoom.gne?id=153074441&amp;amp;size=l"&gt;This letter&lt;/a&gt;, sent by O'Reilly's lawyers claiming that they have applied to trademark the term "&lt;a href="http://en.wikipedia.org/wiki/Web_2"&gt;Web 2.0&lt;/a&gt;" says that the use of this term in the conference title is a "flagrant violation" of their trademark rights.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://radar.oreilly.com/archives/2006/05/controversy_about_our_web_20_s.html"&gt;The disappointing reply&lt;/a&gt; from O'Reilly, in &lt;a href="http://radar.oreilly.com/tim/"&gt;Tim's&lt;/a&gt; defence, does say that Tim is on holiday at the moment. I feel sorry for him, he probably thought, well, I've done enough now over these past few years, I'll pop to the Caribbean for a fortnight and chill out with a few glasses of rum and Red Stripe, secure in the knowledge that the people I've left in charge can take care of business whilst I'm gone.... WWWRRROOONNNGGG!&lt;br /&gt;&lt;br /&gt;This is a shame. O'Reilly really haven't done themselves any favours and in one misplaced letter have really damaged their once excellent reputation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-114864996112671320?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/114864996112671320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=114864996112671320' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/114864996112671320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/114864996112671320'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2006/05/dont-say-web-20-or-oreilly-will-take.html' title='Don&apos;t say Web 2.0 or O&apos;Reilly will take you to court...!'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-114838626858071082</id><published>2006-05-23T11:52:00.000Z</published><updated>2006-05-23T12:23:13.583Z</updated><title type='text'>Java 5 Enums</title><content type='html'>I was reading about Java 5 enums the other night and I realised that I'd only&lt;br /&gt;scratched the surface of what I knew about them. So far I've only defined&lt;br /&gt;simple enums with no behaviour. But it dawned on me that you can do some very&lt;br /&gt;groovy things with them. Consider the following (very basic) example.&lt;br /&gt;&lt;br /&gt;Say you are writing an application for a music school and you want to define the&lt;br /&gt;types of teachers who work at the school, you could do something like this:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;public enum MusicSchoolTeacherType {&lt;br /&gt;   VIOLIN_TEACHER,GUITAR_TEACHER,SAXOPHONE_TEACHER;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Now say each teacher will specialise in a specific genre (I'm assuming, one&lt;br /&gt;genre per teacher for this example). You could define genres like this:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;public enum MusicGenre {&lt;br /&gt;   CLASSICAL,ROCK,JAZZ;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;You would have to write some code somewhere which mapped the teacher type to the genre,&lt;br /&gt;which isn't ideal:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;public class MusicSchoolTeacherManager&lt;br /&gt;{&lt;br /&gt;   public static MusicGenre&lt;br /&gt;      getGenre(MusicSchoolTeacherType type){&lt;br /&gt;      MusicGenre genre = null;&lt;br /&gt;      switch(type)&lt;br /&gt;      {&lt;br /&gt;         case VIOLIN_TEACHER:&lt;br /&gt;            genre = MusicGenre.CLASSICAL;&lt;br /&gt;            break;&lt;br /&gt;         case GUITAR_TEACHER:&lt;br /&gt;            genre = MusicGenre.ROCK;&lt;br /&gt;            break;&lt;br /&gt;         case SAXOPHONE_TEACHER:&lt;br /&gt;            genre = MusicGenre.JAZZ;&lt;br /&gt;            break;&lt;br /&gt;         default:&lt;br /&gt;            throw new AssertionError("Invalid teacher type.");&lt;br /&gt;      }&lt;br /&gt;      return genre;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;So some client code wishing to find out the genre of a particular teacher type&lt;br /&gt;would have to do something like:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;MusicGenre genre =&lt;br /&gt;   MusicSchoolTeacherManager.getGenre(&lt;br /&gt;      MusicSchoolTeacherType.GUITAR_TEACHER);&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;This isn't ideal, the logic for defining the genre of the teacher type is the&lt;br /&gt;concern of the teacher type - it should know which genre it belongs in. As you can&lt;br /&gt;add behaviour to enums (as they are Objects) you can add this logic in a method:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;public enum MusicSchoolTeacherType {&lt;br /&gt;   VIOLIN_TEACHER,GUITAR_TEACHER,SAXOPHONE_TEACHER;&lt;br /&gt;&lt;br /&gt;   public MusicGenre getGenre()&lt;br /&gt;   {&lt;br /&gt;      MusicGenre genre = null;&lt;br /&gt;      switch(this)&lt;br /&gt;      {&lt;br /&gt;         case VIOLIN_TEACHER:&lt;br /&gt;            genre = MusicGenre.CLASSICAL;&lt;br /&gt;            break;&lt;br /&gt;         case GUITAR_TEACHER:&lt;br /&gt;            genre = MusicGenre.ROCK;&lt;br /&gt;            break;&lt;br /&gt;         case SAXOPHONE_TEACHER:&lt;br /&gt;            genre = MusicGenre.JAZZ;&lt;br /&gt;            break;&lt;br /&gt;         default:&lt;br /&gt;            throw new AssertionError("Invalid teacher type.");&lt;br /&gt;      }&lt;br /&gt;      return genre;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Going one step further, the case statement can be completely removed so that each&lt;br /&gt;teacher type is delegated the responsibility of working out which genre it belongs in.&lt;br /&gt;A way to do this is to make the getGenre() method abstract in the enum type and override&lt;br /&gt;it with a concrete method in each constant:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;public enum MusicSchoolTeacherType {&lt;br /&gt;   VIOLIN_TEACHER {&lt;br /&gt;      public MusicGenre getGenre()&lt;br /&gt;      {&lt;br /&gt;         return MusicGenre.CLASSICAL;&lt;br /&gt;      }&lt;br /&gt;   },&lt;br /&gt;&lt;br /&gt;   GUITAR_TEACHER {&lt;br /&gt;      public MusicGenre getGenre()&lt;br /&gt;      {&lt;br /&gt;         return MusicGenre.ROCK;&lt;br /&gt;      }&lt;br /&gt;   },&lt;br /&gt;&lt;br /&gt;   SAXOPHONE_TEACHER {&lt;br /&gt;      public MusicGenre getGenre()&lt;br /&gt;      {&lt;br /&gt;         return MusicGenre.JAZZ;&lt;br /&gt;      }&lt;br /&gt;   };&lt;br /&gt;&lt;br /&gt;   public &lt;strong&gt;abstract&lt;/strong&gt; MusicGenre getGenre();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;So all client code does now is to reference the abstract getGenre() method in the&lt;br /&gt;MusicSchoolTeacherType:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;MusicGenre genre =&lt;br /&gt;   MusicSchoolTeacherType.GUITAR_TEACHER.getGenre();&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Wicked!&lt;br /&gt;It is also important to note that all enum types extend the base class&lt;br /&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Enum.html"&gt;Enum&lt;/a&gt;. So you can&lt;br /&gt;begin to do some very interesting things with generics... but that is for another day....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-114838626858071082?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/114838626858071082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=114838626858071082' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/114838626858071082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/114838626858071082'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2006/05/java-5-enums.html' title='Java 5 Enums'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-114838498546429397</id><published>2006-05-23T11:48:00.000Z</published><updated>2006-05-23T11:49:45.473Z</updated><title type='text'>The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)</title><content type='html'>After over an hour scratching my head on a UTF-8 problem a few days ago, getting frustrated, I read &lt;a href="http://www.joelonsoftware.com/articles/Unicode.html"&gt;this excellent and very animated article from Joel Spolsky&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"So I have an announcement to make: if you are a programmer working in 2003 and you don't know the basics of characters, character sets, encodings, and Unicode, and I catch you, I'm going to punish you by making you peel onions for 6 months in a submarine. I swear I will."&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-114838498546429397?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/114838498546429397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=114838498546429397' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/114838498546429397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/114838498546429397'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2006/05/absolute-minimum-every-software.html' title='The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-114788011932841524</id><published>2006-05-17T15:29:00.000Z</published><updated>2006-05-25T10:16:20.153Z</updated><title type='text'>Jessica - exposing an RDF store through the Java Content Repository API</title><content type='html'>My mate Stu, who lives as a troglodyte in the dungeons of the &lt;a href="http://www.bbc.co.uk/"&gt;BBC&lt;/a&gt;, has just had his new Project &lt;a href="http://sourceforge.net/projects/jessica/"&gt;Jessica&lt;/a&gt; approved by &lt;a href="http://sourceforge.net"&gt;Sourceforge&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The project is concerned with implementing &lt;a href="http://www.jcp.org/en/jsr/detail?id=170"&gt;JSR 170&lt;/a&gt; (The Content Repository for Java) to expose an &lt;a href="http://www.w3.org/RDF/"&gt;RDF&lt;/a&gt; store's API's.&lt;br /&gt;&lt;br /&gt;The original point of JSR 170 is to standardise vendor-specific content management APIs. Jessica is concerned with doing this for RDF store APIs, so it will have an SPI layer, enabling it to sit on top of &lt;a href="http://jena.sourceforge.net/"&gt;Jena&lt;/a&gt;/&lt;a href="http://www.joseki.org/"&gt;Joseki&lt;/a&gt;, &lt;a href="http://www.angelite.nl/aquamarine/"&gt;Aquamarine&lt;/a&gt;, &lt;a href="http://aduna-software.com/products/technology/sesame/index.html"&gt;Sesame&lt;/a&gt; etc...&lt;br /&gt;&lt;br /&gt;The aim is to full implement JSR 170, sticking to the standard and not use the current reference implementation, which is &lt;a href="http://jackrabbit.apache.org/"&gt;Apache Jackrabbit&lt;/a&gt;. In addition Jessica will provide support for &lt;a href="http://www.w3.org/TR/rdf-sparql-query/"&gt;SPARQL&lt;/a&gt; through JSR 170's querying API.&lt;br /&gt;&lt;br /&gt;The project has just started and if Stu buys me a pint I might even give him a hand with it ;-). You can find out more from his &lt;a href="http://jessicaproject.blogspot.com/"&gt;Project Jessica blog&lt;/a&gt; and from the &lt;a href="http://jessica.sourceforge.net/"&gt;main project site&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://embed.technorati.com/embed/gbaib8jga.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-114788011932841524?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/114788011932841524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=114788011932841524' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/114788011932841524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/114788011932841524'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2006/05/jessica-exposing-rdf-store-through.html' title='Jessica - exposing an RDF store through the Java Content Repository API'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-114019391861338798</id><published>2006-02-17T16:29:00.000Z</published><updated>2006-02-17T16:31:58.633Z</updated><title type='text'>Singletonitis</title><content type='html'>I've pretty much concluded that the &lt;a href="http://en.wikipedia.org/wiki/Singleton_pattern"&gt;singleton &lt;/a&gt;is an evil &lt;a href="http://en.wikipedia.org/wiki/Software_antipatterns"&gt;antipattern &lt;/a&gt;and should be avoided at all costs. I think that because singletons are defined by the &lt;a href="http://en.wikipedia.org/wiki/GoF"&gt;GoF &lt;/a&gt;in the &lt;a href="http://www.amazon.com/gp/product/0201633612/sr=8-1/qid=1140193127/ref=pd_bbs_1/104-0764856-5643969?%5Fencoding=UTF8"&gt;industry bible&lt;/a&gt; that many people (myself included) have just gone off and used them without really thinking what the impact on the rest of the system. According to &lt;a href="http://www.google.co.uk/search?hl=en&amp;q=Singletonitis"&gt;various sources &lt;/a&gt;this overuse of the singleton pattern is referred to as Singletonitis.&lt;br /&gt;&lt;br /&gt;There are a many issues with singletons, however I feel the major problem is that they create far too many dependencies within a system. When more and more classes depend on a singleton you start to end up with&lt;a href="http://en.wikipedia.org/wiki/Spaghetti_code"&gt; spaghetti code &lt;/a&gt;which is hard to read, even harder to debug and pretty much impossible to unit test. As software engineers we need to be paying attention to our designs so that we achieve loosely coupled, testable and reusable components. Patterns such as &lt;a href="http://www.martinfowler.com/articles/injection.html"&gt;Inversion of Control&lt;/a&gt; and the containers which implement this provide excellent alternatives to the singleton.&lt;br /&gt;&lt;br /&gt;For a long time we have known that global variables are a bad idea. But after all what is a singleton? It is a glorified global variable. So next time you are in your comfort zone writing the classic &lt;span style="font-family:courier new;"&gt;&lt;strong&gt;getInstance()&lt;/strong&gt;&lt;/span&gt; method take a step back and consider your design more carefully and try to cure yourself from singletonitis...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-114019391861338798?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/114019391861338798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=114019391861338798' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/114019391861338798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/114019391861338798'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2006/02/singletonitis.html' title='Singletonitis'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-113871729636445102</id><published>2006-01-31T14:07:00.000Z</published><updated>2006-01-31T14:21:36.393Z</updated><title type='text'>Waterfall 2006</title><content type='html'>This is pure genius.... My colleagues &lt;a href="http://internetalchemy.org"&gt;Ian &lt;/a&gt;and &lt;a href="http://www.dynamicorange.com/blog/"&gt;Rob &lt;/a&gt;have pointed me in the direction of an excellent up and coming conference - &lt;a href="http://www.waterfall2006.com/"&gt;Waterfall 2006&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I really fancy the Kent Beck session on "&lt;a href="http://www.waterfall2006.com/beck.html"&gt;Document-Driven Documentation&lt;/a&gt;", Andy Hunt on "&lt;a href="http://www.waterfall2006.com/dogmatic.html"&gt;Job Security Through Obfuscation&lt;/a&gt;" and Lisa Crispin on "&lt;a href="http://www.waterfall2006.com/crispin.html"&gt;Testing: Saving the Best for Last&lt;/a&gt;".... brilliant!!&lt;br /&gt;&lt;br /&gt;:-D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-113871729636445102?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/113871729636445102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=113871729636445102' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/113871729636445102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/113871729636445102'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2006/01/waterfall-2006.html' title='Waterfall 2006'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-113837129503622193</id><published>2006-01-27T14:14:00.000Z</published><updated>2006-01-30T14:05:06.236Z</updated><title type='text'>The Nigella and Manuel guide to system integration</title><content type='html'>I’ve been using an analogy the last few months to explain how B2B system integration works with Web Services. I think it is useful and also necessary to use the language of Web Services, such as SOAP, WSDL etc even when addressing a non technical audience. The following analogy is a handy and fun tool for explaining the basic concepts of Web Services:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/3701/1619/1600/restaurant.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 132px; CURSOR: hand; HEIGHT: 105px" height="185" alt="" src="http://photos1.blogger.com/blogger/3701/1619/320/restaurant.jpg" width="132" border="0" /&gt;&lt;/a&gt; Imagine that you are hungry. You have a choice; you can either cook yourself something to eat or go out and buy something scrummy. Imagine you have decided to go to a restaurant. You consider the style of cuisine you fancy your company for the evening and make a decision on the restaurant.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/3701/1619/320/web-menu.jpg"&gt;&lt;img style="FLOAT: right; MARGIN: 0px 0px 10px 10px; WIDTH: 144px; CURSOR: hand; HEIGHT: 151px" height="214" alt="" src="http://photos1.blogger.com/blogger/3701/1619/320/web-menu.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;When you are at the restaurant the first thing you do is to take a look at the menu. The menu tells you what you can order, how much it costs, how you can order the meal – get a table number and go to the bar, flag down a waiter or go to the the Maccy D's counter. The menu will also tell you something about how you will receive your meal, hot or cold, with chop sticks or a steak knife etc etc...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/3701/1619/1600/manuel.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 94px; CURSOR: hand; HEIGHT: 97px" height="129" alt="" src="http://photos1.blogger.com/blogger/3701/1619/320/manuel.jpg" width="145" border="0" /&gt;&lt;/a&gt;When you have made your decision in this restaurant you call the waiter. From the decision you have made from reading the menu you tell the waiter everything you would like to eat. When you are done the waiter then takes your order to the kitchen.....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Your order is received by the kitchen and the chef takes your order and begins to create what you have asked for. Maybe you have asked for a rare steak or seasonal vegetables rather than a baked potato. All of this information is on the order received from the waiter and the chef creates exactly what you have asked for:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 168px; CURSOR: hand; HEIGHT: 182px; TEXT-ALIGN: center" height="210" alt="" src="http://photos1.blogger.com/blogger/3701/1619/320/NLawson3.jpg" width="169" border="0" /&gt; &lt;a href="http://photos1.blogger.com/blogger/3701/1619/320/manuel.jpg"&gt;&lt;img style="FLOAT: right; MARGIN: 0px 0px 10px 10px; WIDTH: 101px; CURSOR: hand; HEIGHT: 109px" height="315" alt="" src="http://photos1.blogger.com/blogger/3701/1619/320/manuel.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;When your food is ready the chef calls for service and the waiter appears in the kitchen. He takes the freshly prepared food from the kitchen and delivers it to your table. &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/3701/1619/1600/yum_food.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 141px; CURSOR: hand; HEIGHT: 101px" height="146" alt="" src="http://photos1.blogger.com/blogger/3701/1619/320/yum_food.jpg" width="239" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Finally, all you have to do is sit back and enjoy your meal....&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;So, what have I just done and what on earth does this have to do with Web Services and system integration?&lt;/p&gt;&lt;p&gt;I have used a service provided by a restaurant, using a standard process. Consider the steps taken:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Decide on restaurant&lt;/li&gt;&lt;li&gt;Look at menu&lt;/li&gt;&lt;li&gt;Request food from service provider&lt;/li&gt;&lt;li&gt;Waiter (service provider) goes on foot&lt;/li&gt;&lt;li&gt;Receive food from service provider&lt;/li&gt;&lt;li&gt;Consume food&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It is &lt;strong&gt;important&lt;/strong&gt; to note that the work done in the kitchen is not my concern. I do not need to know how the food is prepared and cooked. &lt;/p&gt;&lt;p&gt;The process of consuming a web service for the purposes of system integration is analogous to this.&lt;a href="http://photos1.blogger.com/blogger/3701/1619/1600/restaurant.jpg"&gt;&lt;img style="FLOAT: right; MARGIN: 0px 0px 10px 10px; WIDTH: 111px; CURSOR: hand; HEIGHT: 122px" height="243" alt="" src="http://photos1.blogger.com/blogger/3701/1619/1600/restaurant.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The first thing you do is choose the integration engine. This is the same as choosing a restaurant when you are hungry. You decide on the service provider. The application which is to be integrated is the same as you, the diner, going into the restaurant. The web service provider is the same as the restaurant.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://photos1.blogger.com/blogger/3701/1619/320/web-menu.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 206px; CURSOR: hand; HEIGHT: 249px" height="277" alt="" src="http://photos1.blogger.com/blogger/3701/1619/320/web-menu.jpg" border="0" /&gt;&lt;/a&gt;Web Services Descriptor - &lt;/strong&gt;The first thing you did when you entered the restaurant was to read the menu. The first step of system integration is to 'read' the web services descriptor of the integration provider. The web service provider will publish it's services via a &lt;a href="http://en.wikipedia.org/wiki/WSDL"&gt;WSDL&lt;/a&gt; file. The web services descriptor is analogous to the menu in the restaurant, it defines the interface to the web service; effectively telling the client what features are available from the service. The menu tells the client what food is available. In addition the web services descriptor 'tells' the client the way to request the service and also how to receive a response. It does this by defining the request message in &lt;a href="http://en.wikipedia.org/wiki/XML"&gt;XML &lt;/a&gt;and the response message in XML. A menu describes how to order food (call waiter, go to bar etc) and how to receive the food (at the table, at a counter etc).&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/3701/1619/1600/manuel.jpg"&gt;&lt;img style="FLOAT: right; MARGIN: 0px 0px 10px 10px; WIDTH: 122px; CURSOR: hand; HEIGHT: 140px" height="355" alt="" src="http://photos1.blogger.com/blogger/3701/1619/1600/manuel.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;SOAP Request - &lt;/strong&gt;The next thing you did in the restaurant was to tell the waiter your order and the waiter took your order to the kitchen. When a web services client has 'decided' what it would like to do with the service it creates and sends a &lt;a href="http://en.wikipedia.org/wiki/SOAP"&gt;SOAP &lt;/a&gt;request. The SOAP request is the equivalent of the waiter taking the slip of paper with your order written on it to the kitchen. The SOAP request is the digital order, defined in XML sent over the network to the service provider.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Request Processing - &lt;/strong&gt;The kitchen received your order and the chef began to prepare your meal. When a service provider receives your SOAP request it processes it. When you were sitting at your table waiting for your order you didn't need to know how the chef prepared and cooked your meal. In the same way, a client of a web service does not need to know how the service provider will process it's request. The logic and business process are a concern of the service provider, not the client. The skill of preparing and cooking a meal are not the concern of the diner, they are the concern of the chef.&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://photos1.blogger.com/blogger/3701/1619/320/NLawson3.jpg"&gt;&lt;img style="WIDTH: 153px; CURSOR: hand; HEIGHT: 192px" height="234" alt="" src="http://photos1.blogger.com/blogger/3701/1619/320/NLawson3.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://photos1.blogger.com/blogger/3701/1619/1600/manuel.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 100px; CURSOR: hand; HEIGHT: 109px" height="262" alt="" src="http://photos1.blogger.com/blogger/3701/1619/1600/manuel.jpg" border="0" /&gt;&lt;/a&gt;SOAP Response - &lt;/strong&gt;When your food has been cooked the waiter will bring your meal to your table. When a service provider has processed your SOAP request it will create a SOAP response and send this back over the network to the client. The SOAP response is the equivalent of the waiter bringing your cooked meal to your table. The SOAP response is the digital response to your order, defined in XML and sent over the network to the client.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Consume Response - &lt;/strong&gt;When your meal arrives at your table you tuck in and consume&lt;a href="http://photos1.blogger.com/blogger/3701/1619/1600/yum_food.jpg"&gt;&lt;img style="FLOAT: right; MARGIN: 0px 0px 10px 10px; WIDTH: 133px; CURSOR: hand; HEIGHT: 117px" height="172" alt="" src="http://photos1.blogger.com/blogger/3701/1619/1600/yum_food.jpg" border="0" /&gt;&lt;/a&gt; the food. When a client receives a SOAP response from a service provider it knows the format of the XML (as this was defined in the Web Services Descriptor). It extracts the information it needs from the response and uses it appropriately - it consumes the response. &lt;/p&gt;&lt;p&gt;Integration is complete.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-113837129503622193?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/113837129503622193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=113837129503622193' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/113837129503622193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/113837129503622193'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2006/01/nigella-and-manuel-guide-to-system.html' title='The Nigella and Manuel guide to system integration'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-113758915799609299</id><published>2006-01-18T12:58:00.000Z</published><updated>2006-01-18T12:59:18.006Z</updated><title type='text'>Refigerator Code</title><content type='html'>A great phrase, defined &lt;a href="http://www.butunclebob.com/ArticleS.BobKoss.RefrigeratorCode"&gt;here&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"...code that you’re so proud of that you want to take it home and hang it on the refrigerator, right alongside of your children’s drawings. I love it...."&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-113758915799609299?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/113758915799609299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=113758915799609299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/113758915799609299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/113758915799609299'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2006/01/refigerator-code.html' title='Refigerator Code'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-113708306598789268</id><published>2006-01-12T16:19:00.000Z</published><updated>2006-01-12T16:26:36.046Z</updated><title type='text'>Design Pattern: MBean registration management in a J2EE environment</title><content type='html'>&lt;strong&gt;Synopsis&lt;/strong&gt;&lt;br /&gt;This pattern addresses the problem of registering and unregistering MBeans with the MBean Server in a J2EE environment so that the application can guarantee that an MBean is available throughout the lifecycle of the servlet context.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Context&lt;br /&gt;&lt;/strong&gt;Consider the problem of registering and unregistering (registration management) an MBean with the MBean server. Where in your J2EE application logic should this be done? This pattern leverages from standard J2EE behaviour to guarantee an MBean will always be available to the application and separates the concerns of registering/unregistering an MBean with actually using the MBean during the application lifecycle.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Problem&lt;/strong&gt;&lt;br /&gt;When a piece of application logic requires use of an MBean, it is not the concern of this client logic to check the availability of the MBean or to create the MBean. The client logic is only concerned with consuming the features provided by the MBean. When client logic is forced to manage the MBean, it becomes coupled to extra creational logic. Moreover initialisation and synchronisation becomes an issue to all client logic.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Forces&lt;br /&gt;&lt;/strong&gt;Removing the MBean registration management from client logic and guarantying the availability of the MBean during the application lifecycle decouples the client logic from unnecessary creational logic.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Solution&lt;br /&gt;&lt;/strong&gt;Create the MBean and register it with the MBean Server in a Servlet Context Listener. Destroy the MBean and unregister it from the MBean Server in the same Servlet Context Listener. This approach moves the MBean registration management away from client logic and also guarantees that the MBean is available during the application lifecycle. When the servlet context starts up (context init) the MBean is created and registered; when the servlet context is removed (context destroy) the MBean is unregistered and destroyed.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Implementation&lt;br /&gt;&lt;/strong&gt;Follow the standard approach to defining a Servlet Context Listener and declaring it in the deployment descriptor. In the contextInitialized method create and register the MBean. In the contextDestroyed method unregister the MBean:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;public class RegisterDiagnosticsMBeanListener &lt;br /&gt;            implements ServletContextListener {&lt;br /&gt;  public void contextInitialized(ServletContextEvent ctxEvt) {&lt;br /&gt;    DiagnosticsMBean diagnosticsMbean = null;&lt;br /&gt;    MBeanServer mbserver = getMBeanServer();&lt;br /&gt;    diagnosticsMbean = new Diagnostics();&lt;br /&gt;    ObjectName objName = &lt;br /&gt;        new ObjectName(DiagnosticsMBean.OBJECT_NAME);&lt;br /&gt;    mbserver.registerMBean(diagnosticsMbean, objName);&lt;br /&gt;    //(Exception handling has been removed for clarity)&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void contextDestroyed(ServletContextEvent ctxEvt) {&lt;br /&gt;    MBeanServer mbserver = getMBeanServer();&lt;br /&gt;    ObjectName objName = &lt;br /&gt;        new ObjectName(DiagnosticsMBean.OBJECT_NAME);&lt;br /&gt;    mbserver.unregisterMBean(objName);&lt;br /&gt;    //(Exception handling has been removed for clarity)&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-113708306598789268?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/113708306598789268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=113708306598789268' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/113708306598789268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/113708306598789268'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2006/01/design-pattern-mbean-registration.html' title='Design Pattern: MBean registration management in a J2EE environment'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-113705935737372416</id><published>2006-01-12T09:31:00.000Z</published><updated>2006-01-12T09:51:40.933Z</updated><title type='text'>Using Ant to target different JDK's</title><content type='html'>For client side toolkits I need to support previous versions of Java; so I need to build the toolkit in different ways depending on the target environment as different libraries are required.&lt;br /&gt;&lt;br /&gt;This snippet of XML, for an Ant build script determines the JDK version and dynamically executes targets depending on which version it is.&lt;br /&gt;&lt;br /&gt;The usage here is&lt;strong&gt; ant doStuff&lt;/strong&gt; and by way of an example it just echo's out the JDK version...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; &amp;lt;target name="testJDK"&amp;gt;&lt;br /&gt;   &amp;lt;condition property="isJDK1.5"&amp;gt;&lt;br /&gt;      &amp;lt;and&amp;gt;&lt;br /&gt;        &amp;lt;equals arg1="${ant.java.version}" arg2="1.5"/&amp;gt;&lt;br /&gt;      &amp;lt;/and&amp;gt;&lt;br /&gt;    &amp;lt;/condition&amp;gt;&lt;br /&gt;    &amp;lt;condition property="isJDK1.4"&amp;gt;&lt;br /&gt;      &amp;lt;and&amp;gt;&lt;br /&gt;        &amp;lt;equals arg1="${ant.java.version}" arg2="1.4"/&amp;gt;&lt;br /&gt;      &amp;lt;/and&amp;gt;&lt;br /&gt;    &amp;lt;/condition&amp;gt;&lt;br /&gt;    &amp;lt;condition property="isJDK1.3"&amp;gt;&lt;br /&gt;      &amp;lt;and&amp;gt;&lt;br /&gt;        &amp;lt;equals arg1="${ant.java.version}" arg2="1.3"/&amp;gt;&lt;br /&gt;      &amp;lt;/and&amp;gt;&lt;br /&gt;    &amp;lt;/condition&amp;gt; &lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="doStuff" depends="testJDK"&amp;gt;&lt;br /&gt;  &amp;lt;antcall target="runJDK1.5"/&amp;gt;&lt;br /&gt;  &amp;lt;antcall target="runJDK1.4"/&amp;gt;&lt;br /&gt;  &amp;lt;antcall target="runJDK1.3"/&amp;gt; &lt;br /&gt; &amp;lt;/target&amp;gt; &lt;br /&gt;&lt;br /&gt; &amp;lt;target name="runJDK1.5" if="isJDK1.5"&amp;gt;&lt;br /&gt;  &amp;lt;echo&amp;gt;JDK 1.5&amp;lt;/echo&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;target name="runJDK1.4" if="isJDK1.4"&amp;gt;&lt;br /&gt;  &amp;lt;echo&amp;gt;JDK 1.4&amp;lt;/echo&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;target name="runJDK1.3" if="isJDK1.3"&amp;gt;&lt;br /&gt;  &amp;lt;echo&amp;gt;JDK 1.3&amp;lt;/echo&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt; &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-113705935737372416?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/113705935737372416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=113705935737372416' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/113705935737372416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/113705935737372416'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2006/01/using-ant-to-target-different-jdks.html' title='Using Ant to target different JDK&apos;s'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-113698823461883088</id><published>2006-01-11T14:00:00.000Z</published><updated>2006-01-12T09:12:27.853Z</updated><title type='text'>Motivation not punishment</title><content type='html'>I read a blog which was discussing build management (&lt;a href="http://jroller.com/page/rolsen?entry=never_hire_a_build_guy"&gt;Never Hire a Build Guy&lt;/a&gt;) and it was being suggested that developers hate doing builds. I don't contest this, I guess it is down to the individual, I actually rather enjoy doing them personally. However, one follow-up comment really shocked me. It is suggested that whoever broke the build last or the most has to do it the next time. I honesty find this attitude appalling.&lt;br /&gt;&lt;br /&gt;It is the responsibility of the person who broke the build to make sure they get it working again. Build management aside, whatever the problem, a competent engineer will learn from their mistake and move on. However, it is the subtext of the comment which concerns me:&lt;br /&gt;&lt;br /&gt;Assigning a task to an individual that they hate doing by way of punishment goes against the very ethos of software development. We are trying to build energetic, lively, friendly (but competitive) environments so that we can stimulate innovation and produce high quality solutions.&lt;br /&gt;&lt;br /&gt;As individuals there are naturally tasks we enjoy doing and tasks which we don't. Some of us love squeezing the last byte out of a compression algorithm, others like stressing a system to breaking point with simulated load injection, some of us get a kick out of designing public facing API's. Whatever our bag, we as mature industry professionals accept that at times we will need to work on something which isn't the most stimulating for us. However we are professionally compensated for this as we understand that we are adding real value to the project, to the team and ultimately to the overall solution which solves the problems faced by our users.&lt;br /&gt;&lt;br /&gt;Motivation is the key here and with lack of motivation in the development team the quality of the solution and ultimately the quality of the user experience will diminish. Assigning tasks by way of punishment will kill motivation and ultimately the solution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-113698823461883088?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/113698823461883088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=113698823461883088' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/113698823461883088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/113698823461883088'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2006/01/motivation-not-punishment.html' title='Motivation not punishment'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-112801621200552533</id><published>2005-09-29T17:47:00.000Z</published><updated>2005-09-29T17:51:34.503Z</updated><title type='text'>Send Face-Mail not Email</title><content type='html'>How much of our working lives do we spend glued to the Email...? In my opinion it is far too much time. I want to be getting stuck in the work that I love doing; designing and building software and actively engaging with my team members and colleagues.&lt;br /&gt;&lt;br /&gt;Email is a very useful tool and I don't dismiss it, all I am saying is that we too often use email when a face to face conversation would suffice - Send a Face-Mail!!&lt;br /&gt;&lt;br /&gt;In addition, all too often we spend our time reading long email threads which have very little relevance to us, the author has just cc'd as many people in as he can think of in order to engage one or two people. This is much like a fisherman casting out a huge net hoping to catch some tuna fish and ignoring all the other species he catches in the process. It is not until we have wasted 10 minutes reading the email that we have discovered that we could have just ignored it.&lt;br /&gt;&lt;br /&gt;A software development environment should be energetic and lively; there should be a buzz in the atmosphere and plenty of noise! One of the fundamentals of Agile development is communication and working together in pairs and groups - not sending emails to the person sitting next to you! Think of the time you are wasting writing an email, think of the other persons time who has to read it. A face to face conversation, around a computer or at a white board can be far more useful than an email. Not only are you actively engaging with your colleagues, getting to know them better, improving your working relationship and the general culture of your teams but more often then not you will exchange information with each other that you would never have considered in an email.&lt;br /&gt;&lt;br /&gt;So the next time you sit down to write an email, think to yourself, are all the people I'm sending this out to really the right group of people, or am I just cast net fishing? Moreover, think to yourself, am I physically able to get up out of my chair and walk to the person or people I'm writing this to and deliver my email via Face Mail!?!?!?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-112801621200552533?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/112801621200552533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=112801621200552533' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/112801621200552533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/112801621200552533'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2005/09/send-face-mail-not-email.html' title='Send Face-Mail not Email'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-112747076263741810</id><published>2005-09-23T10:16:00.000Z</published><updated>2005-09-23T10:58:28.763Z</updated><title type='text'>The Geek is gone</title><content type='html'>When most people think of a Software Developer or a Computer Programmer (whatever label you care to choose), what do you think they picture in their mind? Is it the age-old stereotype of the spotty nerd with pasty skin who lives on coffee and stays up for days on end learning how to speak Klingon? Or is it the old fashioned 9 to 5 Joe Bloggs who likes to sit on his own all day in his imaginary comfort 'cube', not talk or interact with anybody, do his 'thing' and go home at the same time every day. Then repeat the process until he reaches retirement age.....&lt;br /&gt;&lt;br /&gt;Well, they would be wrong. The world of Software Development has moved on from this. Software companies are not interested in arrogant nerds who get turned on by UNIX commands. Nor are they interested in the unenthusiastic plodders who do not want to contribute to the team or the working environment. Building software is all about passion and a hunger for building the best solutions and solving the most difficult problems as enthusiastic individuals and as highly motivated teams. The latter stereotype is probably more dangerous to software development because these people have become stale and lost inspiration - at least the sci-fi spod has retained an interest, albeit an unhealthy one.&lt;br /&gt;&lt;br /&gt;21st century Software Developers are talented, animated and intelligent people who work hard and play hard. We strive to be the best in a highly competitive world; we embrace change rather than reject it; we try to push the boundaries of innovation to challenge both the software industry and society. We even have romance in our lives - can you believe it?!?!?&lt;br /&gt;&lt;br /&gt;So, if you still have the image of the computer programming geek in your head then think again, they still exist in their caves as little pockets of resistance - but they are a dying breed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-112747076263741810?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/112747076263741810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=112747076263741810' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/112747076263741810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/112747076263741810'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2005/09/geek-is-gone.html' title='The Geek is gone'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-112721892954043432</id><published>2005-09-20T12:21:00.000Z</published><updated>2005-09-20T12:23:16.286Z</updated><title type='text'>Blogging, confidence and software development</title><content type='html'>&lt;p&gt;I thought I would begin my postings with some initial considerations I have on blogging and an interesting relationship I can personally see between blogging and software development. First of all, I am completely new to writing blogs and so I have taken some advice from my colleague &lt;a href="http://internetalchemy.org/"&gt;Ian Davis&lt;/a&gt;; who explained to me that "&lt;em&gt;The trick to blogging is to have self-belief&lt;/em&gt;".&lt;br /&gt;&lt;br /&gt;This reminded me of when I started my first role in IT as a Junior Programmer, during a gap year at university. How? Well, writing blogs means that you need to have the confidence to dump out your brain in public and expose your thoughts to everyone who reads them. The more you write, the easier it will become as your confidence grows.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;It is the same with writing software; when you are a Junior Programmer you are constantly aware that your more experienced peers will scrutinize every line of code you write and you feel under-valued because of your lack of experience. As your experience grows so does your confidence and after a period of time you start to become proud of your solutions; even if your peers would have approached the problem differently to you. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;We all have different minds, different ways of tackling problems and different techniques. It is for this reason that I personally try to give the developers on my team the room to be creative and not force my programming techniques upon them (unless they are doing something completely wrong of course). &lt;/p&gt;&lt;p&gt;&lt;br /&gt;Everyone has their own style and that should be encouraged.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-112721892954043432?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/112721892954043432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=112721892954043432' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/112721892954043432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/112721892954043432'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2005/09/blogging-confidence-and-software.html' title='Blogging, confidence and software development'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16924799.post-112721283406399201</id><published>2005-09-20T10:31:00.000Z</published><updated>2005-09-23T08:49:08.076Z</updated><title type='text'>Pragmatic Integration</title><content type='html'>I've decided to create this blog to share my thoughts and experiences on designing and developing quality integration solutions.&lt;br /&gt;&lt;br /&gt;In this blog I aim to discuss my current areas of influence and interest; Web 2.0, agile methodology, Web Services, J2EE and OO development and whatever else comes my way....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16924799-112721283406399201?l=pragmaticintegration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pragmaticintegration.blogspot.com/feeds/112721283406399201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16924799&amp;postID=112721283406399201' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/112721283406399201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16924799/posts/default/112721283406399201'/><link rel='alternate' type='text/html' href='http://pragmaticintegration.blogspot.com/2005/09/pragmatic-integration.html' title='Pragmatic Integration'/><author><name>Andy Latham</name><uri>http://www.blogger.com/profile/14004087326688252082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_dIbvca6pOq8/TDdaJYazVvI/AAAAAAAAA0M/Do227q_v0gs/S220/moi.jpg'/></author><thr:total>0</thr:total></entry></feed>
