<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Orange is my favorite color</title>
	<atom:link href="http://www.ghidinelli.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ghidinelli.com</link>
	<description></description>
	<lastBuildDate>Fri, 27 Jan 2017 17:45:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Java / ColdFusion SSL handshake_failure Fix</title>
		<link>http://www.ghidinelli.com/2017/01/27/java-coldfusion-ssl-handshake_failure-fix</link>
		<comments>http://www.ghidinelli.com/2017/01/27/java-coldfusion-ssl-handshake_failure-fix#comments</comments>
		<pubDate>Fri, 27 Jan 2017 17:45:50 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[ColdFusion]]></category>
		<category><![CDATA[Web/Internet]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1725</guid>
		<description><![CDATA[Fixing a Java/ColdFusion/JVM-based SSL handshake_failure when making an HTTPS request ]]></description>
			<content:encoded><![CDATA[<p>As PCI DSS rules and general security best practices evolve, more people are configuring their web servers to eliminate less-secure versions of SSL and TLS for their HTTP connections. If you are using a Java or JVM-based application, this may manifest itself in a sudden inability to connect resulting in a fatal handshake_failure. </p>
<p>What this is telling you is that you were able to connect but your client and the remote server were unable to find a mutually acceptable encryption algorithm to communicate over so further communication was aborted.</p>
<p>An easy way to tell if this is your problem as a Java/JVM client is to use the <a href="https://www.ssllabs.com/ssltest/analyze.html">Qualys SSL analyzer</a> and see whether it reports a Java client can connect. In my case, I saw the following failures when I entered the SSL endpoint I wanted to access:</p>
<p><a href="https://www.ghidinelli.com/wp-content/uploads/2017/01/java-ssl-handshake-failure.png"><img src="https://www.ghidinelli.com/wp-content/uploads/2017/01/java-ssl-handshake-failure.png" alt="" title="java-ssl-handshake-failure" style="width: 100%; max-width: 972px;" class="aligncenter size-full wp-image-1726" /></a></p>
<p>If you happen to be a ColdFusion user, you can add <tt>-Djavax.net.debug=ssl,handshake,verbose</tt> to your jvm.config, restart and make your HTTPS request and see the full list of ciphers being attempted and the ultimate failure in your log file. My logs with the handshake_failure can be seen in <a href="https://gist.github.com/ghidinelli/2768e0b28d767a5b018fd3f01cdc3e9f">this gist</a> for comparison.</p>
<h2>Fix with Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files</h2>
<p>The fix is easy to implement but not easy to find. I experienced this with Oracle&#8217;s JVM and not the OpenJDK so other JVM implementations may behave differently. In the case of Oracle&#8217;s JVM, strong encryption is disabled out of the box for export reasons so the JVM can not use an encryption algorithm stronger than 128-bit. Many web servers are now disabling 128-bit SSL in favor of 256-bit and 384-bit encryption algorithms so the fix is to turn these on in your JVM.</p>
<ol>
<li>Download the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files from Oracle (this link is for Java 1.8, Google for alternative JVM versions): <a href="http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html">http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html</a></li>
<li>Extract the two JAR files into your <tt>jre/lib/security</tt> folder overwriting the US_export_policy.jar and local_policy.jar.</li>
<li>Restart the JVM</li>
</ol>
<p>You should now be able to connect to the remote server. If you&#8217;re still unable to connect, try enabling debugging and see which ciphers are attempted/ignored. The remote server may have an exotic configuration that requires you to contact them but the unlimited strength jurisdiction policy files should fix handshake_failure issues.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2017/01/27/java-coldfusion-ssl-handshake_failure-fix/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Stilo Helmet Hydration Port Quick Disconnect</title>
		<link>http://www.ghidinelli.com/2017/01/05/stilo-helmet-hydration-port-quick-disconnect</link>
		<comments>http://www.ghidinelli.com/2017/01/05/stilo-helmet-hydration-port-quick-disconnect#comments</comments>
		<pubDate>Thu, 05 Jan 2017 18:56:42 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[Racing]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1717</guid>
		<description><![CDATA[
I&#8217;m a big fan of my Stilo helmet and one of the reasons is the built in hydration port. I have mine on the right side of my helmet (inboard for LHD cars). In my own cars, I have a camelback system mounted in the passenger area and I use the quick-disconnect for sprint races [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://www.ghidinelli.com/wp-content/uploads/2017/01/1545976_10151874072101935_1622507189_n.jpg" alt="" title="Brian Ghidinelli&#039;s Stilo helmet painted by Brett King Design"  class="aligncenter size-full wp-image-1720" style="width: 100%; max-width: 640px;" /></p>
<p>I&#8217;m a big fan of my Stilo helmet and one of the reasons is the built in hydration port. I have mine on the right side of my helmet (inboard for LHD cars). In my own cars, I have a camelback system mounted in the passenger area and I use the quick-disconnect for sprint races so I can drink without taking my hands off the wheel.</p>
<p>For endurance races where I&#8217;m sharing a car, we usually use something like the <a href="https://store.windingroad.com/longacre-complete-hydration-system-with-roll-bar-mount-p351.aspx">Longacre Drink bottle</a> which a crew member pops in the car when I begin my stint:</p>
<p><img src="https://www.ghidinelli.com/wp-content/uploads/2017/01/drinkbottle.jpg" alt="" title="Longacre drink bottle for racecars" width="300" height="300" class="aligncenter size-full wp-image-1718" /></p>
<p>Normally I attach a bit of the hook side of velcro wrapped around the tube and it will stick to the fabric on the side of the race seat between the seat and the transmission tunnel. The problem this year in the 25 Hours of Thunderhill was that it didn&#8217;t stick and about 3 laps into my 40 lap stint, the hose went flying and out of reach. </p>
<p>Enter McMaster-Carr part number #5012K39 &#8220;Air and water quick-disconnect tube coupling barbed socket with valve, 1/8 coupling for 1/4&#8243; tube ID&#8221;:</p>
<p><a href="https://www.ghidinelli.com/wp-content/uploads/2017/01/mcmastercarr-quick-disconnect-5012K39.png"><img src="https://www.ghidinelli.com/wp-content/uploads/2017/01/mcmastercarr-quick-disconnect-5012K39.png" alt="" title="mcmaster-carr quick disconnect 5012K39" width="96" height="58" class="aligncenter size-full wp-image-1719" /></a></p>
<p>This is the appropriate size female connector to click onto the quick-disconnect male portion that extends from the Stilo hydration port. In short, if you want to attach any fluid hoses to the Stilo factory hydration port, you need a 1/8&#8243; coupler quick disconnect. The 1/4&#8243; barbed size is the right size for the hose in the Longacre drink kit (and probably the others).  McMaster-Carr has all different styles of this connector available including other size barbs and compression fittings.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2017/01/05/stilo-helmet-hydration-port-quick-disconnect/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sleep Deprivation, Caffeine and Cold Showers</title>
		<link>http://www.ghidinelli.com/2016/03/25/sleep-deprivation-caffeine-cold-showers</link>
		<comments>http://www.ghidinelli.com/2016/03/25/sleep-deprivation-caffeine-cold-showers#comments</comments>
		<pubDate>Fri, 25 Mar 2016 19:42:35 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[Research/HOWTO]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1707</guid>
		<description><![CDATA[How cold water replaced caffeine in my sleep-deprived, new-parent, busy-morning routine]]></description>
			<content:encoded><![CDATA[<p>I frequently describe my life as &#8220;trying to fit 10 gallons into a 5-gallon hat&#8221;. It&#8217;s a self-imposed problem due to my love of so many different interests (and perhaps a penchant for &#8220;being busy&#8221; that I&#8217;m trying to break). I recently added a newborn baby girl to the mix which means the structure and routine I relied on has been tossed out the window and I find myself needing new techniques to excel.</p>
<h2>Caffeine</h2>
<p>Introduce our good friend caffeine. It&#8217;s always good for a pick me up, especially when I&#8217;m feeling slow in the morning. I&#8217;m not a coffee drinker but traveling in India and Southeast Asia got me hooked on a good cup of tea. Chai is my preference, but not the sugary kind you would get out of a box at Starbucks. I have a milk frother at home that makes a nice latte-esque cup from black tea leaves and spices. Side note: if you want a no-sugar-added chai at a Starbucks, ask for a &#8220;Chai Tea Misto&#8221;. It&#8217;s chai tea bags with steamed milk priced like a tea so about half the cost of a chai latte. Half the Starbucks don&#8217;t know how to make it though, so be clear it&#8217;s <em>not</em> a latte.</p>
<p>As a Northern Californian going through a drought, I have separately been working to minimize my showers. My shower takes about 2 minutes to get hot water so we let it run into a 5-gallon bucket. Once it gets warm, I would jump in, get wet, turn the water off. Wash my hair, my body and then turn the water back on to rinse before getting out. As someone who loves long, hot showers, this is both soul-crushing and terribly efficient. Combined with better managing our sprinklers and more water-efficient washer/dryer, we cut our overall water usage by 35%.</p>
<p>Let&#8217;s weave these threads together. Busy life. Little sleep. Newborn baby. Water restrictions. How can I optimize my physical feeling each day? </p>
<h2>Cold Showers</h2>
<p>There&#8217;s a lot of research and/or hype about cold showers in the fitness world. They are claimed to help with fat loss and promote muscular recovery among other things. I am not a researcher and have no opinion on those. What I can tell you is that cold showers can wake up even the most sleep deprived new parent and kick start your day. Best part? The effect lasts for hours!</p>
<p>If you search for &#8220;cold shower challenge&#8221;, you&#8217;ll find lots of suggested protocols. I started with a regular hot shower and progressively added cold water finishes. Just for a few seconds. Then a few more seconds. Then a few more and so on until I worked up to half my shower under cold water. Here&#8217;s how I&#8217;m doing it now:</p>
<ol>
<li>Run a hot shower (into the bucket to save water which we use to water plants)</li>
<li>Get in right as the water gets hot, scrub my face vigorously, quickly get wet (under 60 seconds)</li>
<li>Turn water off, wash my hair and body</li>
<li>Turn water back on to hot and begin to rinse</li>
<li>Immediately move water to cold, as cold as you can without the shower turning off</li>
<li>Try to remain calm as your body goes from 130F water to 60F water, finish rinsing off (another 60 seconds). Embrace the feeling.</li>
<li>Exit the shower WIDE AWAKE</li>
</ol>
<p>My mind is buzzing as I dry off and I walk into my home office with not so much a thought about needing a cup of chai. </p>
<p>My home is generally pretty cold so I used to stay in the shower for long periods of time to warm up my cold extremities. Now when I turn the cold water rinse off, the air temperature feels warm and I&#8217;m in no rush to dry off or put on clothes. If you&#8217;ve ever gone wakeboarding in a cold lake, it&#8217;s like how falling back into the water can feel great after the wind chill factor of being towed behind a boat at 20mph.</p>
<p>I still enjoy a good cup of chai because it&#8217;s delicious but I have found that using caffeine as a crutch has all but disappeared. And in a weird way, I now <em>enjoy</em> the feeling of shock as the cold water hits my head and the adrenaline starts running. </p>
<p>You can easily start with a 5-second cold finish. Move that to 10. Then 20. How about a minute? Try it out and tell me what happens below!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2016/03/25/sleep-deprivation-caffeine-cold-showers/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Preventing Long ColdFusion Initialization Timeouts</title>
		<link>http://www.ghidinelli.com/2015/11/21/preventing-long-coldfusion-initialization-timeouts</link>
		<comments>http://www.ghidinelli.com/2015/11/21/preventing-long-coldfusion-initialization-timeouts#comments</comments>
		<pubDate>Sat, 21 Nov 2015 17:08:19 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[ColdFusion]]></category>
		<category><![CDATA[Web/Internet]]></category>
		<category><![CDATA[devops]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1696</guid>
		<description><![CDATA[Request timeouts when initializing your ColdFusion app? This function will stop them.]]></description>
			<content:encoded><![CDATA[<p>My apps use a variety of frameworks which offer a lot of rapid development and agility but they also come at the cost of slower startup times. For a Coldspring-based app with a large service layer, you could easily run into timeouts when initially loading the application. Here&#8217;s a simple function to temporarily extend the processing timeout during initialization using CFTHREAD and the Admin API:</p>
<pre><code>&lt;cffunction name="extendRequestTimeoutDuringInit" output="false" access="public" returntype="any"&gt;

  &lt;cfthread action="run" name="delayRequestTimeoutDuringInit"&gt;
    &lt;cfset thread.adminapi = createObject("component", "cfide.adminapi.administrator") /&gt;
    &lt;cfset thread.adminapi.login('mysecretpassword') /&gt;
    &lt;cfset thread.runtime = createObject("component", "cfide.adminapi.runtime") /&gt;
    &lt;cfset thread.timeout = thread.runtime.getRuntimeProperty("TimeoutRequestTimeLimit") /&gt;
    &lt;cflog file="application" text="Extending RequestTimeout to #2*thread.timeout# seconds" /&gt;
    &lt;cfset thread.runtime.setRuntimeProperty("TimeoutRequestTimeLimit", 2*thread.timeout) /&gt;
    &lt;cfset sleep(2 * thread.timeout * 1000) /&gt;
    &lt;cfset thread.runtime.setRuntimeProperty("TimeoutRequestTimeLimit", thread.timeout) /&gt;
    &lt;cflog file="application" text="Restored RequestTimeout to #thread.timeout# seconds" /&gt;
  &lt;/cfthread&gt;

&lt;/cffunction&gt;</code></pre>
<p>I call this in Server.cfc when my instance starts up but you could also call it from any reinit routine in OnRequestStart or OnApplicationStart. Previously when we pushed code, the first user request would kick off the initialization process while other requests queued. Many of those first requests would exceed our page timeout setting of 60 seconds. Running the above function uses a background thread to double the timeout and later reset it once the application has initialized so users no longer see timeout/error screens.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2015/11/21/preventing-long-coldfusion-initialization-timeouts/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Garage Gym Racing Exercise Steering Wheel</title>
		<link>http://www.ghidinelli.com/2015/10/03/motorsport-fitness-racing-steering-wheel</link>
		<comments>http://www.ghidinelli.com/2015/10/03/motorsport-fitness-racing-steering-wheel#comments</comments>
		<pubDate>Sat, 03 Oct 2015 23:17:24 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[Racing]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1657</guid>
		<description><![CDATA[Fitness training tool for motorsport - how I mounted a steering wheel to a weight rack to simulate actual racing conditions]]></description>
			<content:encoded><![CDATA[<p>Fitness and motorsport are two important parts of my life and a significant portion of my training is to improve my capability on a race weekend. I&#8217;ve <a href="http://www.amazon.com/Motorsport-Fitness-Manual-performance-physical/dp/1844255433">read books</a>, <a href="https://www.youtube.com/watch?v=5tmX2UU_RCM">spent a weekend</a> at the Porsche Human Performance center at Silverstone and built a gym in my garage. But one of the challenges for auto racing is that there are not many sport-specific exercises that can prepare you for the experience of actually driving. What do we need to deal with in the car?</p>
<ul>
<li>High temperatures (made worse by wearing the equivalent of an oven mitt and helmet for safety)</li>
<li>Endurance stamina (30 minutes &#8211; 3 hours at a time)</li>
<li>High G-loads</li>
<li>Noxious fumes such as carbon monoxide</li>
<li>Sustained loud noise upwards of 100db</li>
<li>Awareness and &#8220;butt sensitivity&#8221; key to extracting maximum performance from car</li>
</ul>
<p>Very few sports require the sustained concentration and focus (with life and wallet-threatening consequences) as motorsport but we can&#8217;t just do a hundred deadlifts, swim a mile or practice some yoga and call it good. All of those things would help but none of them alone will really prepare us to deal with the above. There are motorsport-specific trainers out there, Jim Leo&#8217;s <a href="http://www.pitfit.com">PitFit</a> in Indy probably amongst the best in the States, but most of us don&#8217;t live in Indy so what can we do?</p>
<h2>Build Something!</h2>
<p><a href="https://www.ghidinelli.com/wp-content/uploads/2015/10/IMG_5185.jpg"><img src="https://www.ghidinelli.com/wp-content/uploads/2015/10/IMG_5185-1024x768.jpg" alt="Auto racing steering wheel exercise for motorsport fitness" title="Auto racing steering wheel exercise for motorsport fitness" width="1024" height="768" class="aligncenter size-large wp-image-1659" style="width: 95%; height: auto;" /></a></p>
<p>I&#8217;m a small guy &#8211; 5&#8242;8&#8243; and 140# &#8211; so strength is something I have to work at. Hours behind the wheel in a <a href="http://www.nasa25hour.com">25-hour endurance race</a> with big sticky slicks could tire me out if I&#8217;m not in shape so I wanted a tool for my home gym. I have a one-car garage so it had to be modular and not take up a lot of space. I sketched a design that could attach to my <a href="http://www.roguefitness.com">Rogue Fitness half-rack</a> and called my friend Tony Colicchio at <a href="http://www.tcdesignfab.com">TC Design Motorsports</a> to make it a reality.</p>
<p>With a spare Mazda Miata steering column, a $25 <a href="http://www.ebay.com/sch/i.html?_from=R40&#038;_nkw=racing%20steering%20wheel&#038;_udhi=35&#038;_trksid=p2045573.m1684.l5985">&#8220;race wheel&#8221; from Ebay</a> and a <a href="http://www.roguefitness.com/j-3358-monster-lite-j-cups?gclid=CIDwwMixp8gCFUZafgodry0O-w">J-Cup from Rogue Fitness</a>, Tony (who is also a big fitness junkie) built the perfect arm and shoulder exercise tool for replicating the experience behind the wheel. I can load it up with weight and do sets of turning the wheel left 90 degrees, holding for a count of 5, then turning right 90 degrees and repeating. When I&#8217;m done, it just hangs on the wall. You could achieve similar effects with just a plate weight but I find that this more closely taxes my arms and shoulders as when I&#8217;m racing. It also replicates the hand position required.</p>
<p><a href="https://www.ghidinelli.com/wp-content/uploads/2015/10/IMG_5184.jpg"><img src="https://www.ghidinelli.com/wp-content/uploads/2015/10/IMG_5184-1024x768.jpg" alt="Auto racing steering wheel exercise for fitness" title="Auto racing steering wheel exercise for fitness" width="1024" height="768" class="aligncenter size-large wp-image-1658" style="width: 95%; height: auto;" /></a></p>
<p>The old race seat is something I use with iRacing (another training tool) and is definitely overkill but there&#8217;s no question it puts me in precisely the right position. I frequently race a Mazda and have received a lot of support from <a href="http://www.mazdamotorsports">Mazda Motorsports</a> so the steering column is a subtle nod of thanks. </p>
<style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style>
<div class='embed-container'><iframe src='https://www.youtube.com/embed/5tmX2UU_RCM' frameborder='0' allowfullscreen></iframe></div>
<p>Check out another of my DIY projects: <a href="https://www.ghidinelli.com/2011/02/28/diy-cool-shirt-system">Racecar cool shirt system</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2015/10/03/motorsport-fitness-racing-steering-wheel/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jstat in Java 1.8 Can&#8217;t Find Process Run as Root</title>
		<link>http://www.ghidinelli.com/2015/08/20/jstat-in-java-1-8-cant-find-process-run-as-root</link>
		<comments>http://www.ghidinelli.com/2015/08/20/jstat-in-java-1-8-cant-find-process-run-as-root#comments</comments>
		<pubDate>Thu, 20 Aug 2015 17:55:29 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[ColdFusion]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Web/Internet]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jvm]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1649</guid>
		<description><![CDATA[Jstat not working under Java 1.7 u75 or higher including Java 8? There's a bug! Here's how to work around it to get your JVM details.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve written a handful of times on <a href="https://www.ghidinelli.com/2009/07/16/finding-memory-leaks-coldfusion-jvm">observing and tuning the JVM</a> using tools such as Jstat. I recently upgraded our servers to Java 8 and found that my Jstat script could no longer find the process no matter what I tried.</p>
<p>It turns out <a href="https://bugs.openjdk.java.net/browse/JDK-8073858">there is a bug</a> from JDK 1.7 u75 onwards that is present at least through JDK 1.8 u60 which prevents Jstat, when run as root, from introspecting JREs running as other users.</p>
<p>To solve, simply run jstat as the user who owns the JRE process.  You can pass the username to sudo when running jstat like:</p>
<p><code>sudo -u nobody jstat -gcutil -t &lt;pid&gt; 1s 30</code></p>
<p>And you&#8217;ll be treated to your output again. In my case, I have two server instances running so I like to see their output side by side at the console.  Here&#8217;s my script for doing that using /usr/bin/paste and some console redirection trickery:</p>
<p><script src="https://gist.github.com/ghidinelli/a57dd23c03005f0980e8.js"></script></p>
<p>The username can be figured out from the process but this was a quick fix for the above bug.  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2015/08/20/jstat-in-java-1-8-cant-find-process-run-as-root/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Redirecting ColdFusion logs in a Docker Container</title>
		<link>http://www.ghidinelli.com/2015/07/06/redirecting-coldfusion-logs-docker-container</link>
		<comments>http://www.ghidinelli.com/2015/07/06/redirecting-coldfusion-logs-docker-container#comments</comments>
		<pubDate>Mon, 06 Jul 2015 18:35:34 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[ColdFusion]]></category>
		<category><![CDATA[Web/Internet]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1637</guid>
		<description><![CDATA[Learn how to redirect ColdFusion logs to stdout and stderr on Linux or OS X.  Especially useful in containerization using Docker to centralize logs.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been modernizing our development environment and started with the work by <a href="https://github.com/finalcut/docker-coldfusion10">Bill Rawlinson</a> to create a portable ColdFusion Docker image. If you&#8217;re new to Docker and the benefits of containerization, read up <a href="http://readwrite.com/2014/12/23/docker-to-dominate-in-2015">why Docker is dominating 2015</a>. We have Docker Compose running a stack with ColdFusion, Nginx, Postgres, ActiveMQ and Redis all linked together and the entire setup can be started with one command:</p>
<p><code>docker-compose up -d</code></p>
<p>I&#8217;m simultaneously moving from a Windows machine to a Mac and I&#8217;ve been really missing the console logging for watching application activity and errors.  It&#8217;s easy when installed locally to tail the coldfusion-out.log file but once containerized you don&#8217;t have that luxury (without using docker exec to log in to the running container which is a bad practice).  The issue is on Linux, ColdFusion has no option to log to stdout like on Windows.  As a result, the docker logs command can&#8217;t see the output from ColdFusion once the container is running.  </p>
<p>It turns out there is a very simple and very elegant way to force ColdFusion, or any app which wants to daemonize and write to log files, to write to stdout.  From this <a href="http://serverfault.com/questions/599103/make-a-docker-application-write-to-stdout">ServerFault thread</a> referencing the Nginx Dockerfile, you can symlink the coldfusion-out.log file to /dev/stdout:</p>
<pre><code>ln -sf /dev/stdout /opt/coldfusion10/cfusion/logs/coldfusion-out.log</code></pre>
<p>My Dockerfile for ColdFusion has these two lines:</p>
<pre><code># redirect logs so `docker logs -f &lt;container&gt;` works
RUN ln -sf /dev/stdout /opt/coldfusion10/cfusion/logs/coldfusion-out.log
RUN ln -sf /dev/stderr /opt/coldfusion10/cfusion/logs/coldfusion-err.log</code></pre>
<p>Now the logs can be collected and observed in a centralized location using <a href="https://docs.docker.com/articles/dockerfile_best-practices/">Docker best practices</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2015/07/06/redirecting-coldfusion-logs-docker-container/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Talking SaaS at dev.Objective()</title>
		<link>http://www.ghidinelli.com/2015/05/03/talking-saas-at-dev-objective</link>
		<comments>http://www.ghidinelli.com/2015/05/03/talking-saas-at-dev-objective#comments</comments>
		<pubDate>Sun, 03 May 2015 23:41:49 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[ColdFusion]]></category>
		<category><![CDATA[Web/Internet]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1624</guid>
		<description><![CDATA[Brian returns to dev.Objective() in Minneapolis to present on Building SaaS Applications]]></description>
			<content:encoded><![CDATA[<p><strong>Update</strong> &#8211; Slides from my talk were <a href="http://www.slideshare.net/ColdFusionConference/ghidinelli-building-saasappsfinal">posted on SlideShare</a>.  Thanks to everyone who came and all the tweets!</p>
<p>I&#8217;ll be speaking at <a href="http://www.devobjective.com/">dev.Objective()</a> this year in Minneapolis on a hybrid business/programming topic titled, &#8220;<a href="http://www.devobjective.com/sessions/building-multi-tenant-saas-applications/">Building Multi-Tenant Software-As-A-Service (Saas) Applications</a>&#8221;  This will be a comprehensive review covering the hurdles I&#8217;ve crossed growing <a href="http://www.motorsportreg.com">MotorsportReg.com</a> from a one-man nights-and-weekends operation to a team that has processed more than $100,000,000 in event entry fees.  The talk will cover:</p>
<ul>
<li>Database design and tenancy model trade-offs</li>
<li>Third party services and designing for resiliency</li>
<li>E-commerce strategies for cards on file, split payments, multiple currencies and marketplace-style apps</li>
<li>Implications of going global including i18n, l10n, currency and domiciling</li>
<li>Cross-customer security and the impact of banking and legal requirements such as PCI DSS, IRS and Know-Your-Customer (KYC)</li>
<li>Code strategies for implementing customer or domain-specific functionality without a &#8220;kitchen sink&#8221; user experience problem</li>
</ul>
<p>Developers who are interested in SaaS apps or have the entrepreneurial itch themselves will walk away with a roadmap of the issues a SaaS app must solve and strategies to achieve success.  I&#8217;ll be speaking immediately after the keynote Wednesday morning, May 13, at 10:15am. </p>
<p>This is my second time attending dev.Objective() and I&#8217;m returning because I got a ton of value from it.  I hope you&#8217;ll consider attending if you&#8217;re not already signed up as it will be a positive boost for your creativity and skills.   Registration is <a href="https://www.signup4.net/public/ap.aspx?EID=CFOB19E&#038;TID=7R1b5j8%2bsw2owJ95UBUTMw%3d%3d">still available for $999</a>.</p>
<p>Connect with me on twitter ahead of the conference to keep in touch at <a href="http://twitter.com/ghidinelli">@ghidinelli</a>.  You can connect with other speakers and attendees on <a href="http://lanyrd.com/2015/devobjective/">Lanyrd</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2015/05/03/talking-saas-at-dev-objective/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Interview with me on Cars Yeah Podcast</title>
		<link>http://www.ghidinelli.com/2015/01/12/interview-with-me-on-cars-yeah-podcast</link>
		<comments>http://www.ghidinelli.com/2015/01/12/interview-with-me-on-cars-yeah-podcast#comments</comments>
		<pubDate>Mon, 12 Jan 2015 17:37:55 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Racing]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1619</guid>
		<description><![CDATA[Cars Yeah interviewed Brian Ghidinelli on business, cars and lessons learned.]]></description>
			<content:encoded><![CDATA[<p><img src="https://www.ghidinelli.com/wp-content/uploads/2015/01/carsyeah.jpg" alt="" title="Cars Yeah Podcast and Interviews" width="100" height="142" class="alignright size-full wp-image-1618" />Mark Greene from <a href="http://carsyeah.com/">Cars Yeah</a> interviewed me last week on business, cars and lessons learned.  We talked about what got me into cars in the first place, the one car I would buy if money was no object and what has me excited about the future of MotorsportReg.com:</p>
<p><a href="http://carsyeah.com/ourportfolio/brian-ghidinelli/">Brian Ghidinelli interview on Cars Yeah</a></p>
<p>It was a lot of fun!  Mark has interviewed hundreds of interesting business and motorsport personalities and to be included on the list is an honor.  Be careful &#8211; you might spend all day listening!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2015/01/12/interview-with-me-on-cars-yeah-podcast/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adding 4000 subscribers in 45 days</title>
		<link>http://www.ghidinelli.com/2014/09/01/4000-new-subscribers-in-45-days</link>
		<comments>http://www.ghidinelli.com/2014/09/01/4000-new-subscribers-in-45-days#comments</comments>
		<pubDate>Mon, 01 Sep 2014 21:49:14 +0000</pubDate>
		<dc:creator>brian</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Web/Internet]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=1598</guid>
		<description><![CDATA[How 45 days of "testing" grew my email list by 53% after 9 years of "implementing".]]></description>
			<content:encoded><![CDATA[<p>I love researching things.  Learning about something new and finding the best way to approach a problem feeds the engineering part of my background.  I satisfy that by reading a ton and because of my online businesses, I read a lot of SaaS-related online marketing and sales material.   But sometimes I read more than I act.  As a recent example, in setting up the best possible go-to-market strategy for our new live timing app, <a href="http://racehero.io">RaceHero</a>, I ran out of time before vacation and lost weeks out of my marketing strategy by failing to kick it off before I left town.  That same &#8220;cobbler&#8217;s shoes&#8221; fate had befallen my email lists for the past 9 years.</p>
<p>This year I&#8217;ve been working to do more A/B testing.  A/B tests are mathematically-backed competitions between two or more options which are scored by the actions of the users.  They may also be the <a href="https://training.kalzumeus.com/newsletters/archive/why_you_do_not_ab_test">single highest ROI tactic for software companies</a>. These tests could be anything from a simple color change of a button (shocking, to what extent that can matter) all the way to a completely different web page.  I was first exposed to the technique back in 2001 at Yahoo! when I was helping redesign their search results but it wasn&#8217;t until the last 18 months I ran the first A/B test on <a href="http://www.motorsportreg.com">MotorsportReg.com</a>.  </p>
<p>Which brings me to how I grew one of my mailing lists by 53% in 45 days.  In the history of this 9-year old list, the last two months would make a hockey stick look like a rolling foothill.  This is like the face of a glacier where it meets into the ocean: a vertical line that reads like an error.</p>
<p>The technique is perhaps too simple to be valuable by itself: I put the signup form where many more people would see it in their routine use of our platform.  Previously, we had a few CTAs in our transactional emails and on our event calendar but the actual signup took place on a mailing lists screen under &#8220;My Account&#8221;.  Few people went there looking to add more email to their inbox so list growth was steady but slow.  Now, when users create a new account or reconfirm their details, they see checkboxes at the bottom of their personal information letting them opt-in to the lists.  Thousands of people see these screens every month and because the lists are valuable, thousands of them are signing on.</p>
<h2>&#8220;It was just a test&#8221;</h2>
<p>The obvious question is why didn&#8217;t we do this sooner?  The answer is because I wasn&#8217;t sure if these transactional flows were appropriate places to insert a list signup.  I had concerns that it might negatively impact registration conversion.  So I hemmed.  And I hawed.  And I periodically looked at the issue in our bug tracker but never quite got over the &#8220;ewwwww&#8221; feeling to put it in place.</p>
<p>That&#8217;s the beauty of A/B testing.  A feature request in our bug tracker is a stone being added to a wall with mortar: it becomes a seemingly permanent piece of your architecture, of your user interface and of your responsibility.  But an A/B test, why, <em>that&#8217;s just a test</em>!  We have made no commitments to keeping it around.  We&#8217;re not even sure we like it!   Implementation only took a few hours so we could rip it out at any time for any reason and respond, &#8220;It was just a test.&#8221;   Simply doing it, rather than talking about it, is <a href="http://lucasartoni.com/2014/08/28/the-rules-of-ab-testing-by-tyler-durden/">rule #2 of A/B testing fight club</a>.</p>
<p>Since it was just a test, we hoped for a nice bump to justify keeping it around.  We were blown away.  At the current rate, we will reach 25,000 subscribers (333% growth) by the end of 2015.  And because we have a large percentage of first-time participants come through our service, we should see a permanently scaled growth rate.   As an additional bonus, this list drives participation for our events so we&#8217;re creating a positive feedback loop for our event organizers and our bottom line too.</p>
<p>All because of a feature I was skeptical of &#8220;implementing&#8221; but happy to &#8220;test&#8221;.</p>
<p>Remember: making the call is making progress.   Doing is better than planning.   Execution is more valuable than ideas.   Look at your to-do list and find one or two things you&#8217;ve been putting off.  What can you do to &#8220;test&#8221; it (whatever that might mean in your case) to move it ahead and gain confidence in your choice?  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2014/09/01/4000-new-subscribers-in-45-days/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
