<?xml version="1.0" encoding="utf-8"?>

			<rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://web.resource.org/cc/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">

			<channel>
			<title>The No-Dans Club - Software Development</title>
			<link>http://www.nodans.com/index.cfm</link>
			<description>ColdFusion, Flex, Ajax and other items of interest</description>
			<language>en-us</language>
			<pubDate>Sat, 18 May 2013 12:39:06 -0700</pubDate>
			<lastBuildDate>Sat, 21 Jul 2012 10:12:00 -0700</lastBuildDate>
			<generator>BlogCFC</generator>
			<docs>http://blogs.law.harvard.edu/tech/rss</docs>
			<managingEditor>sipacate@gmail.com</managingEditor>
			<webMaster>sipacate@gmail.com</webMaster>
			<itunes:subtitle></itunes:subtitle>
			<itunes:summary></itunes:summary>
			<itunes:category text="Technology" />
			<itunes:category text="Technology">
				<itunes:category text="Podcasting" />
			</itunes:category>
			<itunes:category text="Technology">
				<itunes:category text="Tech News" />
			</itunes:category>
			<itunes:keywords></itunes:keywords>
			<itunes:author></itunes:author>
			<itunes:owner>
				<itunes:email>sipacate@gmail.com</itunes:email>
				<itunes:name></itunes:name>
			</itunes:owner>
			
			<itunes:explicit>no</itunes:explicit>
			
			<item>
				<title>Caching for Fun and Profit: Or why would you ever cache a page for 5 seconds?</title>
				<link>http://www.nodans.com/index.cfm/2012/7/21/Caching-for-Fun-and-Profit-Or-why-would-you-ever-cache-a-page-for-5-seconds</link>
				<description>
				
				There are a lot of ways to cache data. You can cache a piece of data, a query, a page fragment, an entire page, or an entire website.

You can cache to local memory, local file storage, distributed memory, distributed file storage, a front cache, or a Content Delivery Network (CDN).

You can cache for ever, until the process regenerates, 5 years, 5 months, 5 days, 5 hours or 5 minutes. Heck, &lt;strong&gt;it might even, depending on the system, make sense to cache something for 5 seconds&lt;/strong&gt;. Maybe less.

&lt;h3&gt;Why would I cache something for 5 seconds?&lt;/h3&gt;
I know, I know, it seems silly to cache something for 5 seconds. You probably think this is a silly attempt at a ridiculous headline to grab clicks. However, let&apos;s explore.

To get much benefit from caching, cache the content longer than the service time. The service time is the total amount of time it takes to service the request and return the desired item. As an example, if a piece of content takes 5 seconds to generate, the service time is 5 seconds. To get any real benefit, we should cache the content for longer than 5 seconds. 

&lt;h3&gt;What happens if the service time is longer than the cache time?&lt;/h3&gt;
If the service time is longer than the cache time, requests for the piece of content will queue. With caching, we want to AVOID queuing, so it&apos;s important to know the service time of the call under a variety of circumstances. You mathematical types can read up on Little&apos;s law, if you are curious: &lt;a href=&quot;http://en.wikipedia.org/wiki/Little%27s_law&quot;&gt;http://en.wikipedia.org/wiki/Little%27s_law&lt;/a&gt;

&lt;h3&gt;A practical example&lt;/h3&gt;
Now, most cachable content has a service time of less than 5 seconds. Let&apos;s talk about what would happen in 2 identical systems.  To make things simple, we&apos;ll pretend the following:

&lt;ul&gt;
&lt;li&gt;There is only one process&lt;/li&gt;
&lt;li&gt;The service time of the process is 1 second&lt;/li&gt;
&lt;li&gt;The request levels are 1, 5, 15 and 30 requests per second.&lt;/li&gt;
&lt;li&gt;The non-cached system is real time, the cached system is cached for 5 seconds&lt;/li&gt;
&lt;/ul&gt;
In the non-cached system, here&apos;s how the requests per second (RPS) would look during 1 traffic hour:
&lt;ul&gt;
&lt;li&gt;3,600 @ 1 RPS &lt;/li&gt;
&lt;li&gt;18,000 @ 5 RPS &lt;/li&gt;
&lt;li&gt;54,000 @ 15 RPS &lt;/li&gt;
&lt;li&gt;108,000 @ 30 RPS &lt;/li&gt;
&lt;/ul&gt;

WOW! I bet we&apos;d have some major problems in a real time system under these conditions.

Let&apos;s compare with the system using a 5 second cache:
&lt;ul&gt;
&lt;li&gt;720 @ 1 RPS &lt;/li&gt;
&lt;li&gt;720 @ 5 RPS &lt;/li&gt;
&lt;li&gt;720 @ 15 RPS &lt;/li&gt;
&lt;li&gt;720 @ 30 RPS &lt;/li&gt;
&lt;/ul&gt;
Hmm, that looks odd. The requests in the 1 hour period never get over 720. Seems like an insurance policy against load. 

&lt;h3&gt;Let&apos;s look at the amount of requests we save at each of the levels:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;3,600-720=&lt;strong&gt;2,880&lt;/strong&gt; @ 1 RPS &lt;/li&gt;
&lt;li&gt;18,000-720=&lt;strong&gt;17,280&lt;/strong&gt; @ 5 RPS &lt;/li&gt;
&lt;li&gt;54,000-720=&lt;strong&gt;53,280&lt;/strong&gt; @ 15 RPS &lt;/li&gt;
&lt;li&gt;108,000-720=&lt;strong&gt;107,280&lt;/strong&gt; @ 30 RPS &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Wow! By caching for 5 seconds, we saved between 2,800 = 107,280 requests per hour.&lt;/h3&gt;
What&apos;s more interesting we can see &lt;strong&gt;we established a service ceiling&lt;/strong&gt; for our system. We&apos;ll never generate more than 720 requests an hour. No matter how many times the link goes viral on www.FunnyCats.com.

