<?xml version="1.0" encoding="utf-8"?>
			
			<rss version="2.0">
			<channel>
			<title>Lynch Consulting Blog - Java</title>
			<link>http://www.lynchconsulting.com.au/blog/index.cfm</link>
			<description>A blog about ColdFusion, PHP, Flash, Flex, Web Standards and a mish mash of other technologies</description>
			<language>en-us</language>
			<pubDate>Tue, 07 Sep 2010 13:35:55 --1000</pubDate>
			<lastBuildDate>Mon, 21 Dec 2009 21:12:00 --1000</lastBuildDate>
			<generator>BlogCFC</generator>
			<docs>http://blogs.law.harvard.edu/tech/rss</docs>
			<managingEditor>mark@lynchconsulting.com.au</managingEditor>
			<webMaster>mark@lynchconsulting.com.au</webMaster>
			
			
			
			
			
			<item>
				<title>Upcoming book review - Tomcat 6 Developer&apos;s Guide</title>
				<link>http://www.lynchconsulting.com.au/blog/index.cfm/2009/12/21/Upcoming-book-review--Tomcat-6-Developers-Guide</link>
				<description>
				
				&lt;a href=&quot;http://www.packtpub.com/tomcat-6-developers-guide/mid/211209mc5um2?utm_source=lynchconsulting.com.au&amp;utm_medium=affiliate&amp;utm_content=blog&amp;utm_campaign=mdb_001899&quot;&gt;&lt;img src=&quot;http://www.lynchconsulting.com.au/blog/enclosures/tomcat_6_developers_guide.jpg&quot; align=&quot;right&quot;&gt;&lt;/a&gt;

I&apos;ve just received a copy of the &lt;a href=&quot;http://www.packtpub.com/tomcat-6-developers-guide/mid/211209mc5um2?utm_source=lynchconsulting.com.au&amp;utm_medium=affiliate&amp;utm_content=blog&amp;utm_campaign=mdb_001899&quot;&gt;Tomcat 6 Developer&apos;s Guide&lt;/a&gt; from packt publishing to review.  

It&apos;s nice timing as I&apos;ve been working with Tomcat 6 a bit lately and in the new year plan to move some of our production systems over to running &lt;a href=&quot;http://www.getrailo.org&quot;&gt;Railo&lt;/a&gt; on top of &lt;a href=&quot;http://tomcat.apache.org/&quot;&gt;Tomcat&lt;/a&gt;.

After the extremely busy year Learnosity has had I&apos;m looking forward to reading a few books over the break and coming back in the New Year with lots more ideas and technology to implement.
				
				</description>
				
				<category>Systems admin</category>
				
				<category>Railo</category>
				
				<category>Open Source</category>
				
				<category>Java</category>
				
				<category>ColdFusion</category>
				
				<pubDate>Mon, 21 Dec 2009 21:12:00 --1000</pubDate>
				<guid>http://www.lynchconsulting.com.au/blog/index.cfm/2009/12/21/Upcoming-book-review--Tomcat-6-Developers-Guide</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>&quot;Show Full Columns&quot; problem with CFMX and MySQL solved</title>
				<link>http://www.lynchconsulting.com.au/blog/index.cfm/2008/6/1/Show-Full-Columns-problem-with-CFMX-and-MySQL-solved</link>
				<description>
				
				We&apos;ve been performing some load testing on a new website we&apos;ve developed and our helpful sysadmin noticed lots of queries happening on the DB that looked like this:

&lt;code&gt;
SHOW FULL COLUMNS FROM `dbname`.`tablename`
&lt;/code&gt;

We weren&apos;t intentionally doing these queries but they were coming from somewhere.  A bit of detective work via google found &lt;a href=&quot;http://whirlpool.net.au/blog/5 &quot;&gt; a very enlightening article about this problem&lt;/a&gt;.

A quick read of this explained: 
&lt;blockquote&gt;
It turns out ColdFusion was asking Connector/J for the metadata on every field, which in turn triggered a SHOW FULL COLUMNS query for every varchar and text column returned.
&lt;/blockquote&gt;

It also went on to say that is had been &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/cj-news-5-0-7.html&quot;&gt;fixed as of Connector/J 5.07&lt;/a&gt;.

On reading the release notes it mentions that the
&lt;blockquote&gt;
Driver detects when it is running in a ColdFusion MX server (tested with version 7), and uses the configuration bundle coldFusion, which sets useDynamicCharsetInfo to false (see previous entry), and sets useLocalSessionState and autoReconnect to true. 
&lt;/blockquote&gt;

However, from my testing it wasn&apos;t doing it as we were still seeing the problem.  However, we are running the MultiServer version of ColdFusion which sits atop Jrun4.

So I added the parameter directly to the querystring:
&lt;code&gt;
&amp;useDynamicCharsetInfo=false
&lt;/code&gt;
So it now looks like:
&lt;code&gt;
jdbc:mysql://127.0.0.1:3306/mydbname?allowMultiQueries=true&amp;useDynamicCharsetInfo=false
&lt;/code&gt;

This has stopped the problem, and given a significant performance gain.  On one of the sites I was load testing it gave a 12% throughput increase and on another one which had less queries it gave a 4% increase.

Hope it helps.

Cheers,
Mark
				
				</description>
				
				<category>Open Source</category>
				
				<category>mysql</category>
				
				<category>Java</category>
				
				<category>Database</category>
				
				<category>ColdFusion</category>
				
				<category>Systems admin</category>
				
				<pubDate>Sun, 01 Jun 2008 21:01:00 --1000</pubDate>
				<guid>http://www.lynchconsulting.com.au/blog/index.cfm/2008/6/1/Show-Full-Columns-problem-with-CFMX-and-MySQL-solved</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Job Vacancy Sydney AU - Graduate or Junior OO Programmer</title>
				<link>http://www.lynchconsulting.com.au/blog/index.cfm/2008/5/9/Job-Vacancy-Sydney-AU--Graduate-or-Junior-OO-Programmer</link>
				<description>
				
				We&apos;re looking for a Computer Science Graduate or similar with strong Object Oriented programming skills and the ability to grasp cutting edge technologies quickly.

