<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><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:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Orange is my favorite color » My Software</title>
	
	<link>http://www.ghidinelli.com</link>
	<description />
	<pubDate>Sun, 21 Jun 2009 16:26:39 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/OrangeIsMyFavoriteColorTech" type="application/rss+xml" /><feedburner:emailServiceId>OrangeIsMyFavoriteColorTech</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Announcing CFPAYMENT 0.9b!</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColorTech/~3/UB-A31H3dGk/announcing-cfpayment-beta-easy-payment-api</link>
		<comments>http://www.ghidinelli.com/2009/05/15/announcing-cfpayment-beta-easy-payment-api#comments</comments>
		<pubDate>Fri, 15 May 2009 11:14:55 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[My Software]]></category>

		<category><![CDATA[PostgreSQL]]></category>

		<category><![CDATA[Racing]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[cfobjective]]></category>

		<category><![CDATA[cfpayment]]></category>

		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=707</guid>
		<description><![CDATA[CFPAYMENT announces 0.9 beta release including production-tested, documented gateways for payment processing on Braintree, Skipjack, Authorize.net and iTransact.  More gateways coming! ]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been in development for quite some time but <a href="http://cfpayment.riaforge.org">my CFPAYMENT</a> project, inspired by Ruby&#8217;s ActiveMerchant, has gone beta at cf.Objective() with a 0.9 release!  </p>
<p>Working with <a href="http://www.mkville.com">Mark Mazelin</a> over the better part of a year, we&#8217;ve created a developer-friendly set of components with a simple API.  We&#8217;ve made it easy to create new gateways on top of our core and most importantly, we&#8217;ve battle-tested this code processing over $1 Million USD using these components.</p>
<p>Whether you are an OO nut or a spaghetti coder, our simple interface makes processing credit cards and e-checks (EFTs) easy like:</p>
<pre><code>&lt;cfset config = {path = "bogus.gateway", username = "user", password = "foo" } /&gt;
&lt;cfset core = createObject("component", "cfpayment.api.core").init(config) /&gt;
&lt;cfset gateway = core.getGateway() /&gt;

&lt;cfset cc = core.createCreditCard() /&gt;
&lt;cfset cc.setFirstName("Joe").setLastName("Blow").setAddress("888 Nowhere Lane").setPostalCode("94103") /&gt;
&lt;cfset money = core.createMoney(5000) /&gt;&lt; !-- $50.00 in cents --&gt;

&lt;cfset response = gateway.purchase(money, creditcard) /&gt;

&lt;cfdump var="#response.getParsedResult()#" /&gt;</code></pre>
<p>I&#8217;ve put more than five years of e-commerce experience into the design and reliability of this library and Mark has helped me make it better every step of the way.  </p>
<p>I&#8217;ll be at cf.Objective() in Minneapolis through Sunday so please don&#8217;t hesitate to come find me and talk shop. </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=UB-A31H3dGk:upcoKji4XCE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=UB-A31H3dGk:upcoKji4XCE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=UB-A31H3dGk:upcoKji4XCE:2mJPEYqXBVI"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=2mJPEYqXBVI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColorTech/~4/UB-A31H3dGk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2009/05/15/announcing-cfpayment-beta-easy-payment-api/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2009/05/15/announcing-cfpayment-beta-easy-payment-api</feedburner:origLink></item>
		<item>
		<title>Bounce Detector Released</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColorTech/~3/RFoT_I3uQZE/bounce-detector-released</link>
		<comments>http://www.ghidinelli.com/2009/02/26/bounce-detector-released#comments</comments>
		<pubDate>Fri, 27 Feb 2009 02:34:34 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[My Software]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[bounce detector]]></category>

		<category><![CDATA[email]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=630</guid>
		<description><![CDATA[Programmatically process bounced email to determine the cause of the bounce and whether or not it's fatal.  Has hundreds of bounce signatures collected over the past four years ready for use.]]></description>
			<content:encoded><![CDATA[<p>Spurred by interest from <a href="http://www.coldfusionmuse.com">Mark Kruger</a>, I published my Bounce Detector CFC tonight at <a href="http://bouncedetector.riaforge.org/">http://bouncedetector.riaforge.org/</a>.  With a database of approximately 350 bounce signatures collected over the past four years, this CFC will determine if an email was returned for temporary, permanent or spam reasons.  Use it to process bounced email and take action such as notifying the original sender or forwarding off to a human for review.</p>
<p>If you find bounce signatures not included in the XML, please post them to the forums on RIAforge for future inclusion. </p>
<p>Grab it via subversion from riaforge.  </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=RFoT_I3uQZE:t3poOyirIAY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=RFoT_I3uQZE:t3poOyirIAY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColorTech/~4/RFoT_I3uQZE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2009/02/26/bounce-detector-released/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2009/02/26/bounce-detector-released</feedburner:origLink></item>
		<item>
		<title>PowerNap 0.9 Released!</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColorTech/~3/8AWHe1I1Teo/powernap-09-released</link>
		<comments>http://www.ghidinelli.com/2009/02/12/powernap-09-released#comments</comments>
		<pubDate>Thu, 12 Feb 2009 18:23:34 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[My Software]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[PowerNap]]></category>

		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=607</guid>
		<description><![CDATA[The latest version of PowerNap, the ColdFusion-based REST API engine, has been released to RIAForge.  0.9 is now available with lots of new features that I helped develop.]]></description>
			<content:encoded><![CDATA[<p>Brian Carr <a href="http://powernap.riaforge.org/blog/index.cfm/2009/2/11/PowerNap-v-090-Released">posted it to RIAForge</a>: the latest version of his RESTful API engine for ColdFusion is hot off the presses.  I&#8217;m excited about this release because I contributed a lot of the updates and have been working with Brian over the past couple of months.  I&#8217;m using PowerNap for a <a href="http://api.pukkasoft.com">public API</a> and to communicate between server farms behind the scenes.  Brian wrote great documentation and a sample application so get your feet wet!</p>
<p>I have a really long draft in Wordpress that I&#8217;ve been waiting for the time to turn into a series on REST.  With lots of contributions from Kevin Miller (who donated a series of data transformation functions to this release of PowerNap), it should be a helpful nuts and bolts series for anyone who wants to get started with REST services but hasn&#8217;t had the chance to look into it.</p>
<p>In the mean time, <a href="http://powernap.riaforge.org">download 0.9</a> and join the <a href="http://groups.google.com/group/cfrest">CF REST</a> Google group.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=8AWHe1I1Teo:rTP4QN0nVoM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=8AWHe1I1Teo:rTP4QN0nVoM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColorTech/~4/8AWHe1I1Teo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2009/02/12/powernap-09-released/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2009/02/12/powernap-09-released</feedburner:origLink></item>
		<item>
		<title>cfpayment beta-ish-y</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColorTech/~3/ChLMu1gvRVU/cfpayment-beta-ish-y</link>
		<comments>http://www.ghidinelli.com/2008/12/10/cfpayment-beta-ish-y#comments</comments>
		<pubDate>Wed, 10 Dec 2008 22:55:38 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[My Software]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[cfpayment]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=412</guid>
		<description><![CDATA[I put together an Ant script today to generate builds for cfpayment and am posting the most current build for public review.  We have gateways and working unit test coverage for Braintree, iTransact and Skipjack gateways.  This should be everything needed to add your own gateway (and, ahem, contribute it back to the [...]]]></description>
			<content:encoded><![CDATA[<p>I put together an Ant script today to generate builds for <a href="http://cfpayment.riaforge.org/">cfpayment</a> and am posting the <a href="http://www.ghidinelli.com/wp-content/uploads/2008/12/cfpayment-200812101432.zip">most current build</a> for public review.  We have gateways and working unit test coverage for Braintree, iTransact and Skipjack gateways.  This should be everything needed to add your own gateway (and, ahem, contribute it back to the project).</p>
<p>I&#8217;ve already received a report of someone building their own gateway (Authorize.net) based on cfpayment so there&#8217;s nothing to stop you from doing the same for your project!</p>
<p>Also, we added in the ability to chain together set commands on the model objects to allow something like the following:</p>
<p><code>cc.setFirstName("John").setLastName("Doe").setAccount("5454545454545454").setYear("10").setMonth("09")</code></p>
<p>We&#8217;re aiming for an early January 1.0 after we each put our gateways into production for a few weeks to be sure we&#8217;ve ironed out any potential issues.</p>
<p><a href="http://www.ghidinelli.com/wp-content/uploads/2008/12/cfpayment-200812101432.zip">Download the latest</a> and give it a shot.  Questions?  Feedback?  Hit me up here&#8230; </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=ChLMu1gvRVU:mubs7MDf9XU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=ChLMu1gvRVU:mubs7MDf9XU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColorTech/~4/ChLMu1gvRVU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2008/12/10/cfpayment-beta-ish-y/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2008/12/10/cfpayment-beta-ish-y</feedburner:origLink></item>
		<item>
		<title>Converting multiple GET/POST variables of same name to arrays</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColorTech/~3/W8azm9DjArw/converting-multiple-getpost-variables-of-same-name-to-arrays</link>
		<comments>http://www.ghidinelli.com/2008/12/01/converting-multiple-getpost-variables-of-same-name-to-arrays#comments</comments>
		<pubDate>Tue, 02 Dec 2008 00:26:27 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[My Software]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=378</guid>
		<description><![CDATA[The title is a little ambiguous but I don&#8217;t know how else to describe the behavior that Java gives you where the following request:
/test.cfm?id=foo&#38;id=bar&#38;id=snafu
or form with set of checkboxes:
&#60;input type="checkbox" name="id" value="1000" /&#62; 1000&#60;br /&#62;
&#60;input type="checkbox" name="id" value="1001" /&#62; 1001&#60;br /&#62;
&#60;input type="checkbox" name="id" value="1002" /&#62; 1002&#60;br /&#62;
can be transformed using request.getParameterValues() into arrays because we [...]]]></description>
			<content:encoded><![CDATA[<p>The title is a little ambiguous but I don&#8217;t know how else to describe the behavior that Java gives you where the following request:</p>
<p><code>/test.cfm?id=foo&amp;id=bar&amp;id=snafu</code></p>
<p>or form with set of checkboxes:</p>
<pre><code>&lt;input type="checkbox" name="id" value="1000" /&gt; 1000&lt;br /&gt;
&lt;input type="checkbox" name="id" value="1001" /&gt; 1001&lt;br /&gt;
&lt;input type="checkbox" name="id" value="1002" /&gt; 1002&lt;br /&gt;</code></pre>
<p>can be transformed using request.getParameterValues() into arrays because we pass multiple values for the same variable in the request.  PHP also has auto-conversion into arrays.  ColdFusion has no such thingy  <span style="background-color: #fc0"><a href="#update">see update below*</a></span>.  </p>
<p>In working with my Javascript contractor this morning on some AJAX routines, I took a few minutes to try and emulate the behavior to support receiving data from Ext JS components.  I came up with the following UDF which works with both GET and POST:</p>
<pre><code>&lt;cffunction name="getVarAsArray"&gt;
	&lt;cfargument name="field" type="string" required="true" /&gt;

	&lt;cfset var arr = arrayNew(1) /&gt;
	&lt;cfset var data = "" /&gt;

	&lt;cfif CGI.request_method EQ "GET"&gt;
		&lt;cfset data = CGI.query_string /&gt;
	&lt;cfelse&gt;
		&lt;cfset data = toString(getHTTPRequestData().content) /&gt;
	&lt;/cfif&gt;

	&lt;cfloop list="#data#" delimiters="&amp;" index="item"&gt;
		&lt;cfif listFirst(item, "=") EQ arguments.field&gt;
			&lt;cfset arrayAppend(arr, listLast(item, "=")) /&gt;
		&lt;/cfif&gt;
	&lt;/cfloop&gt;

	&lt;cfreturn arr /&gt;
&lt;/cffunction&gt;</code></pre>
<p>If you were to run the first request described above and run getVarAsArray(&#8221;id&#8221;), you would get the following array back:</p>
<table style="font-family: verdana, arial, helvetica, sans-serif; cell-spacing: 2px; background-color: #006600;">
<tr>
<th style="text-align: left;<br />
		color: #fff;<br />
		padding: 5px; background-color: #009900;" colspan="2">array</th>
</tr>
<tr>
<td style="background-color: #ccffcc;">1</td>
<td style="background-color: #fff;">
		foo
	</td>
</tr>
<tr>
<td style="background-color: #ccffcc;">2</td>
<td style="background-color: #fff;">
		bar
	</td>
</tr>
<tr>
<td style="background-color: #ccffcc;">3</td>
<td style="background-color: #fff;">
		snafu
	</td>
</tr>
</table>
<p>I don&#8217;t think getVarAsArray is a very catchy name nor incredibly descriptive of what it does.  Can someone suggest a better name? </p>
<p><a name="update"></a><br />
<h2>Barney is a Smarty Pants *UPDATE*</h2>
<p>I knew, since ColdFusion MX is based on Java, that there must be a way to get at the Java getParameterValues() but I didn&#8217;t have the patience to track it down and I&#8217;m not a big user of getPageContext().  As <a href="http://www.barneyb.com">Barney</a> explains in his comment below, you can get at it with this simple line of code eliminating the need for the above UDF:</p>
<p><code>array = getPageContext().getRequest().getParameterValues('id')</code></p>
<p>The one difference is that this approach will throw an error if the variable ID doesn&#8217;t exist whereas my UDF will return an empty array.  It&#8217;s easy enough to fix by wrapping with a structKeyExists() to check for the variable first.  In most cases you&#8217;ll be expecting a specific variable so it shouldn&#8217;t be a problem.</p>
<p>Thanks to Barney for teaching me something new - cheers!  <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/~ff/OrangeIsMyFavoriteColorTech?a=W8azm9DjArw:vTttjsjboCc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=W8azm9DjArw:vTttjsjboCc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColorTech/~4/W8azm9DjArw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2008/12/01/converting-multiple-getpost-variables-of-same-name-to-arrays/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2008/12/01/converting-multiple-getpost-variables-of-same-name-to-arrays</feedburner:origLink></item>
		<item>
		<title>My case for Hungarian Notation</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColorTech/~3/iNhBGvTqRJI/my-case-for-hungarian-notation</link>
		<comments>http://www.ghidinelli.com/2008/11/23/my-case-for-hungarian-notation#comments</comments>
		<pubDate>Sun, 23 Nov 2008 19:57:32 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[My Software]]></category>

		<category><![CDATA[PostgreSQL]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=189</guid>
		<description><![CDATA[There are many haters of Hungarian Notation.  Prepare to pile on.
I&#8217;ve had this post in my drafts queue for a long time but this thread about escaping SQL reserved keywords on the Transfer group prompted me to finish my thoughts:
Most applications have a User table, if those users are organized then there may be [...]]]></description>
			<content:encoded><![CDATA[<p>There are many haters of Hungarian Notation.  Prepare to pile on.</p>
<p>I&#8217;ve had this post in my drafts queue for a long time but <a href="http://groups.google.com/group/transfer-dev/browse_thread/thread/2b3509744a540bb2">this thread</a> about escaping SQL reserved keywords on the Transfer group prompted me to finish my thoughts:</p>
<blockquote><p>Most applications have a User table, if those users are organized then there may be a Group table, and if there&#8217;s any kind of e-commerce going on then it might have an Order table.  How would you name these so as not to use reserved words?</p></blockquote>
<p>I learned Hungarian Notation from a Sybase database admin named Rick when I first started webdeving back in 1994.  He worked at Prudential and I had never touched a database so when we started doing some more serious work, he told me about the Hungarian Notation they used at Prudential for naming columns:</p>
<p><code>vchCompanyName = company name, varchar<br />
intEmployeeCount = employee count, integer</code></p>
<p>This seems innocuous enough.  Since I didn&#8217;t control the database but needed to code against it, I accepted this as Gospel.  It was my first interaction with a real database, one that ran on <em>scary</em> Sun Ultra 5 servers at some colo facility on the East Coast, so who was I to disagree?  Honestly I was more concerned with getting things done than arguing over a field name.  But now I have more time to argue. <img src='http://www.ghidinelli.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h2>Arguments against Hungarian Notation</h2>
<p><a href="http://en.wikipedia.org/wiki/Convention_over_Configuration">Convention over configuration</a> is all the rage today.  Ruby on Rails programmers claim this to be part of the secret sauce that empowers them to quickly build new services like Basecamp, Blinksale and Twitter.  Since many opponents of HN argue that a compiler is your sanity check, it&#8217;s especially relevant for untyped languages like PHP and ColdFusion that don&#8217;t have such a fallback.  HN subtly communicates information to the developer but it can also be programmatically leveraged as I will demonstrate later.</p>
<p>Another common argument against HN is that the editing environment can give you on-demand details of data types or flag incompatible operations based on introspection.  Most of the developers I know have migrated to Eclipse + CFEclipse for ColdFusion.  While for Java or C the IDE can give you a wealth of information about the code, that support is not available to untyped or dynamically generated languages like ColdFusion which don&#8217;t declare variable types.</p>
<p>Perhaps my favorite argument is that HN is not portable since two companies may not implement it in exactly the same way; therefore having no standard is preferable.  But this makes no sense!  There are changes anytime we switch companies or projects!   We also need to learn where the bathrooms are located and the names of our new co-workers; are these critics really suggesting that developers are <em>unable to adapt</em>?  </p>
<p>Lastly I have read that using HN locks the code into a particular data type making data model changes more difficult down the road.  This might have been true before the advent of search and replace but with today&#8217;s IDEs, you can trigger a very accurate system-wide replacement with Regular Expressions in seconds.  With the exception of some very large or distributed projects, I simply can&#8217;t believe this to be the case any longer.  In fact, I would argue that Hungarian Notation makes these kinds of system-wide changes <em>easier</em> because the field and variable names have more specific and unique names making a RegExp more precise (this is the same reason why I <em>never</em> name an iterator variable &#8220;i&#8221; or &#8220;j&#8221; - I <em>always</em> use &#8220;ii&#8221; or &#8220;jj&#8221; so you can search and/or replace it).</p>
<p>The old arguments against Hungarian Notation just simply don&#8217;t make sense in today&#8217;s web development environment.  Thus, I present to you my top reasons to love Hungarian Notation!</p>
<h2>Four Reasons to love Hungarian Notation</h2>
<ol>
<li>With no variable typing, IDE introspection or language compiler to fall back upon for PHP, ColdFusion and other web languages, HN subtly communicates valuable information to the developer that helps prevent and identify mistakes.</li>
<li>The greatest cost of software is actually the maintenance, assuming you&#8217;re not some pump-n-dump consultant who rides from one gig to the next.  Hungarian Notation <em>significantly improves</em> maintainability because a developer can return to code six months or six years later and have an immediate handle on what is going on in the code without knowing the intricacies of the data model.  These prefixes act like hints, continually reminding us of where we are and what we&#8217;re dealing with.  It&#8217;s built-in documentation that you never have to sit down to write!</li>
<li>Prefixes can allow you to catch special situations.  I use <a href="http://www.transfer-orm.com">Transfer ORM</a> against <a href="http://www.ghidinelli.com/2008/02/04/postgresql-83-uuid-xml-enums">PostgreSQL</a>.  One of the great things about postgres are the <a href="http://www.postgresql.org/docs/8.3/static/datatype.html">extensive data types</a> it supports which include things like GIS &#8220;points&#8221; and UUIDs and timestamp-differential &#8220;Intervals&#8221;. Problem is, Transfer would throw errors when I accessed an interval column but Hungarian Notation came to the rescue.  Since I prefix all interval columns with &#8220;inv&#8221;, I modified TransferSelecter.cfc starting with:
<pre><code>default:
	null = null &amp; "text";</code></pre>
<p>to handle this special case:</p>
<pre><code>default:
if (left(arguments.column, 3) EQ "inv")
{
	null = null &amp; "interval";
}
else
{
	null = null &amp; "text";
}</code></pre>
<p>Not the ideal fix but the prefix saved my bacon with a minimal amount of work when I was in the middle of writing my application.
</li>
<li>No collision with reserved words in SQL or any other language.  Consider an e-commerce site: it would surely have an &#8220;Order&#8221; table and perhaps a &#8220;Group&#8221; table, both of which are reserved keywords in SQL.  You can work around that by making them plural or giving them a more descriptive name like &#8220;SiteOrders&#8221; but consistently prefixed names like tblLookupOrder will never conflict with reserved words.</li>
</ol>
<h2>Ghidinelli (Hungarian) Notation</h2>
<p>There are many interpretations of Hungarian Notation out there but I will share the prefixes and naming conventions I use to paint a picture of a system I have used alone and in teams for over a decade.  I don&#8217;t claim this to be <em>the</em> way, but rather <em>a</em> way.</p>
<p>My first personal rule is that all prefixes should be three characters.  There are two reasons for this - with three characters you will surely have enough combinations to adequately abbreviate the object you are trying to describe.  Secondly, it allows you to programmatically check the prefix since it will always be three characters long (see the Transfer example above).  Beyond that, I use a combination of what I learned back in 1994 and what sounded good to me as time went by:</p>
<p><strong>Table Naming</strong></p>
<ul>
<li>tblLookup* - a normalized lookup table to hold an idea.  ex: tblLookupUser, tblLookupOrder.</li>
<li>tblMap* - a mapping table between typically two lookup tables to describe a relationship.  ex: tblMapUserOrders or I have seen others use tblMapUsersToOrders.</li>
<li>vue* - a view prefix, usually using the same Lookup and Map pieces.  ex: vueLookupAttendee.</li>
</ul>
<p><strong>Column Naming</strong></p>
<ul>
<li>boo - boolean</li>
<li>int - integer</li>
<li>snt - small integer (int[2])</li>
<li>tnt - tiny integer (int[1])</li>
<li>chr - character</li>
<li>uid - character(35) used for storage of UUIDs which I use as primary keys in many instances.</li>
<li>vch - varying character</li>
<li>txt - text or unlimited varying character (depending on platform)</li>
<li>inv - <a href="http://www.ghidinelli.com/2007/06/14/postgresql-interval-data-type-with-cfqueryparam">interval</a></li>
<li>num - numeric</li>
<li>dec - decimal</li>
<li>mny - money, which may actually be decimal but better describes it as currency</li>
<li>xml - XML storage for databases that support it like PostgreSQL, Oracle&#8230;</li>
<li>dte - date</li>
<li>dtm - datetime/timestamp</li>
<li>rad - radians (may be represented as decimal)</li>
<li>net - <a href="http://www.postgresql.org/docs/8.3/static/datatype-net-types.html">IP address</a></li>
</ul>
<p><strong>Application Variable Naming</strong></p>
<ul>
<li>arr - array</li>
<li>str - struct (in coldfusion, object in javascript, etc)</li>
<li>obj - an instance of a coldfusion component</li>
<li>int - integer/numeric</li>
<li>qry - query</li>
</ul>
<p>I&#8217;ve become less strict about the variable naming rules in the past years mostly because with CFCs, I keep my methods short enough to be clear.  I may be more strict in using them in the view layer where non-programmers or other users might need to do some work since we can share a key of &#8220;what is what&#8221;.</p>
<h2>Conclusion</h2>
<p>At the end of the day, Hungarian Notation does not cost the developer anything but <em>may</em> add value in a variety of circumstances, specifically consistency, maintainability and flexibility.  There may be components of these conventions that people don&#8217;t like, but they clearly do solve the items laid out above.</p>
<p>These are guidelines I generally use but freely break as needed.  I tend to be very strict in the data layer and less strict in the display layer.  I&#8217;ve been writing my current application now for five years and I can&#8217;t imagine wading into some of my old code without these hints - it would take at least twice as long to make simple changes.  This is the key reason why I continue to use Hungarian Notation!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=iNhBGvTqRJI:n34y1iugkIA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=iNhBGvTqRJI:n34y1iugkIA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColorTech/~4/iNhBGvTqRJI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2008/11/23/my-case-for-hungarian-notation/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2008/11/23/my-case-for-hungarian-notation</feedburner:origLink></item>
		<item>
		<title>cfpayment in eighteen lines of code</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColorTech/~3/x56HdpeLc8A/cfpayment-in-eighteen-lines-of-code</link>
		<comments>http://www.ghidinelli.com/2008/11/18/cfpayment-in-eighteen-lines-of-code#comments</comments>
		<pubDate>Wed, 19 Nov 2008 02:29:35 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[My Software]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[cfpayment]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=311</guid>
		<description><![CDATA[We&#8217;ve been hard at work the last few weeks on making real, meaningful ground on CFPAYMENT, the open source ColdFusion payment processing library that generalizes many different gateways into a single, pluggable API.  In the run-up to 1.0, I wanted to share some snippets to get you excited about using cfpayment for your next [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve been hard at work the last few weeks on making real, meaningful ground on <a href="http://cfpayment.riaforge.org">CFPAYMENT</a>, the open source ColdFusion payment processing library that generalizes many different gateways into a single, pluggable API.  In the run-up to 1.0, I wanted to share some snippets to get you excited about using cfpayment for your next (or current!) e-commerce project:</p>
<p><code>&lt;cfset config = {path = "braintree.braintree", username = "demo", password = "demo"  } /&gt;<br />
&lt;cfset cfpayment = createObject("component", "cfpayment.api.core").init(config) /&gt;<br />
&lt;cfset gateway = cfpayment.getGateway() /&gt;<br />
// create a money object to hold the amount in cents<br />
&lt;cfset money = cfpayment.createMoney(5000, "USD") /&gt;<br />
// create an account to charge<br />
&lt;cfset account = cfpayment.createCreditCard() /&gt;<br />
&lt;cfset account.setAccount(4111111111111111) /&gt;<br />
&lt;cfset account.setMonth(10) /&gt;<br />
&lt;cfset account.setYear(10) /&gt;<br />
&lt;cfset account.setFirstName("John") /&gt;<br />
&lt;cfset account.setLastName("Doe") /&gt;<br />
// authorize the card<br />
&lt;cfset response = gw.authorize(money = money, account = creditcard) /&gt;<br />
// flag the authorization for settlement into your bank account<br />
&lt;cfset response = gw.capture(money = money, transactionid = response.getTransactionID()) /&gt;<br />
// changed my mind, let's void it<br />
&lt;cfset response = gw.void(transactionid = response.getTransactionID()) /&gt;</code></p>
<p>Heard of <a href="http://www.ghidinelli.com/2007/09/06/accepting-credit-cards-then-youve-heard-of-pci-dss-right-right">PCI DSS</a>?  You can mitigate or avoid it altogether by using a remote storage system like <a href="http://www.braintreepaymentsolutions.com/remote-credit-card-storage/">Braintree&#8217;s Secure Vault</a>:</p>
<p><code>// create a token<br />
&lt;cfset token = cfpayment.createToken(createUUID()) /&gt;<br />
&lt;cfset options = { store = token.getID() } /&gt;<br />
// authorize and put the data into the vault<br />
&lt;cfset response = gw.authorize(money = money, account = account, options = options) /&gt;<br />
// come back later and use that token to charge the card<br />
&lt;cfset response = gw.purchase(money = money, account = token) /&gt;<br />
// changed my mind, delete it from the vault<br />
&lt;cfset response = gw.unstore(account = token) /&gt;</code></p>
<p>Don&#8217;t use Braintree?  That&#8217;s OK, as of today, you could just as easily initialize the Core API to use <a href="http://www.itransact.com">iTransact</a> or <a href="http://www.skipjack.com/">Skipjack</a> <em>without any change in your consumer code</em>.</p>
<p>We&#8217;re working to add more payment gateways.  The best source of these will come from people who have written integrations already or need to write one and want to benefit from the infrastructure of a community-supported and planned API that gives them flexibility in choosing their gateways and merchant accounts over the long road.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=x56HdpeLc8A:jhU3Y4id8K4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=x56HdpeLc8A:jhU3Y4id8K4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColorTech/~4/x56HdpeLc8A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2008/11/18/cfpayment-in-eighteen-lines-of-code/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2008/11/18/cfpayment-in-eighteen-lines-of-code</feedburner:origLink></item>
		<item>
		<title>Announcing CFPAYMENT</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColorTech/~3/HMNLwBCRxRI/announcing-cfpayment</link>
		<comments>http://www.ghidinelli.com/2007/11/13/announcing-cfpayment#comments</comments>
		<pubDate>Tue, 13 Nov 2007 16:55:02 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[My Software]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/2007/11/13/announcing-cfpayment/</guid>
		<description><![CDATA[I have a need for an abstracted payment processing API and based on a thread on the CFGURU list, it&#8217;s obvious other people do too.  A few weeks ago, I created a project called CFMERCHANT but found the name was taken so today it has been renamed to CFPAYMENT.  You can see the [...]]]></description>
			<content:encoded><![CDATA[<p>I have a need for an abstracted payment processing API and based on a thread on the CFGURU list, it&#8217;s obvious other people do too.  A few weeks ago, I created a project called CFMERCHANT but found the name was taken so today it has been renamed to CFPAYMENT.  You can see the project site at <a href="http://cfpayment.riaforge.org">cfpayment.riaforge.org</a>.</p>
<p>The goal is to let developers plug in payment processing without having to understand the intricacies of each gateway.  Instead, we&#8217;ll provide a clean outward facing API for each payment gateway.  <a href="http://www.mkville.com/blog/">Mark Mazelin</a> has already been a great help in putting together some samples and documentation and we&#8217;re knocking ideas back and forth.  We&#8217;ll be leveraging a lot of the thinking and work done by the <a href="http://www.activemerchant.org">ActiveMerchant</a> project since they did a great job.  Hopefully we&#8217;ll be collaborating with the <a href="http://cfcommerce.org/">cfCommerce team</a> who is building an open source commerce platform for ColdFusion.</p>
<p>We should have support for five or six gateways in our first release which will be soon because both Mark and I need this in the short-term.  If you have working code for a payment gateway, PLEASE contribute it.  We&#8217;ll attribute it to you and you&#8217;ll be famous!  If you&#8217;re interested in developing it yourself, even better!  Please contact me and let me know.  More to come&#8230;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=HMNLwBCRxRI:vxAxnnn9deM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=HMNLwBCRxRI:vxAxnnn9deM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColorTech/~4/HMNLwBCRxRI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2007/11/13/announcing-cfpayment/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2007/11/13/announcing-cfpayment</feedburner:origLink></item>
		<item>
		<title>Logwatch script for Courier-IMAP</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColorTech/~3/znly_Ibvs-o/logwatch-script-for-courier-imap</link>
		<comments>http://www.ghidinelli.com/2007/08/31/logwatch-script-for-courier-imap#comments</comments>
		<pubDate>Fri, 31 Aug 2007 23:31:45 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[My Software]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/2007/08/31/logwatch-script-for-courier-imap/</guid>
		<description><![CDATA[Every morning the same thing in my inbox:
 --------------------- IMAP Begin ------------------------ 
**Unmatched Entries**
   Connection, ip=[::ffff:65.81.246.95]: 45 Time(s)
   Connection, ip=[::ffff:65.81.61.76]: 8 Time(s)
   DISCONNECTED, user=xxxxxxx, ip=[::ffff:65.81.241.95], headers=0, body=0, rcvd=2675, sent=118, time=246, starttls=1: 1 Time(s)
   DISCONNECTED, user=xxxxxxx, ip=[::ffff:65.81.241.95], headers=0, body=35629, rcvd=415, sent=42860, time=310, starttls=1: 1 Time(s)
   DISCONNECTED, [...]]]></description>
			<content:encoded><![CDATA[<p>Every morning the same thing in my inbox:</p>
<p><code> --------------------- IMAP Begin ------------------------ </p>
<p>**Unmatched Entries**<br />
   Connection, ip=[::ffff:65.81.246.95]: 45 Time(s)<br />
   Connection, ip=[::ffff:65.81.61.76]: 8 Time(s)<br />
   DISCONNECTED, user=xxxxxxx, ip=[::ffff:65.81.241.95], headers=0, body=0, rcvd=2675, sent=118, time=246, starttls=1: 1 Time(s)<br />
   DISCONNECTED, user=xxxxxxx, ip=[::ffff:65.81.241.95], headers=0, body=35629, rcvd=415, sent=42860, time=310, starttls=1: 1 Time(s)<br />
   DISCONNECTED, user=xxxxxxx, ip=[::ffff:65.81.61.76], headers=528, body=0, rcvd=555, sent=61494, time=15, starttls=1: 1 Time(s)<br />
   LOGIN, user=xxxxxxx, ip=[::ffff:218.55.14.23], protocol=IMAP: 8 Time(s)<br />
   LOGIN, user=xxxxxxx, ip=[::ffff:218.55.14.2], protocol=IMAP: 23 Time(s)<br />
   LOGOUT, user=xxxxxxx, ip=[::ffff:218.55.14.23], headers=0, body=0, rcvd=44, sent=8574, time=15, starttls=1: 2 Time(s)<br />
   LOGOUT, user=xxxxxxx, ip=[::ffff:218.55.14.23], headers=0, body=0, rcvd=44, sent=8574, time=17, starttls=1: 1 Time(s)<br />
   LOGOUT, user=xxxxxxx, ip=[::ffff:218.55.14.23], headers=11121, body=0, rcvd=589, sent=29878, time=21, starttls=1: 1 Time(s)<br />
   TIMEOUT, user=xxxxxxx, ip=[::ffff:65.81.61.76], headers=5480, body=137917, rcvd=15459, sent=230354, time=41040, starttls=1: 1 Time(s)<br />
   couriertls: read: Connection timed out: 2 Time(s)</p>
<p> --------------- IMAP End ----------------- </code></p>
<p>Only about 50x the amount of these entries.  The reason?  The Logwatch script for IMAP that ships with RHEL/CentOS is totally broken.  Everything comes back as one blob of &#8220;Unmatched Entries&#8221;.  Not high on my priority list, I was forced to restore sanity to my life by hacking out a <a href="http://www.ghidinelli.com/software">fixed version</a>.  This doesn&#8217;t do everything, but set detail level to 5 (Med) and you&#8217;ll get the basics in nice, tabular output:</p>
<p><code> --------------------- Courier IMAP Begin ------------------------ </p>
<p>[IMAPd] Connections:<br />
=========================<br />
                                  Host | Connections |    SSL   |   Total<br />
-------------------------- | -------- | ------ | ------<br />
                  m7e0e36d0.tmodns.net |           0 |        0 |        54<br />
                  m180e36d0.tmodns.net |           0 |        0 |        54<br />
                  m190e36d0.tmodns.net |           0 |        0 |        26<br />
                  m590e36d0.tmodns.net |           0 |        0 |         3<br />
                          32.144.4.182 |           0 |        0 |         2<br />
                         32.147.133.10 |           0 |        0 |         2<br />
                        32.168.132.161 |           0 |        0 |         2<br />
                         32.169.11.246 |           0 |        0 |         1<br />
                        32.169.127.172 |           0 |        0 |         1<br />
                          32.169.4.144 |           0 |        0 |         1<br />
          64.124.188.114.gatespeed.com |           0 |        0 |         3<br />
                   mail.fastracing.com |           0 |        0 |        50<br />
                   mail.sum-racing.net |           0 |        0 |        10<br />
--------------------------------------------------<br />
                                                   0 |        0 |       209</p>
<p>[IMAPd] Login stats:<br />
====================<br />
                                   User | Logins<br />
-------------------------- | -----<br />
                    xxxxxxxxxxxxxxxxxxx |     104<br />
                        xxxxxxxxxxxxxxx |      59<br />
                     xxxxxxxxxxxxxxxxxx |      44<br />
---------------------------------<br />
                                              207</code></p>
<p>You can see some of the stats are logged separately yet.  Note that the conf file has a DNS lookup option to turn on/off reverse lookups in the logs.  You can get the script and configuration file from my <a href="http://www.ghidinelli.com/software">software page</a> now.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=znly_Ibvs-o:ko7MoDL8lko:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=znly_Ibvs-o:ko7MoDL8lko:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColorTech/~4/znly_Ibvs-o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2007/08/31/logwatch-script-for-courier-imap/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2007/08/31/logwatch-script-for-courier-imap</feedburner:origLink></item>
		<item>
		<title>RSESSION 2.0</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColorTech/~3/o4aXp0sC3Rg/rsession-20</link>
		<comments>http://www.ghidinelli.com/2007/08/05/rsession-20#comments</comments>
		<pubDate>Mon, 06 Aug 2007 00:41:36 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[My Software]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/2007/08/05/rsession-20/</guid>
		<description><![CDATA[RSESSION is a database-backed session management system I built for ColdFusion 4.5 when there was no support for failover and serious issues with locking.  It&#8217;s been six years since its last release.  Last year, Jason Baker provided a CFC-based implementation which I have rolled into the package.  I&#8217;m releasing this for completeness [...]]]></description>
			<content:encoded><![CDATA[<p>RSESSION is a database-backed session management system I built for ColdFusion 4.5 when there was no support for failover and serious issues with locking.  It&#8217;s been six years since its last release.  Last year, Jason Baker provided a CFC-based implementation which I have rolled into the package.  I&#8217;m releasing this for completeness although I no longer use or maintain this code.  Download available <a href="http://www.ghidinelli.com/personal/code/rsession/">here</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=o4aXp0sC3Rg:Ercj2g_0MdU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?a=o4aXp0sC3Rg:Ercj2g_0MdU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColorTech?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColorTech/~4/o4aXp0sC3Rg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2007/08/05/rsession-20/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2007/08/05/rsession-20</feedburner:origLink></item>
	</channel>
</rss>