As traffic rates increase, the value from a 5 second cache also increases. In a world full of email blasts, viral links, email, IM, social media, we see more and more bursts of traffic. As traffic bursts, we approach the natural threshold of a system. A system can only go as fast as the slowest part, (&lt;a href=&quot;http://en.wikipedia.org/wiki/Amdahl%27s_law&quot;&gt;http://en.wikipedia.org/wiki/Amdahl%27s_law&lt;/a&gt;) so we need to make sure the slowest part is good enough for what business problem we are trying to solve.

&lt;h3&gt;So should we cache everything at 5 seconds?&lt;/h3&gt;
A 5 second cache isn&apos;t the answer to every problem though. Some content can&apos;t be cached at all. Like a shopping cart. Some content can be cached forever, like static content (named with a version number). Some content types do not seem cachable, but maybe could possibly be.

An example would be a page listing inventory. Perhaps the business is able to fulfill limited quantities of out of stock items. Maybe the products don&apos;t change often and come in all the time. In this case, it might be ok to cache inventory for 5 seconds and handle out-of-stock items by delaying shipment. The right answer depends on the business problem and the constraints on solutions. Which is a better problem to have, a down website, or a few out-of-stock orders to deal with?

&lt;h3&gt;Just for fun, let&apos;s look at the difference in caching for 5 seconds and caching for 5 minutes over 1 traffic hour:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;720-20=&lt;strong&gt;700&lt;/strong&gt; @ 1 RPS &lt;/li&gt;
&lt;li&gt;720-20=&lt;strong&gt;700&lt;/strong&gt; @ 5 RPS &lt;/li&gt;
&lt;li&gt;720-20=&lt;strong&gt;700&lt;/strong&gt; @ 15 RPS &lt;/li&gt;
&lt;li&gt;720-20=&lt;strong&gt;700&lt;/strong&gt; @ 30 RPS &lt;/li&gt;
&lt;/ul&gt;

The new service ceiling is 20 requests per hour. This is better than 720, for sure. However the savings aren&apos;t as dramatic as the no-cache to 5 second cache example. The reason why this is important is because we must balance the needs of the business with the needs of the system serving the business needs. Maybe the business can&apos;t afford to have information stale for 5 minutes, but 5 seconds is a reasonable level. You&apos;d only have to have your system able to support 720 hourly requests, versus 108,000. You can get away with a lot more at the 720 RPH (requests per hour) level than you can at 108,000 RPH.

I put together some charts showing the point of diminishing returns on longer cache intervals. The first chart shows the total number of requests in a 30 minute period at different traffic level times. Note the 5 minute period as the point in which there is no benefit visible on the chart.
&lt;p&gt;
&lt;img src=&quot;/images/extras/TotalRequestsIn30MinutePeriod.png&quot; style=&quot;margin: 2em&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
The second chart shows the total number of requests in a 4 minute period at different traffic level times. Note again, the 5 minute period as the point in which there is no visible benefit, considering the starting point.
&lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;/images/extras/TotalRequestsIn4HourPeriod.png&quot; style=&quot;margin: 2em&quot; /&gt;
&lt;/p&gt;
&lt;h3&gt;The answer is, as always, &quot;It Depends&quot;&lt;/h3&gt;
The right time to cache a piece of content really depends on all the elements in the equation. Caching, even in non-intuitive ways, can be used to solve business problems within the available solution constraints. 
				</description>
				
				<category>Wow</category>
				
				<category>Software Development</category>
				
				<category>Application Architecture</category>
				
				<pubDate>Sat, 21 Jul 2012 10:12:00 -0700</pubDate>
				<guid>http://www.nodans.com/index.cfm/2012/7/21/Caching-for-Fun-and-Profit-Or-why-would-you-ever-cache-a-page-for-5-seconds</guid>
				
				
			</item>
			
			<item>
				<title>How to get Oracle 8i to Start on Windows XP</title>
				<link>http://www.nodans.com/index.cfm/2012/6/14/How-to-get-Oracle-8i-to-Start-on-Windows-XP</link>
				<description>
				
				&lt;h2&gt;Oracle Error - Oracle Not Available&lt;/h2&gt;
&lt;p&gt;
I&apos;m working on a client project that uses an Oracle 8i database. We&apos;ll eventually convert this database to another platform at some point, but for now, we need to make some much needed changes to the existing platform.
&lt;/p&gt;
&lt;p&gt;
Oracle 8i doesn&apos;t seem to run on modern Windows Operating Systems so I installed it on Windows XP. This worked fine until I restarted the machine. Upon restart, the once functioning database service would not open. Connecting to the database gave the error &quot;Oracle not available&quot;.
&lt;/p&gt;
&lt;p&gt;
It turns out, this is a common issue and after researching and exploring various options, I finally got the database to start up with a series of steps.
&lt;/p&gt;
&lt;h3&gt;Here&apos;s what to do:&lt;/h3&gt;

&lt;p&gt;
Since this process involves starting services in a particular order, we need to change the 5 Oracle services below to start up manually: (Administrative Tools &gt; Services ) 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;OracleOraHome81TNSListener&lt;/li&gt;
&lt;li&gt;OracleOraHome81DataGatherer&lt;/li&gt;
&lt;li&gt;OracleOraHome81ClientCache&lt;/li&gt;
&lt;li&gt;OracleOraHome81Agent&lt;/li&gt;
&lt;li&gt;OracleWebAssistant0&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
While you are in there, change the name of your particular database service &quot;OracleServiceWhateverYourServiceNameIs&quot; to Manual also.
&lt;/p&gt;
&lt;p&gt;
After a reboot, start all 5 services in the order listed above. Once all services are up and running, start your database service: &quot;OracleServiceWhateverYourServiceNameIs&quot;
&lt;/p&gt;
&lt;p&gt;
It&apos;ll probably complain with an error afterwards, but that&apos;s ok.
&lt;/p&gt;
&lt;p&gt;
Go to Task Manager and kill the ORACLE.exe process running and restart the service for your database instance: &quot;OracleServiceWhateverYourServiceNameIs&quot;. 
&lt;/p&gt;
&lt;p&gt;
Try to connect to the database. Sometimes the service will be up and ready for service after these steps. If it is not, perform the following steps:
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the Database Configuration Assistant ( start&gt;Programs&gt;Oracle-oraHome8i&gt;database administration&gt; database configuration assistant )&lt;/li&gt;
&lt;li&gt;Choose &quot;Change Database Configuration&quot;&lt;/li&gt;
&lt;li&gt;After pressing Next, choose the instance you want to connect to.&lt;/li&gt;
&lt;li&gt;Press next 2 more times and the database will be ready for service then&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
At this point, you should be able to connect to your database with SQLPlus, or any other preconfigured connection. I hope this works as well for you as it worked for me.
&lt;/p&gt; 
				</description>
				
				<category>Software Development</category>
				
				<category>Server Configuration</category>
				
				<pubDate>Thu, 14 Jun 2012 07:47:00 -0700</pubDate>
				<guid>http://www.nodans.com/index.cfm/2012/6/14/How-to-get-Oracle-8i-to-Start-on-Windows-XP</guid>
				
				
			</item>
			
			<item>
				<title>Reporting Querys and COUNT(*) vs COUNT(1)</title>
				<link>http://www.nodans.com/index.cfm/2012/4/20/Reporting-Querys-and-COUNT-vs-COUNT1</link>
				<description>
				
				&lt;p&gt;I was working on a reporting query today and used several legacy queries as a base. When debugging and optimizing the query I found the query took 35+ seconds to crunch down to 72 records. Before worrying about indexes, I went over the query syntax and structure and found a COUNT(*) in one of the subqueries. Changing the COUNT(*) to a COUNT(1) turned the 35 second query into a 300ms query. Take a look for yourself:
&lt;/p&gt;
&lt;h3&gt;Query with COUNT(*)&lt;/h3&gt;
&lt;p&gt;
&lt;img src=&quot;/images/extras/StartSpeedSlow.jpg&quot; /&gt;
&lt;/p&gt;

&lt;h3&gt;Query with COUNT(1)&lt;/h3&gt;
&lt;p&gt;
&lt;img src=&quot;/images/extras/NoStarSpeed.jpg&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;
While the use of the * in SQL Queries is always a bad idea and considered very poor form, it can be baffling how bad it affect query performance. What other common mistakes do you see that have dramatic effects on queries?&lt;/p&gt;
&lt;p&gt;&lt;small&gt;The database in question is a development SQL Server 2005 database. I&apos;d be interested to know if other databases suffer equally.&lt;/small&gt;&lt;/p&gt; 
				</description>
				
				<category>Software Development</category>
				
				<pubDate>Fri, 20 Apr 2012 10:34:00 -0700</pubDate>
				<guid>http://www.nodans.com/index.cfm/2012/4/20/Reporting-Querys-and-COUNT-vs-COUNT1</guid>
				
				
			</item>
			
			<item>
				<title>ColdSpring 2.0 Alpha 1 Released! Your Help Needed!</title>
				<link>http://www.nodans.com/index.cfm/2011/10/25/ColdSpring-20-Alpha-1-Released-Your-Help-Needed</link>
				<description>
				
				&lt;p&gt;
&lt;a href=&quot;http://www.compoundtheory.com&quot;&gt;Mark Mandel&lt;/a&gt; posted information about the ColdSpring 2.0 Alpha release and I wanted to make sure it got out to the general public. There is a documentation contest running and your help is requested in trying out the release and helping to identify issues. Make sure you have joined the &lt;a href=&quot;http://groups.google.com/group/coldspring-users&quot;&gt;ColdSpring Users Group&lt;/a&gt; as this is the best way to give and get information about &lt;a href=&quot;http://coldspringframework.org&quot;&gt;ColdSpring&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Mark&apos;s Post is below for your reference&lt;/p&gt;


&lt;h3&gt;ColdSpring 2.0 Alpha 1 is now available for you to download and test!&lt;/h3&gt;
&lt;h4&gt;Major features included in this release:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Enhanced underlying architecture for greater extensibility&lt;/li&gt;
&lt;li&gt;XML Schema For ColdSpring configuration files&lt;/li&gt;
&lt;li&gt;New BeanDefinition architecture&lt;/li&gt;
&lt;li&gt;BeanFactoryInterceptors for intercepting BeanFactory lifecyle events&lt;/li&gt;
&lt;li&gt;BeanProcessInterceptors for intercepting Bean lifecyle events&lt;/li&gt;
&lt;li&gt;XML Custom Namespaces for defining your own XML dialect for creating and configurating beans&lt;/li&gt;
&lt;li&gt;Aspect Oriented Programming (AOP) Custom XML Namespaces&lt;/li&gt;
&lt;li&gt;Greatly extended AOP functionality with AOP expressions&lt;/li&gt;
&lt;li&gt;ColdFusion 9 ORM Integration classes&lt;/li&gt;
&lt;li&gt;Utility Custom XML Namespace for creation of data structures&lt;/li&gt;
&lt;li&gt;Enhanced error reporting&lt;/li&gt;
&lt;li&gt;Multiple Bean Scope support – beans can be prototype (transient), singleton, as well as request or session scope bound&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More details can be found in the release notes, and my blog post:
&lt;a href=&quot;https://sourceforge.net/apps/trac/coldspring/wiki/NewInColdSpring2.0&quot;&gt;https://sourceforge.net/apps/trac/coldspring/wiki/NewInColdSpring2.0&lt;/a&gt;
&lt;a href=&quot;http://www.compoundtheory.com/?action=displayPost&amp;ID=537&quot;&gt;http://www.compoundtheory.com/?action=displayPost&amp;ID=537&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
We are also running a competition to help flesh out the missing pieces of the documentation, with an opportunity to win a copy of ColdFusion Builder!
&lt;/p&gt;
&lt;p&gt;
Details can be found here:
&lt;a href=&quot;http://www.compoundtheory.com/?action=displayPost&amp;ID=538&quot;&gt;http://www.compoundtheory.com/?action=displayPost&amp;ID=538&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Happy testing!
&lt;/p&gt;
&lt;p&gt;
Thanks to all have been involved in this release!
&lt;/p&gt; 
				</description>
				
				<category>Software Development</category>
				
				<category>ColdFusion</category>
				
				<pubDate>Tue, 25 Oct 2011 06:31:00 -0700</pubDate>
				<guid>http://www.nodans.com/index.cfm/2011/10/25/ColdSpring-20-Alpha-1-Released-Your-Help-Needed</guid>
				
				
			</item>
			
			<item>
				<title>Quirk in MySQL Join Conditions</title>
				<link>http://www.nodans.com/index.cfm/2011/10/24/Quirk-in-MySQL-Join-Conditions</link>
				<description>
				
				&lt;p&gt;
I found a quirk in a join condition today that caused too many records to display. Look at the following query and notice the two AND clauses after the LEFT JOIN to activitytype.
&lt;/p&gt;
&lt;code&gt;
SELECT *
FROM  organization grouptable 
INNER JOIN (
	SELECT c.CommunityID, o.OrganizationID, d.DivisionID
	FROM
		community c
		LEFT JOIN organization o ON c.communityID = o.communityID 
		LEFT JOIN  division d ON o.organizationID  = d.organizationID
	WHERE c.communityID = 1
	) orgmodel ON (  grouptable.OrganizationID = orgmodel.OrganizationID )
INNER JOIN member m ON orgmodel.OrganizationID =  m.OrganizationID	
LEFT JOIN activity a ON a.memberID = m.memberID 
LEFT JOIN activitytype at ON a.activityTypeID = at.activityTypeID
AND hasDistance = 1
AND activityDate BETWEEN &apos;2011-08-01 00:00:00&apos; AND &apos;2011-10-24 13:38:14&apos;
ORDER BY activitydate
&lt;/code&gt;

&lt;p&gt;This query runs and returns 2918 rows. However, when I audit this data, I get rows back that are outside of the time bounds specified in the BETWEEN clause: ( AND activityDate BETWEEN &apos;2011-08-01 00:00:00&apos; AND &apos;2011-10-24 13:38:14&apos; ). There is no activityDate column on the table activitytype. There is an activityDate column on the activity table however. This means the query is parsed and executed without MySQL throwing an error, but the expression is not used to limit the number of joined rows. The correct recordset (428 rows) is easily obtained by moving the join condition to the correct join statement.
&lt;code&gt;
SELECT *
FROM  organization grouptable 
	INNER JOIN (
		SELECT c.CommunityID, o.OrganizationID, d.DivisionID
		FROM
			community c
			LEFT JOIN organization o ON c.communityID = o.communityID 
			LEFT JOIN  division d ON o.organizationID  = d.organizationID
		WHERE c.communityID = 1
		) orgmodel ON (  grouptable.OrganizationID = orgmodel.OrganizationID )
	INNER JOIN member m ON orgmodel.OrganizationID =  m.OrganizationID	
	LEFT JOIN activity a ON a.memberID = m.memberID AND activityDate BETWEEN &apos;2011-08-01 00:00:00&apos; AND &apos;2011-10-24 13:38:14&apos;
	LEFT JOIN activitytype at ON a.activityTypeID = at.activityTypeID
	AND hasDistance = 1
ORDER BY activitydate
&lt;/code&gt;

&lt;p&gt; I hope this helps someone else with their MySQL queries. &lt;/p&gt; 
				</description>
				
				<category>Software Development</category>
				
				<pubDate>Mon, 24 Oct 2011 12:30:00 -0700</pubDate>
				<guid>http://www.nodans.com/index.cfm/2011/10/24/Quirk-in-MySQL-Join-Conditions</guid>
				
				
			</item>
			
			<item>
				<title>Linux gaining on Apple - Current Visitors By Operating System</title>
				<link>http://www.nodans.com/index.cfm/2010/7/19/Linux-gaining-on-Apple--Current-Visitors-By-Operating-System</link>
				<description>
				
				I happened to be researching which platforms visit my web properties. I found some unexpected trends and thought some of you might be interested.

First, the obvious. Windows (the much maligned operating system) is firmly in 1st place with 85% of traffic.

In second place, Apple, with 7.4%. Then Linux in third, with 6.44%

&lt;h3&gt;Linux trails Apple by less than 1%?!?!&lt;/h3&gt;

By mindshare and mouthshare, I would have thought Apple would command a much larger lead. Especially since I write almost exclusively on technology topics.

What trends are you seeing on YOUR web properties?

&lt;img src=&quot;/images/extras/NodansBrowserVisitors.jpg&quot; /&gt; 
				</description>
				
				<category>Software Development</category>
				
				<pubDate>Mon, 19 Jul 2010 09:25:00 -0700</pubDate>
				<guid>http://www.nodans.com/index.cfm/2010/7/19/Linux-gaining-on-Apple--Current-Visitors-By-Operating-System</guid>
				
				
			</item>
			
			<item>
				<title>How to resolve svn: Error setting property &apos;log&apos;:</title>
				<link>http://www.nodans.com/index.cfm/2009/9/29/How-to-resolve-svn-Error-setting-property-log</link>
				<description>
				
				I was trying to check in some changes on the Model-Glue framework and kept getting this error:
&lt;img src=&quot;/images/extras/SVN-Hating-Multi-Line-Comments.jpg&quot; style=&quot;margin: .5em; float: right&quot; /&gt;

&lt;code&gt;
update D:/webroot/ModelGlueTrunk/ModelGlue/gesture -r HEAD --force
    At revision 184.
commit -m &quot;Removed potential recursion in this functionality...&quot; D:/webroot/ModelGlueTrunk/ModelGlue/gesture/helper/HelperInjector.cfc D:/webroot/ModelGlueTrunk/ModelGlue/gesture/helper/IncludeHelperShell.cfc
    Failed to execute WebDAV PROPPATCH
svn: Commit failed (details follow):
svn: At least one property change failed; repository is unchanged
RA layer request failed
svn: Error setting property &apos;log&apos;: 
Could not execute PROPPATCH.
&lt;/code&gt;

I updated from SVN, thinking it to be a synchronization error, but I still got the same error.

I used the &apos;cleanup&apos; or SVN:clean functionality to maybe get the .svn files and such back in to the right condition, but that didn&apos;t help either.

The original SVN Comment I used was: 

&lt;code&gt;
Removed potential recursion in this functionality
Also removed useless cfdump when a helper is attempted to be included but doesn&apos;t have a cfc or cfm extension
&lt;/code&gt;

Can you spot the issue?  I can&apos;t either. What fixed the error:
&lt;code&gt;
    Failed to execute WebDAV PROPPATCH
svn: Commit failed (details follow):
svn: At least one property change failed; repository is unchanged
RA layer request failed
svn: Error setting property &apos;log&apos;: 
Could not execute PROPPATCH.
&lt;/code&gt;

Was changing the multi-line comment to a single line comment. Once the comment was a single line, there was no issue checking it in. I&apos;m not sure what I learned here, but I hope SVN doesn&apos;t REALLY have a problem with multi-line comments, after all, we need those to keep details on what changed! 
				</description>
				
				<category>Subversion</category>
				
				<category>Software Development</category>
				
				<category>Server Configuration</category>
				
				<pubDate>Tue, 29 Sep 2009 07:31:00 -0700</pubDate>
				<guid>http://www.nodans.com/index.cfm/2009/9/29/How-to-resolve-svn-Error-setting-property-log</guid>
				
				
			</item>
			
			<item>
				<title>Usability and Error Messages</title>
				<link>http://www.nodans.com/index.cfm/2009/9/16/Usability-and-Error-Messages</link>
				<description>
				
				I often consider usability when using web applications, especially when I am the user.  Our lovely state of North Carolina, is very tech savvy and has a lot of online resources and help. Did you know that North Carolina was one of the first states to have it&apos;s own data center?

Today, I went online to change my address on my Driver License. Apparently there is some complication with my particular license (hopefully not a warrant out for my arrest :-) ) in the system and I need to go into a physical office for human assistance. As an application architect, I can see this is probably some poorly handled data condition. I can dig that, a computer can&apos;t handle EVERYTHING...