If you are looking to work with the latest technogies and are a motivated self starter with a positive &quot;can do&quot; attitude this is the job for you. The ability to take problems and deliver solutions is a must.

There will be significant on the job learning as we are always pushing the boundaries and using the latest and greatest technologies. We are currently working on projects using Actionscript/Flex, ColdFusion, PHP, and Javascript, and are leveraging technologies such as VOIP, SMS, Instant Messenger (Jabber XMPP) to deliver cutting edge solutions.

Suitable applicants will have a Bachelors Degree in Computer Science or Engineering, or similar tertiary qualification. Remuneration commensurate with experience.

&lt;h3&gt;Responsibilities would include:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Developing new functionality for Asterisk and VOIP applications&lt;/li&gt;
&lt;li&gt;Creating Rich Internet Applications with Adobe Flex&lt;/li&gt;
&lt;li&gt;Creation of Desktop applications with Adobe AIR&lt;/li&gt;
&lt;li&gt;Design and development of new Web applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Must haves:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A robust foundation in Object Oriented programming&lt;/li&gt;
&lt;li&gt;Demonstrated experience in at least one OO language&lt;/li&gt;
&lt;li&gt;Motivation to learn and push the boundaries&lt;/li&gt;
&lt;li&gt;Understanding of XHTML and CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Preferable:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Experience with PHP, ColdFusion, Farcry CMS, XML, Web Standards etc&lt;/li&gt;
&lt;li&gt;Competency using linux-based tools (SSH, bash, etc)&lt;/li&gt;
&lt;li&gt;Familiar with using source control tools (Subversion, etc)&lt;/li&gt;
&lt;li&gt;Familiarity with Actionscript or Flash&lt;/li&gt;
&lt;/ul&gt;

This role may be full time, part-time or on a contract basis depending on the candidates skills and experience. You will be working in a casual workplace with flexible hours in the centre of Sydney.

If this sounds like the job for you email your resume to mark@lynchconsulting.com.au if interested - no agencies please.
				
				</description>
				
				<category>Learnosity</category>
				
				<category>Jobs</category>
				
				<category>Java</category>
				
				<category>General</category>
				
				<category>Flex</category>
				
				<category>ColdFusion</category>
				
				<category>Asterisk</category>
				
				<category>AIR</category>
				
				<category>Actionscript</category>
				
				<category>PHP</category>
				
				<pubDate>Fri, 09 May 2008 00:17:00 --1000</pubDate>
				<guid>http://www.lynchconsulting.com.au/blog/index.cfm/2008/5/9/Job-Vacancy-Sydney-AU--Graduate-or-Junior-OO-Programmer</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Getting Flex 4.0 up and running on Ubuntu</title>
				<link>http://www.lynchconsulting.com.au/blog/index.cfm/2008/5/8/Getting-Flex-40-up-and-running-on-Ubuntu</link>
				<description>
				
				I came across a blog entry today from &lt;a href=&quot;http://www.morearty.com/blog/2008/02/25/open-source-flex-the-candy-store-is-now-unlocked/&quot;&gt;Mike Morearty about the flex 4 source tree&lt;/a&gt;.  

It also mentioned the &lt;a href=&quot;http://blogs.adobe.com/gosmith/2008/02/disassembling_a_swf_with_swfdu_1.html&quot;&gt;swfdump tool which looked interesting&lt;/a&gt;

I downloaded it and went to the bin directory to try swddump  but it didn&apos;t work straight away complaining about a missing jar file.

I thought this would mean a lot of pain to get it all compiling but I was very surprised.  Here were the steps to get it working on Ubuntu 8.04 Hardy Heron.

&lt;h2&gt;Step 1&lt;/h2&gt;
Get the code from the repository

&lt;code&gt;svn co http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/ flex4&lt;/code&gt;
This will check out the code to a directory called flex4 under your current directory.  I&apos;m assuming you have Subversion installed  but if you don&apos;t you&apos;ll need to run this first.
&lt;code&gt;
sudo apt-get install subversion
&lt;/code&gt;

&lt;h2&gt;Get the tools to compile flex&lt;/h2&gt;
&lt;code&gt;
sudo apt-get install ant ant-optional sun-java6-jdk
&lt;/code&gt;
That wasn&apos;t hard now was it?

&lt;h2&gt;Compile&lt;/h2&gt;
Go into the correct directory and call &quot;ant&quot; which will use the build.xml to build it all.
&lt;code&gt;
cd flex4
ant
&lt;/code&gt;

Some couple of minutes later you should get the following message
&lt;code&gt;
BUILD SUCCESSFUL
Total time: 2 minutes 41 seconds
&lt;/code&gt;

Now you have a build of Flex4.  Next step is to figure out how to configure Flex Builder to use the new compiler.

NOTE: This is not a finished version of Flex4 yet.  Just the work in progress. 

Cheers,
Mark
				
				</description>
				
				<category>Ubuntu</category>
				
				<category>Open Source</category>
				
				<category>Java</category>
				
				<category>AIR</category>
				
				<category>Actionscript</category>
				
				<pubDate>Thu, 08 May 2008 20:41:00 --1000</pubDate>
				<guid>http://www.lynchconsulting.com.au/blog/index.cfm/2008/5/8/Getting-Flex-40-up-and-running-on-Ubuntu</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>MD5 Checksum for Images (Binaries) in CF</title>
				<link>http://www.lynchconsulting.com.au/blog/index.cfm/2008/1/14/MD5-Checksum-for-Images-Binaries-in-CF</link>
				<description>
				
				I&apos;ve been working on a piece of an application which is needs to verify that the images received have not been modified or tampered by using MD5 hashes.

&lt;strong&gt;Note: If you want to skip my ramble and get to the solution scroll to the bottom for the &lt;a href=&quot;#solution&quot;&gt;example code and download&lt;/a&gt;.&lt;/strong&gt;

