<?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:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Orange is my favorite color</title>
	
	<link>http://www.ghidinelli.com</link>
	<description />
	<lastBuildDate>Wed, 04 Jan 2012 08:06:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</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" type="application/rss+xml" href="http://feeds.feedburner.com/OrangeIsMyFavoriteColor" /><feedburner:info uri="orangeismyfavoritecolor" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>37.772329</geo:lat><geo:long>-122.41087</geo:long><feedburner:emailServiceId>OrangeIsMyFavoriteColor</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>CFHTTP Error Handling for Status Codes</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/wEXRU2tBubg/cfhttp-error-handling-http-status-codes</link>
		<comments>http://www.ghidinelli.com/2012/01/03/cfhttp-error-handling-http-status-codes#comments</comments>
		<pubDate>Wed, 04 Jan 2012 03:23:10 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[ColdFusion]]></category>
		<category><![CDATA[Web/Internet]]></category>
		<category><![CDATA[CFHTTP]]></category>
		<category><![CDATA[cfpayment]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1433</guid>
		<description><![CDATA[A test of the exception types thrown by ColdFusion for all HTTP status codes]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re <a href="https://groups.google.com/forum/#!topic/cfpayment/e_gjlAbAWqY">discussing some refactoring</a> before releasing a <a href="http://cfpayment.riaforge.org">cfpayment 1.0</a> and one of the things I&#8217;m working on is figuring out when to use ColdFusion&#8217;s in-built error handling and when to use HTTP status codes.  Currently we use the throwonerror option for CFHTTP which results in issues like 404 throwing an exception.  This works but as more and more services expose RESTful APIs which use status codes other than 200 to communicate results, this is not perfect.</p>
<p>That got me to thinking&#8230; what status codes does ColdFusion throw an error for when throwonerror is set to yes?  Here&#8217;s the list for <a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes">every HTTP status code</a>:</p>
<h2>CFHTTP with throwonerror=&#8221;yes&#8221;</h2>
<table>
<tr>
<td>200</td>
<td>Returned normally with status 200 OK</td>
</tr>
<tr>
<td>201</td>
<td>Returned normally with status 201 Created</td>
</tr>
<tr>
<td>202</td>
<td>Returned normally with status 202 Accepted</td>
</tr>
<tr>
<td>203</td>
<td>Returned normally with status 203 Non-Authoritative Information</td>
</tr>
<tr>
<td>204</td>
<td>Returned normally with status 204 No Content</td>
</tr>
<tr>
<td>205</td>
<td>Returned normally with status 205 Reset Content</td>
</tr>
<tr>
<td>206</td>
<td>Returned normally with status 206 Partial Content</td>
</tr>
<tr>
<td>207</td>
<td>Returned normally with status 207 Multi-Status</td>
</tr>
<tr>
<td>208</td>
<td>Returned normally with status 208 Already Reported</td>
</tr>
<tr>
<td>226</td>
<td>Returned normally with status 226 IM Used</td>
</tr>
<tr>
<td>300</td>
<td>COM.Allaire.ColdFusion.HTTPMultipleChoices</td>
</tr>
<tr>
<td>301</td>
<td>COM.Allaire.ColdFusion.HTTPMovedPermanently</td>
</tr>
<tr>
<td>302</td>
<td>COM.Allaire.ColdFusion.HTTPMovedPermanently</td>
</tr>
<tr>
<td>303</td>
<td>COM.Allaire.ColdFusion.HTTPSeeOther</td>
</tr>
<tr>
<td>304</td>
<td>COM.Allaire.ColdFusion.HTTPNotModified</td>
</tr>
<tr>
<td>305</td>
<td>COM.Allaire.ColdFusion.HTTPUseProxy</td>
</tr>
<tr>
<td>306</td>
<td>Returned normally with status 306 Switch Proxy</td>
</tr>
<tr>
<td>307</td>
<td>Returned normally with status 307 Temporary Redirect</td>
</tr>
<tr>
<td>308</td>
<td>Returned normally with status 308 Resume Incomplete</td>
</tr>
<tr>
<td>400</td>
<td>COM.Allaire.ColdFusion.HTTPBadRequest</td>
</tr>
<tr>
<td>401</td>
<td>Returned normally with status 401 Unauthorized</td>
</tr>
<tr>
<td>402</td>
<td>COM.Allaire.ColdFusion.HTTPPaymentRequired</td>
</tr>
<tr>
<td>403</td>
<td>COM.Allaire.ColdFusion.HTTPForbidden</td>
</tr>
<tr>
<td>404</td>
<td>COM.Allaire.ColdFusion.HTTPNotFound</td>
</tr>
<tr>
<td>405</td>
<td>Returned normally with status 405 Method Not Allowed</td>
</tr>
<tr>
<td>406</td>
<td>COM.Allaire.ColdFusion.HTTPNotAcceptable</td>
</tr>
<tr>
<td>407</td>
<td>COM.Allaire.ColdFusion.HTTPProxyAuthenticationRequired</td>
</tr>
<tr>
<td>408</td>
<td>Returned normally with status 408 Request Timeout</td>
</tr>
<tr>
<td>409</td>
<td>COM.Allaire.ColdFusion.HTTPConflict</td>
</tr>
<tr>
<td>410</td>
<td>COM.Allaire.ColdFusion.HTTPGone</td>
</tr>
<tr>
<td>411</td>
<td>COM.Allaire.ColdFusion.HTTPFailure</td>
</tr>
<tr>
<td>412</td>
<td>COM.Allaire.ColdFusion.HTTPPreconditionFailed</td>
</tr>
<tr>
<td>413</td>
<td>COM.Allaire.ColdFusion.HTTPCFHTTPRequestEntityTooLarge</td>
</tr>
<tr>
<td>414</td>
<td>COM.Allaire.ColdFusion.HTTPRequestURITooLarge</td>
</tr>
<tr>
<td>415</td>
<td>COM.Allaire.ColdFusion.HTTPUnsupportedMediaType</td>
</tr>
<tr>
<td>416</td>
<td>Returned normally with status 416 Requested Range Not Satisfiable</td>
</tr>
<tr>
<td>417</td>
<td>Returned normally with status 417 Expectation Failed</td>
</tr>
<tr>
<td>418</td>
<td>Returned normally with status 418 I&#8217;m a teapot</td>
</tr>
<tr>
<td>422</td>
<td>Returned normally with status 422 Unprocessable Entity</td>
</tr>
<tr>
<td>423</td>
<td>Returned normally with status 423 Locked</td>
</tr>
<tr>
<td>424</td>
<td>Returned normally with status 424 Failed Dependency</td>
</tr>
<tr>
<td>425</td>
<td>Returned normally with status 425 Unordered Collection</td>
</tr>
<tr>
<td>426</td>
<td>Returned normally with status 426 Upgrade Required</td>
</tr>
<tr>
<td>428</td>
<td>Returned normally with status 428 Precondition Required</td>
</tr>
<tr>
<td>429</td>
<td>Returned normally with status 429 Too Many Requests</td>
</tr>
<tr>
<td>431</td>
<td>Returned normally with status 431 Request Header Fields Too Large</td>
</tr>
<tr>
<td>444</td>
<td>Returned normally with status 444 No Response</td>
</tr>
<tr>
<td>449</td>
<td>Returned normally with status 449 Retry With</td>
</tr>
<tr>
<td>450</td>
<td>Returned normally with status 450 Blocked by Windows Parental Controls</td>
</tr>
<tr>
<td>499</td>
<td>Returned normally with status 499 Client Closed Request</td>
</tr>
<tr>
<td>500</td>
<td>COM.Allaire.ColdFusion.HTTPServerError</td>
</tr>
<tr>
<td>501</td>
<td>COM.Allaire.ColdFusion.HTTPNotImplemented</td>
</tr>
<tr>
<td>502</td>
<td>COM.Allaire.ColdFusion.HTTPBadGateway</td>
</tr>
<tr>
<td>503</td>
<td>COM.Allaire.ColdFusion.HTTPServiceUnavailable</td>
</tr>
<tr>
<td>504</td>
<td>Returned normally with status 504 Gateway Timeout</td>
</tr>
<tr>
<td>505</td>
<td>COM.Allaire.ColdFusion.HTTPVersionNotSupported</td>
</tr>
<tr>
<td>506</td>
<td>Returned normally with status 506 Variant Also Negotiates</td>
</tr>
<tr>
<td>507</td>
<td>Returned normally with status 507 Insufficient Storage</td>
</tr>
<tr>
<td>508</td>
<td>Returned normally with status 508 Loop Detected</td>
</tr>
<tr>
<td>509</td>
<td>Returned normally with status 509 Bandwidth Limit Exceeded</td>
</tr>
<tr>
<td>510</td>
<td>Returned normally with status 510 Not Extended</td>
</tr>
<tr>
<td>511</td>
<td>Returned normally with status 511 Network Authentication Required</td>
</tr>
<tr>
<td>598</td>
<td>Returned normally with status 598 Network read timeout error</td>
</tr>
<tr>
<td>599</td>
<td>Returned normally with status 599 Network connect timeout error</td>
</tr>
<tr>
<td>999</td>
<td>Returned normally with status 999 Invalid HTTP status code</td>
</tr>
</table>
<p>I also ran it with throwonerror=&#8221;no&#8221;, which has <em>almost</em> the results you would expect with the exception of code 411:</p>
<h2>CFHTTP with throwonerror=&#8221;no&#8221;</h2>
<table>
<tr>
<td>200</td>
<td>Returned normally with status 200 OK</td>
</tr>
<tr>
<td>201</td>
<td>Returned normally with status 201 Created</td>
</tr>
<tr>
<td>202</td>
<td>Returned normally with status 202 Accepted</td>
</tr>
<tr>
<td>203</td>
<td>Returned normally with status 203 Non-Authoritative Information</td>
</tr>
<tr>
<td>204</td>
<td>Returned normally with status 204 No Content</td>
</tr>
<tr>
<td>205</td>
<td>Returned normally with status 205 Reset Content</td>
</tr>
<tr>
<td>206</td>
<td>Returned normally with status 206 Partial Content</td>
</tr>
<tr>
<td>207</td>
<td>Returned normally with status 207 Multi-Status</td>
</tr>
<tr>
<td>208</td>
<td>Returned normally with status 208 Already Reported</td>
</tr>
<tr>
<td>226</td>
<td>Returned normally with status 226 IM Used</td>
</tr>
<tr>
<td>300</td>
<td>Returned normally with status 300 Multiple Choices</td>
</tr>
<tr>
<td>301</td>
<td>Returned normally with status 301 Moved Permanently</td>
</tr>
<tr>
<td>302</td>
<td>Returned normally with status 302 Found</td>
</tr>
<tr>
<td>303</td>
<td>Returned normally with status 303 See Other</td>
</tr>
<tr>
<td>304</td>
<td>Returned normally with status 304 Not Modified</td>
</tr>
<tr>
<td>305</td>
<td>Returned normally with status 305 Use Proxy</td>
</tr>
<tr>
<td>306</td>
<td>Returned normally with status 306 Switch Proxy</td>
</tr>
<tr>
<td>307</td>
<td>Returned normally with status 307 Temporary Redirect</td>
</tr>
<tr>
<td>308</td>
<td>Returned normally with status 308 Resume Incomplete</td>
</tr>
<tr>
<td>400</td>
<td>Returned normally with status 400 Bad Request</td>
</tr>
<tr>
<td>401</td>
<td>Returned normally with status 401 Unauthorized</td>
</tr>
<tr>
<td>402</td>
<td>Returned normally with status 402 Payment Required</td>
</tr>
<tr>
<td>403</td>
<td>Returned normally with status 403 Forbidden</td>
</tr>
<tr>
<td>404</td>
<td>Returned normally with status 404 Not Found</td>
</tr>
<tr>
<td>405</td>
<td>Returned normally with status 405 Method Not Allowed</td>
</tr>
<tr>
<td>406</td>
<td>Returned normally with status 406 Not Acceptable</td>
</tr>
<tr>
<td>407</td>
<td>Returned normally with status 407 Proxy Authentication Required</td>
</tr>
<tr>
<td>408</td>
<td>Returned normally with status 408 Request Timeout</td>
</tr>
<tr>
<td>409</td>
<td>Returned normally with status 409 Conflict</td>
</tr>
<tr>
<td>410</td>
<td>Returned normally with status 410 Gone</td>
</tr>
<tr>
<td>411</td>
<td>Returned normally with status Connection Failure.  Status code unavailable.</td>
</tr>
<tr>
<td>412</td>
<td>Returned normally with status 412 Precondition Failed</td>
</tr>
<tr>
<td>413</td>
<td>Returned normally with status 413 Request Entity Too Large</td>
</tr>
<tr>
<td>414</td>
<td>Returned normally with status 414 Request-URI Too Long</td>
</tr>
<tr>
<td>415</td>
<td>Returned normally with status 415 Unsupported Media Type</td>
</tr>
<tr>
<td>416</td>
<td>Returned normally with status 416 Requested Range Not Satisfiable</td>
</tr>
<tr>
<td>417</td>
<td>Returned normally with status 417 Expectation Failed</td>
</tr>
<tr>
<td>418</td>
<td>Returned normally with status 418 I&#8217;m a teapot</td>
</tr>
<tr>
<td>422</td>
<td>Returned normally with status 422 Unprocessable Entity</td>
</tr>
<tr>
<td>423</td>
<td>Returned normally with status 423 Locked</td>
</tr>
<tr>
<td>424</td>
<td>Returned normally with status 424 Failed Dependency</td>
</tr>
<tr>
<td>425</td>
<td>Returned normally with status 425 Unordered Collection</td>
</tr>
<tr>
<td>426</td>
<td>Returned normally with status 426 Upgrade Required</td>
</tr>
<tr>
<td>428</td>
<td>Returned normally with status 428 Precondition Required</td>
</tr>
<tr>
<td>429</td>
<td>Returned normally with status 429 Too Many Requests</td>
</tr>
<tr>
<td>431</td>
<td>Returned normally with status 431 Request Header Fields Too Large</td>
</tr>
<tr>
<td>444</td>
<td>Returned normally with status 444 No Response</td>
</tr>
<tr>
<td>449</td>
<td>Returned normally with status 449 Retry With</td>
</tr>
<tr>
<td>450</td>
<td>Returned normally with status 450 Blocked by Windows Parental Controls</td>
</tr>
<tr>
<td>499</td>
<td>Returned normally with status 499 Client Closed Request</td>
</tr>
<tr>
<td>500</td>
<td>Returned normally with status 500 Internal Server Error</td>
</tr>
<tr>
<td>501</td>
<td>Returned normally with status 501 Not Implemented</td>
</tr>
<tr>
<td>502</td>
<td>Returned normally with status 502 Bad Gateway</td>
</tr>
<tr>
<td>503</td>
<td>Returned normally with status 503 Service Unavailable</td>
</tr>
<tr>
<td>504</td>
<td>Returned normally with status 504 Gateway Timeout</td>
</tr>
<tr>
<td>505</td>
<td>Returned normally with status 505 HTTP Version Not Supported</td>
</tr>
<tr>
<td>506</td>
<td>Returned normally with status 506 Variant Also Negotiates</td>
</tr>
<tr>
<td>507</td>
<td>Returned normally with status 507 Insufficient Storage</td>
</tr>
<tr>
<td>508</td>
<td>Returned normally with status 508 Loop Detected</td>
</tr>
<tr>
<td>509</td>
<td>Returned normally with status 509 Bandwidth Limit Exceeded</td>
</tr>
<tr>
<td>510</td>
<td>Returned normally with status 510 Not Extended</td>
</tr>
<tr>
<td>511</td>
<td>Returned normally with status 511 Network Authentication Required</td>
</tr>
<tr>
<td>598</td>
<td>Returned normally with status 598 Network read timeout error</td>
</tr>
<tr>
<td>599</td>
<td>Returned normally with status 599 Network connect timeout error</td>
</tr>
<tr>
<td>999</td>
<td>Returned normally with status 999 Invalid HTTP status code</td>
</tr>
</table>
<p>Notice Status Code 411 doesn&#8217;t return a numerical status code but rather a string &#8220;Connection Failure. Status code unavailable.&#8221;  The FileContent is set to &#8220;Connection Failure&#8221; while all other status codes are left blank (assuming that the request doesn&#8217;t return any data, as my test script does).  Good to know.</p>
<p><img src="http://www.ghidinelli.com/wp-content/uploads/2012/01/statuscode411.png" alt="How ColdFusion handles Status Code 411" title="How ColdFusion handles Status Code 411" width="426" height="220" class="aligncenter size-full wp-image-1441" /></p>
<h2>Problematic SSL Certificates</h2>
<p>For processing credit cards and payment processing transactions in general, the most insidious error I have run into is the &#8220;I/O Exception: peer not authenticated&#8221; error.  This basically means ColdFusion is <a href="http://www.ghidinelli.com/2008/01/19/using-invalid-expired-or-mismatched-ssl-certs-from-coldfusion">unable to read and authenticate the SSL certificate</a> and initiate a secure connection.  Generally this is either a self-signed certificate or, these days, a <a href="http://www.elliottsprehn.com/cfbugs/bugs/82997#comments">wildcard SSL certificate</a>.  Interestingly,  ColdFusion handles these scenarios a little bit differently depending on how throwonerror is set:</p>
<table border="1">
<tr>
<th>Test</th>
<th>ThrowOnError</th>
<th>Status/Message</th>
<th>ErrorDetail/Exception</th>
</tr>
<tr>
<td>Self-signed SSL Cert</td>
<td>Yes</td>
<td>Connection Failure: Status code unavailable</td>
<td>COM.Allaire.ColdFusion.HTTPFailure</td>
</tr>
<tr>
<td>Self-signed SSL Cert</td>
<td>No</td>
<td>Connection Failure. Status code unavailable.</td>
<td>I/O Exception: peer not authenticated</td>
</tr>
<tr>
<td>Wildcard SSL Cert</td>
<td>Yes</td>
<td>Connection Failure: Status code unavailable</td>
<td>COM.Allaire.ColdFusion.HTTPFailure</td>
</tr>
<tr>
<td>Wildcard SSL Cert</td>
<td>No</td>
<td>Connection Failure. Status code unavailable.</td>
<td>I/O Exception: peer not authenticated</td>
</tr>
</table>
<p>In summary, using throwonerror=no looks reasonably safe but you still must account for the catch-all COM.Allaire.ColdFusion.HTTPFailure.  My <a href="http://cfpayment.riaforge.org">battle-tested code</a> (which has processed more than $15MM) suggests you also need to check for coldfusion.runtime.RequestTimedOutException which is a different kind of exception when CFHTTP times out or the page times out.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=wEXRU2tBubg:Kw4-i8iJAt0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=wEXRU2tBubg:Kw4-i8iJAt0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=wEXRU2tBubg:Kw4-i8iJAt0:2mJPEYqXBVI"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=2mJPEYqXBVI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColor/~4/wEXRU2tBubg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2012/01/03/cfhttp-error-handling-http-status-codes/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ghidinelli.com/2012/01/03/cfhttp-error-handling-http-status-codes</feedburner:origLink></item>
		<item>
		<title>Autopilot in the ColdFusion Updater Minefield</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/lNtH9m6sKho/autopilot-in-coldfusion-updater-minefield</link>
		<comments>http://www.ghidinelli.com/2011/12/20/autopilot-in-coldfusion-updater-minefield#comments</comments>
		<pubDate>Wed, 21 Dec 2011 06:18:05 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[ColdFusion]]></category>
		<category><![CDATA[Web/Internet]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1426</guid>
		<description><![CDATA[Applying ColdFusion server security updates automatically with Unofficial Updater 2]]></description>
			<content:encoded><![CDATA[<p>If you manage a ColdFusion 8 or 9 server, you are likely aware of the complete and total train wreck that is applying security updates from Adobe.  Not only are directions vague, but on occasion Adobe likes to go back and modify the security update without changing filenames or rev-ing the version number.  It can drive a SysOp to insanity.</p>
<p>So seems to be the mental state of <a href="http://www..com">David Epler</a> as he has been driven to build the &#8220;<a href="http://www.dcepler.net/post.cfm/unofficial-updater-2-for-coldfusion-8">Unofficial Updater 2</a>&#8220;.  It is an Ant script on steroids bundled in a JAR that knows how to go out and fetch all of the updates from Adobe.com and apply them to your CF8 or CF9 server installation.</p>
<p>I&#8217;m not going to belabor the awesomness; here&#8217;s how to get your server up to date in about 5 minutes:</p>
<ol>
<li>Start by verifying your current security issues, use Pete Freitag&#8217;s <a href="http://www.hackmycf.com">HackMyCF.com</a> for a baseline</li>
<li>Backup your /opt/jrun directory (just be safe): tar -cf /opt/jrun4</li>
<li>Download the Unofficial Updater from http://uu2.riaforge.org/</li>
<li>Run it: java -jar Unofficial-Updater2.jar text</li>
<li>Tell it where stuff lives in your installation (it knows how to handle Standalone, Jrun Multi-server and EAR/WAR installs)</li>
<li>Wait about 4 minutes for it to finish grabbing everything and install&#8230;</li>
<li>Re-run HackMyCF.com and BOOM!  Rest easy, friend.</li>
<li>Proceed to <a href="http://twitter.com/#!/ghidinelli/status/149361873878396928">have David Epler&#8217;s baby</a></li>
</ol>
<p>Please Adobe, please send David a big check so you can take his IP and use it for your next update, mmmm kay?</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=lNtH9m6sKho:8ITDxDqUIHk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=lNtH9m6sKho:8ITDxDqUIHk:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=lNtH9m6sKho:8ITDxDqUIHk:2mJPEYqXBVI"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=2mJPEYqXBVI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColor/~4/lNtH9m6sKho" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2011/12/20/autopilot-in-coldfusion-updater-minefield/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.ghidinelli.com/2011/12/20/autopilot-in-coldfusion-updater-minefield</feedburner:origLink></item>
		<item>
		<title>25 Hours of Thunderhill Endurance Race</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/9fXtXZzcfRs/25-hours-of-thunderhill-endurance-race</link>
		<comments>http://www.ghidinelli.com/2011/12/11/25-hours-of-thunderhill-endurance-race#comments</comments>
		<pubDate>Sun, 11 Dec 2011 22:47:31 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[Racing]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1419</guid>
		<description><![CDATA[In-car video at twilight driving a 400+HP BMW M3 at the 25 Hours of Thunderhill]]></description>
			<content:encoded><![CDATA[<p>One of my favorite annual racing events, the <a href="http://www.nasa25hour.com/">NASA 25 Hours of Thunderhill</a> brings racers from all backgrounds and disciplines together to see who can run their racecar the fastest over a 25-hour period.  Walking the paddock is like compressing an entire year of friends and conversations into a single weekend and yet, somehow, the on-track action is even better.</p>
<p>This year I was lucky enough to drive with Tiger Racing in their 2006 BMW M3.  Compared to the low-horsepower cars I typically drive, this 400+HP car with 10&#8243; slicks and big Brembo brakes was a completely different animal, <em>and it was fast</em>.  Even at a comfortable enduro pace to preserve the car and exercise caution when passing, the M3 is capable of running lap times 12-15s/lap faster than my Spec Miata.  It also sounds absolutely glorious. <img src='http://www.ghidinelli.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p>Here are a few laps of in-car footage from my stint driving just after sundown into the darkness.  Driving at night is one of my favorite times: you settle into a rhythm and just click off the laps (click through to see a larger version and make sure to enable HD):</p>
<p><iframe src="http://player.vimeo.com/video/33495466?title=0&amp;byline=0&amp;portrait=0" width="640" height="360" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
<p>I was in the car for 2.5 hours until earlier damage created a mechanical issue that forced us to retire.  This was the team&#8217;s 8th running of the 25 Hour and it&#8217;s their first retirement which speaks to the great job they do before the race each year.  The car is prepared by <a href="http://www.bavarian-tuning.com/">Bavarian Tuning</a> in Santa Rosa and <a href="http://www.tcdesignfab.com">TC Design</a> in Milpitas, CA.  Big thanks go out to the crew &#8211; one of the best in the paddock &#8211; and my fellow drivers John Larson, Billy Maher and Tony Colicchio for inviting me to be part of the team!</p>
<p>For some amazing photos, check <a href="http://www.lifeblasters.com/awesome/2011/7461/25-hours-of-thunderhill/">LifeBlasters.com</a> write-up of the event.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=9fXtXZzcfRs:PTfGqSfrlnk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=9fXtXZzcfRs:PTfGqSfrlnk:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=9fXtXZzcfRs:PTfGqSfrlnk:2mJPEYqXBVI"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=2mJPEYqXBVI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColor/~4/9fXtXZzcfRs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2011/12/11/25-hours-of-thunderhill-endurance-race/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.ghidinelli.com/2011/12/11/25-hours-of-thunderhill-endurance-race</feedburner:origLink></item>
		<item>
		<title>Announcing the Fred Jehle Spanish Verb Database</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/JjiR6hvh2sU/announcing-fred-jehle-spanish-verb-database</link>
		<comments>http://www.ghidinelli.com/2011/12/06/announcing-fred-jehle-spanish-verb-database#comments</comments>
		<pubDate>Wed, 07 Dec 2011 00:29:24 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Research/HOWTO]]></category>
		<category><![CDATA[Web/Internet]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[espanol]]></category>
		<category><![CDATA[spanish]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1397</guid>
		<description><![CDATA[Download a free database of 600 conjugated Spanish verbs under a Creative Commons license courtesy of Professor Fred Jehle]]></description>
			<content:encoded><![CDATA[<p>On a recent trip to Mexico I had the chance to use my Spanish (oh I&#8217;m <em>quite</em> the Renaissance man) and found that what I lose first is my ability to quickly say &#8220;he did X&#8221; or &#8220;they do Y&#8221;.  Worse is my need to reverse-engineer what I’m hearing back to an infinitive.  If someone says &#8220;Ellos me hablaban&#8221;, I decipher it like: &#8220;hablaban, ok, that is the third person plural for hablaba, which is hablar, which means to speak, so it’s they were speaking.&#8221;  That probably explains the glassy look in my eyes as I listen to native speakers.</p>
<p>Once home I searched for a database of conjugated verbs to make flash cards that, rather than working with infinitives, would read simple actions like &#8220;They walk&#8221;, &#8220;He used to sing&#8221; or &#8220;We would have spoken&#8221; and the reverse would have the proper Spanish conjugation.  Despite my uber Google skills, I was unable to find any non-commercial products.  However, I did come across one great resource that had the data I needed.  </p>
<p>Fred Jehle, formerly a professor at  Indiana University-Purdue University Fort Wayne, <a href="http://users.ipfw.edu/jehle/VERBLIST.HTM">published approximately 600 verbs</a>, fully conjugated in all moods and tenses, on his website in 1998.  The resource helped students improve their verb use in addition to a variety of notes on other aspects of the language.  I contacted Mr. Jehle to inquire if a database of his verbs were behind the scenes but unfortunately only the static web pages exist.</p>
<p>Out of curiosity, I opened up a couple of pages to see what the source HTML looked like and, luckily, it was pretty uniform.  I broke out my editor and wrote a script to read in each page, parse out the various conjugations and dump them in to a (PostgreSQL 9.x) database.   The roughly 600 verbs converted to 11,467 combinations of moods + tenses. </p>
<p>In coordination with copyright holder Professor Jehle, this data is available free of charge via a <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/">Creative Commons license</a> for anyone to use for non-commercial purposes so long as you provide attribution.  If you alter, transform or build upon this work then you <em>may</em> distribute the resulting work only under the same license.  </p>
<div style="border: 1px dashed black; padding: 5px; background-color: #eee; text-align: center;"><a href="http://www.ghidinelli.com/free-spanish-conjugated-verb-database">Click here to download the database</a></div>
<p>My thanks go to Mr. Jehle for quickly answering my questions and allowing me to publish the data for other would-be Spanish students.  I recommend that you also check out his website for additional Spanish content at <a href="http://users.ipfw.edu/jehle/VERBLIST.HTM">http://users.ipfw.edu/jehle/VERBLIST.HTM</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=JjiR6hvh2sU:5o-9CWtfv78:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=JjiR6hvh2sU:5o-9CWtfv78:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=JjiR6hvh2sU:5o-9CWtfv78:2mJPEYqXBVI"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=2mJPEYqXBVI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColor/~4/JjiR6hvh2sU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2011/12/06/announcing-fred-jehle-spanish-verb-database/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.ghidinelli.com/2011/12/06/announcing-fred-jehle-spanish-verb-database</feedburner:origLink></item>
		<item>
		<title>Shifter kart at Infineon</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/RJDHdzc324Q/shifter-kart-at-infineon</link>
		<comments>http://www.ghidinelli.com/2011/12/05/shifter-kart-at-infineon#comments</comments>
		<pubDate>Mon, 05 Dec 2011 19:15:03 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[Racing]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1385</guid>
		<description><![CDATA[Just a quick post of some helmet-cam footage taken by my friend with his ContourGPS last week at Infineon Raceway&#8217;s kart track on an open test day.  We&#8217;re both running Stock Moto karts although my kart is lighter.  I appear starting about 2:15 in wearing the blue suit with the red neck collar.

Watch [...]]]></description>
			<content:encoded><![CDATA[<p>Just a quick post of some helmet-cam footage taken by my friend with his ContourGPS last week at Infineon Raceway&#8217;s kart track on an open test day.  We&#8217;re both running Stock Moto karts although my kart is lighter.  I appear starting about 2:15 in wearing the blue suit with the red neck collar.</p>
<p><iframe width="480" height="270" src="http://contour.com/stories/infineon-stock-moto-practice-112611/embed?map=false&#038;width=480px&#038;height=270px" frameborder="0"></iframe></p>
<p>Watch the <a href="http://contour.com/stories/infineon-stock-moto-practice-112611">larger version on contour.com</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=RJDHdzc324Q:FB0rEq80f9g:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=RJDHdzc324Q:FB0rEq80f9g:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=RJDHdzc324Q:FB0rEq80f9g:2mJPEYqXBVI"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=2mJPEYqXBVI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColor/~4/RJDHdzc324Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2011/12/05/shifter-kart-at-infineon/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ghidinelli.com/2011/12/05/shifter-kart-at-infineon</feedburner:origLink></item>
		<item>
		<title>Preparing for the 25 Hours of Thunderhill</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/AK9Yl58Cy3E/preparing-for-the-25-hours-of-thunderhill</link>
		<comments>http://www.ghidinelli.com/2011/11/09/preparing-for-the-25-hours-of-thunderhill#comments</comments>
		<pubDate>Thu, 10 Nov 2011 03:09:41 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[Racing]]></category>
		<category><![CDATA[25hour]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1378</guid>
		<description><![CDATA[Three weeks until I drive a really fast car in a really long race: The 25 Hours of Thunderhill]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ghidinelli.com/wp-content/uploads/2011/11/photo.JPG"><img src="http://www.ghidinelli.com/wp-content/uploads/2011/11/photo-300x225.jpg" alt="photo" title="photo" width="300" height="225" class="alignright size-medium wp-image-1380" /></a>The first weekend of December, NASA holds their annual 25 Hours of Thunderhill race in Northern California.  The event is typically contested by around 75 teams who believe they can drive faster for 25 hours than their competitors. </p>
<p>I&#8217;ve participated three times: crewing for a Subaru WRX, driving in an 1989 BMW M3 and managing a 1995 BMW M3.  This year I&#8217;ll be driving a second time in an 2005 BMW M3 in the ES class with Tiger Racing.  ES is for unlimited cars: slicks, dry-brake fueling, air jacks, four-wheel tire changes, 400HP, the works.  This is going for the overall win, the glory and the 11-foot trophy that NASA gives the winning team.   We&#8217;ll be competing against Porsche GT3 Cup Cars, a Super Truck and who knows what else will come out of the woodwork before the event begins.  Previous years have featured Daytona Prototypes in the mix so anything is possible.</p>
<p>I&#8217;m very excited to be part of this team &#8211; their organizational skills, people and overall demeanor are professional but friendly and I know many of the crew and other drivers from previous track events making it an easy environment to get up to speed.  Last Friday we shook the car down at Thunderhill.  I got in the car about an hour before lunch to get oriented with the car.  Coming from primarily driving Spec Miatas where we turn around 2:07s at Thunderhill, this car has some serious juice!</p>
<p>I got to work over the next seven laps and brought my times down to a high 1:53 before disaster struck: the motor exploded, filling the cabin with smoke and sending me off track.  I coasted up to a flagging station so the corner worker could assist in case the car caught on fire but, minus the hole in the engine, no additional drama.  While this ended our day prematurely, it was a blessing in disguise that it happened a month before the race and not on the test day, or worse, in the first six hours of the race itself.   The motor is already out of the car and a spare is being readied.  Very nice work by Chris Watson at <a href="http://www.bavarian-tuning.com">Bavarian Tuning</a>.</p>
<h2>New Helmet</h2>
<p><a href="http://www.ghidinelli.com/wp-content/uploads/2011/11/stilo.jpg"><img src="http://www.ghidinelli.com/wp-content/uploads/2011/11/stilo-300x296.jpg" alt="Stilo ST4F Composite SA2010 helmet" title="Stilo ST4F Composite SA2010 helmet" width="300" height="296" class="alignright" /></a>I&#8217;m sitting in my office writing this post while I&#8217;m wearing my new <a href="http://www.saferacer.com/stilo-st4f-composite-sa2010-helmet.html?productid=2329">SA2010 Stilo ST4F helmet from SafeRacer</a>.  I&#8217;ve got my custom molded earplugs in and my balaclava to make sure everything is comfortable.  I&#8217;ll be driving the Tiger Racing BMW M3 for as long as 3.5 hours at a time: comfort isn&#8217;t a convenience, it&#8217;s a necessity.  A headache in 30 minutes would be a cranium splitter after all that time in the rough, buzzy car.  A lot of places won&#8217;t let you return a helmet but SafeRacer will let you try it on and return it if it doesn&#8217;t fit (did the same thing when I was shopping for race suits).  They have free shipping on orders over $99 so there&#8217;s only a minimum amount of cost to send something back if it isn&#8217;t the right size or fit.  <a href="http://www.saferacer.com/auto-racing-helmets/stilo/?cat=52&#038;manufacturerid=82">Stilo helmets</a> are quite new in the US, I&#8217;ve only ever seen one in person, so it&#8217;s not like I could run down to the local speed shop and try one on.  I&#8217;m very satisfied with the fit and features: built-in radio electronics, forced air and quick-disconnect drink tube are all awesome options.  If you order from SafeRacer and are a road racer, be sure to specify that you want the road race electronics package rather than the rally electronics.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=AK9Yl58Cy3E:zMFC531mnWQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=AK9Yl58Cy3E:zMFC531mnWQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=AK9Yl58Cy3E:zMFC531mnWQ:2mJPEYqXBVI"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=2mJPEYqXBVI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColor/~4/AK9Yl58Cy3E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2011/11/09/preparing-for-the-25-hours-of-thunderhill/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ghidinelli.com/2011/11/09/preparing-for-the-25-hours-of-thunderhill</feedburner:origLink></item>
		<item>
		<title>Why I buy racing gear from SafeRacer</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/UaVDRzNEZTY/why-i-buy-racing-gear-from-saferacer</link>
		<comments>http://www.ghidinelli.com/2011/10/25/why-i-buy-racing-gear-from-saferacer#comments</comments>
		<pubDate>Wed, 26 Oct 2011 01:23:54 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[Racing]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1373</guid>
		<description><![CDATA[Video of disabled car at 24 Hours of Lemons race getting rear-ended by unaware car]]></description>
			<content:encoded><![CDATA[<p><iframe width="560" height="315" src="http://www.youtube.com/embed/LX0kZGQJmnA" frameborder="0" allowfullscreen="true"></iframe></p>
<p>Skip to :22 if you&#8217;re impatient.  Never unbuckle your <a href="http://www.saferacer.com">safety equipment</a> on track unless you&#8217;re on fire.  It doesn&#8217;t matter if you&#8217;re in a Formula 1 race or a 171-car themed nutjob race.  </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=UaVDRzNEZTY:EgDVCaiZhr0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=UaVDRzNEZTY:EgDVCaiZhr0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=UaVDRzNEZTY:EgDVCaiZhr0:2mJPEYqXBVI"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=2mJPEYqXBVI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColor/~4/UaVDRzNEZTY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2011/10/25/why-i-buy-racing-gear-from-saferacer/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ghidinelli.com/2011/10/25/why-i-buy-racing-gear-from-saferacer</feedburner:origLink></item>
		<item>
		<title>October Qmail Follow-up</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/BTnZWQb58Is/october-qmail-follow-up</link>
		<comments>http://www.ghidinelli.com/2011/10/20/october-qmail-follow-up#comments</comments>
		<pubDate>Thu, 20 Oct 2011 20:04:54 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Research/HOWTO]]></category>
		<category><![CDATA[Web/Internet]]></category>
		<category><![CDATA[qmail]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1365</guid>
		<description><![CDATA[A couple of tweaks for QmailToaster install to update CHKUSER 2.0.9 and improve DSPAM integration]]></description>
			<content:encoded><![CDATA[<p>Some notes that I don&#8217;t want to forget to follow-up on my <a href="http://www.ghidinelli.com/2011/05/04/march-qmail-server-madness">March (Q)mail Server Madness</a> post earlier this year.  Things are running great with the exception of SpamAssassin being pretty useless.  An SA rules update in the last couple of weeks has been quarantining every email from Facebook plus another 25% of my legitimate email so we&#8217;ve disabled it and we&#8217;re just letting DSPAM do it&#8217;s thing instead.  Here&#8217;s a couple of tweaks we&#8217;ve made:</p>
<h2>Upgrade to CHKUSER 2.0.9</h2>
<p>CHKUSER 2.0.9 includes one update that is very important to us: CHKUSER_DISABLE_VARIABLE.  This enhancements allows us to disable CHKUSER checks for certain relays.  In our case, our web application servers relay mail and sometimes the TO address is invalid.  Without this change, CHKUSER would deny even sending the email so bad emails would queue up on the web servers.  What we want to happen is for the mail server to accept them, bounce them and let our bounce handling routines run notifying the sender of the bad address.  Here&#8217;s the necessary steps:</p>
<ol>
<li>Download development package <a href="http://qmailtoaster.com/testing/qmail-toaster-1.03-1.3.21.src.rpm">qmail-toaster-1.03-1.3.21.src.rpm</a> which includes the CHKUSER 2.0.9 code and a few other enhancements (see <a href="http://comments.gmane.org/gmane.mail.qmail.toaster.devel/693">this thread</a>)</li>
<li>rpm -Uvh qmail-toaster-1.03-1.3.21.src.rpm</li>
<li>bunzip2 /usr/src/redhat/SOURCES/qmailtoaster-1.3.2.patch.bz2</li>
<li>vi /usr/src/redhat/SOURCES/qmailtoaster-1.3.2.patch</li>
<li>Search for &#8220;/* #define CHKUSER_DISABLE_VARIABLE&#8221; and remove the comments, save</li>
<li>Search for &#8220;/* #define CHKUSER_ENABLE_USERS_EXTENSIONS&#8221; and remove the comments to <a href="http://www.mail-archive.com/vchkpw@inter7.com/msg27903.html">re-enable dash-aliasing</a></li>
<li>bzip2 /usr/src/redhat/SOURCES/qmailtoaster-1.3.2.patch</li>
<li>cd /usr/src/redhat/SPECS</li>
<li>rpmbuild -bb &#8211;with cnt50 &#8211;target i686 qmail-toaster.spec</li>
<li>rpm -Uvh /usr/src/redhat/RPMS/i686/qmail-toaster-1.3.2.rpm</li>
</ol>
<p>Note, I&#8217;m running on x64 CentOS 5.  For some reason I had to specify the target as i686 as without the target it wanted to generate an i386 binary while everything else is i686.  I didn&#8217;t know if that would cause problems so I specified the target explicitly.</p>
<p>For any IP address we want to bypass the CHKUSER checks, we simply add an entry to /etc/tcprules.d/tcp.smtp with a RELAYCLIENT variable.  An entry might look like:</p>
<p><code>192.168.0.1:allow,RELAYCLIENT=""</code></p>
<p>Finally, the RPM update for qmail-toaster overrides your SSL certificates for SMTP.  To restore my real certificates, I had to perform the following steps (lifted from <a href="http://coreygilmore.com/blog/2008/03/14/chained-ssl-certificates-and-qmail-error-140943f2/">coregilmore.com</a>):</p>
<pre><code># cp /etc/httpd/certs/mail.msr.com.pem /var/qmail/control/servercert.pem
# ln -s /var/qmail/control/servercert.pem /var/qmail/control/clientcert.pem
# chown -h qmaild:root /var/qmail/control/clientcert.pem
# chmod 400 /var/qmail/control/servercert.pem
# qmailctl restart</code></pre>
<p>mail.msr.com.pem is simply a single concatenated file containing your key, certificate and any intermediate certificates (required for registrars like Go Daddy for example):</p>
<p><code># cat /path/to/ssl_cert.key /path/to/ssl_cert.crt /path/to/gd_intermediate_bundle.crt &amp;gt; /var/qmail/control/servercert.pem</code></p>
<h2>Updated Mailfilter Script</h2>
<p>We also expanded our mailfilter script to be a little bit smarter and handle DSPAM better.  Here&#8217;s the latest:</p>
<pre><code>SHELL="/bin/bash"
import EXT
import HOST

VUSER=`echo ${EXT%-*}`
export VUSER
USERHOME=`/mail/bin/vuserinfo -d $VUSER@$HOST`
export USERHOME

MARKTIME=`date +%s.%N`
UNIQUE=`date +%N`

logfile "/var/log/maildrop/mailfilter.log"

# Test for the existance of the Junk directory.  Create it if it doesn't exist
VERBOSE=1
log "$VUSER@$HOST[$UNIQUE] : Start user filter"

# make sure the Junk folder exists and is subscribed too
`test -d $USERHOME/Maildir/.Junk`

if ( $RETURNCODE == 1 )
{
    `/usr/bin/maildirmake -f Junk $USERHOME/Maildir`
    `echo INBOX.Junk &gt;&gt; $USERHOME/Maildir/courierimapsubscribed`
}

# make sure the retrain folder exists
`test -d $USERHOME/Maildir/.JunkRetrain`

if ( $RETURNCODE == 1 )
{
    `/usr/bin/maildirmake -f JunkRetrain $USERHOME/Maildir`
    `echo INBOX.JunkRetrain &gt;&gt; $USERHOME/Maildir/courierimapsubscribed`
}

# now analyze the SA header
if (/^X-Spam-Status: Yes/)
{
        log "$VUSER@$HOST[$UNIQUE] : SpamAssassin found SPAM"
        to "$USERHOME/Maildir/.Junk"
}
else
{
        # spamassassin thinks its ham, which means nothing, because SA sucks
        # so now we check with dspam

        # warning: exception must have one space and then the curly bracket or else syntax errors are generatead
        exception {
                xfilter "/usr/local/bin/dspam --deliver=innocent,spam --stdout --user $USERHOME"
        }

        if (/^X-DSPAM-Result: Spam/)
        {
                # dspam says spam
                log "$VUSER@$HOST[$UNIQUE] : DSPAM found SPAM"
                to "$USERHOME/Maildir/.Junk"
        }
        else
        {
                # ham in both places, deliver
                log "$VUSER@$HOST[$UNIQUE] : DSPAM found HAM (returncode = $RETURNCODE)"
                if (/^X-DSPAM-Result: Innocent/)
                {
                        log "$VUSER@$HOST[$UNIQUE] : HAM includes X-DSPAM-Result: Innocent"
                }
                else
                {
                        if (/^X-DSPAM-Result: Whitelisted/)
                        {
                                log "$VUSER@$HOST[$UNIQUE] : HAM includes X-DSPAM-Result: Whitelisted"
                        }
                        else
                        {
                                log "$VUSER@$HOST[$UNIQUE] : HAM does NOT include X-DSPAM-Result: Innocent/Whitelisted"
                        }
                }
                to "$USERHOME/Maildir/"
        }
}</code></pre>
<p>Since we&#8217;re dropping SpamAssassin, this file could be streamlined to be DSPAM specific but it doesn&#8217;t hurt to leave it in the event we decide to re-enable it at a later date.  Simply save the script somewhere and enable it via a .qmail file in a user directory with the following:</p>
<p><code>|preline /usr/bin/maildrop /path/to/mailfilter-to-spam-plus-dspam</code></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=BTnZWQb58Is:mxkbo74jbsg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=BTnZWQb58Is:mxkbo74jbsg:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=BTnZWQb58Is:mxkbo74jbsg:2mJPEYqXBVI"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=2mJPEYqXBVI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColor/~4/BTnZWQb58Is" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2011/10/20/october-qmail-follow-up/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ghidinelli.com/2011/10/20/october-qmail-follow-up</feedburner:origLink></item>
		<item>
		<title>Itinerary tools for mileage runs and premier status</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/nYnA1Hh0MrI/itinerary-tools-mileage-runs-premier-status</link>
		<comments>http://www.ghidinelli.com/2011/10/03/itinerary-tools-mileage-runs-premier-status#comments</comments>
		<pubDate>Mon, 03 Oct 2011 20:49:50 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[Research/HOWTO]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1346</guid>
		<description><![CDATA[Tips and tools for planning airline itineraries and mileage runs to achieve frequent flier status]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m close to achieving premier status on an airline for the first time.  I generally fly on the best price but I&#8217;ve been consolidating my flights to United and Continental this year.  I have one more flight to the East coast but the traditional routings would leave me about 1,500 miles short of reaching the necessary 25,000 miles.  Time for some creativity.</p>
<p>Here are some links to building &#8220;mileage runs&#8221; &#8211; intentionally bad airline itineraries designed to rack up additional frequent flyer miles.  Also in the list below are some unique or useful itinerary planning tools.  I was particularly blown away by ITA&#8217;s Matrix which lets you specify how many hops, on what airlines, in what class of travel and with what connections to build a trip.  These will come in handy when I get on the Amazing Race. <img src='http://www.ghidinelli.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<ul>
<li><a href="http://www.insideflyer.com/articles/printable/article.php?key=6585">InsideFlyer article on mileage runs</a> &#8211; with links to tools</li>
<li><a href="http://www.flyertalk.com/forum/mileage-run-discussion/312559-mileage-run-tools-part-2-a.html">FlyerTalk mileage run tools</a> &#8211; an epic list of tools</li>
<li><a href="http://www.flyertalk.com/forum/mileage-run-discussion/391187-how-construct-book-mileage-run.html">FlyerTalk mileage run strategy</a> &#8211; how one MR fanatic goes about booking his trips</li>
<li><a href="http://www.travelocity.com/dealsonamap">Travelocity DreamMap</a> &#8211; display cheap trips on a map using a starting location, show where you can go on the cheap</li>
<li><a href="http://blog.happyflier.com/?p=443">HappyFlier</a> &#8211; strategies on finding routes</li>
<li><a href="http://matrix.itasoftware.com/">ITA Software&#8217;s Matrix Planner</a> &#8211; lets you specify arcane airline codes to build exactly the route desired and price it</li>
<li><a href="http://gc.kls2.com/">Great Circle Mapper</a> &#8211; for sticking in a flight route like SFO-LAX-IAH-MCO and figuring out the total miles.  2,570 if you&#8217;re counting.</li>
<li><a href="http://cwsi.net/">Fare Codes, Award calculations, Mileage charts</a></li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=nYnA1Hh0MrI:msrdVovnt8Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=nYnA1Hh0MrI:msrdVovnt8Y:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=nYnA1Hh0MrI:msrdVovnt8Y:2mJPEYqXBVI"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=2mJPEYqXBVI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColor/~4/nYnA1Hh0MrI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2011/10/03/itinerary-tools-mileage-runs-premier-status/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ghidinelli.com/2011/10/03/itinerary-tools-mileage-runs-premier-status</feedburner:origLink></item>
		<item>
		<title>Javascript for Mobile</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/5L5Dv_8q_ak/javascript-for-mobile</link>
		<comments>http://www.ghidinelli.com/2011/09/06/javascript-for-mobile#comments</comments>
		<pubDate>Tue, 06 Sep 2011 17:49:15 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[Web/Internet]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1344</guid>
		<description><![CDATA[Packt Publishing's "jQuery Mobile First Look" arrives at a timely juncture]]></description>
			<content:encoded><![CDATA[<p>Richard Dias from Packt Publishing dropped me a note recently asking if I was interested in taking a look at their latest jQuery title: <a href="http://link.packtpub.com/qhDdWa">jQuery Mobile First Look</a>.  The timing is perfect since we just had a team meeting to discuss how we wanted to continue evolving <a href="http://www.motorsportreg.com">MotorsportReg.com</a> for mobile consumption.  About 10% of our usage is on mobile devices and while our HTML/CSS system today is pretty solid on iOS and Android devices, we want to improve the experience.   We already use jQuery extensively on MSR so <a href="http://jquerymobile.com/">jQuery Mobile</a> is a leading candidate before we even crack the book.  I&#8217;m hoping HTML5 matures quickly so we can leverage the skills and technologies we&#8217;re already using rather than go down the path of platform-specific applications.  Once I dig in I&#8217;ll post a short review of the book.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=5L5Dv_8q_ak:HJwnlzVuyFM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=5L5Dv_8q_ak:HJwnlzVuyFM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=5L5Dv_8q_ak:HJwnlzVuyFM:2mJPEYqXBVI"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=2mJPEYqXBVI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OrangeIsMyFavoriteColor/~4/5L5Dv_8q_ak" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2011/09/06/javascript-for-mobile/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.ghidinelli.com/2011/09/06/javascript-for-mobile</feedburner:origLink></item>
	</channel>
</rss>