What prompted this post was a bit of musing on proper error messages. When humans interact with computers, by definition there is a depersonalization to the process. This depersonalization can add a level of harshness or friction into the equation, altering the perception of the organization to the user. Allow me to pontificate...

I often stay at nice hotels. Nice hotels always have extremely polite front desk staff to help check guests in. The check-in phase of the hotel stay sets the stage for perception. If the registration desk is nicely furnished, elegant and staffed with ultra-polite staff, guests perceive the hotel as a nicely furnished, elegant and ultra-polite and this perception sticks with them the entire trip. If there is some reason why a request can not be accommodated, say I ask for a room on the top floor and the top floor has already been booked, the registration staff apologize effusively and find a suitable arrangement. Even if I asked for something impossible, like a helicopter to take my bags to my room, the staff would politely and softly apologize that such a service was not available, then offer the services of a bellman for bag delivery.

Hotels definitely understand the human touch. Computers do not. Nor do the engineers that create applications. See, it was perfectly acceptable for some reason or another not to provide algorithms suitable for handling an address change with my specific type of license. The engineer probably had a meeting discussing just such an occurrence and it was deemed not critical for the application. So the engineer dutifully put in code to catch such an occurrence and then added an error message to halt the flow of the application. The engineer considered the application from the perspective of the application and this is what was implemented:

&lt;img src=&quot;/images/extras/UsabilityFailure.jpg&quot; style=&quot;margin: 1em;&quot; /&gt;
&lt;br /&gt;

Ouch. Nothing like a BIG RED STOP SIGN.

STOP! It says.. The text, actually, isn&apos;t half bad because it attempts to explain the issue, &quot;...Multiple Address Records...&quot; and offer to help me find the nearest office. But, I reeled from the impact of that stop sign.

To stick with the hotel analogy, it was as if I approached the registration desk, asked for a room with a King Sized bed, and the clerk said, &quot;We have no king beds&quot; then &lt;strong&gt;slapped me across the face&lt;/strong&gt;, WACK!

I&apos;m sure all of this seemed rather normal for the Application Engineer, who had undoubtedly seen this error page hundreds of times before during testing and was desensitized to it. Me, however, expecting to see a helpful page allowing me to change my address, was a little taken aback by the HONKING BIG RED STOP SIGN OF DOOM CLUBBING ME LIKE A BABY SEAL.

So, I mused a little bit this morning and made a decision to pay a little more attention to the human factor and to usability. I challenge you to do the same in your applications.

Do you have a screenshot example of a ridiculously insulting error message? &lt;a href=&quot;http://www.nodans.com/contact.cfm&quot;&gt;Submit a link of the image to me&lt;/a&gt; and I&apos;ll post it here for the amusement of others... 
				</description>
				
				<category>Software Development</category>
				
				<category>Stupidity</category>
				
				<pubDate>Wed, 16 Sep 2009 07:51:00 -0700</pubDate>
				<guid>http://www.nodans.com/index.cfm/2009/9/16/Usability-and-Error-Messages</guid>
				
				
			</item>
			
			<item>
				<title>Performance tuning for ColdFusion applications and Comment</title>
				<link>http://www.nodans.com/index.cfm/2009/6/9/Performance-tuning-for-ColdFusion-applications-and-Comment</link>
				<description>
				
				&lt;p&gt;Kunal Saini, an Adobe employee, recently posted an &lt;a href=&quot;http://www.adobe.com/devnet/coldfusion/articles/coldfusion_performance.html&quot; target=&quot;_blank&quot;&gt;article on Adobe Developer Connection about Performance tuning for ColdFusion applications&lt;/a&gt;. This is a well written article full of useful tips and practices and should be a must read on the topic.&lt;/p&gt;