I thought it would be nice and easy to do it with the CF Hash function and on first attempt it appeared to be:

&lt;code&gt;
&lt;cffile action=&quot;read&quot; file=&quot;#getDirectoryFromPath(getCurrentTemplatePath())#firework.jpg&quot; variable=&quot;myTextFile&quot;&gt;
Hash: &lt;cfoutput&gt;#hash(myTextFile)#&lt;/cfoutput&gt;
&lt;/code&gt;
Gives:
&lt;code&gt;
Hash: 2A3643821420D5349665D2231842FD89
&lt;/code&gt;

However, the hashes get created on by CF but get verified by an Flex application so I was using the &lt;a href=&quot;http://code.google.com/p/as3corelib/&quot;&gt;as3corelib&apos;s&lt;/a&gt; MD5 function and couldn&apos;t get the hashes to match.

So I decided to try another MD5 implementation to see which of my functions was wrong - unfortunately it turned out that both of them were wrong but for two different reasons.  I&apos;ll cover the AS3 problem in a different post.

The output from md5sum was as follows:
&lt;code&gt;
$ md5sum firework.jpg 
2346b6ab017de31688ee35949612db07  firework.jpg
&lt;/code&gt;

This didn&apos;t match what I had generated.  A bit more head scratching and I realised that the problem was that I was trying to do an md5 hash on a binary file but the CF Hash() only takes a &quot;string&quot;.

After loading the file with &quot;readbinary&quot; the hash function didn&apos;t work (no surprise) and a bit of digging around led me to use some Java functionality to handle the generation of the Hash.

&lt;code&gt;
&lt;cffile action=&quot;readbinary&quot; file=&quot;#getDirectoryFromPath(getCurrentTemplatePath())#firework.jpg&quot; variable=&quot;myBinaryFile&quot;&gt;
&lt;cfset var md5 = createObject(&quot;java&quot;,&quot;java.security.MessageDigest&quot;).getInstance(&quot;MD5&quot;)&gt;
&lt;cfset md5.update(myBinaryFile,0,len(myBinaryFile))&gt;
&lt;cfset checksumByteArray = md5.digest()&gt;
&lt;/code&gt;

This leaves us with a ByteArray digest of the file - which we need to convert to a familiar hex encoded MD5 Hash.

&lt;code&gt;
&lt;cfloop from=&quot;1&quot; to=&quot;#len(checksumByteArray)#&quot; index=&quot;i&quot;&gt;
	&lt;cfset hexCouplet = formatBaseN(bitAND(checksumByteArray[i],255),16)&gt;
	&lt;!--- Pad with 0&apos;s ---&gt;
	&lt;cfif len(hexCouplet) EQ 1&gt;
		&lt;cfset hexCouplet = &quot;0#hexCouplet#&quot;&gt;
	&lt;/cfif&gt;
	&lt;cfset checkSumHex = &quot;#checkSumHex##hexCouplet#&quot;&gt;
&lt;/cfloop&gt;
Binary Hash: &lt;cfoutput&gt;#checkSumHex#&lt;/cfoutput&gt;	
&lt;/code&gt;
This gives the following checksum:
&lt;code&gt;
Binary Hash: 2346b6ab017de31688ee35949612db07
&lt;/code&gt;

Bingo - all working nicely now.  I&apos;ve packaged it all up to make my life easier I&apos;ve packaged it up into a nice CFC - &lt;a href=&quot;http://www.lynchconsulting.com.au/blog/enclosures/crypto.zip&quot;&gt;Crypto.cfc&lt;/a&gt;.

&lt;h3&gt;&lt;a name=&quot;solution&quot;&gt;&lt;/a&gt;Solution and Download&lt;/h3&gt;

Here&apos;s the &lt;a href=&quot;http://www.lynchconsulting.com.au/blog/enclosures/crypto.zip&quot;&gt;example code&lt;/a&gt; and a &lt;a href=&quot;http://www.lynchconsulting.com.au/examples/hashBinary.cfm&quot;&gt;running demo of it&lt;/a&gt;.


The &lt;a href=&quot;http://www.lynchconsulting.com.au/blog/enclosures/crypto.zip&quot;&gt;Crypto CFC is available&lt;/a&gt; from the subversion repository.

Here is the code to use it:
&lt;code&gt;
&lt;cffile action=&quot;readbinary&quot; file=&quot;#getDirectoryFromPath(getCurrentTemplatePath())#firework.jpg&quot; variable=&quot;myBinaryFile&quot;&gt;
&lt;cfset md5 = createObject(&quot;component&quot;,&quot;au.com.lynchconsulting.cfc.utility.Crypto&quot;).hashBinary(myBinaryFile)&gt;

&lt;h3&gt;MD5 Sum calculated from hashBinary()&lt;/h3&gt;
Hash Binary: &lt;cfoutput&gt;#md5#&lt;/cfoutput&gt;
&lt;/code&gt;

Hope it helps.
Cheers,
Mark
				
				</description>
				
				<category>Ubuntu</category>
				
				<category>Open Source</category>
				
				<category>Java</category>
				
				<category>ColdFusion</category>
				
				<pubDate>Mon, 14 Jan 2008 21:00:00 --1000</pubDate>
				<guid>http://www.lynchconsulting.com.au/blog/index.cfm/2008/1/14/MD5-Checksum-for-Images-Binaries-in-CF</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Complex CF Webservices problem - solved</title>
				<link>http://www.lynchconsulting.com.au/blog/index.cfm/2007/11/12/CF-Webservices-problem--solved</link>
				<description>
				
				Couple of days ago I ran into ColdFusion Webservices problem using cfinvoke and complex arguments. The Java Webservice I was talking to expected 3 arguments - 2 strings and 1 array of structures. So far, I only had to pass String arguments to webservices, which worked fine. For some reason, and correct me if I&apos;m wrong, ColdFusion doesn&apos;t seem to translate complex variables into correct soap-equivalent format when sending the soap packet out. I got the following error - &quot;Web service operation &apos;myMethod()&apos; with parameters {args} could not be found&quot;. I was definitely calling the right method, but CF Array I was sending was not recognised by the Webservice.

