<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">

<channel>
	<title>Orange is my favorite color</title>
	
	<link>http://www.ghidinelli.com</link>
	<description />
	<pubDate>Thu, 17 Jul 2008 12:03:09 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<geo:lat>37.772329</geo:lat><geo:long>-122.41087</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/OrangeIsMyFavoriteColor" type="application/rss+xml" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">358348</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://www.feedburner.com</feedburner:feedburnerHostname><item>
		<title>Jerry Tam</title>
		<link>http://www.ghidinelli.com/2008/07/17/jerry-tam/</link>
		<comments>http://www.ghidinelli.com/2008/07/17/jerry-tam/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 12:01:36 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=206</guid>
		<description><![CDATA[


I found out not long ago that my good friend and college housemate Jerry Tam had made the cut and would be appearing on Season 5 of Bravo TV&#8217;s Project Runway.  I&#8217;m currently in Europe right now so I went looking to find some details about the season premiere last night.  Knowing Jerry [...]]]></description>
			<content:encoded><![CDATA[<div class="wpg2right">
<div class="wpg2tag-image"><a href="http://www.ghidinelli.com/wpg2/?g2_itemId=1694" title="Flowers?  Jerry, you're so sweet..."><img src="http://www.ghidinelli.com/life/main.php?g2_view=core.DownloadItem&amp;g2_itemId=1695&amp;g2_serialNumber=3" width="150" height="118" id="IFid2" class="ImageFrame_None" alt="Flowers?  Jerry, you're so sweet..."/></a></div>
</div>
<p>I found out not long ago that my good friend and college housemate <a href="http://www.jerrytam.com">Jerry Tam</a> had made the cut and would be appearing on Season 5 of Bravo TV&#8217;s Project Runway.  I&#8217;m currently in Europe right now so I went looking to find some details about the season premiere last night.  Knowing Jerry as well as I do, he was either going to win it all or get kicked off the first episode and unfortunately it was the latter.</p>
<p>Tam has an incredible amount of talent and vision wound up into a 150 beats-per-minute kind of frenetic energy.  This is a guy who went from growing up in Montana bussing tables in his dad&#8217;s Chinese Restaurant to start his own fashion label in Manhattan, <a href="http://www.jerrytam.com">FORM</a>.  That was not the shortest path between two points.</p>
<p>People think succeeding in business just requires a great idea but ideas don&#8217;t blossom on their own.  Success takes hard work, long nights, persistence and an undying conviction that you can do it better than everyone else.  While he may have lost out on Project Runway, I know Jerry has those qualities required to succeed.</p>
<p>You&#8217;re still 1 of 16 buddy and we&#8217;re all proud of you here on the left coast!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=vLsdVJ"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=vLsdVJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=iL22IJ"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=iL22IJ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2008/07/17/jerry-tam/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Clearing trusted cache with Admin API fails</title>
		<link>http://www.ghidinelli.com/2008/07/04/clearing-trusted-cache-with-admin-api-fails/</link>
		<comments>http://www.ghidinelli.com/2008/07/04/clearing-trusted-cache-with-admin-api-fails/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 17:12:25 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=205</guid>
		<description><![CDATA[I&#8217;m testing an application on ColdFusion 8 in preparation for an upgrade and have found a strange error.  My reinit process clears the trusted cache using the Admin API along with restarting Coldspring and Model-Glue.   On CF7, the following code works very reliably:
&#60;cfinvoke component="cfide.adminapi.administrator" method="login"&#62;
	&#60;cfinvokeargument name="adminPassword" value="..." /&#62;
&#60;/cfinvoke&#62;

&#60;cfinvoke component="cfide.adminapi.runtime" method="clearTrustedCache" /&#62;
Since updating [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m testing an application on ColdFusion 8 in preparation for an upgrade and have found a strange error.  My reinit process clears the trusted cache <a href="http://www.coldfusionjedi.com/index.cfm/2007/6/7/ColdFusion-8-Admin-API-and-Trusted-Cache">using the Admin API</a> along with restarting Coldspring and Model-Glue.   On CF7, the following code works very reliably:</p>
<pre><code>&lt;cfinvoke component="cfide.adminapi.administrator" method="login"&gt;
	&lt;cfinvokeargument name="adminPassword" value="..." /&gt;
&lt;/cfinvoke&gt;

&lt;cfinvoke component="cfide.adminapi.runtime" method="clearTrustedCache" /&gt;</code></pre>
<p>Since updating to CF8 on my Windows XP laptop, running this code as either part of my reinit process or in a standalone template results in the following coldfusion.security.SecurityManager UnauthenticatedCredentialsException error:</p>
<pre><code>The error occurred in runtime.cfc: line 656
-1 : Unable to display error's location in a CFML template.

Stack Trace
at
cfruntime2ecfc1355728568$funcCLEARTRUSTEDCACHE.runFunction(E:\cf8_updates\cfusion\wwwroot\CFIDE\adminapi\runtime.cfc:656)
at
cfApplication2ecfc221588290$funcONREQUESTSTART.runFunction(Application.cfc:85)

coldfusion.security.SecurityManager$UnauthenticatedCredentialsException
	at
coldfusion.security.SecurityManager.authenticateAdmin(SecurityManager.java:1704)
	at
coldfusion.runtime.RuntimeServiceImpl.clearTrustedCache(RuntimeServiceImpl.java:1518)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at coldfusion.runtime.StructBean.invoke(StructBean.java:511)
	at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:2300)
	at
cfruntime2ecfc1355728568$funcCLEARTRUSTEDCACHE.runFunction(E:\cf8_updates\cfusion\wwwroot\CFIDE\adminapi\runtime.cfc:656)
	at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:418)</code></pre>
<p>Many people on the CFGURU list including Charlie Arehart and Cameron Childress made several suggestions of things to check but everything came back looking correct.  I was prepared to chalk this up to a random issue with my installation until I asked others to try it on their CF8 install and was surprised by the results.  While several people were unable to reproduce the error, we had confirmations of the same CF8 error on the following platforms:</p>
<ul>
<li>Enterprise 8.0.1 multi-server on Windows XP</li>
<li>Standard 8.0.1 on Windows 2003</li>
<li>Enterprise 8.0.1 multi-server on Mac OSX</li>
<li></li>
</ul>
<p>There are some people on 8.0.1 who have it working successfully but with three different people experiencing the issue it doesn&#8217;t seem to be a one-off installation error.  If I find a resolution I will post it here as a follow-up but at this point I am going to comment out that line in my reinit since on my laptop I don&#8217;t use the trusted cache in development.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=Z0Mj1J"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=Z0Mj1J" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=LPLIwJ"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=LPLIwJ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2008/07/04/clearing-trusted-cache-with-admin-api-fails/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ColdFusion 8 ClassLoader bug less prevalent on cold starts?</title>
		<link>http://www.ghidinelli.com/2008/07/01/coldfusion-8-classloader-bug-less-prevalent-on-cold-starts/</link>
		<comments>http://www.ghidinelli.com/2008/07/01/coldfusion-8-classloader-bug-less-prevalent-on-cold-starts/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 21:36:28 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=204</guid>
		<description><![CDATA[It&#8217;s pretty common knowledge that the Java 6 JRE in ColdFusion 8 has a bug from Sun that makes loading CFC-heavy applications slow.  This impacts most framework-based apps that use Model-Glue, Mach-II, Coldspring, Transfer and so forth.  To be clear, it&#8217;s not the frameworks, it&#8217;s a bug in the underlying Sun JRE.
I have [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s pretty common knowledge that the Java 6 JRE in ColdFusion 8 has <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6566201">a bug</a> from Sun that makes loading CFC-heavy applications slow.  This impacts most framework-based apps that use Model-Glue, Mach-II, Coldspring, Transfer and so forth.  To be clear, it&#8217;s not the frameworks, it&#8217;s a bug in the underlying Sun JRE.</p>
<p>I have some timing in my Application.cfc and index.cfm in my model-glue app that produced some interesting results different from my expectations.  The difference is between reinitializing an application on a running CF8 server and starting up the CF8 server from scratch.  I track the time it takes to load beans into Coldspring and for Model-glue to initialize with the following code in application.cfc:</p>
<pre><code>&lt;cfset cnt = getTickCount() /&gt;
&lt;cfset application.cs.loadBeansFromXmlFile(expandPath("coldspring.xml"), true) /&gt;
&lt;cflog file="application" type="information" text="Finished ColdSpring load in #(getTickCount()-cnt)/1000# seconds" /&gt;</code></pre>
<p>And in index.cfm:</p>
<pre><code>&lt;cfif NOT structKeyExists(application, ModelGlue_APP_KEY)&gt;
	&lt;cfset booInit = true /&gt;
	&lt;cfset cnt = getTickCount() /&gt;
&lt;cfelse&gt;
	&lt;cfset booInit = false /&gt;
&lt;/cfif&gt;

&lt;cfinclude template="/ModelGlue/unity/ModelGlue.cfm" /&gt;
&lt;cfif booInit&gt;
	&lt;cflog type="information" file="application" text="ModelGlue #ModelGlue_APP_KEY# initialized in #(getTickCount()-cnt)/1000# seconds" /&gt;
&lt;/cfif&gt;</code></pre>
<p>Now my expectation is that it would be slower on a cold start to load these applications than restart but the reverse is what I see by a factor of 2-1.  My reinit routine performs the following:</p>
<ul>
<li>Clears session key</li>
<li>Clears trusted cache via Admin API</li>
<li>Clears Transfer cache</li>
<li>Deletes Coldspring instance</li>
<li>Recreates Coldspring instance (this is timed)</li>
<li>Clears all Model-glue Application keys to force reload</li>
<li>Reinitialized session</li>
<li>Runs index.cfm to initialize Model-Glue (this is timed)</li>
</ul>
<p>The times below are from starting CF8, loading my application home page, then immediately performing a warm reinit:</p>
<table>
<tr>
<th></th>
<th>Cold Start &nbsp;</th>
<th>Warm Reinit &nbsp;</th>
<th>Ratio</th>
</tr>
<tr>
<td>Coldspring &nbsp;</td>
<td>20.7s</td>
<td>48.2s</td>
<td>2.3x</td>
</tr>
<tr>
<td>Model-Glue &nbsp;</td>
<td>29.3s</td>
<td>55.8s</td>
<td>1.9x</td>
</tr>
</table>
<p>Anyone know why this would be the case?  I would think the classes had already been loaded so a warm reinit should be faster than the cold start. </p>
<p>If this is true in general, then it&#8217;s better to restart the CF8 server when deploying code than running a reinit procedure.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=mbQMSJ"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=mbQMSJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=hXCycJ"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=hXCycJ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2008/07/01/coldfusion-8-classloader-bug-less-prevalent-on-cold-starts/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Using SAVEPOINTs in CFTRANSACTION with CFTRY</title>
		<link>http://www.ghidinelli.com/2008/06/27/using-savepoints-in-cftransaction-with-cftry/</link>
		<comments>http://www.ghidinelli.com/2008/06/27/using-savepoints-in-cftransaction-with-cftry/#comments</comments>
		<pubDate>Sat, 28 Jun 2008 01:26:28 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[PostgreSQL]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/2008/06/27/using-savepoints-in-cftransaction-with-cftry/</guid>
		<description><![CDATA[In the same member merging process described in my last post, I was running a bit of code with a TRY/CATCH that looked for a duplicate primary key condition and, if found, deleted it from the source account:
&#60;cfquery name="select" datasource="#variables.datasource.getName()#"&#62;
	SELECT *
	FROM roles
	WHERE id = '#id#'
&#60;/cfquery&#62;

&#60;cfloop query="select"&#62;

	&#60;cftry&#62;
		&#60;cfquery name="update" datasource="#variables.datasource.getName()#"&#62;
			UPDATE roles
			SET id = '#target#'
			WHERE id = '#id#'
			AND [...]]]></description>
			<content:encoded><![CDATA[<p>In the same member merging process described <a href="http://www.ghidinelli.com/2008/06/27/transfer-and-usernames-and-passwords-for-all-the-database-tags-within-the-cftransaction-tag-must-be-the-same/">in my last post</a>, I was running a bit of code with a TRY/CATCH that looked for a duplicate primary key condition and, if found, deleted it from the source account:</p>
<pre><code>&lt;cfquery name="select" datasource="#variables.datasource.getName()#"&gt;
	SELECT *
	FROM roles
	WHERE id = '#id#'
&lt;/cfquery&gt;

&lt;cfloop query="select"&gt;

	&lt;cftry&gt;
		&lt;cfquery name="update" datasource="#variables.datasource.getName()#"&gt;
			UPDATE roles
			SET id = '#target#'
			WHERE id = '#id#'
			AND role = '#role#'
		&lt;/cfquery&gt;

		&lt;cfcatch type="database"&gt;
			&lt;cfquery name="delete" datasource="#variables.datasource.getName()#"&gt;
				DELETE FROM roles
				WHERE id = '#id#'
				AND role = '#role#'
			&lt;/cfquery&gt;
		&lt;/cfcatch&gt;
	&lt;/cftry&gt;

&lt;/cfloop&gt;</code></pre>
<p>The problem is that when the UPDATE failed due to a duplicate key, the CFTRANSACTION aborted the rest of the routine.  I received this error in the console:</p>
<blockquote><p>
Error Executing Database Query.<br />
ERROR: current transaction is aborted, commands ignored until end of transaction block
</p></blockquote>
<h2>SAVEPOINT Solution</h2>
<p>Via Google, I learned about PostgreSQL <a href="http://www.postgresql.org/docs/current/static/sql-savepoint.html">SAVEPOINTs</a>, which allow you to back up your transaction to some intermediate point and continue as if it had not happened.  They were easy to implement:</p>
<pre><code>&lt;cfquery name="select" datasource="#variables.datasource.getName()#"&gt;
	SELECT *
	FROM roles
	WHERE id = '#id#'
&lt;/cfquery&gt;

&lt;cfloop query="select"&gt;

	&lt;cftry&gt;
		&lt;cfquery name="update" datasource="#variables.datasource.getName()#"&gt;
			-- declare my savepoint
			SAVEPOINT troles;

			UPDATE roles
			SET id = '#target#'
			WHERE id = '#id#'
			AND role = '#role#';
		&lt;/cfquery&gt;

		&lt;cfcatch type="database"&gt;
			&lt;cfquery name="delete" datasource="#variables.datasource.getName()#"&gt;
				-- a collision occurred, skip back to the savepoint and then delete
				ROLLBACK TO SAVEPOINT troles;

				DELETE FROM roles
				WHERE id = '#id#'
				AND role = '#role#';
			&lt;/cfquery&gt;
		&lt;/cfcatch&gt;
	&lt;/cftry&gt;

&lt;/cfloop&gt;</code></pre>
<p>Note it requires a semi-colon to run both statements in a single CFQUERY.  This says that if the CFCATCH runs, to skip back to where we were just before our UPDATE caused an index error (duplicate keys) and instead run the delete to eliminate the duplicate data (which in my business process here, is OK).  Now collisions could be handled without breaking the top level transaction.</p>
<p>There are other ways to do this like use a SELECT query first to see if the collision is going to happen.  In this process however, collisions are very rare but datasets can be large so for performance I decided it was &#8220;easier to ask for forgiveness than permission&#8221;.  <img src='http://www.ghidinelli.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>I don&#8217;t know if this is required in other databases besides PostgreSQL but I believe save points are available with most vendors.   My member merge process runs about 70 queries to join together two accounts and all of their data before it declares the operation complete.  This a neat feature to help control that lengthy process.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=4o9AHI"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=4o9AHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=BjTILI"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=BjTILI" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2008/06/27/using-savepoints-in-cftransaction-with-cftry/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Transfer and “Usernames and Passwords for all the database tags within the cftransaction tag must be the same”</title>
		<link>http://www.ghidinelli.com/2008/06/27/transfer-and-usernames-and-passwords-for-all-the-database-tags-within-the-cftransaction-tag-must-be-the-same/</link>
		<comments>http://www.ghidinelli.com/2008/06/27/transfer-and-usernames-and-passwords-for-all-the-database-tags-within-the-cftransaction-tag-must-be-the-same/#comments</comments>
		<pubDate>Sat, 28 Jun 2008 01:20:29 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/2008/06/27/transfer-and-usernames-and-passwords-for-all-the-database-tags-within-the-cftransaction-tag-must-be-the-same/</guid>
		<description><![CDATA[Something I learned today in my very rare use of CFTRANSACTION.  I have a process that merges member accounts.  This is needed when people create more than one account because they forget or can&#8217;t access their email account, etc.  Because of the scale of this operation and it&#8217;s total behind-the-scenes nature, I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>Something I learned today in my very rare use of CFTRANSACTION.  I have a process that merges member accounts.  This is needed when people create more than one account because they forget or can&#8217;t access their email account, etc.  Because of the scale of this operation and it&#8217;s total behind-the-scenes nature, I&#8217;m using mostly CFQUERYs in conjunction with a few Transfer calls.  The psuedo-code looks like this:</p>
<pre><code>&lt;cftransaction&gt;
acct1 = transfer.get("member", id);
acct2 = transfer.get("member", id2);
memberships = acct1.getMemberships();

for (ii = 0; ii &lt; memberships.length; ii++)
{
  membergateway.mergeMemberships(memberships[ii], acct2);
}

membergateway.mergeAccounts(acct1, acct2);

if (success) cftransaction commit
else cftransaction rollback
&lt;/cftransaction&gt;</code></pre>
<p>Which resulted in the error:</p>
<blockquote><p>
Datasource convert verification failed.<br />
The root cause was that: java.sql.SQLException: Usernames and Passwords for all the database tags within the cftransaction tag must be the same.
</p></blockquote>
<p>I was stumped!  I don&#8217;t even use username/password in my CFQUERY blocks!  Then I realized that Transfer did, and since it was between the CFTRANSACTION block, it was screwing up my manual queries.  This is what my CFQUERY in my gateway normally looks like:</p>
<pre><code>&lt;cfquery name="select" datasource="#variables.datasource.getName()#"&gt;
	SELECT foo
	FROM sometable
	WHERE id = '#arguments.id#'
&lt;/cfquery&gt;</code></pre>
<p>Where variables.datasource is a bean provided to my Gateway by Coldspring as defined in my coldspring.xml:</p>
<pre><code>&lt;bean id="datasource" factory-bean="ormService" factory-method="getDatasource" singleton="true" /&gt;</code></pre>
<p>This is the bean that Transfer uses and it contains the DSN, username and password.  Even though my username and password are stored in the CF admin, I had to add them to each of my CFQUERYs that appeared inside of the CFTRANSACTION to make it play nicely with Transfer:</p>
<pre><code>&lt;cfquery name="select" datasource="#variables.datasource.getName()#" username="#variables.datasource.getUsername()#" password="#variables.datasource.getUsername()#"&gt;
	SELECT foo
	FROM sometable
	WHERE id = '#arguments.id#'
&lt;/cfquery&gt;</code></pre>
<p>After that change, the error messages disappeared.  Also check my post on something else I learned today about <a href="http://www.ghidinelli.com/2008/06/27/using-savepoints-in-cftransaction-with-cftry/">CFTRANSACTION with SAVEPOINTs</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=AfiQxI"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=AfiQxI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=mE8GoI"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=mE8GoI" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2008/06/27/transfer-and-usernames-and-passwords-for-all-the-database-tags-within-the-cftransaction-tag-must-be-the-same/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Building reusable form views with Model-Glue</title>
		<link>http://www.ghidinelli.com/2008/06/22/building-reusable-form-views-with-model-glue/</link>
		<comments>http://www.ghidinelli.com/2008/06/22/building-reusable-form-views-with-model-glue/#comments</comments>
		<pubDate>Mon, 23 Jun 2008 01:05:45 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[Research/HOWTO]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/2008/06/22/building-reusable-form-views-with-model-glue/</guid>
		<description><![CDATA[After seven months of heavy development and a rocky-but-now-stable launch behind me, I feel like I have some command over Model-Glue (instead of the other way around).  I am certainly no expert but I want to share a few of the things that tripped me up when I was getting started and solutions that [...]]]></description>
			<content:encoded><![CDATA[<p>After seven months of heavy development and a rocky-but-now-stable launch behind me, I feel like I have some command over Model-Glue (instead of the other way around).  I am certainly no expert but I want to share a few of the things that tripped me up when I was getting started and solutions that I found to the problem.</p>
<h2>Building Forms in Pieces</h2>
<p>Reuse is central to development and frameworks purport to aid in code reuse.  In my application, there are users, organizers and superusers.  Users can edit a subset of the overall data available in the database while organizers can edit almost everything.  Superusers have a few additional fields at their disposal.  The question is:  how do you build views and events to be able to only define the form fields a single time?  Oh, and don&#8217;t forget client-side Javascript validation or effects too. <img src='http://www.ghidinelli.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Before Model-Glue</h2>
<p>Before Model-Glue, I combined my CRUD into a single CFM file with some conditional handling.  Here is a simple example of how my forms used to look.  The ui:qform is a custom tag that outputs a SCRIPT tag and instantiates the <a href="http://www.pengoworks.com/index.cfm?action=get:qforms">qForms validation library</a>.  The form posted to itself and with a structKeyExists(FORM, &#8220;uidClass&#8221;) at the top, it would have handled server side validation and persistence.  I really like this approach as it makes finding the right code quick and easy.</p>
<p>Note my conditional delete statement checking for URL.uidClass which was the convention indicating it was in &#8220;edit&#8221; mode and would show the delete link with a Javascript &#8220;are you sure&#8230;&#8221; confirmation.  I don&#8217;t always use these checks but in some circumstances they make sense from a usability perspective.  I also try to use the LABEL tag for accessibility and usability purposes whenever possible. </p>
<pre><code>&lt;form action="#cgi.script_name#" method="post" name="frm"&gt;

	&lt;input type="hidden" name="uidClass" value="#uidClass#" /&gt;

	&lt;table class="form"&gt;
	  &lt;tr&gt;
		&lt;td class="labelrequired"&gt;&lt;label for="vchClass"&gt;Name&lt;/label&gt;:&lt;/td&gt;
		&lt;td&gt;&lt;input type="text" name="vchClass" id="vchClass" value="#HTMLEditFormat(vchClass)#" size="25" maxlength="25" /&gt;&lt;/td&gt;
	  &lt;/tr&gt;
	  &lt;tr&gt;
		&lt;td class="label"&gt;&lt;label for="vchClassDescription"&gt;Description&lt;/label&gt;:&lt;/td&gt;
		&lt;td&gt;&lt;input type="text" name="vchClassDescription" id="vchClassDescription" value="#HTMLEditFormat(vchClassDescription)#" size="40" maxlength="255" /&gt;&lt;/td&gt;
	  &lt;/tr&gt;
	  &lt;tr&gt;
		&lt;td&gt;&lt;/td&gt;
		&lt;td&gt;
			&lt;input type="submit" value="Save Class" /&gt;
			&lt;cfif structKeyExists(URL, "uidClass")&gt;&lt; a href="#cgi.script_name#?uidDelete=#uidClass#" class="delete" onclick="javascript:return confirm('Are you really, really sure you want to delete this class?')"&gt;delete this class</a>&lt;/cfif&gt;
		&lt;/td&gt;
	  &lt;/tr&gt;
	&lt;/table&gt;
&lt;/form&gt;

&lt;ui:qform name="frm"&gt;
	// give better descriptions
	objForm.vchClass.description = "Class name";

	// make these fields required
	objForm.required("vchClass");
&lt;/ui:qform&gt;</code></pre>
<h2>Post Model-Glue Solution</h2>
<p>In my prior system, I would sometimes abstract out everything between the FORM tags into a custom tag so that I could re-use the form in multiple contexts.  This worked OK and was an approach I could have used again under Model-Glue but I wanted to try and find something more &#8220;Model-Gluey&#8221;.  Specifically, I wanted to accommodate the following requirements:</p>
<ul>
<li>Use the same HTML form for user, organizers and superuser editing, some of which may have different fields visible or editable</li>
<li>Forms must post to different events in each scenario</li>
<li>Validation rules (client and server-side) may be different or even optional</li>
<li>Not all instances may permit deleting the object</li>
</ul>
<p>Each unique use of the form includes its own form tag.  This is so I can pass the exit action in from model-glue.xml.   The XML configuration is pretty simple:</p>
<pre><code>&lt;event-handler name="vehicle"&gt;
	&lt;broadcasts&gt;
		&lt;message name="needVehicleMakes" /&gt;
		&lt;message name="needVehicle" /&gt;
	&lt;/broadcasts&gt;
	&lt;results&gt;
		&lt;result do="view.render" /&gt;
	&lt;/results&gt;
	&lt;views&gt;
		&lt;include name="formVehicle" template="shared/vehicle/frm.vehicle.cfm" /&gt;
		&lt;include name="validateVehicle" template="shared/vehicle/val.vehicle.cfm" /&gt;
		&lt;include name="main" template="staff/members/edt.vehicle.cfm"&gt;
			&lt;value name="xe.process" value="vehicle.do" /&gt;
			&lt;value name="xe.delete" value="vehicle.delete" /&gt;
		&lt;/include&gt;
	&lt;/views&gt;
&lt;/event-handler&gt;</code></pre>
<p>The val.vehicle.cfm and frm.vehicle.cfm stay the same while the edt.vehicle.cfm changes from context to context.  The edt.vehicle.cfm &#8220;master&#8221; view looks something like this:</p>
<pre><code>&lt;cfset myself = viewState.getValue("myself") /&gt;
&lt;cfset vehicle = viewState.getValue("objVehicle") /&gt;
&lt;cfset xe.process = viewState.getValue("xe.process") /&gt;
&lt;cfset xe.delete = viewState.getValue("xe.delete") /&gt;
&lt;cfset frmName = viewState.getValue("frmName", "frmVehicle") /&gt;

&lt;form action="#myself##xe.process#/uidVehicle/#vehicle.getUidVehicle()#" method="post" name="#frmName#"&gt;

	&lt; !-- bring in the HTML form, which uses its own &lt;table&gt; --&gt;
	#viewCollection.getView("formVehicle")#

	&lt;div class="submit"&gt;
		&lt;input type="submit" value="Save Vehicle" /&gt;
		&lt;cfif vehicle.getIsPersisted()&gt;&lt; a href="#myself##xe.delete#/uidVehicle/#vehicle.getUidVehicle()#" class="delete" onclick="javascript:return confirm('Are you really, really sure you want to delete this vehicle "&gt;delete this vehicle</a>&lt;/cfif&gt;
	&lt;/div&gt;

&lt;/form&gt;

&lt; !-- bring in the validation rules (if any) --&gt;
#viewCollection.getView("validateVehicle")#
</code></pre>
<p>You can see how I&#8217;m bringing in a lot of parameters from my model-glue.xml file to make it configurable without modifying the HTML making it as reusable as possible.  The frm.vehicle.cfm and val.vehicle.cfm look like what you would expect, but by breaking them out into different files I can apply the appropriate validation to each scenario: admins have fewer required fields than end-users, for example.  </p>
<p>That&#8217;s just client-side.  Obviously we need to address the server-side too.  If my object has different levels of validation (say, full and basic), I structure my .validate() method something like this:</p>
<pre><code>&lt;cffunction name="validate" access="public" returntype="array" output="false"&gt;
	&lt;cfreturn validateBasic() /&gt;
&lt;/cffunction&gt;

&lt;cffunction name="validateBasic" access="public" returntype="array" output="false"&gt;
	...
&lt;/cffunction&gt;

&lt;cffunction name="validateFull" access="public" returntype="array" output="false"&gt;
	&lt;cfset var errors = validateBasic() /&gt;
	...
&lt;/cffunction&gt;</code></pre>
<p>The controller calls the appropriate method based on context.  </p>
<h2>Bonus Advantages</h2>
<p>What&#8217;s not so obvious is this also gives me the ability to modify what fields are available depending on context.  There are several possible approaches for this including some kind of security context check wrapped in a CFIF to determine whether or not to show certain fields but there are scenarios, like sensitive financial details, where the more paranoid might opt to not include those fields in the view to prevent any possible data leakage.  Both approaches are valid and in fact I use both which is why I like this method - it&#8217;s flexible!</p>
<p>Here&#8217;s an example view how I might combine two different views to facilitate editing additional, sensitive attributes:</p>
<pre><code>&lt;form action="#viewState.getValue("xe.formAction")#"&gt;

  #viewCollection.getView("basicForm")#
  #viewCollection.getView("organizerForm")#

  &lt;input type="submit" value="Save Now"&gt;
  &lt;cfif obj.getIsPersisted()&gt;&lt; a href="javascript;" class="delete"&gt;delete this object</a>&lt;/cfif&gt;

&lt;/form&gt;

#viewCollection.getView("validateForm")#
#viewCollection.getView("organizerValidateForm")#
</code></pre>
<h2>Future Improvements</h2>
<p>Today, I use tables to layout my forms. Standards-weenies be damned, I think forms are a perfectly acceptable way of laying out the tabular notion of a form and they afford many conveniences (like auto-adjusting widths) that XHTML solutions can&#8217;t.</p>
<p>However, I&#8217;ll also admit to having fallen in love with <a href="http://dnevnikeklektika.com/uni-form/">Uniform</a> and Quackfuzed&#8217;s tagset for generating the forms (which has a recent <a href="http://www.quackfuzed.com/index.cfm/2008/6/2/UniForm-XHTML-Forms-Custom-Tags-v2">v2 release</a>).  My goal is to migrate to XHTML form layout (and potentially jQuery for validation&#8230; especially if <a href="http://blog.pengoworks.com/">Dan Switzer</a> would just get on with it and port the ever amazing qForms to be a jQuery plugin <img src='http://www.ghidinelli.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ).</p>
<h2>What About You?</h2>
<p>How do you handle reusing forms or views in general?  The idea of reuse is at the core of frameworks like Model-Glue and yet I feel like it can still be a challenge to figure out a successful strategy.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=KraWcI"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=KraWcI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=C2YXdI"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=C2YXdI" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2008/06/22/building-reusable-form-views-with-model-glue/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Neat Dropdown Menu jQuery Plugin</title>
		<link>http://www.ghidinelli.com/2008/06/22/neat-dropdown-menu-jquery-plugin/</link>
		<comments>http://www.ghidinelli.com/2008/06/22/neat-dropdown-menu-jquery-plugin/#comments</comments>
		<pubDate>Sun, 22 Jun 2008 18:55:40 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/2008/06/22/neat-dropdown-menu-jquery-plugin/</guid>
		<description><![CDATA[Dan Switzer has been up to more good with jQuery releasing a multi-column dropdown plugin developed for Giva that can handle an arbitrary number of elements from a series of nested unordered lists.
There are two things that I like about this plugin in particular:

Full support for keyboard input
Designed to handle a lot of data

I have [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.pengoworks.com/">Dan Switzer</a> has been up to more good with jQuery releasing a <a href="http://www.givainc.com/labs/mcdropdown_jquery_plugin.htm">multi-column dropdown plugin</a> developed for <a href="http://www.givainc.com/index.htm">Giva</a> that can handle an arbitrary number of elements from a series of nested unordered lists.</p>
<p>There are two things that I like about this plugin in particular:</p>
<ol>
<li>Full support for keyboard input</li>
<li>Designed to handle a lot of data</li>
</ol>
<p>I have been working with RIAs for a long time, trying to bridge the gap between the power of desktop applications and the distribution model of web applications.  When trying to build data-heavy applications, we were regularly disappointed by either the lack of design for lots of data or the poor performance experienced once we exceeded a sample screen of data.  I&#8217;m glad to see more emphasis on this type of performance at the requirements gathering phase.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=sJyU4I"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=sJyU4I" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=Y5Y9HI"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=Y5Y9HI" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2008/06/22/neat-dropdown-menu-jquery-plugin/feed/</wfw:commentRss>
		</item>
		<item>
		<title>On Transfer and performance</title>
		<link>http://www.ghidinelli.com/2008/06/14/on-transfer-and-performance/</link>
		<comments>http://www.ghidinelli.com/2008/06/14/on-transfer-and-performance/#comments</comments>
		<pubDate>Sat, 14 Jun 2008 18:40:37 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/2008/06/14/on-transfer-and-performance/</guid>
		<description><![CDATA[When I started the process of rebuilding my application in Model-Glue, Transfer and Coldspring nearly 9 months ago, the DIY programmer in me moaned at giving up direct control over the persistence layer in using Transfer.  But it was clear that if I was going to commit to going OO with my ColdFusion application, [...]]]></description>
			<content:encoded><![CDATA[<p>When I started the process of rebuilding my application in Model-Glue, Transfer and Coldspring nearly 9 months ago, the DIY programmer in me moaned at giving up direct control over the persistence layer in using Transfer.  But it was clear that if I was going to commit to going OO with my ColdFusion application, that Transfer gave me a lot of power and would save me from writing a lot of code by hand at the expense of a black box in my system, for both better and worse.</p>
<p>I must give great credit to <a href="http://www.transfer-orm.com">Mark Mandel</a> who has listened to my frequently crazy and incomplete bug reports, found and resolved many bugs ahead of the 1.0 release last week.  When I first relaunched <a href="http://www.MotorsportReg.com">MotorsportReg.com</a> six weeks ago, we were getting a lot of strange errors, particularly during application startup and under load.  Having just checked my email this morning, it&#8217;s refreshing how empty the inbox is totally devoid of our automated bug report emails.</p>
<h2>Transfer&#8217;s Yin and Yang</h2>
<p>There is, however, one area in which Transfer is a clear and direct tradeoff: performance.  In some ways, Transfer can boost your performance with its caching model that will return fully composed objects in just a few milliseconds that would otherwise require many database queries and createObject() calls letting you take the hit once for creating the objects and then speed along on subsequent use.</p>
<p>Sean Corfield has mentioned many times that using Coldspring as a transient beanfactory would be extreme overkill and not very performant due to all of the other things Coldspring does beyond createObject().  I am now coming to grips with Transfer performance for large batch operations or where the beans you are persisting will not be read back (frequently, if ever).  These are cases where I am finding Transfer may also be overkill.</p>
<h2>My Example</h2>
<p>My application has an email blaster that organizers can use to send email to their attendees.  I record each campaign with the subject, body and sender in the database and then separately record each delivery so that I can use a unique ID in my return-path header for automatic bounce handling and reporting for the original sender.  Typically an organizer will send emails out to less than 100 people at a time but there are very valid scenarios where they will send 1000-2000 messages.</p>
<p>Before the conversion to MG/CS/Transfer, even these very large sends would complete in a matter of seconds.  It was effectively an insert for the campaign and then one insert per delivery and spool the message to disk.  Figure at 20ms per delivery + spool, you can send 1000 messages in approximately 20 seconds.</p>
<p>Since the conversion, we had received an increasing number of timeouts during blasts.  At this point, I have our timeout set up to 1200 seconds to try and let these blasts go out and some are still not making it.  I have done a bit of instrumentation using CFLOG and debugging to see how long each step is taking averaged out over 3 deliveries in a single campaign:</p>
<table>
<tr>
<td>transfer.create(&#8221;mail.delivery&#8221;)</td>
<td>66ms</td>
</tr>
<tr>
<td>transfer.save(delivery)</td>
<td>81.5ms (SQL insert: 6ms)</td>
</tr>
<tr>
<td>CFMAIL/spool to disk</td>
<td>19ms</td>
</tr>
</table>
<p>The absolute numbers aren&#8217;t that important; it&#8217;s the relative size of them that matters.  The actual hard time to save the delivery data and send the message is right around 15% of the total time.  Now, this is my dev/test machine, CF7/Linux running older hardware (dual P3 800mhz processors) after a recent restart.  Here are some numbers from a production server which is dual 2.8ghz Xeons after it&#8217;s been running for a few days and is using ~600mb of RAM (presumably a significant part is the Transfer cache, set to Application scope):</p>
<table>
<tr>
<td>transfer.create(&#8221;mail.delivery&#8221;)</td>
<td>47ms</td>
</tr>
<tr>
<td>transfer.save(delivery)</td>
<td><strong>607ms</strong> (SQL inserts: 30, 25, 6ms)</td>
</tr>
<tr>
<td>CFMAIL/spool to disk</td>
<td>10ms</td>
</tr>
</table>
<p>You can see the faster hardware in the create() and the CFMAIL tag.  I listed the three SQL inserts as they were all over the place; probably a result of other load on the box whereas the test server was only used by me.  Clearly the 6ms INSERT time experienced on the test server (which points to the same database server) is feasible.   Without being able to instrument Transfer internally, my only guess is that these much longer save times are related to the large cache size.  Anecdotally, we do notice the site seems to run more quickly after either bouncing CF or restarting the MG application which includes a rehash of Coldspring/Transfer.</p>
<h2>Conclusion</h2>
<p>I have come to love Transfer over the past 9 months.  The things it can do, especially if you are building smart decorators that create intelligent business objects, is quite powerful.  It has especially helped to reduce duplication of validation checks and centralization of key business rules (like no duplicate email addresses in our system, for example).</p>
<p>But you don&#8217;t get everything for free.  The overhead incurred for this functionality hurts high-performance operations.  As I am scaling the learning curve with these frameworks, the saying &#8220;if you have a hammer, everything looks like a nail&#8221; comes to mind.  With only a few months of experience with Transfer and now just six weeks of production history, the judgment to know when and where to use that hammer is still lagging.  </p>
<p>With this research under my belt, I am going to revisit some key places in my application:</p>
<ul>
<li>Anywhere I run Transfer.save() in a loop to evaluate the potential total number of objects</li>
<li>Anywhere I run Transfer.save() without first running .validate() on my bean (I use decorators for almost every object in my app with a .validate() routine)</li>
<li>Anywhere I use Transfer to persist data but don&#8217;t interact with it in single-object form (e.g., I have an audit log system that I use transfer objects to persist but I pretty much exclusively display it in aggregate query output)</li>
<li>Our JVM is currently using less than half the RAM allocated to it; if the size/age of the cache is a factor in the performance, switching the cache to be session scope may potentially resolve some of these issues (but will probably create others&#8230;)</li>
</ul>
<p>These are probably &#8220;duh&#8221; moments for experienced users of these frameworks but when migrating an existing application to a new framework, my instinct was to convert everything consistently to simplify the process and take advantage of the new tools.  The good news is that I still have my SQL-based code in subversion so going backwards should be easy. <img src='http://www.ghidinelli.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=Tqhr5I"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=Tqhr5I" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=eCq0eI"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=eCq0eI" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2008/06/14/on-transfer-and-performance/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Transfer 1.0 about to drop!</title>
		<link>http://www.ghidinelli.com/2008/06/07/transfer-10-about-to-drop/</link>
		<comments>http://www.ghidinelli.com/2008/06/07/transfer-10-about-to-drop/#comments</comments>
		<pubDate>Sat, 07 Jun 2008 21:31:19 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[ORM]]></category>

		<category><![CDATA[transfer]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/2008/06/07/transfer-10-about-to-drop/</guid>
		<description><![CDATA[After lots of hard work and many improvements by Aussie Mark Mandel, it looks like Transfer 1.0 is within a few hours is of a public release.  Congrats Mark - a job well done!
Update 6/8: The announcement is out and the code is available for download.  I&#8217;ll be upgrading our production tomorrow.  [...]]]></description>
			<content:encoded><![CDATA[<p>After lots of hard work and many improvements by Aussie Mark Mandel, it looks like Transfer 1.0 is <a href="http://tracker.transfer-orm.com/milestones.cfm?p=89977683-A728-9CD3-ABD9545A91734422&#038;m=9189790C-0335-6D4D-7C724EF48D5F0870">within a few hours</a> is of a public release.  Congrats Mark - a job well done!</p>
<p><strong>Update 6/8:</strong> The <a href="http://www.transfer-orm.com/?action=displayPost&#038;ID=329">announcement is out</a> and the code is available for download.  I&#8217;ll be upgrading our production tomorrow.  Remember kids, don&#8217;t forget to delete all of the *transfer* files out of your generated directory when upgrading!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=yu00zI"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=yu00zI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=D6JBMI"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=D6JBMI" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2008/06/07/transfer-10-about-to-drop/feed/</wfw:commentRss>
		</item>
		<item>
		<title>I thought maybe it was just me…</title>
		<link>http://www.ghidinelli.com/2008/06/02/i-thought-maybe-it-was-just-me/</link>
		<comments>http://www.ghidinelli.com/2008/06/02/i-thought-maybe-it-was-just-me/#comments</comments>
		<pubDate>Tue, 03 Jun 2008 00:53:58 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[Complaint Dept.]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/2008/06/02/i-thought-maybe-it-was-just-me/</guid>
		<description><![CDATA[I thought maybe it was just me, but it turns out uninvolved third parties have the same head-scratching case of bewilderment.
2008 called and it wants its common sense back. Pronto.
]]></description>
			<content:encoded><![CDATA[<p>I thought maybe it was just me, but it turns out uninvolved third parties have the same <a href="http://timesonline.typepad.com/comment/2008/06/i-have-been-try.html">head-scratching case of bewilderment</a>.</p>
<p>2008 called and it wants its common sense back. Pronto.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=4Uh5vI"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=4Uh5vI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?a=QDKD6I"><img src="http://feeds.feedburner.com/~f/OrangeIsMyFavoriteColor?i=QDKD6I" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2008/06/02/i-thought-maybe-it-was-just-me/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