&lt;p&gt;I will raise a counter point to one of the minor tips Kunal raised. He says:&lt;/p&gt;
&lt;h4&gt;compare() and compareNoCase()&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Use compare() or compareNoCase() instead of the is not operator to compare two items. They are a bit faster.
&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I trust Kunal has insider knowledge about the implementations of these two compare functions, because I fail to see how a straight evaluation (&amp;lt;cfif dan IS 1337&gt;) can be slower than a function call ( compare(dan, 1337) IS 0 ). Maybe it has to do with the type inference and type conversion ColdFusion does as a dynamically typed language, maybe it is something else. Regardless I avoid using compare() and compareNoCase() because both functions reduce the readability of the code.&lt;/p&gt;

&lt;p&gt;Whereas all boolean comparisons in ColdFusion treat 1 as true and 0 as false, the compare and compareNoCase functions return 0 if the comparison is true. This means compare( 1, 1) will return 0, which doesn&apos;t follow the boolean rules. Since this does not follow the rules, code using compare and compareNoCase is harder to read, harder to follow, and generally uglier than straight comparisons.&lt;/p&gt;
&lt;p&gt;So Kunal, I don&apos;t take anything away from your statements and I appreciate you writing the article. I want to point out that software isn&apos;t all about micro-performance, it is also about long-term maintainability. Always write your code to be readable by others.&lt;/p&gt;
&lt;p&gt;Of course, if you happen to write the next Facebook and you need to squeeze every possible fraction of a millisecond out of a routine, then throw this advice right out the window. But then again, you&apos;d have already tuned every single query permutation, added a clustered caching layer, offloaded your static files to a Content Delivery Network and clustered your infrastructure Horizontally and Vertically, haven&apos;t you?&lt;/p&gt; 
				</description>
				
				<category>Software Development</category>
				
				<category>Application Architecture</category>
				
				<pubDate>Tue, 09 Jun 2009 17:17:00 -0700</pubDate>
				<guid>http://www.nodans.com/index.cfm/2009/6/9/Performance-tuning-for-ColdFusion-applications-and-Comment</guid>
				
				
			</item>
			
			<item>
				<title>The Art Of Method Names</title>
				<link>http://www.nodans.com/index.cfm/2009/5/21/The-Art-Of-Method-Names</link>
				<description>
				
				&lt;p&gt;I write from time to time on code quality and structure because it is a topic of interest to me. Clean code and well named logical structures, methods and objects really pay off during the infinitely long Support And Maintenance phase of software development.&lt;/p&gt;
&lt;p&gt;Some could accuse me of having too many opinions on the topic, and I&apos;d guess they could be on to something. Heck, I&apos;ll probably disagree with something I&apos;ve said today, tomorrow, just because I&apos;m always refining and learning.&lt;/p&gt;
&lt;p&gt;While some of what I think/advocate/do is opinions, and could be subjective, I&apos;d like to share some code I found on a project today and talk about the importance of method names.&lt;/p&gt;
&lt;p&gt;A method should describe it&apos;s intent or behavior at the level of where it is inside the program. For example, a method named load() might be sufficiently descriptive to represent the behavior and be flexible enough to withstand a refactor or two. In other places in the program, perhaps the right method name is loadShippedOrders() since there will always be the concept of a shipped order in our proverbial system.&lt;/p&gt;
&lt;p&gt;You get the point, right? There is a wide range of OK-ness for method names, with behavioral descriptiveness and refactorability as being two made up words that really judge the method name quality.&lt;/p&gt;
&lt;p&gt;I found code today that really flies in the face of any of these principles. The names of these methods do not in any way describe any behavior of any system I&apos;ve ever written, nor will probably be lucky enough to write. &lt;/p&gt;
&lt;p&gt;&lt;em&gt;method bodies removed to protect client interests&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;Be the Judge Yourself:&lt;/h4&gt;
&lt;code&gt;
&lt;cfcomponent name=&quot;ET&quot;&gt;
  &lt;cffunction name=&quot;phoneHome&quot; output=&quot;yes&quot;&gt;
  &lt;/cffunction&gt;

  &lt;cffunction name=&quot;createDir&quot;&gt;
  &lt;/cffunction&gt;

  &lt;cffunction name=&quot;createDirImpl&quot;&gt;
  &lt;/cffunction&gt;

  &lt;cffunction name=&quot;beamMeUp&quot;&gt;
  &lt;/cffunction&gt;

  &lt;cffunction name=&quot;energize&quot;&gt;
  &lt;/cffunction&gt;

  &lt;cffunction name=&quot;setPhaserToKill&quot;&gt;
  &lt;/cffunction&gt;
&lt;/cfcomponent&gt;
&lt;/code&gt;

&lt;p&gt;Before you ask, this code was found in a production eCommerce system that is currently running that has nothing to do with Phasers, Energization nor beaming anything to any location.&lt;/p&gt; 
				</description>
				
				<category>Object Oriented</category>
				
				<category>Software Development</category>
				
				<category>Application Architecture</category>
				
				<pubDate>Thu, 21 May 2009 01:12:00 -0700</pubDate>
				<guid>http://www.nodans.com/index.cfm/2009/5/21/The-Art-Of-Method-Names</guid>
				
				
			</item>
			
			<item>
				<title>Hard Coding Scopes In CFCs Is A No No!</title>
				<link>http://www.nodans.com/index.cfm/2009/5/3/Hard-Coding-Scopes-In-CFCs-Is-A-No-No</link>
				<description>
				
				&lt;h4&gt;Now Hear This!&lt;/h4&gt;