I was pretty determined to get this working and decided to build the SOAP envelope manually and send it to the webservice using a CFHTTP POST. This actually worked very nicely and this is how I did it:
				 [More]
				</description>
				
				<category>Java</category>
				
				<category>ColdFusion</category>
				
				<pubDate>Mon, 12 Nov 2007 23:13:00 --1000</pubDate>
				<guid>http://www.lynchconsulting.com.au/blog/index.cfm/2007/11/12/CF-Webservices-problem--solved</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>JMeter load testing - Regex problem solved</title>
				<link>http://www.lynchconsulting.com.au/blog/index.cfm/2007/10/9/JMeter-load-testing--Regex-problem-solved</link>
				<description>
				
				I&apos;ve been having fun playing with JMeter to do some load testing on some of our applications recently and I came across this problem which had me stumped.  Eventually my friendly sysadmins put me out of my misery.  So to prevent other people from the same issues - here is the problem and the solution.

&lt;img src=&quot;http://www.lynchconsulting.com.au/blog/enclosures/jmeter-bad.png&quot; align=&quot;right&quot; alt=&quot;Jmeter screenshot - not working&quot; /&gt;

&lt;a href=&quot;http://jakarta.apache.org/jmeter/&quot;&gt;JMeter is a great load testing application&lt;/a&gt; but it can be a bit tricky to when you are learning it.

For the particular testing I needed to get it to do the following:
&lt;ul&gt;
&lt;li&gt;Login in as a user&lt;/li&gt;
&lt;li&gt;Retrieve the valid userid&lt;/li&gt;
&lt;li&gt;Create a new test for the user&lt;/li&gt;
&lt;li&gt;Get the testid back&lt;/li&gt;
&lt;li&gt;Load the test details&lt;/li&gt;
&lt;li&gt;Submit the test&lt;/li&gt;
&lt;/ul&gt;

I pretty quickly got everything working with some regex&apos;s to extract the userid and testid as required and my test case looked like the picture above.

Everything was working except the final submission of the test, which was failing as the regex variable was always using the default value, despite the fact that is was working for the previous step.

&lt;img src=&quot;http://www.lynchconsulting.com.au/blog/enclosures/jmeter-good.png&quot; align=&quot;right&quot; alt=&quot;Jmeter screenshot - working!!&quot; /&gt;

It turns out that the regex needed to be nested inside the request it was referring to or it would be called after every request, which in most cases would return the default value as the regex wouldn&apos;t match.

Once I put the regex&apos;s inside the requests the were not constantly being reset and everything worked a treat.

Hope it helps.

Mark
				
				</description>
				
				<category>ColdFusion</category>
				
				<category>Java</category>
				
				<category>Open Source</category>
				
				<category>Software Architecture</category>
				
				<category>Systems admin</category>
				
				<pubDate>Tue, 09 Oct 2007 08:19:00 --1000</pubDate>
				<guid>http://www.lynchconsulting.com.au/blog/index.cfm/2007/10/9/JMeter-load-testing--Regex-problem-solved</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Cross platform Database IDE</title>
				<link>http://www.lynchconsulting.com.au/blog/index.cfm/2007/9/15/Cross-platform-Database-IDE</link>
				<description>
				
				Ever since I&apos;ve moved to using Linux full time I&apos;ve been looking for a solid Database IDE. I&apos;ve tried and tested quite a few.

&lt;dl&gt;
&lt;dt&gt;&lt;a href=&quot;http://www.aquafold.com/&quot;&gt;Aqua Data Studio&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;This is my current DB IDE of choice and has some significant features in the new &lt;a href=&quot;http://docs.aquafold.com/ads/6.5/features_6_5.html&quot;&gt;version 6.5&lt;/a&gt; that means I&apos;ll be staying with it for a while, particularly as it runs on Linux, Macs and Windows identically.&lt;/dd&gt;
&lt;dd&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.aquafold.com/ads/6.5/features_6_5.html#schemaCompare&quot;&gt;Schema Comparison&lt;/a&gt; - very handy for keeping development and production db&apos;s schemas in sync.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.aquafold.com/ads/6.5/features_6_5.html#pivotresults&quot;&gt;Charts &amp; Pivot Tables&lt;/a&gt; - makes it easy to create adhoc graphs withouth having to resort to Excel/OpenOffice Calc&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.aquafold.com/ads/6.5/features_6_5.html#morphtolist&quot;&gt;Morph to Delimited List&lt;/a&gt; - A simple but powerful function that saves a lot of time. Allows you to take the results of a sql query and convert to comma seperated list.  I&apos;ve done dozens of adhoc CF scripts to handle this before :-)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.aquafold.com/ads/6.5/features_6_5.html#subversion&quot;&gt;Subversion Support&lt;/a&gt; - As we use subversion for our code it&apos;s handy to have it built in.&lt;/li&gt;
&lt;/ul&gt;

&lt;/dd&gt;
&lt;dt&gt;&lt;a href=&quot;http://dev.mysql.com/downloads/gui-tools/&quot;&gt;MySQL GUI tools&lt;/a&gt; (Query Browser &amp; Admin)&lt;/dt&gt;
&lt;dd&gt;These have some very nice functionality but have always found them to be pretty unstable - they just crash a lot with no explanation.&lt;/dd&gt;
&lt;dt&gt;&lt;a href=&quot;http://www.navicat.com/&quot;&gt;Navicat&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;This is pretty good option, but the Linux version is the poor cousin to the Windows &amp;amp; Mac versions.&lt;/dd&gt;

&lt;/dl&gt;

