<?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: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 />
	<pubDate>Sun, 21 Jun 2009 16:26:39 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<geo:lat>37.772329</geo:lat><geo:long>-122.41087</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/OrangeIsMyFavoriteColor" type="application/rss+xml" /><feedburner:emailServiceId>OrangeIsMyFavoriteColor</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>cfpayment adds Paypal support</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/nlSDT6VaPx8/cfpayment-adds-paypal-support</link>
		<comments>http://www.ghidinelli.com/2009/06/21/cfpayment-adds-paypal-support#comments</comments>
		<pubDate>Sun, 21 Jun 2009 16:26:39 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[cfobjective]]></category>

		<category><![CDATA[cfpayment]]></category>

		<category><![CDATA[paypal]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=767</guid>
		<description><![CDATA[Joseph Lamoree contributes a Paypal gateway to CFPAYMENT rounding out our support for popular payment processors.]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.ghidinelli.com/wp-content/uploads/2009/06/redhatsocks.jpg" alt="RedHat cycling socks" title="RedHat cycling socks" width="250" height="259" class="alignright" />Joseph Lamoree has been building a Paypal gateway for <a href="http://cfpayment.riaforge.org">CFPAYMENT</a> lately.  He&#8217;s <a href="https://www.lamoree.com/machblog/index.cfm?event=showEntry&#038;entryId=B776D707-834C-4668-82319D6E0DF6F53D">documenting the process</a> and even built a sweet UML-ish diagram of how the library is pieced together.  Although I&#8217;m not a Paypal user myself, this is the #1 gateway request so I&#8217;m excited to see support, especially contributed from a user.  Joseph and I met at cf.Objective() a little over a month ago when he gave me these sweet cycling socks.  Thanks for all of the contributions!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=nlSDT6VaPx8:38PSLcP1Gz8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=nlSDT6VaPx8:38PSLcP1Gz8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=nlSDT6VaPx8:38PSLcP1Gz8: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/nlSDT6VaPx8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2009/06/21/cfpayment-adds-paypal-support/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2009/06/21/cfpayment-adds-paypal-support</feedburner:origLink></item>
		<item>
		<title>Stupid easy database replication for Postgres and MySQL</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/V7ACuZ9glq0/stupid-easy-database-replication-postgres-mysql</link>
		<comments>http://www.ghidinelli.com/2009/06/16/stupid-easy-database-replication-postgres-mysql#comments</comments>
		<pubDate>Tue, 16 Jun 2009 18:42:08 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[PostgreSQL]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[database]]></category>

		<category><![CDATA[postgres]]></category>

		<category><![CDATA[replication]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=765</guid>
		<description><![CDATA[Working replication between two Postgres or MySQL database servers in under 5 minutes with few limitations - it's true!]]></description>
			<content:encoded><![CDATA[<p>I shy away from database replication because it tends to require a lot of monkeying around with complex systems to get it working right.  Postgres has a simple log shipping feature but you can&#8217;t query the warm standby while other replication tools give you all kinds of option for synchronous vs. asynchronous and multi-master, master-slave, etc.  </p>
<p>Enter <a href="http://www.rubyrep.org/">RubyRep</a>, a Ruby-based replicator that already supports both Postgres and MySQL and has plans to also support Microsoft SQL Server, Oracle and IBM.  The author has published a screencast where he enables and demonstrates <a href="http://www.rubyrep.org/screencast.html">working replication in less than 5 minutes</a>.</p>
<p>It handles composite primary keys, single primary keys, sequences/uniqueids and even tables without primary keys with a touch of configuration.  It works using triggers which it installs and maintains automatically.  There are some limitations with MySQL since it only supports one trigger per table which could collide with an existing application trigger.  We&#8217;ll have to see what performance is like but it&#8217;s pretty compelling so far.  </p>
<p><a href="http://www.postgresql.org/about/news.1097">Postgres 8.4 RC1 is out too</a> - might be a good opportunity to roll out a test environment and start playing.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=V7ACuZ9glq0:Nuh8CxSZLAw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=V7ACuZ9glq0:Nuh8CxSZLAw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=V7ACuZ9glq0:Nuh8CxSZLAw: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/V7ACuZ9glq0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2009/06/16/stupid-easy-database-replication-postgres-mysql/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2009/06/16/stupid-easy-database-replication-postgres-mysql</feedburner:origLink></item>
		<item>
		<title>Embedding Codex wiki in an existing application</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/sAwVcXO9AHM/include-coldbox-codex-wiki-inside-application</link>
		<comments>http://www.ghidinelli.com/2009/06/04/include-coldbox-codex-wiki-inside-application#comments</comments>
		<pubDate>Thu, 04 Jun 2009 21:15:29 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[codex]]></category>

		<category><![CDATA[coldbox]]></category>

		<category><![CDATA[framework]]></category>

		<category><![CDATA[wiki]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=739</guid>
		<description><![CDATA[How to point the configuration, views and layout of Codex wiki or other ColdBox applications at a different directory to simplify updates between versions]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been getting up to speed with Luis Majano and Mark Mandel&#8217;s <a href="http://www.codexwiki.org">ColdFusion-based Codex Wiki</a>.  My use case is a little different from some of the existing installations like <a href="http://docs.transfer-orm.com">docs.transfer-orm.com</a> where the wiki <em>is</em> the site.  Instead, I want to embed Codex as a knowledge base and help repository inside of my existing Model-Glue application.  I&#8217;m a total <a href="http://www.coldboxframework.com">ColdBox</a> neophyte so I am sharing this guide in case anyone wants to do something similar.</p>
<h2>Incorporating Codex as part of your code</h2>
<p>My preferred method for including a third-party code base is to use Subversion&#8217;s svn:externals.  Specifically I have been using a <a href="http://www.ghidinelli.com/2007/10/12/managing-third-party-software-with-subversion">&#8220;local external&#8221; repository</a> which gives me the benefits of svn:external without the deploy-time dependency on a remote repository that may not be available.</p>
<p>Thus, in my application, I have an svn:external that points like so:</p>
<p><code>http://myrepo/externals/codex/tags/trunk_r298 help</code></p>
<p>Where the codex/tags/trunk_r298 folder is simply a copy of the Codex trunk at revision 298.  When I run svn update on my application, it extracts the Codex codebase into a /help directory.  All&#8217;s great right?  If you don&#8217;t want to modify the look and feel, then you&#8217;re done.  </p>
<h2>The problem with modifying Codex</h2>
<p>Most people however are going to want to customize the layout and CSS at a minimum so you&#8217;ll need to modify the layout and view CFM files.  That&#8217;s pretty straightforward but what happens when Codex releases an update?  And what about the configuration file - where will you put that?  What a train wreck - now you need to merge your files into theirs and hope there are no conflicts.  </p>
<p>To embed Codex (or really any ColdBox application) into your app, you&#8217;ll need to adjust three things:</p>
<ol>
<li>Move the coldbox.xml.cfm file to a location outside of the Codex tree</li>
<li>Relocate the view files</li>
<li>Relocate the layout files</li>
</ol>
<h2>A Better Way</h2>
<p>This may be common knowledge to Coldbox developers but I stumbled upon it through trial and error.  There is a way to externalize your configuration and your views such that your external views only serve as an override rather than the default.  This lets you take advantage of updates that come from the Codex team while keeping your modification footprint as small as possible.  Let&#8217;s start with a partial directory tree where Codex has been checked out into the /help directory and my Model-Glue application has its own /views directory structure:</p>
<pre><code>/
+ gfx
+ help (this is Codex, checked out via svn:external)
    + config
    + handlers
    + ...
    + layouts
    + model
    + plugins
    + views
    Application.cfc
+ controllers
+ views
    + help
         + views
             + tags
             footer.cfm
             header.cfm
             ...
         + layouts
             Layout.html.cfm
             Layout.Main.cfm
             ...
Application.cfc
index.cfm </code></pre>
<p>Each ColdBox application has a configuration section called &#8220;Conventions&#8221; that are optional adjustments to the defaults.  The general strategy is to turn Codex back on itself by making it look for the default in your external folder and then look for the override in the standard Codex folder.  In this manner, if you have a file in your own views folder then it will be used, if not, it will go searching for the default file under the Codex directory tree.  You&#8217;ll need to add this section to your Codex config file:</p>
<pre><code>&lt;Conventions&gt;
	&lt;layoutsLocation&gt;../views/help/layouts&lt;/layoutsLocation&gt;
	&lt;viewsLocation&gt;../views/help/views&lt;/viewsLocation&gt;
&lt;/Conventions&gt;</code></pre>
<p>Conventions will work with a relative path so I am pointing my <em>default</em> views to be in my Model-Glue views folder instead of the Codex directory.  Codex (or more specifically, Coldbox) will first look in my /views/help/* directories instead of /help/layouts and /help/views.  </p>
<p>Perfect!  Now my layout and views are external so I can manage them independently of Codex upgrades.  But, what if I only want to make small changes, like put my logo in the header?  It would be a bummer to manage all of those files for such a simple change!  Thankfully Coldbox has a Setting called ViewsExternalLocation:</p>
<pre><code>&lt;Setting name="ViewsExternalLocation" value="views" /&gt;</code></pre>
<p>Put alongside the other Settings in your configuration file, this tells Codex to override any default views with those found in the standard Codex views directory.  At the time of this writing with Coldbox 2.6, there is no corresponding LayoutsExternalLocation but Luis Majano said <a href="http://groups.google.com/group/codex-wiki-development/msg/ad48d3522f04cf24">it would be coming in 3.0</a>.  In the mean time, you will need to include all of the 5 or 6 layout files in your custom layout folder but you only need to include the views you wish to override or add.</p>
<p>You can verify this works by creating a single file like (using my directory structure) /views/help/views/wiki/show.cfm (which is used to display a wiki page) and adding some extra text to it.  Reinitialize Codex, view a wiki page and you should see your changes.</p>
<h2>Moving the Configuration File</h2>
<p>Since Coldbox is all about conventions, you must override the default to point at a configuration file in a different location and this will take some editing.  This is one place where you will need to make one small change each time you update Codex or script it for your deployment using something like Ant.  Automating your deployment is a good idea if you&#8217;re not already doing it.</p>
<p>The /help/Application.cfc defines where the configuration file lives.  Each time you update Codex (either via svn:external or unzipping of a file), you&#8217;ll need to modify a single line like so (or, <a href="http://ortus.svnrepository.com/coldbox/trac.cgi/wiki/cbLoadConfigFile">see the Coldbox docs</a>):</p>
<pre><code>&lt;cfset COLDBOX_CONFIG_FILE = "../myconfig/codex.xml.cfm"&gt;</code></pre>
<p>In this case, I&#8217;m using an example directory of /myconfig with a copy of the configuration file that I renamed from coldbox.xml.cfm to codex.xml.cfm.  Move your file, save the Application.cfc and reinitialize and you&#8217;ll now be running off the XML file managed by your own version control rather than the one provided in the standard Codex distribution.</p>
<p>That&#8217;s it, you&#8217;re ready to modify the look, feel and configuration of your Codex wiki (or really any other ColdBox app) without resorting to modifying the actual distribution.  This will make future upgrades much easier and less fragile which will encourage you to do them more frequently.  </p>
<h2>Bonus Tip for Automating Application.cfc Edit</h2>
<p>If you&#8217;re using Ant, you can automate the replacement of the Application.cfc file on every deployment using the following task:</p>
<pre><code>&lt;replace file="/help/Application.cfc"&gt;
	&lt;replacefilter token="&lt;cfset COLDBOX_CONFIG_FILE = \"\"&gt;" value="&lt;cfset COLDBOX_CONFIG_FILE = \"../myconfig/codex.xml.cfm\"&gt;" /&gt;
&lt;/replace&gt;</code></pre>
<p>Now you can update with impunity and your Ant script will automatically fix the configuration file pointer during deployment.  </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=sAwVcXO9AHM:hWCRRM6Eui8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=sAwVcXO9AHM:hWCRRM6Eui8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=sAwVcXO9AHM:hWCRRM6Eui8: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/sAwVcXO9AHM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2009/06/04/include-coldbox-codex-wiki-inside-application/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2009/06/04/include-coldbox-codex-wiki-inside-application</feedburner:origLink></item>
		<item>
		<title>Estimating I/O requests for EC2 and EBS costs</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/aOMd221vnlk/estimating-io-requests-ec2-ebs-costs</link>
		<comments>http://www.ghidinelli.com/2009/05/26/estimating-io-requests-ec2-ebs-costs#comments</comments>
		<pubDate>Tue, 26 May 2009 23:25:00 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[Research/HOWTO]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[amazon]]></category>

		<category><![CDATA[EC2]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[postgres]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=741</guid>
		<description><![CDATA[How to quickly estimate the I/O costs for Amazon EC2 and EBS using Linux disk tools]]></description>
			<content:encoded><![CDATA[<p>Are you thinking about moving to <a href="http://aws.amazon.com">Amazon&#8217;s EC2 service</a>?  But you get to the part where you&#8217;re calculating how much your persistent (EBS) storage will cost and you have no idea?  The Amazon pricing page looks like this:</p>
<p><strong>Amazon EBS Volumes</strong></p>
<ul>
<li>$0.10 per GB-month of provisioned storage</li>
<li>$0.10 per 1 million I/O requests</li>
</ul>
<p>Well, I&#8217;d like to know how much it&#8217;s going to cost to run my database before I move it over and I can&#8217;t find squat on the Intarweb on how to estimate this cost.  But assuming you&#8217;re running Linux, there is an easy way by looking at /proc/diskstats:</p>
<pre><code>[brian@db2 ~]$ cat /proc/diskstats
 104    0 cciss/c0d0 5946064 12358605 1783920022 267694420 26411136 296537705 2583591570 34712288540 53639757 3738914277
 104    1 cciss/c0d0p1 553 2156 2 10
 104    2 cciss/c0d0p2 194565 1556520 192647 1541176
 104    3 cciss/c0d0p3 18109735 1782360706 322755967 2582047424
 104   16 cciss/c0d1 6579320 1005537 566670186 27193242 13685423 33336126 376172656 26751430 023642414 53937189
 104   17 cciss/c0d1p1 7584779 566669554 47021570 376172552</code></pre>
<p>This is a device with hardware RAID so we want to ignore the individual partitions (c0d1p* for example) and look at the disks c0d0 and c0d1:</p>
<pre><code>cciss/c0d0 5946064 12358605 1783920022 267694420 26411136 296537705 2583591570 34712288540 53639757 3738914277
cciss/c0d1 6579320 1005537 566670186 27193242 13685423 33336126 376172656 26751430 0 23642414 53937189</code></pre>
<p>According to <a href="http://devresources.linux-foundation.org/dev/robustmutexes/src/fusyn.hg/Documentation/iostats.txt">these directions on reading the numbers</a>, you can add the first and fifth numbers of that row to get total reads and writes respectively since the system was started.  To calculate your total I/O requests per month (what Amazon will charge you), just plug your numbers into this formula:</p>
<pre><code>Cost = $0.10 * 30 days * ((first number) + (fifth number)) / (days of uptime)</code></pre>
<p>You can get this number another way by using iostat as well which will give you the average number of transactions per second since boot:</p>
<pre><code>Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
cciss/c0d0        1.56        86.17       124.80 1783920022 2583601386
cciss/c0d1        0.98        27.37        18.17  566670378  376184592</code></pre>
<p>If you take the average TPS for your disks and multiply them out, you get roughly the same number (good enough to make a cost estimate for EC2):</p>
<pre><code>Cost = (TPS of all disks) * 60s * 60m * 24h * 30d</code></pre>
<p>You can see this particular box is under very light load with only 6,583,680 I/O requests per month.  With EBS that would cost about $0.65.  I think we can afford that. <img src='http://www.ghidinelli.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=aOMd221vnlk:rTrFgN8YGco:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=aOMd221vnlk:rTrFgN8YGco:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=aOMd221vnlk:rTrFgN8YGco: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/aOMd221vnlk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2009/05/26/estimating-io-requests-ec2-ebs-costs/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2009/05/26/estimating-io-requests-ec2-ebs-costs</feedburner:origLink></item>
		<item>
		<title>cf.Objective() thoughts and presentations for download</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/xAaeCS79TYE/cfobjective-thoughts-and-presentations-for-download</link>
		<comments>http://www.ghidinelli.com/2009/05/21/cfobjective-thoughts-and-presentations-for-download#comments</comments>
		<pubDate>Thu, 21 May 2009 18:16:34 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[PostgreSQL]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[cfobjective]]></category>

		<category><![CDATA[framework]]></category>

		<category><![CDATA[postgres]]></category>

		<category><![CDATA[speaking]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=722</guid>
		<description><![CDATA[What I took home from cf.objective() 2009 and the slides from my two presentations on PostgreSQL and migrating to a framework.]]></description>
			<content:encoded><![CDATA[<p>This was my first <a href="http://www.cfobjective.com">cf.Objective()</a> and it was a great experience.  Normally I go to conferences really more for the people and the networking but bringing together so many of the thought leaders in the ColdFusion community really marks this as where an intermediate or advanced developer can come and take back actionable thoughts to their organization.   I kept a running list of ideas in my notebook of specific ways to apply things I was learning to my <a href="http://www.motorsportreg.com">motorsport event registration service</a>.  Here&#8217;s a few things I&#8217;m planning on attacking:</p>
<ul>
<li>Look at replacing my validate() methods with Bob Silverberg&#8217;s <a href="http://www.validatethis.org">ValidateThis</a> framework which has centralized validation rules.  One thing I&#8217;ve struggled with in centralized validation is how to handle the situation where a user and an admin have differing validation requirements depending on who is doing the editing.  Bob solves this with configurable &#8220;contexts&#8221; which look promising.</li>
<li>There are a few places in my system where I am working with collections of ~100-300 objects and using Transfer to manipulate these can be slow.  Peter Bell&#8217;s <a href="http://ibo.riaforge.org/">Iterating Business Object</a>, which is simply a fancy wrapper for a query, is a performant way of working with collections of this size.  The fact that we, in CF land, have to worry about this makes object oriented design a compromise but that&#8217;s the way it goes.  It&#8217;s time to evaluate this as an option.</li>
<li>Refactor to Abstract Classes.  Bob Silverberg gave a presentation on <a href="http://www.silverwareconsulting.com/index.cfm/2009/5/19/Building-An-Object-Oriented-Model--Presentation-Materials-Available">building an object oriented model</a> which included discussion of Abstract Classes.  I have used one as the basis for my Transfer decorators for some time which defines a generic populate() routine (influenced by Bob in the past) but it&#8217;s time to look at these for the remainder of my objects in an effort to reduce my total code footprint and centralize the similar code.  Because I refactored from a query-based framework, my gateways and services leveraged a lot of that code and I wound up with gateways that have their own queries and services that repeatedly proxy calls to those gateways along with calls to Transfer for persisting my objects.  One of the things I mentioned in my frameworks migration is starting with my original code may have been a limitation in my migration and the kind of blind cut-and-paste that is time efficient but not particularly elegant is one of those places.  Now it&#8217;s time to go back and optimize.</li>
<li>ColdFusion 9 CFC performance is supposed to be substantially better - I have the beta so I need to do some head-to-head tests of Transfer on CF8 vs. CF9 as well as Transfer on CF9 vs. the built in Hibernate support.  Gains here may make an IBO unnecessary.</li>
<li>Get my <a href="http://trac.edgewall.org">Trac</a> install updated.  I&#8217;m still running some ridiculous 0.9.5 version while the latest is up to 0.11.4.  Getting 0.9.x Trac to install and run was such a dependency-based nightmare that I swore off touching it but that was 3+ years ago and I&#8217;ve got a new server being built to replace the hardware anyways.  This older version is not only compromising the feature set but it&#8217;s also preventing me from updating my Eclipse setup to take advantage of <a href="http://www.henke.ws/post.cfm/Mylyn-Rocks,-Mylyn-Rocks">Mylyn</a> so I can work more from Eclipse <a href="http://trac.cfeclipse.org/cfeclipse/wiki/MylynTracTaskIntegration">against my outstanding tickets</a>.</li>
<li>I sketched out the definition for a reporting overhaul we&#8217;ve been talking about for a year.  I already have a pretty sophisticated CF-based reporting system that emulates a lot of what you would get out of a Crystal Report or CFREPORT but does it without requiring the end user to install a report builder tool or have any knowledge beyond the data they&#8217;re working with.  I&#8217;m interested in exploring <a href="http://eclipse.org/birt">BIRT</a> further but the user interface for generating reports must be <em>user-friendly</em>.  Actuate&#8217;s version of BIRT has a very nice UI but costs some dollars.</li>
<li>The Writing Testable Code: Real-World TDD session by Marc Esher was a great kick in the butt to improve my unit testing.  The way he took some very reasonable code and demonstrated how to refactor it to be more testable (and thus, more reliable) was eye opening despite the fact that it was simple.  Sometimes the best ninja tricks are.  And, he finally explained concisely <a href="http://www.adobe.com/devnet/coldfusion/articles/testdriven_coldfusion_pt2_04.html">how to use a mock object</a> in testing that I grokked so it&#8217;s time to implement some of these ideas.</li>
</ul>
<h2>Presentation Slide decks</h2>
<p>As promised, I&#8217;m publishing the slides from my presentations for any attendees who want to grab the details.  Thanks for coming and be sure to fill out the <a href="http://www.cfobjective.com/surveys.cfm">CFO survey</a>.  The slides, particularly the Postgres preso, were bullet-point heavy which is not my favorite style of presentation (and when compared to say, a <a href="http://blog.mxunit.org/2009/01/are-you-presenting-at-cfobjective.html">Marc Esher presentation</a>, is a bit embarrassing) but when you are walking people through the features of a package, I consider the feature-list-with-commentary to be the equivalent of showing-code-with-commentary.  You don&#8217;t use pictures to represent your code, now do you? <img src='http://www.ghidinelli.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  The framework migration slides include my recommendations for surviving a migration of a code base but spare the reader my personal pain and suffering from my launch last year.  You only get the actionable stuff and none of the emotional scarring!  Don&#8217;t forget: build a functional equivalent at all costs!</p>
<p><strong>Move over MySQL, Make Room for PostgreSQL</strong><br />
ColdFusion and MySQL have been best friends since MX and many developers use it as their day-to-day database. Brian made the leap to PostgreSQL in 2004 and never looked back: it has everything MySQL has plus most of the enterprise features found in Oracle, SQL Server and DB2 wrapped in an open source package with a great community and support. Come learn how these packages are more similar than different and why your next project should be backed by Postgres.</p>
<p><a href='http://www.ghidinelli.com/wp-content/uploads/2009/05/cfo_move_over_mysql_make_room_for_postgresql.pdf'>Download Slides</a> (PDF)</p>
<p><strong>Planning your migration to a Framework</strong><br />
Still waiting to make the jump to an object-oriented framework like Model-Glue, Mach-II or Coldbox? As the sole developer and survivor of a seven-month migration from a home-grown framework to Model-Glue, Coldspring and Transfer, Brian will share four key areas where unexpected complexity resulted in catastrophe and how you can avoid them in your own applications. This is your survival guide for moving code to a new framework.</p>
<p><a href='http://www.ghidinelli.com/wp-content/uploads/2009/05/cfo_migrating_to_a_framework.pdf'>Download Slides</a> (PDF)</p>
<p>If you have any questions or feedback about my presentations, feel free to hit me up here.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=xAaeCS79TYE:e-2DwaFG3bA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=xAaeCS79TYE:e-2DwaFG3bA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=xAaeCS79TYE:e-2DwaFG3bA: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/xAaeCS79TYE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2009/05/21/cfobjective-thoughts-and-presentations-for-download/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2009/05/21/cfobjective-thoughts-and-presentations-for-download</feedburner:origLink></item>
		<item>
		<title>Italian Citizenship FOIA request returns</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/wDlvvZYHT28/italian-citizenship-foia-request-returns</link>
		<comments>http://www.ghidinelli.com/2009/05/19/italian-citizenship-foia-request-returns#comments</comments>
		<pubDate>Tue, 19 May 2009 19:45:25 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[Italian Citizenship]]></category>

		<category><![CDATA[passport]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=725</guid>
		<description><![CDATA[U.S. Citizenship and Immigration Services returns copies of my Italian great-grandfathers naturalization paperwork ]]></description>
			<content:encoded><![CDATA[<p>Good thing I wasn&#8217;t waiting on this to complete my <a href="http://www.ghidinelli.com/italian-citizenship">Italian Citizenship</a>!  The U.S. Citizenship and Immigration Services finally responded to my FOIA request for citizenship details of my great grandfather.  At the time I originally filed, I didn&#8217;t believe he had ever been a citizen so I was hoping for a &#8220;Records not found&#8221; response which would be what I needed to complete my application.</p>
<p>As it turns out, the road took a fork and I found he had become a citizen and with a copy of a declaration of intent to become a citizen, I was able to file my paperwork and receive my <a href="http://www.ghidinelli.com/italian-citizenship">dual citizenship and passport</a> last year.  Here&#8217;s what the letter says:</p>
<blockquote><p>
This is in respnose to your Freedom of Information Act/Privacy Act (FOIA/PA) request received in this office March 4, 2008 regarding Prospero Ghidinelli.</p>
<p>We have completed our search for records that are responsive to your request.  The record consists of 4 pages of material and we have determined to release it in full.  The enclosed record consists of the best reproducible copies available.</p>
<p>Please be advised that the National Records Center does not process petitions, applications or any other type of benefit under the Immigration and Nationality Act.  If you have questions or wish to submit documentation relating to a matter pending with the bureau, you must address these issues with your nearest District Office.</p>
<p>If you should have any additional questions about your request, please direct your inquiries to this office at the above address [etc]
</p></blockquote>
<p>I originally filed in late 2006 or early 2007 but my application was denied for being incorrect in some way so I had to refile and thus the 2008 date above. By the time I refiled, I already knew he had become a citizen but I sent it off anyways for completeness.  The packet includes four photocopies:</p>
<ul>
<li>Department of Labor Form 124A, issued 7/28/1919</li>
<li>Certificate of Naturalization</li>
<li>Petition for Naturalization</li>
<li>Declaration of Intention</li>
</ul>
<p>The copies are not great but of interest is the Declaration of Intent had his name as Dante (what everyone knew him as and what&#8217;s on his tombstone in Italy) and the other documents all have his legal name, Prospero.  Clearly someone informed him to get his act together. <img src='http://www.ghidinelli.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>I have received a few emails from people who are going through the process themselves and are seeking help but otherwise I haven&#8217;t thought much about this lately.  I had a busy few months of work and then getting married last month and this was a fun surprise to receive in the mail.  I will admit that I had a flash of panic when I first saw it, thinking somehow I had done something wrong, but alls well that ends well!</p>
<p>I&#8217;m still itching to use my passport for the first time&#8230; </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=wDlvvZYHT28:O31TQGEd7Ww:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=wDlvvZYHT28:O31TQGEd7Ww:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=wDlvvZYHT28:O31TQGEd7Ww: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/wDlvvZYHT28" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2009/05/19/italian-citizenship-foia-request-returns/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2009/05/19/italian-citizenship-foia-request-returns</feedburner:origLink></item>
		<item>
		<title>Amazon load balancing and server monitoring enhances stack</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/G91RvKHGieg/amazon-load-balancing-and-server-monitoring-enhances-stack</link>
		<comments>http://www.ghidinelli.com/2009/05/18/amazon-load-balancing-and-server-monitoring-enhances-stack#comments</comments>
		<pubDate>Mon, 18 May 2009 15:09:31 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[Business]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[amazon]]></category>

		<category><![CDATA[cloud]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=714</guid>
		<description><![CDATA[New Amazon Web Services offer EC2 monitoring, load balancing and auto-scaling.  These tools make it easier to achieve high availability without a cost penalty.]]></description>
			<content:encoded><![CDATA[<p>I have been researching cloud computing over the past few months and evaluating the various vendors, service add-ons and pricing to see how it compares to our colocation solution.  While many people think of cloud computing as a way to do it cheaper, I came across a great quote (which I can&#8217;t find now) that basically said:</p>
<blockquote><p>Why would you expect someone to provide a higher level of availability and more features at a cost lower than you can do it yourself?</p></blockquote>
<p>You can argue about economies of scale but fundamentally it&#8217;s on the mark.  Amazon (and the other grid/cloud providers) have to pay for the same hardware and infrastructure that we do except they have even more strenuous requirements.  And since they&#8217;re not a charity, there has to be some profit in there, too.  </p>
<p>But many of the reasons to wait on cloud computing, at least the Amazon variety, changed today with the announcement of three new services:</p>
<ul>
<li><strong>CloudWatch</strong> - Web services-based resource and performance monitoring of EC2 services at $0.015/hr or $10.80/month.</li>
<li><strong>Auto Scaling</strong> - A key feature of add-on services like <a href="http://www.rightscale.com">RightScale</a>, Auto scaling will add or remove server instances on the fly.  Most web sites experience some amount of seasonality whether it be time of day, day of week or month of year and this will reduce costs by scaling up only as needed.  It&#8217;s included as part of CloudWatch.</li>
<li><strong>Elastic Load Balancing</strong> - Yes!  Instead of setting up an instance and running keepalived or haproxy to route traffic between multiple servers, Amazon now has load balancing at $0.025/hr or $18/month and it can span multiple availability zones (~physical data centers).  You also pay $0.008/GB of data transfer handled by the load balancer.  100GB/month would cost you $0.80.</li>
</ul>
<h2>Why is this news?</h2>
<p>It means EC2 just got cheaper as you scale up.</p>
<p>For my company, we run a two-node cluster primarily for high-availability.  To actually keep this highly available, we also have to run a pair of load balancers managed by <a href="http://www.keepalived.org">keepalived</a>.  This works quite well but it&#8217;s 4 separate boxes with power supplies and disks consuming power and taking up rack space.  Those are all the downsides to having your own rack space.  At least in California, power is the most expensive part of physical hosting and also the biggest restriction.  It took a <a href="http://www.ghidinelli.com/2007/12/12/state-of-the-silicon-valley-collocation-pricing">fairly exhaustive search</a> to find a datacenter where we could get 30A into a single cabinet.</p>
<p>If we had our current architecture in EC2 today, my interpretation is we could eliminate our two load balancers to save $144/month (small instances are ~$72/month) and replace them with $11 worth of Elastic Load Balancing.  If we added monitoring, we should be able to add web servers as demand dictates for additional savings by not having a second web server running 24/7.</p>
<p>Most smaller web companies want five nines but can&#8217;t afford it nor manage it.  Historically we run our service just short of 99.99% uptime which is fairly expensive and difficult to achieve but provides a scant 3.5 hours of downtime per year.  <em>Most companies can tolerate this</em>.  These new features of EC2 are making it inexpensive to take advantage of EC2s promise: on-demand scalability with high-availability.</p>
<h2>How to save money with EC2</h2>
<p>When I agreed it was insane to expect someone else to do something for you for less money, it was if you <em>compare apples to apples</em>.  Everyone has a base architecture that has something like a database server, web server and mail server.  You simply cannot expect to save much, if any, money in your initial configuration.  The only meaningful way to save money with cloud computing is to reduce the incremental step in costs as you add capacity.  If a colocated solution offers you additional 10 units of web server performance for $1000/month and you can buy the same performance in 1-unit increments for $100/month, then you save money anywhere between 10 and 20 units.  Virtualization and auto-scaling make it possible to reduce your investment to the minimum required capacity on a minute-by-minute basis to drive the most value from cloud hosting.  </p>
<p>I think it&#8217;s time to start running some tests&#8230; </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=G91RvKHGieg:4jX1pPOlMMA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=G91RvKHGieg:4jX1pPOlMMA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=G91RvKHGieg:4jX1pPOlMMA: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/G91RvKHGieg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2009/05/18/amazon-load-balancing-and-server-monitoring-enhances-stack/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2009/05/18/amazon-load-balancing-and-server-monitoring-enhances-stack</feedburner:origLink></item>
		<item>
		<title>Announcing CFPAYMENT 0.9b!</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/UB-A31H3dGk/announcing-cfpayment-beta-easy-payment-api</link>
		<comments>http://www.ghidinelli.com/2009/05/15/announcing-cfpayment-beta-easy-payment-api#comments</comments>
		<pubDate>Fri, 15 May 2009 11:14:55 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[My Software]]></category>

		<category><![CDATA[PostgreSQL]]></category>

		<category><![CDATA[Racing]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[cfobjective]]></category>

		<category><![CDATA[cfpayment]]></category>

		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=707</guid>
		<description><![CDATA[CFPAYMENT announces 0.9 beta release including production-tested, documented gateways for payment processing on Braintree, Skipjack, Authorize.net and iTransact.  More gateways coming! ]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been in development for quite some time but <a href="http://cfpayment.riaforge.org">my CFPAYMENT</a> project, inspired by Ruby&#8217;s ActiveMerchant, has gone beta at cf.Objective() with a 0.9 release!  </p>
<p>Working with <a href="http://www.mkville.com">Mark Mazelin</a> over the better part of a year, we&#8217;ve created a developer-friendly set of components with a simple API.  We&#8217;ve made it easy to create new gateways on top of our core and most importantly, we&#8217;ve battle-tested this code processing over $1 Million USD using these components.</p>
<p>Whether you are an OO nut or a spaghetti coder, our simple interface makes processing credit cards and e-checks (EFTs) easy like:</p>
<pre><code>&lt;cfset config = {path = "bogus.gateway", username = "user", password = "foo" } /&gt;
&lt;cfset core = createObject("component", "cfpayment.api.core").init(config) /&gt;
&lt;cfset gateway = core.getGateway() /&gt;

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

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

&lt;cfdump var="#response.getParsedResult()#" /&gt;</code></pre>
<p>I&#8217;ve put more than five years of e-commerce experience into the design and reliability of this library and Mark has helped me make it better every step of the way.  </p>
<p>I&#8217;ll be at cf.Objective() in Minneapolis through Sunday so please don&#8217;t hesitate to come find me and talk shop. </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=UB-A31H3dGk:upcoKji4XCE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=UB-A31H3dGk:upcoKji4XCE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=UB-A31H3dGk:upcoKji4XCE: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/UB-A31H3dGk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2009/05/15/announcing-cfpayment-beta-easy-payment-api/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2009/05/15/announcing-cfpayment-beta-easy-payment-api</feedburner:origLink></item>
		<item>
		<title>Adobe CF.Objective Keynote - ColdFusion 9</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/McHWEWzkNjE/adobe-cfobjective-keynote-coldfusion-9</link>
		<comments>http://www.ghidinelli.com/2009/05/14/adobe-cfobjective-keynote-coldfusion-9#comments</comments>
		<pubDate>Thu, 14 May 2009 15:48:28 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[cfobjective]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=703</guid>
		<description><![CDATA[The Adobe keynote presentation at CF.Objective() revealed some upcoming highlights of ColdFusion 9 AKA "Centaur"]]></description>
			<content:encoded><![CDATA[<p>Just a quick highlight from the cf.Objective() keynote this morning.  Adam Lehman and Terry Ryan from Adobe kicked off the conference with some new news and features of ColdFusion 9 (aka Centaur).  There are three big picture things that I think will be relevant:</p>
<ol>
<li>Free for Education and Students - Adobe is giving away free full-blown ColdFusion Enterprise licenses for schools and students.  They are also providing curriculum.  Not shelling out $7500 to learn ColdFusion means the long-term future of ColdFusion developers is looking a little brighter.  It&#8217;s available at <a href="http://www.freeriatools.com">FreeRIATools.com</a></li>
<li>CFaaS - ColdFusion As A Service.  The underlying out-of-the-box functionality that CF provides like Mail, Charting, Documents, Database interaction, etc. is being opened up to SOAP web services and AMF for Flash/Flex.  This will eliminate building a middle tier for RIAs that wrap ColdFusion tags and it opens up ColdFusion as a RAD service layer for any technology that can speak SOAP like .Net, Perl, Ruby, PHP, etc.</li>
<li>Object Relational Mapper - ORM.  This has been said before so isn&#8217;t new but if you haven&#8217;t heard, CF9 will have ORM support via Hibernate baked in with a lot of stupid easy syntax that will eliminate the need to write SQL.  I&#8217;m a <a href="http://www.transfer-orm.com">Transfer</a> user today but am watching this carefully.</li>
</ol>
<p>As a developer, there were a handful of things that are going to be great for day-to-day development:</p>
<ul>
<li>Server.cfc and onServerStart().  The ability to run code when the server first starts will eliminate the dreaded first hit for any application with a lengthy initialization process (that&#8217;s you, frameworks!).  This isn&#8217;t a game changer, but it sure makes restarting a server more consistent.</li>
<li>Implicit struct/arrays can be used everywhere.  The gross speed advantage of defining a struct or array in a Javascript-like syntax with:<br />
<code>myArray = ["Brian", "Joe", "Frank"];</code><br />
was less helpful because you couldn&#8217;t create it as part of a method call like so:<br />
<code>methodThatTakesAStructure({name = "Brian", age = "32"});</code><br />
That code would fail in CF8 but will work in CF9.  This makes the syntax more consistent with other languages and more natural to use which is the kind of sugar that makes day to day development a little easier.</li>
<li>Assignment chaining!  Good god, more than a decade later we can finally say:<br />
<code>a = b = c = 0;</code>
</li>
<li>Direct access to the elements of a returned array.  This wouldn&#8217;t work in CF8 but will in CF9:<br />
<code>&lt;cfoutput&gt;#getSomeArray()[2]#</code><br />
This makes working with dynamically returned arrays a little easier by avoiding an intermediate assignment.
</li>
<li>ColdFusion Components have a new automatically defined LOCAL scope (the equivalent of a CFMs &#8220;variables&#8221; scope).  So you don&#8217;t need to var every variable if you use the local scope instead:<br />
<code>&lt;cfset local.myPrivateVariable = "foo" /&gt;</code><br />
The other part of this is that you can now put a var&#8217;d variable <em>anywhere</em> in your method declaration, no longer just at the top!  Another syntax tweak that will make day to day development a little nicer and will make reading code a little easier.
</li>
</ul>
<p>There was a lot of stuff that Adam and Terry covered, including a cool demo of the new CF IDE code named Bolt, but there were two specific things that I am looking forward to:</p>
<ul>
<li>Multi-server Server Manager.  Like the multi-server server monitor in CF8, the Server Manager will let you administer multiple servers from a single interface.  For anyone who has to admin even two servers, there are two bitching features: apply changes (e.g., new datasource) to more than one server at a time and compare the settings of any two servers with one click.  The latter will help track down why one server is performing exceptionally well or poorly.</li>
<li>Object Cache - Adobe is going to ship a built-in, pluggable caching framework.  New methods cacheGet(), cachePut() and cacheGetMetaData() combined with fragment caching should eliminate a lot of the homegrown caching frameworks.  Just like CFQUERY caching will look at the variables passed in and determine if the cached results are still applicable, these tools will do the same <em>and are going to work with CFCs</em>.</li>
</ul>
<p>More to come&#8230; my presentations are tomorrow on PostgreSQL and Saturday on Migrating to a Framework.  </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=McHWEWzkNjE:GEyJlZZs_Cw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=McHWEWzkNjE:GEyJlZZs_Cw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=McHWEWzkNjE:GEyJlZZs_Cw: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/McHWEWzkNjE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2009/05/14/adobe-cfobjective-keynote-coldfusion-9/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2009/05/14/adobe-cfobjective-keynote-coldfusion-9</feedburner:origLink></item>
		<item>
		<title>Model-Glue 3 Beta and Documentation released</title>
		<link>http://feedproxy.google.com/~r/OrangeIsMyFavoriteColor/~3/X6LHcbtVO8c/model-glue-3-beta-and-documentation-released</link>
		<comments>http://www.ghidinelli.com/2009/05/12/model-glue-3-beta-and-documentation-released#comments</comments>
		<pubDate>Tue, 12 May 2009 21:50:31 +0000</pubDate>
		<dc:creator>brian</dc:creator>
		
		<category><![CDATA[ColdFusion]]></category>

		<category><![CDATA[Web/Internet]]></category>

		<category><![CDATA[model-glue]]></category>

		<guid isPermaLink="false">http://www.ghidinelli.com/?p=698</guid>
		<description><![CDATA[Model-Glue 3 "Gesture" beta is fully documented and released today ahead of cf.Objective() for your testing.]]></description>
			<content:encoded><![CDATA[<p>I <a href="http://groups.google.com/group/model-glue/browse_thread/thread/c4c2018b7a6b85db/3a27565aa292f589">asked for it</a> and new project manager Dan Wilson and team <a href="http://docs.model-glue.com/wiki/NewFeaturesInMG3">delivered</a>.  Go get <a href="http://www.model-glue.com/coldfusion.cfm">the Gesture beta</a> and come join the BOF at cf.Objective() next Friday at 8pm!</p>
<p>Personally, I&#8217;m most excited about <a href="http://docs.model-glue.com/wiki/HowTos/HowToUseBeanInjection">Bean injection</a>, <a href="http://docs.model-glue.com/wiki/HowTos/EventCopyToScope">copyToScope()</a> and <a href="http://docs.model-glue.com/wiki/HowTos/HowToUseTypedEvents">Typed Events</a>.  Those three things will make me faster and less error prone.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=X6LHcbtVO8c:HWbsJDz20js:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=X6LHcbtVO8c:HWbsJDz20js:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OrangeIsMyFavoriteColor?a=X6LHcbtVO8c:HWbsJDz20js: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/X6LHcbtVO8c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ghidinelli.com/2009/05/12/model-glue-3-beta-and-documentation-released/feed</wfw:commentRss>
		<feedburner:origLink>http://www.ghidinelli.com/2009/05/12/model-glue-3-beta-and-documentation-released</feedburner:origLink></item>
	</channel>
</rss>