&lt;p&gt;This is a public service announcement. If you hard code scopes inside your CFCs (request, application, session), stop today.&lt;/p&gt;
&lt;p&gt;I know it might be &apos;easier&apos; or &apos;cleaner&apos; or less lines of code, but you are really painting yourself into a corner when you do this.&lt;/p&gt;
&lt;p&gt;An object (CFC) should not know or have access to ANYTHING outside of itself, its configuration and its immediate dependent objects.&lt;/p&gt;
&lt;p&gt;If you want to question/argue with me on this, go for it. (Just go &lt;a href=&quot;http://en.wikipedia.org/wiki/Information_hiding&quot; target=&quot;_blank&quot; /&gt;Read Up On Information Hiding&lt;/a&gt; before you do). &lt;/p&gt;
&lt;h4&gt;That Is All&lt;/h4&gt; 
				</description>
				
				<category>Object Oriented</category>
				
				<category>Software Development</category>
				
				<category>For N00bs</category>
				
				<category>Application Architecture</category>
				
				<pubDate>Sun, 03 May 2009 23:56:00 -0700</pubDate>
				<guid>http://www.nodans.com/index.cfm/2009/5/3/Hard-Coding-Scopes-In-CFCs-Is-A-No-No</guid>
				
				
			</item>
			
			<item>
				<title>I Present Making Bad Code Good To The CFMeetup March 5th @ 6:00 EST</title>
				<link>http://www.nodans.com/index.cfm/2009/3/2/I-Present-Making-Bad-Code-Good-To-The-CFMeetup-March-5th--600-EST</link>
				<description>
				
				&lt;p&gt;
At 6:00 EST this Thursday, March 5th, I present &lt;strong&gt;Making Bad Code, Good&lt;/strong&gt; to the Online ColdFusion Meetup. You can attend this presentation virtually, by &lt;a href=&quot;http://experts.acrobat.com/cfmeetup/&quot; target=&quot;_blank&quot;&gt;visiting the Online ColdFusion Meeting Room&lt;/a&gt; at 6:00 EST.&lt;/p&gt;
&lt;p&gt;
If you work on a legacy application, or on code built by lots of
developers over the years, you likely laugh your way through this presentation. I promise to be thought provoking and challenge the way you write code. In this session, we&apos;ll look at lots of code samples and walk through making incremental changes to speed development, reduce errors and make life easier for everyone involved.
&lt;/p&gt;

&lt;p&gt;
Ideas and concepts in this presentation will help you improve your existing applications and write more maintainable code.
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://experts.na3.acrobat.com/p38399329/&quot; target=&quot;_new&quot;&gt;The recorded presentation can be watched now!&lt;/a&gt;&lt;/p&gt; 
				</description>
				
				<category>Object Oriented</category>
				
				<category>ColdFusion</category>
				
				<category>Software Development</category>
				
				<category>Application Architecture</category>
				
				<category>Practical Refactoring</category>
				
				<pubDate>Mon, 02 Mar 2009 18:11:00 -0700</pubDate>
				<guid>http://www.nodans.com/index.cfm/2009/3/2/I-Present-Making-Bad-Code-Good-To-The-CFMeetup-March-5th--600-EST</guid>
				
				
			</item>
			
			<item>
				<title>Of Software Design, The Law of Demeter and Credit Card Companies</title>
				<link>http://www.nodans.com/index.cfm/2009/2/18/Of-Software-Design-The-Law-of-Demeter-and-Credit-Card-Companies</link>
				<description>
				
				&lt;p&gt;
The Law of Demeter is a Software Engineering principle guiding how objects should talk to each other. From &lt;a href=&quot;http://en.wikipedia.org/wiki/Law_of_Demeter&quot; taget=&quot;_new&quot;&gt;Wikipedia&lt;/a&gt;:
&lt;/p&gt;
&lt;p&gt;
	&lt;blockquote&gt;
		The Law of Demeter (LoD), or Principle of Least Knowledge, is a design guideline for developing software, particularly object-oriented programs ...[and] ...can be succinctly summarized as &quot;Only talk to your immediate friends.&quot; The fundamental notion is that a given object should assume as little as possible about the structure or properties of anything else (including its subcomponents).
	&lt;/blockquote&gt;
&lt;/p&gt;
&lt;h2&gt;We Don&apos;t Need No Stinking Laws&lt;/h2&gt;
&lt;p&gt;Now, I&apos;m no fan of laws, so I privately refer to this as the General Guideline of Demeter, even though it doesn&apos;t sound as snappy or cool. However, just because there are valid reasons to break it, doesn&apos;t take away from the validity of the intent. Let&apos;s look at 2 code examples blatantly ripped off from the &lt;a href=&quot;http://groups.google.com/group/cfcdev&quot; target=&quot;_blank&quot;&gt;CFCDEV mailing list:&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Conforms To &lt;strike&gt;Law&lt;/strike&gt; General Guideline of Demeter&lt;/h3&gt;
&lt;code&gt;
Room.canCustomizeWindow()
Room.canSelectStyle()
Room.hasCeilingFan()
&lt;/code&gt;

&lt;h3&gt;Violates &lt;strike&gt;Law&lt;/strike&gt; General Guideline of Demeter&lt;/h3&gt;
&lt;code&gt;
Room.getPlan().canCustomizeWindow()
Room.getPlan().canSelectStyle()
Room.getPlan().hasCeilingFan()
&lt;/code&gt;
&lt;h2&gt;Ok, So What?&lt;/h2&gt;
&lt;p&gt;In the conforming set of statements, the room is asked directly whether or not certain things can happen. The implementation (steps required to complete the task) are hidden from the calling code.  This is encapsulated and will help insulate callers from changes in the implementation.&lt;/p&gt;
&lt;p&gt;In the violating set of statements, the calling code has to get a reference to Room, then ask Room for a Plan and then query the plan. Now calling code is expected to know about this Plan and what the plan knows. This adds another level of coupling and if Plan changes, then a whole lot of code has to change as well.&lt;/p&gt;
&lt;p&gt;However, to the programmer, the violating syntax (Room.getPlan().canSelectStyle()) could make sense. It might be that the programmer doesn&apos;t want to refactor Room and using getPlan() is a faster way to do something. If the code works, is it wrong?&lt;/p&gt;
&lt;h2&gt;I Don&apos;t Follow All This Abstract Stuff. You Are Losing Me!&lt;/h2&gt;
&lt;p&gt;Ok, fair enough. My eyes glaze over with too much abstract stuff too. Let&apos;s look at an analogy.&lt;/p&gt;
&lt;p&gt;I made a call to a credit card company. The essence of the call was:

&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep:&lt;/strong&gt; &lt;small&gt;&lt;em&gt;CreditCardRep.answerPhone()&lt;/em&gt;&lt;/small&gt;&lt;br /&gt; Thanks for calling Law Of Demeter Credit Card Company, how may I help you?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; Hi, My name is Dan Wilson. I have a question as to a charge on my latest bill.
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep:&lt;/strong&gt; Hi Dan, I&apos;m Tracy. I can help you with that. For security purposes, what is your account number, mothers maiden name and shoe size?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; Acct: 333-444-555-5555 mothers maiden: Stratulat Shoe Size: 9
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep:&lt;/strong&gt; &lt;small&gt;&lt;em&gt;CreditCardRep.verifyAccountInformation()&lt;/em&gt;&lt;/small&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Perfect. What is the charge you wish to inquire about?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; I have a 17.99 charge to ILovePets.com on Feb 7th. I can&apos;t find my receipt so I don&apos;t know what this is for.
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep:&lt;/strong&gt; &lt;small&gt;&lt;em&gt;CreditCardRep.lookUpTransaction()&lt;/em&gt;&lt;/small&gt; From the transaction details, you purchased a red dog sweater. Do you recall that purchase?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; (Embarassed) Yeah. ok No problem. I also wanted to change my mailing address. Can you help me with that?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep:&lt;/strong&gt; Of course, what is the new address?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; 123 ColdFusion Lane, Surf City, North Carolina.
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep:&lt;/strong&gt; &lt;small&gt;&lt;em&gt;CreditCardRep.updateAccountAddress()&lt;/em&gt;&lt;/small&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ok. I&apos;ve updated the address. Is there anything else I can help you with?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; No thanks. That takes care of me.. have a nice day!
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep:&lt;/strong&gt; OK Dan. Thanks for calling Law Of Demeter Credit Card Company. Have a nice day.
&lt;/p&gt;

&lt;h2&gt;What Am I Supposed To Get From That Example?&lt;/h2&gt;
&lt;p&gt;Note how I called the CC company and talked with a representative. I only spoke to that representative and was not exposed to any implementation nor had to talk to any other objects to get my tasks done. Let&apos;s look at the converse example:&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep:&lt;/strong&gt; &lt;small&gt;&lt;em&gt;CreditCardRep.answerPhone()&lt;/em&gt;&lt;/small&gt; Thanks for calling Demeter Violation Credit Card Company, how may I help you?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; Hi, My name is Dan Wilson. I have a question as to a charge on my latest bill.
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep:&lt;/strong&gt; Hi Dan, I&apos;m Tracy. I can help you with that. For security purposes, what is your account number, mothers maiden name and shoe size?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; Acct: 333-444-555-5555 mothers maiden: Stratulat Shoe Size: 9
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep:&lt;/strong&gt; &lt;small&gt;&lt;em&gt;CreditCardRep.verifyAccountInformation()&lt;/em&gt;&lt;/small&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Perfect. I can refer you to our Payment Inquiry Department. May I place you on hold?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; Ummm... ok.
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep:&lt;/strong&gt; Perfect. &lt;small&gt;&lt;em&gt;CreditCardRep.getPaymentInquiryRep()&lt;/em&gt;&lt;/small&gt; ......
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep 2:&lt;/strong&gt; Hello, this is Jessica, the Payment Inquiry &lt;strike&gt;Object&lt;/strike&gt;Representative. For security purposes, what is your account number, mothers maiden name and shoe size? 
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; (Grumbles...  didn&apos;t I already say this once?) Acct: 333-444-555-5555 mothers maiden: Stratulat Shoe Size: 9
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep 2:&lt;/strong&gt; &lt;small&gt;&lt;em&gt;CreditCardRep.getPaymentInquiryRep().verifyAccountInformation()&lt;/em&gt;&lt;/small&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Perfect. What is the charge you wish to inquire about?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; I have a 17.99 charge to ILovePets.com on Feb 7th. I can&apos;t find my receipt so I don&apos;t know what this is for.
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep 2:&lt;/strong&gt; &lt;small&gt;&lt;em&gt;CreditCardRep.getPaymentInquiryRep().lookUpTransaction()&lt;/em&gt;&lt;/small&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; From the transaction details, you purchased a red dog sweater. Do you recall that purchase?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; (Embarassed), yeah. ok No problem. I also wanted to change my mailing address. Can you help me with that?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep 2:&lt;/strong&gt; No, I am sorry. Our Address Change department handles that. Would you mind if I placed you on hold?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; (Grumbles, looks at watch) Ummm... ok.
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep 2:&lt;/strong&gt; Perfect. &lt;small&gt;&lt;em&gt;CreditCardRep.getPaymentInquiryRep().getAddressChangeRep()&lt;/em&gt;&lt;/small&gt;  ......
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep 3:&lt;/strong&gt; Hello, this is Ann, the Address Change &lt;strike&gt;Object&lt;/strike&gt;Representative. For security purposes, what is your account number, mothers maiden name and shoe size?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; (Grumbles... Kicks Dog) Acct: 333-444-555-5555 mothers maiden: Stratulat Shoe Size: 9
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep 3:&lt;/strong&gt; &lt;small&gt;&lt;em&gt;CreditCardRep.getPaymentInquiryRep().getAddressChangeRep().verifyAccountInformation()&lt;/em&gt;&lt;/small&gt; Perfect. What is the new address?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; 123 ColdFusion Lane, Surf City, North Carolina.
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep 3:&lt;/strong&gt; &lt;small&gt;&lt;em&gt;CreditCardRep.getPaymentInquiryRep().getAddressChangeRep().updateAccountAddress()&lt;/em&gt;&lt;/small&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ok. I&apos;ve updated the address. Is there anything else I can help you with?
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me:&lt;/strong&gt; No thanks. That takes care of me.. have a nice day!
&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CC Rep 3:&lt;/strong&gt; OK Dan. Thanks for calling Demeter Violation Credit Card Company. Have a nice day.
&lt;/p&gt;

&lt;h2&gt;And What Shall I Gain From That Example?&lt;/h2&gt;
&lt;p&gt;I&apos;m sure you have had a similar experience calling a credit card company. Did you feel like their processes were well designed? Wasn&apos;t it a much cleaner experience to just deal with the main object and let it handle the implementation of getting the tasks done? &lt;/p&gt;
&lt;p&gt;Circling back to the Law of Demeter, note this passage from &lt;a href=&quot;http://en.wikipedia.org/wiki/Law_of_Demeter&quot; taget=&quot;_new&quot;&gt;Wikipedia&lt;/a&gt;:
	&lt;blockquote&gt;
	When applied to object-oriented programs, the Law of Demeter can be more precisely called the &quot;Law of Demeter for Functions/Methods&quot; (LoD-F). In this case, an object A can request a service (call a method) of an object instance B, but object A cannot &quot;reach through&quot; object B to access yet another object, C, to request its services. Doing so would mean that object A implicitly requires greater knowledge of object B&apos;s internal structure. Instead, B&apos;s class should be modified if necessary so that object A can simply make the request directly of object B, and then let object B propagate the request to any relevant subcomponents. Or A should have a direct reference to object C and make the call directly. If the law is followed, only object B knows its own internal structure.
	&lt;/blockquote&gt;
So if I am Object A, should I really be exposed to the fact that the credit card company even has a Payment Inquiry Department or an Address Change department? Surely these internal details should be kept inside the CC Company Object, not sprinkled through all the various objects that interact with a Credit Card Company.
&lt;/p&gt;
&lt;h2&gt;What Should I Take Away From This Nonsensical Post?&lt;/h2&gt;
&lt;p&gt;The call dialogue examples above are contrived, I admit, but think of the above dialogues as a set of design requirements for software. Now ask yourself the following questions:
	&lt;ul&gt;
		&lt;li&gt;What would have to be updated in each of the designs if the CC company added an account verification department that validated account number, mothers maiden name and shoe size?&lt;/li&gt;
		&lt;li&gt;What would have to be updated in each of the designs if the CC Company merged the Payment Inquiry department with the Address Change Department?&lt;/li&gt;
		&lt;li&gt;Which design better encapsulates the implementation from the caller?&lt;/li&gt;
		&lt;li&gt;Which design incurs less ripple effect from design changes?&lt;/li&gt;
	&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;Thoughts, concerns, comments?  Add them below!&lt;/p&gt; 
				</description>
				
				<category>Object Oriented</category>
				
				<category>Software Development</category>
				
				<category>Application Architecture</category>
				
				<pubDate>Wed, 18 Feb 2009 18:59:00 -0700</pubDate>
				<guid>http://www.nodans.com/index.cfm/2009/2/18/Of-Software-Design-The-Law-of-Demeter-and-Credit-Card-Companies</guid>
				
				
			</item>
			
			<item>
				<title>Tip to Speed Up Your Website - Compress CSS</title>
				<link>http://www.nodans.com/index.cfm/2009/1/26/Tip-to-Speed-Up-Your-Website--Compress-CSS</link>
				<description>
				
				&lt;p&gt;
	There are a number of ways to speed up a website. An easy one would be to compress asset files and compact the files. 
	This has been widely done for Javascript files with popular tools such as &lt;a href=&quot;http://www.crockford.com/javascript/jsmin.html&quot; target=&quot;_blank&quot;&gt;JSMIN&lt;/a&gt; and &lt;a href=&quot;http://dean.edwards.name/packer/&quot; target=&quot;_blank&quot;&gt;Packer&lt;/a&gt;.
&lt;/p&gt; 
&lt;p&gt;
	The general idea behind compression/combination is to reduce the number of characters that must be sent over the wire as well as reduce the number of HTTP calls that must be made. Each time a browser gets a request to download a JS file, there is a certain amount of overhead incurred in negotiating and completing the HTTP request. Combining all JS files into one file is a great way to speed up a web application.
&lt;/p&gt;
&lt;h3&gt;Everyone Already Knows This, Right?&lt;/h3&gt;
&lt;p&gt;Probably. However, CSS files can often be as numerous and verbose as Javascript files. How come there no public outcry for CSS compression/combination?&lt;/p&gt;
&lt;p&gt;There happens to be a compressor/combinator that handles CSS files, the &lt;a href=&quot;http://developer.yahoo.com/yui/compressor/&quot; target=&quot;_blank&quot;&gt;YUI Compressor&lt;/a&gt;. For most web application developers, YUI Compressor is an annoying tool to use because, as a java application, it must be installed and run from the command line. Yuck!, right?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.scriptalizer.com&quot; target=&quot;_blank&quot;&gt;Scriptalizer&lt;/a&gt;, developed by ColdFusion luminary &lt;a href=&quot;http://ajlcom.instantspot.com/blog/&quot; target=&quot;_blank&quot;&gt;Aaron Lynch&lt;/a&gt;, is a web front end for the YUI compressor. Scriptalizer has handled Javascript compression/combination for a while now and is a nicely designed, easy to use tool. Aaron recently added support for CSS compression/combination. Now, dealing with CSS files is as simple as dealing with JS files.&lt;/p&gt;
&lt;h3&gt;How well does it work?&lt;/h3&gt;
&lt;p&gt;I added all 14 CSS files from &lt;a href=&quot;http://thehealthchallenge.com&quot; target=&quot;_blank&quot;&gt;The Health Challenge&lt;/a&gt; and compressed/combined them with Scriptalizer. Here are the results:

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Number of Files Before:&lt;/strong&gt; 14&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;File Size of All Files:&lt;/strong&gt; 35.42 KB&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Number of Files After:&lt;/strong&gt; 1&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;File Size of All Files:&lt;/strong&gt; 19.96 KB&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;As you can see, the reduction was significant. Not only have I cut the size of my CSS assets by ~50%, I have also removed 13 HTTP connections.&lt;/p&gt; 
				</description>
				
				<category>Wow</category>
				
				<category>Software Development</category>
				
				<category>Javascript</category>
				
				<pubDate>Mon, 26 Jan 2009 22:57:00 -0700</pubDate>
				<guid>http://www.nodans.com/index.cfm/2009/1/26/Tip-to-Speed-Up-Your-Website--Compress-CSS</guid>
				
				
			</item>
			
			<item>
				<title>Fix for: 500 Null Corrupt form data: no leading boundary</title>
				<link>http://www.nodans.com/index.cfm/2009/1/22/Fix-for-500-Null-Corrupt-form-data-no-leading-boundary</link>
				<description>
				
				&lt;h2&gt;Another 500 Null Error / Solution&lt;/h2&gt;
&lt;p&gt;I ran into a strange error in the registration section of TheHealthChallenge.com where Internet Explorer users &lt;em style=&quot;font-size: 90%&quot;&gt;(Editors Note: Remove defamatory comments re: Internet Explorer Development Team and gratuitious comparisons about the size of their brains vs. size of their egos )&lt;/em&gt; clicking a button would cause a 500 Null.&lt;/p&gt;
&lt;h3&gt;Here are the error details:&lt;/h3&gt;
&lt;p&gt;

&lt;code&gt;
500 
Corrupt form data: no leading boundary:  != -----------------------------7d93d92a60680


java.io.IOException: Corrupt form data: no leading boundary:  != -----------------------------7d93d92a60680
	at com.oreilly.servlet.multipart.MultipartParser.&lt;init&gt;(MultipartParser.java:174)
	at com.oreilly.servlet.multipart.MultipartParser.&lt;init&gt;(MultipartParser.java:93)
&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;Can anyone venture a guess as to what the problem was?  You want more information? Take a look at the form code as well:&lt;/p&gt;
&lt;h3&gt;Here is the HTML for the Form:&lt;/h3&gt;
&lt;p&gt;
&lt;code&gt;
&lt;form action=&quot;index.cfm?x=register&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot; id=&quot;registerForm&quot; class=&quot;uniForm&quot;&gt;
	&lt;fieldset class=&quot;inlineLabels&quot;&gt;
		&lt;div class=&quot;ctrlHolder&quot;&gt;
			&lt;label for=&quot;register&quot;&gt; Need an Account?&lt;/label&gt;
			&lt;p class=&quot;formHint&quot;&gt;registration takes only 53 seconds&lt;/p&gt;
		&lt;/div&gt;
	&lt;/fieldset&gt;
		&lt;div class=&quot;buttonHolder&quot;&gt;
			&lt;button type=&quot;submit&quot; class=&quot;submitButton&quot;&gt;Start Registration&lt;/button&gt;
		&lt;/div&gt;
&lt;/form&gt;
&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;By the looks of the HTML code above, a single button will be drawn on the screen along with some friendly text. So why the error?&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;Apparently Internet Explorer does not handle serializing the form post if there is no content and what it sends to the server is not what the server expects. Possible resolutions for this are to remove the [enctype=&quot;multipart/form-data&quot;] attribute or change the [method=&quot;post&quot;] to [method=&quot;get&quot;]. Either one will work as intended.&lt;/p&gt;

&lt;p&gt;I happened to create this set of circumstances by using the &lt;a href=&quot;http://cfuniform.riaforge.org/&quot; target=&quot;_new&quot;&gt;CFUniform library&lt;/a&gt; in a way it was not designed for. I mentioned this to &lt;a href=&quot;http://www.quackfuzed.com/&quot; target=&quot;_new&quot;&gt;Matt Quackenbush&lt;/a&gt; who reworked the inner workings of the CFUniform Library to intelligently figure out if a file upload control is in the form or not. If one exists, the [enctype=&quot;multipart/form-data&quot;] attribute will be included automatically. If you experience the 500 Null problem listed in this post, and you are using the CFUniform Library, simply update your version from &lt;strong&gt;http://cfuniform.riaforge.org/&lt;/strong&gt; and you&apos;ll be all set.&lt;/p&gt; 
				</description>
				
				<category>Software Development</category>
				
				<pubDate>Thu, 22 Jan 2009 19:05:00 -0700</pubDate>
				<guid>http://www.nodans.com/index.cfm/2009/1/22/Fix-for-500-Null-Corrupt-form-data-no-leading-boundary</guid>
				
				
			</item>
			</channel></rss>