Love to hear any comments feedback or suggestions.
				
				</description>
				
				<category>Systems admin</category>
				
				<category>Open Source</category>
				
				<category>Java</category>
				
				<category>Database</category>
				
				<category>ColdFusion</category>
				
				<category>Windows</category>
				
				<pubDate>Sat, 15 Sep 2007 05:29:00 --1000</pubDate>
				<guid>http://www.lynchconsulting.com.au/blog/index.cfm/2007/9/15/Cross-platform-Database-IDE</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>howto document your code with ASDoc</title>
				<link>http://www.lynchconsulting.com.au/blog/index.cfm/2007/8/23/howto-document-your-code-with-ASDoc</link>
				<description>
				
				Last night I was trying to document our AS3 code, using ASDoc, for a project that we have been working on.  For those of you who don&apos;t know, ASDoc is a command line utility which allows you to generate code documentation in HTML format.  A good example of what ASDoc output looks like would be, &lt;a href=&quot;http://livedocs.adobe.com/flex/2/langref/index.html&quot; target=&quot;_blank&quot;&gt;Flex 2 Language Reference&lt;/a&gt;.

Documenting code wasn&apos;t as easy as I thought it would be, so I thought I&apos;d share this with you and hopefully it will save someone some time.  I use an Intel Mac and this is what you need to do to get your basic code documentation generated successfully:&lt;br /&gt;&lt;br /&gt;
1. In your terminal window go to your Flex SDK bin directory.  Typically this is located under /Applications/Adobe Flex Builder 2/Flex SDK 2/bin &lt;br /&gt;&lt;br /&gt;
2. From &quot;bin&quot; directory run this command:  
&lt;code&gt;./asdoc -doc-sources=/Users/marko/Documents/workspace/yourFlexProject/  -source-path=/Users/marko/Documents/workspace/yourFlexProject/
&lt;/code&gt;

If you have any external Libraries in your Flex project you will need to include them in your command:
&lt;code&gt;-external-library-path=/path_to_your_swc/myLib.swc&lt;/code&gt;

The key thing to remember for Mac users is that you need to run the command from Flex SDK bin directory and use &lt;strong&gt;-source-path&lt;/strong&gt; option to tell the compiler where the source is located. &lt;strong&gt;-doc-sources&lt;/strong&gt; will tell the compiler to generate output for the current directory and all subdirectories recursively.  If you run this utility from any other directory other than &quot;bin&quot;, you will get NoClassDefFoundError.

I haven&apos;t tried running ASDoc in Windows yet, but it should be very similar to running it on a Mac.  And since ASDoc is a command line java utility, you would think it would run on Linux too.  Well, for all you Linux users out there, this is the message I got from the compiler:
&lt;code&gt;Error: Could not create toplevel.xml: Unknown OS for ASDoc. ASDoc will only run on Windows and Mac OS X.&lt;/code&gt; 
That last sentence is pretty self explanatory :)

ASDoc is nicely documented &lt;a href=&quot;http://livedocs.adobe.com/flex/201/html/asdoc_127_1.html&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.

Cheers&lt;br /&gt;
Marko
				
				</description>
				
				<category>Linux</category>
				
				<category>Java</category>
				
				<category>HOWTO</category>
				
				<category>Flex</category>
				
				<category>Windows</category>
				
				<pubDate>Thu, 23 Aug 2007 20:52:00 --1000</pubDate>
				<guid>http://www.lynchconsulting.com.au/blog/index.cfm/2007/8/23/howto-document-your-code-with-ASDoc</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Install SSL certificate in ColdFusion</title>
				<link>http://www.lynchconsulting.com.au/blog/index.cfm/2007/6/20/Install-SSL-certificate-in-ColdFusion</link>
				<description>
				
				If you are using self signed ssl certs for web-services you may run across the following error:
&lt;code&gt;
 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 
&lt;/code&gt;

If you browse to the URL using Firefox you will likely get a certificate warning and a prompt which allows you to continue anyway despite the warning.  With CF you can&apos;t do this so you have to add the certificate to the list of &quot;known&quot; certs using the java keytool.

&lt;h3&gt;Instructions:&lt;/h3&gt;

First - save the certificate to your desktop using Internet Explorer or the &lt;a href=&quot;https://addons.mozilla.org/firefox/1964/&quot;&gt;Cert Viewer Plus plugin&lt;/a&gt; for firefox.

Then open a command prompt and go to cfusion jre/bin directory

&lt;code&gt;
$ cd /opt/jrun/jre/bin 
&lt;/code&gt;

From here you should have see access to the keytool application which is how you modify the security settings.

You can show all certs:
&lt;code&gt;
./keytool -list -storepass changeit -noprompt -keystore ../lib/security/cacerts
&lt;/code&gt;

or Import a new cert:
&lt;code&gt;
./keytool -import -storepass changeit -noprompt -alias mynewcert
-keystore ../lib/security/cacerts -trustcacerts -file mynewcert.cer
&lt;/code&gt;

Explanation of the options:
&lt;ul&gt;
&lt;li&gt;alias - this is a friendly name for the cert that you can specify&lt;/li&gt;
&lt;li&gt;storepass is the password for the security store.  Unless you have already changed it it will be &apos;changeit&apos;&lt;/li&gt;
&lt;li&gt;file - this is the certificate file you have downloaded in your browser.&lt;/li&gt;
&lt;/ul&gt;

If it reports the following error:
&lt;code&gt;
keytool error: java.io.FileNotFoundException: ../lib/security/cacerts
(Permission denied)
&lt;/code&gt;
Check that you have write permissions to the cacerts file.

Note: If you are a Mac user you will find that ColdFusion may not have JRE directory installed under JRun.  This is because CF uses OS X Java install, so you will need to run your keytool command from the following directory:
&lt;code&gt;
/Library/Java/Home/bin
&lt;/code&gt; 

To find out the location of your Java Home, log in CF Administrator and click on Settings Summary. 

Hope it helps and thanks to the other people who have posted about this.

Sources:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.talkingtree.com/blog/index.cfm/2004/7/1/keytool&quot;&gt;Using Keytool to Import SSL Certificates into Sun JDK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
				
				</description>
				
				<category>Systems admin</category>
				
				<category>Linux</category>
				
				<category>Java</category>
				
				<category>ColdFusion</category>
				
				<pubDate>Wed, 20 Jun 2007 03:18:00 --1000</pubDate>
				<guid>http://www.lynchconsulting.com.au/blog/index.cfm/2007/6/20/Install-SSL-certificate-in-ColdFusion</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Useful package for Ubuntu - ubuntu-restricted-extras</title>
				<link>http://www.lynchconsulting.com.au/blog/index.cfm/2007/6/12/Useful-package-for-Ubuntu--ubunturestrictedextras</link>
				<description>
				
				I just happened across &lt;a href=&quot;http://packages.ubuntu.com/feisty/metapackages/ubuntu-restricted-extras&quot;&gt;this package&lt;/a&gt; today - and while I had pretty much  everything already installed it is a handy way to add some of the essential packages which cannot be distributed in the main Ubuntu distribution due to licensing issues.

It installs the following:
&lt;ul&gt;
&lt;li&gt;Flash Player 9&lt;/li&gt;
&lt;li&gt;Sun Java 6.0 runtime and browser plugin &lt;/li&gt;
&lt;li&gt;Microsoft Core Fonts - Arial, Verdana etc&lt;/li&gt;
&lt;li&gt;GStreamer Video Codecs&lt;/li&gt;
&lt;/ul&gt;

Installing is as simple as:
&lt;code&gt;
sudo apt-get install ubuntu-restricted-extras
&lt;/code&gt;
or search for it in Synaptic.

Cheers,
Mark
				
				</description>
				
				<category>Ubuntu</category>
				
				<category>Open Source</category>
				
				<category>Linux</category>
				
				<category>Java</category>
				
				<pubDate>Tue, 12 Jun 2007 05:34:00 --1000</pubDate>
				<guid>http://www.lynchconsulting.com.au/blog/index.cfm/2007/6/12/Useful-package-for-Ubuntu--ubunturestrictedextras</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Memcached configuration options</title>
				<link>http://www.lynchconsulting.com.au/blog/index.cfm/2007/5/8/Memcached-configuration-options</link>
				<description>
				
				From the previous &lt;a href=&quot;http://www.lynchconsulting.com.au/blog/index.cfm/2007/5/1/MemCached-Client-for-CFMX--alpha-version#c48A16A0F-F965-3CD6-1F8126E4E67E6156&quot;&gt;discussion with Michael Long&lt;/a&gt; I realised that the memcached solution doesn&apos;t force you to only have a single centralised cache store.  What it does is allow you to configure you caching in a more flexible manner (at the cost of adding another layer in).  

For example, you could configure you caching in a number different ways:  

Note that these are theoretical and I haven&apos;t yet tested these configurations, keen to hear if anyone else has/or does though.

&lt;h3&gt;Stable Performance&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1 memcached instance per server&lt;/li&gt;
&lt;li&gt;2 or 3  CF intances per server&lt;/li&gt;
&lt;/ul&gt;
&lt;strong&gt;Pros:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Ability to rolling restart CF instances without clearing cache&lt;/li&gt;
&lt;li&gt;Ability to clear entire cache (or parts of it) for the server via cf template&lt;/li&gt;
&lt;li&gt;More efficient memory usage than storing 1 copy per instance&lt;/li&gt;
&lt;li&gt;Each instance can share work of other instances i.e. cache is generated by one server instead of each server&lt;/li&gt;
&lt;/ul&gt;
&lt;strong&gt;Cons:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Additional memcached layer&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Maximum Performance&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2+ memcached instances shared across cluster&lt;/li&gt;
&lt;li&gt;2 or 3  CF intances per server&lt;/li&gt;
&lt;/ul&gt;
&lt;strong&gt;Pros:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Ability to rolling restart CF instances without clearing cache&lt;/li&gt;
&lt;li&gt;Ability to clear entire cache for cluster (or parts of it) for the server via cf template&lt;/li&gt;
&lt;li&gt;Very efficient memory usage across entire cluster&lt;/li&gt;
&lt;li&gt;Each instance can share work of other instances  across cluster i.e. cache is generated by one server instead of each server&lt;/li&gt;
&lt;/ul&gt;
&lt;strong&gt;Cons:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Performance degration of particular pages if memcached server holding specific cache is down.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CF Emulation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1 memcached instance per cf instance&lt;/li&gt;
&lt;li&gt;1 CF intances per memcache&lt;/li&gt;
&lt;/ul&gt;
&lt;strong&gt;Pros:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Each CF instance has dedicated cache&lt;/li&gt;
&lt;li&gt;CF memory is only used for requests not caching&lt;/li&gt;
&lt;/ul&gt;
&lt;strong&gt;Cons:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Dependancy on memcached&lt;/li&gt;
&lt;/ul&gt;

One of the reasons that I&apos;m keen to move the cache data out of the CF process is that I&apos;ve found CF to become unstable when it&apos;s using all it&apos;s memory and this is an elegant way of removing some of the memory usage. Also the JVM seems to have &lt;a href=&quot;http://blog.daemon.com.au/archives/000279.html&quot;&gt;limits on how much ram it can use&lt;/a&gt;.  This way it leaves all the memory in CF for processing requests.
				
				</description>
				
				<category>Java</category>
				
				<category>ColdFusion</category>
				
				<pubDate>Tue, 08 May 2007 22:57:00 --1000</pubDate>
				<guid>http://www.lynchconsulting.com.au/blog/index.cfm/2007/5/8/Memcached-configuration-options</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Faster alternative to CFWDDX - java serialize</title>
				<link>http://www.lynchconsulting.com.au/blog/index.cfm/2007/5/8/Faster-alternative-to-CFWDDX--java-serialize</link>
				<description>
				
				As part of looking at implementing the memcached client for CF I&apos;ve been looking at using the native Java serialize methods instead of the cfwddx serialization that I put in first time to get it to work.

With a bit of help from &lt;a href=&quot;http://www.linkedin.com/in/maxnyman&quot;&gt;Max Nyman&lt;/a&gt; I&apos;ve created some tags to handle java serialization in a similar manner to cfwddx.  

Some rough benchmarks on this using an array of numbers between 100 and 10,000 elements and repeating between 100 and 10000 times resulted in the following general observations:

JavaSerialize on average took 60% of the execution time of cfwddx for a serialize and deserialize operation.

In addition to this - the data length was typically 60% of the wddx length.  This has significant benefits when it is used for caching in memory.  It means you can fit more data in the same amount of ram or use less ram!

The tag is &lt;a href=&quot;http://developer.lynchconsulting.com.au/svn/opensource/lc_cflib/trunk/customtags/util/javaSerialize.cfm&quot;&gt;available here&lt;/a&gt;

To serialize from CF use the following:
&lt;code&gt;
&lt;cfimport prefix=&quot;util&quot; taglib=&quot;/au/com/lynchconsulting/customtags/util/&quot;&gt;
&lt;util:javaSerialize action=&quot;fromCF&quot; input=&quot;#cfObj#&quot; output=&quot;serialized&quot;&gt;
&lt;/code&gt;

To serialize to CF use the following:
&lt;code&gt;
&lt;cfimport prefix=&quot;util&quot; taglib=&quot;/au/com/lynchconsulting/customtags/util/&quot;&gt;
&lt;util:javaSerialize action=&quot;toCF&quot; input=&quot;#serialized#&quot; output=&quot;cfObj&quot;&gt;
&lt;/code&gt;

&lt;strong&gt;Note&lt;/strong&gt; that fromCF function returns a binary object - which would need to be converted to base64 if you want to transfer them via a form submission.

&lt;strong&gt;Another Note&lt;/strong&gt; - the customtag does add some overhead, so I would suggest putting the code directly into any high performance code (eg caching tags, like cfaccelerate and memcached) but for general use it  is more convenient in the custom tag.
				
				</description>
				
				<category>Java</category>
				
				<category>ColdFusion</category>
				
				<pubDate>Tue, 08 May 2007 09:24:00 --1000</pubDate>
				<guid>http://www.lynchconsulting.com.au/blog/index.cfm/2007/5/8/Faster-alternative-to-CFWDDX--java-serialize</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>MemCached Client for CFMX - alpha version</title>
				<link>http://www.lynchconsulting.com.au/blog/index.cfm/2007/5/2/MemCached-Client-for-CFMX--alpha-version</link>
				<description>
				
				I&apos;ve been looking at using &lt;a href=&quot;http://www.danga.com/memcached/&quot;&gt;memcached&lt;/a&gt; in order to speed up a few sites that I&apos;ve been working on.

&lt;h3&gt;What does it do?&lt;/h3&gt;
Memcached is basically a large RAM cache that is distributed across a network and can be shared between many machines.  Many CF applications use the application scope to cache information - including the &lt;a href=&quot;http://www.bpurcell.org/blog/index.cfm?entry=963&amp;mode=entry&quot;&gt;wonderful CF_Accelerate tag&lt;/a&gt;.  This works great for single servers (and instances) but once you need to scale beyond this you end up with each server having duplicate copies of the cached data.

Memcache gives you a central place to store this info and allows you to move it out of the ColdFusion memory space which uses as much memory on the network as you have available.  Plenty &lt;a href=&quot;http://www.danga.com/memcached/&quot;&gt;more info on the memcache site.&lt;/a&gt;


&lt;h3&gt;How do I use it?&lt;/h3&gt;
Install memcached on a machine (using apt on ubuntu is the following)
&lt;code&gt;
sudo apt-get install memcached
&lt;/code&gt;
Then run it (the -vv gives extra debugging info):
&lt;code&gt;
memcached -vv
&lt;/code&gt;

&lt;a href=&quot;http://www.whalin.com/memcached/#download&quot;&gt;Download the java api for memcached&lt;/a&gt; (for CF7 you need the 1.3.2 version unless you have upgraded your VM)

Copy it into the lib folder for CF and restart CF eg:
&lt;code&gt;
sudo cp java_memcached-release_1.3.2.jar /opt/jrun/lib
&lt;/code&gt;


Get the CFC:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://developer.lynchconsulting.com.au/svn/opensource/lc_cflib/trunk/cfc/utility/MemCached.cfc&quot;&gt;Download the MemCached.cfc from SVN&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;It can also &lt;a href=&quot;http://developer.lynchconsulting.com.au/trac/opensource/lc_cflib/browser/trunk/cfc/utility/MemCached.cfc&quot;&gt;view in the friendlier trac&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



Then try the following test code:
&lt;code&gt;
&lt;cfscript&gt;
	oMemCached = createObject(&quot;component&quot;,&quot;MemCached&quot;).getPoolInstance();
	oMemCached.shutdown();
	
	//List of server:ports to use

	serverList = &apos;127.0.0.1:11211&apos;;
	
	//Create a new memcached object - this could be stored in application
	
	oMemCached = createObject(&quot;component&quot;,&quot;MemCached&quot;).init(serverList=serverList);
		
	//Create some data to store
	
	aTemp = ArrayNew(1);
	aTemp[1] = &apos;34343&apos;;
	aTemp[2] = &apos;134343&apos;;
	aTemp[3] = &apos;234343&apos;;
	aTemp[4] = &apos;334343&apos;;
	aTemp[5] = &apos;434343&apos;;

	//Save to keys (one add and one set)

	oMemCached.add(&apos;key&apos;,aTemp);
	oMemCached.set(&apos;key2&apos;,aTemp);		
&lt;/cfscript&gt;

&lt;!--- Output the data from cache ---&gt;
&lt;cfdump var=&quot;#oMemCached.get(&apos;key&apos;)#&quot;&gt;
&lt;cfdump var=&quot;#oMemCached.get(&apos;key2&apos;)#&quot;&gt;

&lt;/code&gt;

The cfc is not production ready - but is working in some basic tests.  One area that is not working (as far as I can tell) is the failover of servers.

Have a play, and all comments welcome.
				
				</description>
				
				<category>Software Architecture</category>
				
				<category>Open Source</category>
				
				<category>Linux</category>
				
				<category>Java</category>
				
				<category>ColdFusion</category>
				
				<pubDate>Wed, 02 May 2007 07:10:00 --1000</pubDate>
				<guid>http://www.lynchconsulting.com.au/blog/index.cfm/2007/5/2/MemCached-Client-for-CFMX--alpha-version</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>OO Part 1: From code libraries to instances</title>
				<link>http://www.lynchconsulting.com.au/blog/index.cfm/2007/1/15/OO-Part-1-From-code-libraries-to-instances</link>
				<description>
				
				&lt;h3&gt;Code libraries&lt;/h3&gt;
When people first start using CFC&apos;s they often use them as a handy way to group related functions together. For example, if you could put all the functions that deal with users into the same cfc and you may have something like the following pseudocode:
&lt;code&gt;
User.cfc
 function getUserName(id)
 function getFirstName(id)
 function getLastName(id)
 function authenticate(username,password)
 function getAllUsers()
 function getUserCount()
 function createUser(username,password,firstname,lastname)
 function updateUser(id,username,password,firstname,lastname)
&lt;/code&gt;

While this is a useful and valid way to use CFC&apos;s it isn&apos;t using them to their full potential.  

&lt;h3&gt;Dealing with a single user&lt;/h3&gt;

When working in object oriented way we try to discern what the different objects in a system would be.  In this case User would be an object - and the user would know certain things about itself (name, username, password, date created) and just as importantly it would not know certain things (eg: total number of users in system)

&lt;code&gt;
User.cfc
 var id  //We store the user id in the cfc

 function init(id)
 function getUserName() //id is not required as it is already in the instance
 function getFirstName() 
 function getLastName()
 function updateUser(username,password,firstname,lastname) //also no id required here
&lt;/code&gt;

This &quot;instance&quot; of a user gives us access to all the properties that a user knows about but shields us from many of the functions that are not relevant.

We now have a user that we can easily conceptualise and work with without having all of the other methods such as getAllUsers() or getUserCount() getting in our way.  It also allows a team of programmers to have a set of guidelines as to where code should live.  If it deals with a single user it will be in the user CFC

&lt;h3&gt;But how do we create a new user&lt;/h3&gt;
You&apos;ll notice that the above code has no way of creating a user - this is because it doesn&apos;t make sense for a user to be able to create another user (we&apos;re not talking about giving birth here).  So how do we create a user.

We need a place to put the create user method that is outside of the User.cfc - and I have typically used something like UserManager.cfc.

UserManager is also responsible for all functions that deal with more than one user.

&lt;code&gt;
UserManager.cfc
 function authenticate(username,password)  // We don&apos;t have a valid user at this point
 
 function getAllUsers()
 function getUserCount()
 function createUser(username,password,firstname,lastname)
&lt;/code&gt;


This works really well in that there is now a logical place to put all of the code relating to Users and if all the people working on the application know where things should go.

&lt;h3&gt;Two CFC&apos;s for each object type?&lt;/h3&gt;
However having two CFC&apos;s for each object type can get really messy, espcially when you are drawing Class diagrams.  The java solution to this lies in the use of Static methods.

Static methods (or Class methods) are functions that are available on the Class as opposed to the Instance - i.e. when we are dealing with the concept of Users as opposed to a specific user Steve Bennett who works on level 5.

So now we are back to having the following:
&lt;code&gt;
User.cfc
 var id
// static methods

 function authenticate(username,password)
 function getAllUsers()
 function getUserCount()
 function createUser(username,password,firstname,lastname)
 function init(id)

//Instance methods

 function getUserName() //id is not required as it is already in the instance

 function getFirstName() 
 function getLastName()
 function updateUser(username,password,firstname,lastname) //also no id required here
&lt;/code&gt;


But aren&apos;t we back where we started with everything jumbled together?  Not really, we now have a obvious set methods that deal with a single instance and another set that deal with multiple users. 

In this example you only have half the number of methods to look through when you are dealing with a specific user (i.e. all the instance methods) and the same when you are dealing with multiple users.

&lt;h3&gt;Enforcing it in ColdFusion&lt;/h3&gt;

However Coldfusion doesn&apos;t naturally handle the differentiation of Static methods from Instance methods - however with a bit of ingenuity (aka hackery) we can enforce it in our CFC&apos;s.  I&apos;ve got a working prototype of this and I&apos;ll post some more on it shortly.


&lt;h3&gt;Further reading&lt;/h3&gt;
If you are interested in getting more aquainted with Object Oriented design I&apos;ve found the following books very helpful:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FHead-First-Object-Oriented-Analysis-Design%2Fdp%2F0596008678%2Fsr%3D8-1%2Fqid%3D1168245207%3Fie%3DUTF8%26s%3Dbooks&amp;tag=lynchconsu-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325&quot;&gt;Head First Object-Oriented Analysis &amp; Design&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=lynchconsu-20&amp;amp;l=ur2&amp;amp;o=1&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FHead-First-Design-Patterns%2Fdp%2F0596007124%2Fsr%3D8-2%2Fqid%3D1168245207%3Fie%3DUTF8%26s%3Dbooks&amp;tag=lynchconsu-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325&quot;&gt;Head First Design Patterns&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=lynchconsu-20&amp;amp;l=ur2&amp;amp;o=1&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
				
				</description>
				
				<category>Software Architecture</category>
				
				<category>Java</category>
				
				<category>ColdFusion</category>
				
				<pubDate>Mon, 15 Jan 2007 05:49:00 --1000</pubDate>
				<guid>http://www.lynchconsulting.com.au/blog/index.cfm/2007/1/15/OO-Part-1-From-code-libraries-to-instances</guid>
				
			</item>
			
		 	
			</channel></rss>