<?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.cfwheels.org/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
   <channel>
      <title>ColdFusion on Wheels Bloggers</title>
      <description>Blog posts from CFML developers who use Wheels.</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=4258363960ec2fbd438d68d764c7faa6</link>
      <atom:link rel="next" href="http://pipes.yahoo.com/pipes/pipe.run?_id=4258363960ec2fbd438d68d764c7faa6&amp;_render=rss&amp;page=2" />
      <pubDate>Sat, 04 Feb 2012 04:15:23 +0000</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.cfwheels.org/cfwheels/bloggers" /><feedburner:info uri="cfwheels/bloggers" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
         <title>Overriding a Wheels View Helper</title>
         <link>http://per.djurner.net/overriding-a-wheels-view-helper</link>
         <description>&lt;p&gt;
	&lt;p&gt;Overriding a built-in &lt;a rel="nofollow" target="_blank" href="http://cfwheels.org"&gt;ColdFusion on Wheels&lt;/a&gt; function is something I often see done by Wheels developers. It's a very useful technique for customizing a Wheels function while still keeping your code base clean.&lt;/p&gt;
&lt;p&gt;Since there are some gotchas with the approach though, I'll show you a quick example of how it can be implemented.&lt;/p&gt;
&lt;p&gt;Let's say we want to add the ability to strip Bulletin Board Code to the &lt;a rel="nofollow" target="_blank" href="http://cfwheels.org/docs/1-1/function/striptags"&gt;stripTags&lt;/a&gt;&amp;nbsp;function. Your first instinct might be to code your own stripTags function and place it in the views/helpers.cfm file where view helper functions are typically placed.&lt;/p&gt;
&lt;p&gt;Unfortunately you'll get a "Routines cannot be declared more than once" error if you do that though (or a similar error depending on the CFML server you have). This happens because the controller in Wheels includes all view functions and simply won't accept two functions with the same name.&lt;/p&gt;
&lt;p&gt;The solution is to make use of the inheritance in Wheels and place the function in the controllers/Controller.cfc file instead. This component inherits all functions from a base Wheels controller component and thefore we can achieve something like what we have in the code below.&lt;/p&gt;
&lt;p&gt;&lt;div class="data type-coldfusion"&gt;
      &lt;table class="lines" cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            &lt;pre class="line_numbers"&gt;&lt;span id="L1"&gt;1&lt;/span&gt;
&lt;span id="L2"&gt;2&lt;/span&gt;
&lt;span id="L3"&gt;3&lt;/span&gt;
&lt;span id="L4"&gt;4&lt;/span&gt;
&lt;span id="L5"&gt;5&lt;/span&gt;
&lt;span id="L6"&gt;6&lt;/span&gt;
&lt;span id="L7"&gt;7&lt;/span&gt;
&lt;span id="L8"&gt;8&lt;/span&gt;
&lt;span id="L9"&gt;9&lt;/span&gt;
&lt;span id="L10"&gt;10&lt;/span&gt;
&lt;span id="L11"&gt;11&lt;/span&gt;
&lt;span id="L12"&gt;12&lt;/span&gt;
&lt;span id="L13"&gt;13&lt;/span&gt;
&lt;span id="L14"&gt;14&lt;/span&gt;
&lt;span id="L15"&gt;15&lt;/span&gt;
&lt;span id="L16"&gt;16&lt;/span&gt;
&lt;span id="L17"&gt;17&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
                &lt;div class="highlight"&gt;&lt;pre &gt;&lt;div class="line" id="LC1"&gt;&lt;span class="nb"&gt;&amp;lt;cffunction&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stripTags&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;returntype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;public&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class="nb"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;&amp;lt;cfargument&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;html&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="nb"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC3"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;&amp;lt;cfargument&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;BBCode&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;boolean&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class="nb"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC4"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;&amp;lt;cfscript&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;loc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC6"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nv"&gt;loc.BBCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;arguments.BBCode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC7"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nf"&gt;StructDelete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;BBCode&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nv"&gt;loc.returnValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;super.stripTags&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;argumentCollection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC9"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;loc.BBCode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC10"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC11"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nv"&gt;loc.returnValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;REReplaceNoCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;loc.returnValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;#92;[img&amp;#92;].*&amp;#92;[&amp;#92;/img&amp;#92;]&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;all&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC12"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nv"&gt;loc.returnValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;REReplaceNoCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;loc.returnValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;#92;[&amp;#92; *[a-z].*?&amp;#92;]&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;all&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC13"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nv"&gt;loc.returnValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;REReplaceNoCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;loc.returnValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;#92;[&amp;#92; */&amp;#92; *[a-z].*?&amp;#92;]&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;all&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC14"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC15"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;&amp;lt;/cfscript&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC16"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;&amp;lt;cfreturn&lt;/span&gt; &lt;span class="nv"&gt;loc.returnValue&lt;/span&gt;&lt;span class="nb"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC17"&gt;&lt;span class="nb"&gt;&amp;lt;/cffunction&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
  &lt;/div&gt;
&lt;p&gt;Here I have added my new BBCode argument and the custom code to handle the new functionality. Note how I call the parent stripTags functions using the "super" keyword and also clean up the arguments struct before passing it along.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;With this in place all existing calls to stripTags in your code will behave exactly the same but you get the additional option of simply adding BBCode=true to the function calls to strip out Bulletin Board Code.&lt;/p&gt;
&lt;p&gt;This same technique can of course be applied to controllers and models too.&lt;/p&gt;
&lt;p&gt;You can also take it a step further by wrapping it up in a plugin but that's a post for another day...&lt;/p&gt;
	


&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://per.djurner.net/overriding-a-wheels-view-helper"&gt;Permalink&lt;/a&gt; 

	| &lt;a rel="nofollow" target="_blank" href="http://per.djurner.net/overriding-a-wheels-view-helper#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/2oLkJFK5sFo" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://per.djurner.net/overriding-a-wheels-view-helper</guid>
         <pubDate>Fri, 13 Jan 2012 11:16:00 +0000</pubDate>
      </item>
      <item>
         <title>CFML Study Group - Perth AU</title>
         <link>http://webonix.net/post/cfml-study-group-perth-au</link>
         <description>&lt;p&gt;At the start of last year, &lt;a rel="nofollow" target="_blank" href="http://twitter.com/#!/Vagrant"&gt;Chris Bauer&lt;/a&gt; and I got together to take a look at the CFWheels framework in what we refered to as a 'study group'. We are going to kick this off again in the new year.&lt;/p&gt;
&lt;p&gt;We have also been discussing running CFML classes. The recently released &lt;a rel="nofollow" title="visit Packt Publishing to find out more about the Railo book" target="_blank" href="http://www.packtpub.com/railo-3-beginners-guide-to-develop-deploy-complex-applications-online/book"&gt;Railo 3 Beginners Guide&lt;/a&gt; book would make an excellent text book. I am sure I could get a good price for bulk order.&lt;/p&gt;
&lt;p&gt;So if you would like to learn the ColdFusion Markup Language, or would like to extend your skills, please leave a comment.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/BGCitdcRYrM" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://webonix.net/post/cfml-study-group-perth-au</guid>
         <pubDate>Thu, 05 Jan 2012 06:16:34 +0000</pubDate>
      </item>
      <item>
         <title>What's Hot &amp; Where do we go from here</title>
         <link>http://www.henke.ws/post.cfm/what-s-hot-where-do-we-go-from-here</link>
         <description>&lt;p&gt;Last week, "&lt;a rel="nofollow" target="_blank" href="http://www.fusionauthority.com/community/4829-whats-hot-whats-not-where-do-we-go-from-here.htm"&gt;What technologies, other than ColdFusion, should a developer know?&lt;/a&gt;" was posted on &lt;a rel="nofollow" target="_blank" href="http://www.fusionauthority.com"&gt;Fusion Authority&lt;/a&gt;. I figured I would answer the question also. Feel free do blog your own "What technologies, other than ColdFusion, should a developer know?". It could be like a what to expect (or would like to see) in the New Year post about ColdFusion developer's skills and technologies.&lt;/p&gt;
&lt;h2&gt;What technologies, other than ColdFusion, should a developer know?&lt;/h2&gt;
&lt;p&gt;Anything &lt;a rel="nofollow" target="_blank" href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt;! &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/ColdFusion"&gt;ColdFusion&lt;/a&gt; has a framework modeled after Rails called &lt;a rel="nofollow" target="_blank" href="http://www.cfwheels.org"&gt;ColdFusion On Wheels&lt;/a&gt; (CFWheels). Rails promotes two philosophies: Convention over Configuration (CoC), and the rapid development principle of &lt;strong&gt;Don't Repeat Yourself&lt;/strong&gt; (DRY). The Rails community excels at taking the DRY principle to new levels with &lt;a rel="nofollow" target="_blank" href="http://haml-lang.com"&gt;Haml&lt;/a&gt; (HTML Abstraction Markup Language) and &lt;a rel="nofollow"&gt;Sass&lt;/a&gt; (Syntactically Awesome Stylesheets). Two technologies ColdFusion developers can learn and take advantage of. Haml is a markup language to concisely &lt;em&gt;describe &lt;/em&gt;the HTML (Hyper Text Markup Language) of a web page. Coding HTML is very similar to a frog in boiling water, we don't notice all the repetitive code and wasteful keystrokes. &lt;em&gt;&lt;strong&gt;Most developer probably haven't consider why we are coding HTML and if there is a better solution.&lt;/strong&gt;&lt;/em&gt; Developers code HTML to render a web page properly to a browser. Haml maybe a better, friendly solution to accomplish this goal. Sass also prides itself on a simpler, more elegant syntax to &lt;em&gt;describe &lt;/em&gt;the style of a web page. CSS (Cascading Style Sheets) maybe even more repetitive and awkward then HTML. Both Haml and Sass move the DRY principle to new levels in syntax. ColdFusion developers should start exploring them along with other Rails technologies.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://git-scm.com/"&gt;Git&lt;/a&gt; has taken hold as a source control system for CFML developers. With Git in many Coldfusion shops, I see &lt;a rel="nofollow" target="_blank" href="http://code.google.com/p/gerrit/"&gt;Gerrit&lt;/a&gt; integration for code reviews becoming adopted. Gerrit is a code review system specifically using Git and makes reviews easier. Gerrit has &lt;a rel="nofollow" target="_blank" href="http://eclipse.org/mylyn/"&gt;Mylyn&lt;/a&gt; integration so code reviews can be easily accomplished without leaving your Eclipse IDE (Integrated Development Environment).&lt;/p&gt;&lt;table&gt;&lt;tr&gt;&lt;td style="vertical-align:top;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/xmwsYDADRIM" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://www.henke.ws/post.cfm/what-s-hot-where-do-we-go-from-here</guid>
         <pubDate>Wed, 14 Dec 2011 21:33:27 +0000</pubDate>
      </item>
      <item>
         <title>Episode 4: HackMyCF giveaway, FarCry, Evolving Skills and John Madden</title>
         <link>http://www.henke.ws/post.cfm/episode-4-hackmycf-giveaway-farcry-evolving-skills-and-john-madden</link>
         <description>&lt;p&gt;&lt;img src="http://coldfusionshow.com/assets/content/post_images/eposide4.jpg" alt=""/&gt;&lt;/p&gt;
&lt;p&gt;Ryan Stille and Mike Henke talk about HackMyCF giveaway, FarCry, Evolving Skills and John Madden. &lt;a rel="nofollow" target="_blank" href="http://coldfusionshow.com/post.cfm/episode-4-hackmycf-giveaway-farcry-evolving-skills-and-john-madden"&gt;&lt;em&gt;See Show Page for Epoisode 4 more information&lt;br /&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
						
						 
						&lt;h4 class="podcastPostHeading"&gt;Listen to the Podcast&lt;/h4&gt;
						&lt;div class="playerHolder"&gt;
							&lt;embed type="application/x-shockwave-flash"

 src="http://www.google.com/reader/ui/3523697345-audio-player.swf"
 width="400"
 height="27"
&gt;&lt;/iframe&gt;
						&lt;/div&gt;
						
						
						&lt;div class="downloadPodcast"&gt;
							&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://coldfusionshow-podcast.s3.amazonaws.com/111204-1.mp3" title="Download Audio" class="downloadLink"&gt;Download Audio&lt;/a&gt;&lt;/p&gt;
							
						&lt;/div&gt;
						
						
						&lt;div class="clearLinks"&gt;&lt;/div&gt;
						
						
&lt;p&gt;
 
&lt;/p&gt;&lt;table&gt;&lt;tr&gt;&lt;td style="vertical-align:top;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/Du1X6X0kGgI" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://www.henke.ws/post.cfm/episode-4-hackmycf-giveaway-farcry-evolving-skills-and-john-madden</guid>
         <pubDate>Mon, 05 Dec 2011 14:13:31 +0000</pubDate>
      </item>
      <item>
         <title>Beating the Flying Spaghetti Code Monster with CFWheels - Part 1</title>
         <link>http://talltroym.blogspot.com/2011/12/beating-flying-spaghetti-code-monster.html</link>
         <description>&lt;img alt="Flying Spaghetti Code Monster" id="flyingspaghetticodemonster" src="http://s3-2.kiva.org/img/w800/196261.jpg" title="Flying Spaghetti Code Monsterr"/&gt;&lt;br /&gt;
&lt;h2 id="background"&gt;
Background&lt;/h2&gt;
I started writing web application using Coldfusion in 2000 with version 4.5.  Like probably most of us back in those early days, we had one hand on the keyboard and a copy of &lt;a rel="nofollow" target="_blank" href="http://www.forta.com/books/032151548x/"&gt;Ben Forta’s Web Application Contrution Kit (WACK)&lt;/a&gt; in the other.  My development of applications consisted of creating a single autonomous file, with both database queries and conditional display code.  This of course was tied to yet another autonomous which did the same, etc, etc, etc.  Thus the “Flying Spaghetti Code Monster” Even after I started to use the Application.cfm “framework” within ColdFusion, I still had all of these autonomous files that would often break if I changed a variable or parameter that should be passed into the next.&lt;br /&gt;
After developing a few applications like this I realized there had to be a better way.  Somehow I came across the &lt;a rel="nofollow" target="_blank" href="http://www.fusebox.org/"&gt;Fusebox&lt;/a&gt; 2 framework and started to look into it.  This framework encouraged you to break the application up into separate files, query file, action file, display file, and then “chain” these together like fuses in an electrical circuit.  &lt;br /&gt;
Shortly after &lt;a rel="nofollow" target="_blank" href="http://www.fusebox.org/"&gt;Fusebox&lt;/a&gt; version 3 was released and I begin using this framework to develop my applications.  I especially loved the formurl2attributes function that put all of your url and form variables into a single scope.  I &lt;em&gt;started&lt;/em&gt; to convert small pieces of my existing applications from my spaghetti code to organized code following the Fusebox methodology, however I ended up sticking more with the file naming then actually using the framework after a while.  When &lt;a rel="nofollow" target="_blank" href="http://www.fusebox.org/"&gt;Fusebox&lt;/a&gt; version 4 was released I found it difficult to grasp, as well as the CFC concept that was brand new.  My two and a half years of part-time web application programming was coming to a close though as I left to work full-time as a systems administrator.&lt;br /&gt;
Over the next 7 years the largest of the web applications I wrote, a Laboratory Information System (LIS), continued to work for the University lab I wrote it for with minimal adjustments to it.  &lt;br /&gt;
&lt;h2 id="backtodeveloping"&gt;
Back to Developing&lt;/h2&gt;
At the end of those 7 years I was hired back, part-time, for this same lab, and part-time for another lab (so it’s a full-time position) on campus.  When I looked at this old source code I saw the “Flying Spaghetti Code Monster” glaring back at me.  I had well over 350 individual files and the folder size was near 80MB, not to mention &lt;em&gt;no&lt;/em&gt; source control software to help manage it.  I knew there had to be a better way to handle this, I didn’t want to continue to develop this way.&lt;br /&gt;
The first thing I did was get the software into a source control system.  Subversion was the choice as it was the easiest for me to grasp initially.  I went back to look at the &lt;a rel="nofollow" target="_blank" href="http://www.fusebox.org/"&gt;Fusebox&lt;/a&gt; framework and saw it was still around, but it didn’t seem like many were using it any longer.  There was the Mach-II framework, but I couldn’t seem to understand that either.  In the meantime I continued to serve the hard master known as the “Flying Spaghetti Code Monster” and maintain the code as it was, even adding new features, without much difference in my development pattern.&lt;br /&gt;
After five months of developing this way I came across the &lt;a rel="nofollow" target="_blank" href="http://cfwheels.org/"&gt;ColdFusion on Wheels&lt;/a&gt; framework website, not sure how (probably Twitter).  After greedily consuming all of the available screencasts I &lt;em&gt;knew&lt;/em&gt; this was the way I needed to develop the application.  The question was, how do I learn the &lt;a rel="nofollow" target="_blank" href="http://cfwheels.org/"&gt;CFWheels&lt;/a&gt; framework and use it to power this application?  I saw two choices:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;start from scratch in a parallel environment using &lt;a rel="nofollow" target="_blank" href="http://cfwheels.org/"&gt;CFWheels&lt;/a&gt; and recreate all of the functionality&lt;/li&gt;
&lt;li&gt;slowly, one “tenticle” at a time, battle the “Flying Spaghetti Code Monster” by converting a section to the CFWheels framework&lt;/li&gt;
&lt;/ol&gt;
After considering it I decided choice 2 was for me, to slowly convert the application.  In the following post I’ll explain how I’m doing this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7716316-2410543748889088283?l=talltroym.blogspot.com' alt=''/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/JdIhapF1OOQ" height="1" width="1"/&gt;</description>
         <author>Troy</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7716316.post-2410543748889088283</guid>
         <pubDate>Thu, 01 Dec 2011 20:18:00 +0000</pubDate>
      </item>
      <item>
         <title>Loading “extra” queries for a form in ColdFusion on Wheels</title>
         <link>http://www.clearcrystalmedia.com/pm/loading-extra-queries-for-form-cfwheels/</link>
         <description>Many times, you'll see this sort of situation when writing a form, where you need to load "extra" queries for things like state and country selectors:
&lt;pre lang="cfm"&gt;

 
 
 

 

#startFormTag(route="customer")#
    #textField(objectName="customer", property="name")#
    #textField(objectName="customer", property="email")#
    #select(objectName="customer", property="countryId", options=countries)#
    #select(objectName="customer", property="stateId", options=states)#
#endFormTag()#

 
&lt;/pre&gt;
There are many ways that you can load the data that this view template is requiring, each with their pros and cons. I'll cover 3 different approaches.</description>
         <guid isPermaLink="false">http://www.clearcrystalmedia.com/pm/?p=632</guid>
         <pubDate>Wed, 23 Nov 2011 13:51:15 +0000</pubDate>
         <content:encoded><![CDATA[<p>Many times, you&#8217;ll see this sort of situation when writing a form, where you need to load &#8220;extra&#8221; queries for things like state and country selectors:</p>

<div class="wp_syntax"><div class="code"><pre class="cfm" style="font-family:monospace;"><span style="color:#808080;font-style:italic;">&lt;!--- `views/customers/new.cfm` ---&gt;</span>
<span style="color:#333333;"><span style="color:#0000FF;">&lt;</span><span style="color:#990000;font-weight:bold;">cfparam</span> <span style="color:#0000FF;">name</span><span style="color:#0000FF;">=</span><span style="color:#009900;">&quot;customer&quot;</span><span style="color:#0000FF;">&gt;</span></span>
<span style="color:#333333;"><span style="color:#0000FF;">&lt;</span><span style="color:#990000;font-weight:bold;">cfparam</span> <span style="color:#0000FF;">name</span><span style="color:#0000FF;">=</span><span style="color:#009900;">&quot;countries&quot;</span> <span style="color:#0000FF;">type</span><span style="color:#0000FF;">=</span><span style="color:#009900;">&quot;query&quot;</span><span style="color:#0000FF;">&gt;</span></span>
<span style="color:#333333;"><span style="color:#0000FF;">&lt;</span><span style="color:#990000;font-weight:bold;">cfparam</span> <span style="color:#0000FF;">name</span><span style="color:#0000FF;">=</span><span style="color:#009900;">&quot;states&quot;</span> <span style="color:#0000FF;">type</span><span style="color:#0000FF;">=</span><span style="color:#009900;">&quot;query&quot;</span><span style="color:#0000FF;">&gt;</span></span>
&nbsp;
<span style="color:#333333;"><span style="color:#0000FF;">&lt;</span><span style="color:#990000;font-weight:bold;">cfoutput</span><span style="color:#0000FF;">&gt;</span></span>
&nbsp;
#startFormTag(route=&quot;customer&quot;)#
    #textField(objectName=&quot;customer&quot;, property=&quot;name&quot;)#
    #textField(objectName=&quot;customer&quot;, property=&quot;email&quot;)#
    #select(objectName=&quot;customer&quot;, property=&quot;countryId&quot;, options=countries)#
    #select(objectName=&quot;customer&quot;, property=&quot;stateId&quot;, options=states)#
<span style="color:#0000FF;">#endFormTag<span style="color:#0000FF;">&#40;</span><span style="color:#0000FF;">&#41;</span>#</span>
&nbsp;
<span style="color:#333333;"><span style="color:#0000FF;">&lt;/</span><span style="color:#990000;font-weight:bold;">cfoutput</span><span style="color:#0000FF;">&gt;</span></span></pre></div></div>

<p>There are many ways that you can load the data that this view template is requiring, each with their pros and cons. I&#8217;ll cover 3 different approaches.</p>
<h2>Approach #1: Use before filters to stay DRY</h2>
<p>One way to solve this problem in the controller is to run before filters on the <code>new</code>, <code>create</code>, <code>edit</code>, and <code>update</code> actions:</p>

<div class="wp_syntax"><div class="code"><pre class="cfm" style="font-family:monospace;">// `controllers/Customers.cfc`
component extends=&quot;Controller&quot; {
&nbsp;
    function init() {
        verifies(only=&quot;edit,update,show&quot;, params=&quot;key&quot;, paramsTypes=&quot;integer&quot;);
        verifies(only=&quot;create,update, params=&quot;customer&quot;);
        filters(only=&quot;new,create,edit,update&quot;, through=&quot;$setStates,$setCountries&quot;);
    }
&nbsp;
    function new() {
        customer = model(&quot;customer&quot;).new();
    }
&nbsp;
    function create() {
        customer = model(&quot;customer&quot;).new(params.customer);
        if (customer.save()) {
            redirectTo(route=&quot;customer&quot;, key=customer.key(), success=&quot;...&quot;);
        }
        else {
            flashInsert(error=&quot;...&quot;);
            renderPage(action=&quot;new&quot;);
        }
    }
&nbsp;
    function edit() {
        customer = model(&quot;customer&quot;).findByKey(params.key);
    }
&nbsp;
    function update() {
        customer = model(&quot;customer&quot;).findByKey(params.key);
        if (customer.update(params.customer)) {
            redirectTo(route=&quot;customer&quot;, key=customer.key(), success=&quot;...&quot;);
        }
        else {
            flashInsert(error=&quot;...&quot;);
            renderPage(action=&quot;edit&quot;);
        }
    }
&nbsp;
    function show() {
        customer = model(&quot;customer&quot;).findByKey(params.key);
    }
&nbsp;
    private function $setStates() {
        states = model(&quot;state&quot;).findAll(order=&quot;name&quot;);
    }
&nbsp;
    private function $setCountries() {
        countries = model(&quot;countries&quot;).findAll(order=&quot;name&quot;);
    }
}</pre></div></div>

<p>Notice the call to <code>filters()</code> in <code>init()</code> to load the <code>$setStates()</code> and <code>$setCountries()</code> private filter methods.</p>
<p>Yes, this works. But one problem is that you only need to load <code>states</code> and <code>countries</code> if the form needs to be shown with errors. On <code>create</code> and <code>update</code>, those queries may not even need to be run, but they&#8217;re running anyway. Why hit the database if you don&#8217;t need to?</p>
<p>Depending on your caching strategy, this may not matter if you are caching the <code>findAll()</code> calls. But let&#8217;s say that you are running at least one of those queries in real time. How do you avoid running them if you don&#8217;t need them?</p>
<h2>Approach #2: Limiting the use of filters and calling them manually in <code>create</code> and <code>update</code></h2>
<p>An approach that alleviates that problem is to limit the before filters to <code>new</code> and <code>edit</code> and only run them when needed in <code>create</code> and <code>update</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="cfm" style="font-family:monospace;">// `controllers/Customers.cfc`
component extends=&quot;Controller&quot; {
&nbsp;
    function init() {
        verifies(only=&quot;edit,update,show&quot;, params=&quot;key&quot;, paramsTypes=&quot;integer&quot;);
        verifies(only=&quot;create,update, params=&quot;customer&quot;);
        filters(only=&quot;new,edit&quot;, through=&quot;$setStates,$setCountries&quot;);
    }
&nbsp;
    function new() {
        customer = model(&quot;customer&quot;).new();
    }
&nbsp;
    function create() {
        customer = model(&quot;customer&quot;).new(params.customer);
        if (customer.save()) {
            redirectTo(route=&quot;customer&quot;, key=customer.key(), success=&quot;...&quot;);
        }
        else {
            $setStates();
            $setCountries();
            flashInsert(error=&quot;...&quot;);
            renderPage(action=&quot;new&quot;);
        }
    }
&nbsp;
    function edit() {
        customer = model(&quot;customer&quot;).findByKey(params.key);
    }
&nbsp;
    function update() {
        customer = model(&quot;customer&quot;).findByKey(params.key);
        if (customer.update(params.customer)) {
            redirectTo(route=&quot;customer&quot;, key=customer.key(), success=&quot;...&quot;);
        }
        else {
            $setStates();
            $setCountries();
            flashInsert(error=&quot;...&quot;);
            renderPage(action=&quot;edit&quot;);
        }
    }
&nbsp;
    function show() {
        customer = model(&quot;customer&quot;).findByKey(params.key);
    }
&nbsp;
    private function $setStates() {
        states = model(&quot;state&quot;).findAll(order=&quot;name&quot;);
    }
&nbsp;
    private function $setCountries() {
        countries = model(&quot;countries&quot;).findAll(order=&quot;name&quot;);
    }
}</pre></div></div>

<p>Notice the modified call to <code>filters()</code> in <code>init()</code> and the manual calls to <code>$setStates()</code> and <code>$setCountries()</code> in the <code>create</code> and <code>update</code> actions.</p>
<p>This is better because now the <code>states</code> and <code>countries</code> are only being loaded when absolutely needed. This does make things slightly less DRY, but it&#8217;s not too bad of a trade-off.</p>
<h2>Approach #3: Using Automatic Data Functions to Load Data for the Form</h2>
<p>Yet another approach is to factor out the form into a partial and use what&#8217;s called an <em>automatic data function</em> to load the extra queries.</p>
<p>So the view template changes to this (which you may be doing anyway):</p>

<div class="wp_syntax"><div class="code"><pre class="cfm" style="font-family:monospace;"><span style="color:#808080;font-style:italic;">&lt;!--- `views/customers/new.cfm` ---&gt;</span>
<span style="color:#333333;"><span style="color:#0000FF;">&lt;</span><span style="color:#990000;font-weight:bold;">cfoutput</span><span style="color:#0000FF;">&gt;</span></span>
&nbsp;
#startFormTag(route=&quot;customer&quot;)#
    #includePartial(&quot;form&quot;)#
<span style="color:#0000FF;">#endFormTag<span style="color:#0000FF;">&#40;</span><span style="color:#0000FF;">&#41;</span>#</span>
&nbsp;
<span style="color:#333333;"><span style="color:#0000FF;">&lt;/</span><span style="color:#990000;font-weight:bold;">cfoutput</span><span style="color:#0000FF;">&gt;</span></span></pre></div></div>

<p>And now you create a partial:</p>

<div class="wp_syntax"><div class="code"><pre class="cfm" style="font-family:monospace;"><span style="color:#808080;font-style:italic;">&lt;!--- `views/customers/_form.cfm` ---&gt;</span>
<span style="color:#333333;"><span style="color:#0000FF;">&lt;</span><span style="color:#990000;font-weight:bold;">cfparam</span> <span style="color:#0000FF;">name</span><span style="color:#0000FF;">=</span><span style="color:#009900;">&quot;customer&quot;</span><span style="color:#0000FF;">&gt;</span></span>
<span style="color:#333333;"><span style="color:#0000FF;">&lt;</span><span style="color:#990000;font-weight:bold;">cfparam</span> <span style="color:#0000FF;">name</span><span style="color:#0000FF;">=</span><span style="color:#009900;">&quot;arguments.countries&quot;</span> <span style="color:#0000FF;">type</span><span style="color:#0000FF;">=</span><span style="color:#009900;">&quot;query&quot;</span><span style="color:#0000FF;">&gt;</span></span>
<span style="color:#333333;"><span style="color:#0000FF;">&lt;</span><span style="color:#990000;font-weight:bold;">cfparam</span> <span style="color:#0000FF;">name</span><span style="color:#0000FF;">=</span><span style="color:#009900;">&quot;arguments.states&quot;</span> <span style="color:#0000FF;">type</span><span style="color:#0000FF;">=</span><span style="color:#009900;">&quot;query&quot;</span><span style="color:#0000FF;">&gt;</span></span>
&nbsp;
<span style="color:#333333;"><span style="color:#0000FF;">&lt;</span><span style="color:#990000;font-weight:bold;">cfoutput</span><span style="color:#0000FF;">&gt;</span></span>
&nbsp;
#textField(objectName=&quot;customer&quot;, property=&quot;name&quot;)#
#textField(objectName=&quot;customer&quot;, property=&quot;email&quot;)#
#select(objectName=&quot;customer&quot;, property=&quot;countryId&quot;, options=arguments.countries)#
#select(objectName=&quot;customer&quot;, property=&quot;stateId&quot;, options=arguments.states)#
&nbsp;
<span style="color:#333333;"><span style="color:#0000FF;">&lt;/</span><span style="color:#990000;font-weight:bold;">cfoutput</span><span style="color:#0000FF;">&gt;</span></span></pre></div></div>

<p>You may now notice that the <code>countries</code> and <code>states</code> variables are now being referenced in the <code>arguments</code> scope. That&#8217;s because we&#8217;re going to load them from an automatic data function.</p>
<p>The controller should now look like this:</p>

<div class="wp_syntax"><div class="code"><pre class="cfm" style="font-family:monospace;">// `controllers/Customers.cfc`
component extends=&quot;Controller&quot; {
&nbsp;
    function init() {
        verifies(only=&quot;edit,update,show&quot;, params=&quot;key&quot;, paramsTypes=&quot;integer&quot;);
        verifies(only=&quot;create,update, params=&quot;customer&quot;);
    }
&nbsp;
    function new() {
        customer = model(&quot;customer&quot;).new();
    }
&nbsp;
    function create() {
        customer = model(&quot;customer&quot;).new(params.customer);
        if (customer.save()) {
            redirectTo(route=&quot;customer&quot;, key=customer.key(), success=&quot;...&quot;);
        }
        else {
            flashInsert(error=&quot;...&quot;);
            renderPage(action=&quot;new&quot;);
        }
    }
&nbsp;
    function edit() {
        customer = model(&quot;customer&quot;).findByKey(params.key);
    }
&nbsp;
    function update() {
        customer = model(&quot;customer&quot;).findByKey(params.key);
        if (customer.update(params.customer)) {
            redirectTo(route=&quot;customer&quot;, key=customer.key(), success=&quot;...&quot;);
        }
        else {
            flashInsert(error=&quot;...&quot;);
            renderPage(action=&quot;edit&quot;);
        }
    }
&nbsp;
    function show() {
        customer = model(&quot;customer&quot;).findByKey(params.key);
    }
&nbsp;
    private struct function form() {
        local.data.states = model(&quot;state&quot;).findAll(order=&quot;name&quot;);
        local.data.countries = model(&quot;countries&quot;).findAll(order=&quot;name&quot;);
        return local.data;
    }
}</pre></div></div>

<p>The true points of interest in this example are the <code>init()</code> and <code>form()</code>. We&#8217;re now no longer running before filters in <code>init()</code> to load the <code>states</code> and <code>countries</code>.</p>
<p>Also, there is a new private method named <code>form()</code> that acts as an automatic data function. Every time you call a partial, Wheels checks for a method in your controller with the name of the partial, <code>private</code> access, and a return type of <code>struct</code>. If it finds that method, it&#8217;ll run it and merge the struct that it returns into the <code>arguments</code> scope in the view.</p>
<p>So <code>form()</code> is only being run when the form is shown via the call to <code>#includePartial("form")#</code>. And the data loading is still happening in the controller where it belongs.</p>
<p>I&#8217;ve only begun playing around with this method and so far have been enjoying the results. I am slightly torn because I like the &#8220;self-documenting&#8221; nature of declaring filters in <code>init()</code>, but that method does have the caveat that I mentioned before. The automatic data function solves this problem, but it does make the functionality a little less obvious. You need to remember the extra step of checking to see if there is a method in the controller with the same name as the partial when you run across one.</p>
<p>Has anyone else play with this method? If so, how has this worked out for you?</p><img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/q3QDAnd9WQ8" height="1" width="1"/>]]></content:encoded>
         <category>ColdFusion on Wheels</category>
      </item>
      <item>
         <title>Restrict key ColdFusion on Wheels URL variables from Google Analytics</title>
         <link>http://www.clearcrystalmedia.com/pm/restrict-key-cfwheels-url-variables-from-google-analytics/</link>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.clearcrystalmedia.com/pm/wp-content/uploads/google-analytics-logo.gif"&gt;&lt;img class="alignnone size-full wp-image-607" title="google-analytics-logo" src="http://www.clearcrystalmedia.com/pm/wp-content/uploads/google-analytics-logo.gif" alt="Google Analytics" width="213" height="40"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here's a little tip to keep anyone in your organization using Google Analytics from accidentally reloading your ColdFusion on Wheels application in the wrong &lt;a rel="nofollow" title="Switching Environments" target="_blank" href="http://cfwheels.org/docs/chapter/switching-environments"&gt;environment&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://www.clearcrystalmedia.com/pm/?p=602</guid>
         <pubDate>Mon, 07 Nov 2011 15:00:51 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://www.clearcrystalmedia.com/pm/wp-content/uploads/google-analytics-logo.gif"><img class="alignnone size-full wp-image-607" title="google-analytics-logo" src="http://www.clearcrystalmedia.com/pm/wp-content/uploads/google-analytics-logo.gif" alt="Google Analytics" width="213" height="40"/></a></p>
<p>Here&#8217;s a little tip to keep anyone in your organization using Google Analytics from accidentally reloading your ColdFusion on Wheels application in the wrong <a rel="nofollow" title="Switching Environments" target="_blank" href="http://cfwheels.org/docs/chapter/switching-environments">environment</a>.</p>
<h2>Problem: people can see your reload URLs</h2>
<p>You wouldn&#8217;t think that Google Analytics would have anything to do with this, but consider this scenario:</p>
<ol>
<li>A non-technical teammate of yours runs some content reports in Google Analytics.</li>
<li>The teammate keeps seeing a URL appearing in the reports that looks something like this:<br />
<code>/?reload=maintenance&amp;password=123456</code>.</li>
<li>They eventually say to themselves, &#8220;Hmm, I wonder what that does. I&#8217;m going to click it.&#8221;</li>
<li>You get an emergency call because your website is in maintenance mode all of a sudden, and you&#8217;re not sure why it happened.</li>
</ol>
<h2>Solution: <em>Exclude URL Query Parameters</em> setting</h2>
<p>The solution is pretty simple. You just need to go into the Google Analytics settings area for each of your Wheels apps&#8217; profiles and exclude the <kbd>reload</kbd>, <kbd>password</kbd>, and <kbd>except</kbd> URL paramaters from appearing in Google Analytics.</p>
<p>Your settings would look something like this:</p>
<p><a rel="nofollow" class="screenshot" target="_blank" href="http://www.clearcrystalmedia.com/pm/wp-content/uploads/exclude-url-query-parameters-field.gif"><img class="size-full wp-image-606 alignnone" title="exclude-url-query-parameters-field" src="http://www.clearcrystalmedia.com/pm/wp-content/uploads/exclude-url-query-parameters-field.gif" alt="" width="469" height="283"/></a></p>
<p>Here&#8217;s how to get to the profile settings for your Wheels app:</p>
<ol>
<li>Open the reports for each profile</li>
<li>Click the Gear icon in the upper right</li>
<li>Click the Profile Settings tab</li>
<li>Edit the Exclude URL Query Parameters field.</li>
</ol>
<h2>More information</h2>
<ul>
<li><a rel="nofollow" target="_blank" href="http://www.google.com/support/analyticshelp/bin/answer.py?answer=1010249">Edit Profile Settings</a> article in Google Analytics Help</li>
<li><a rel="nofollow" target="_blank" href="http://cfwheels.org/docs/chapter/switching-environments">Switching Environments</a> chapter in ColdFusion on Wheels Reference Guide</li>
</ul>



<p class='technorati-tags'>Technorati Tags: <a rel="nofollow" class='technorati-link' target="_blank" href='http://technorati.com/tag/analytics'>analytics</a>, <a rel="nofollow" class='technorati-link' target="_blank" href='http://technorati.com/tag/ccm'>ccm</a>, <a rel="nofollow" class='technorati-link' target="_blank" href='http://technorati.com/tag/cfwheels'>cfwheels</a>, <a rel="nofollow" class='technorati-link' target="_blank" href='http://technorati.com/tag/chris+peters'>chris peters</a>, <a rel="nofollow" class='technorati-link' target="_blank" href='http://technorati.com/tag/clear+crystal+media'>clear crystal media</a>, <a rel="nofollow" class='technorati-link' target="_blank" href='http://technorati.com/tag/ColdFusion'>ColdFusion</a>, <a rel="nofollow" class='technorati-link' target="_blank" href='http://technorati.com/tag/coldfusion+on+wheels'>coldfusion on wheels</a>, <a rel="nofollow" class='technorati-link' target="_blank" href='http://technorati.com/tag/ColdFusion+on+Wheels'>ColdFusion on Wheels</a>, <a rel="nofollow" class='technorati-link' target="_blank" href='http://technorati.com/tag/google+analytics'>google analytics</a>, <a rel="nofollow" class='technorati-link' target="_blank" href='http://technorati.com/tag/polymorphism'>polymorphism</a>, <a rel="nofollow" class='technorati-link' target="_blank" href='http://technorati.com/tag/security'>security</a>, <a rel="nofollow" class='technorati-link' target="_blank" href='http://technorati.com/tag/web+analytics'>web analytics</a></p><img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/H8EfYOI9Ivk" height="1" width="1"/>]]></content:encoded>
      </item>
      <item>
         <title>would like one more person – Melbourne Australia training and conference</title>
         <link>http://www.henke.ws/post.cfm/would-like-one-more-person-melbourne-australia-training-and-conference</link>
         <description>&lt;p&gt;I'll be traveling to Melbourne, Australia next week to give an &lt;a rel="nofollow" target="_blank" href="http://www.cfobjective.com.au/program/workshops/"&gt;"Introduction Into ColdFusion on Wheels" workshop&lt;/a&gt; and attend &lt;a rel="nofollow" target="_blank" href="http://www.cfobjective.com.au/"&gt;cfObjective (AUZ)&lt;/a&gt;. I would love at least one more person to &lt;a rel="nofollow" target="_blank" href="http://www.cfobjective.com.au/register"&gt;register&lt;/a&gt; for the the CFWheels workshop so please consider it if you are in the Melbourne area. The workspace was give before at &lt;a rel="nofollow" target="_blank" href="http://www.cfobjective.com/"&gt;CFObjective&lt;/a&gt; pre-conference training last year and it was a lot of fun. We do the whole workshop without writing a single line of sql using ColdFusion on Wheels built in ORM and a DBMigrate plugin. It is pretty awesome.&lt;/p&gt;
&lt;p&gt;During the conference, I'll be presenting on ColdFusion and Flash Builder using Task focused workflow. This is a great session covering tools already available for a developer using Eclipse and doesn't involve any changes in your existing ticket solution.&lt;/p&gt;&lt;table&gt;&lt;tr&gt;&lt;td style="vertical-align:top;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/waaTobnkBuY" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://www.henke.ws/post.cfm/would-like-one-more-person-melbourne-australia-training-and-conference</guid>
         <pubDate>Fri, 04 Nov 2011 14:35:22 +0000</pubDate>
      </item>
      <item>
         <title>Railo on IIS6 installation and configuration errors</title>
         <link>http://rip747.wordpress.com/2011/10/17/railo-on-iis6-installation-and-configuration-errors/</link>
         <description>railo is a great alternative to adobe&amp;#8217;s cfml server, but there lets face it&amp;#8230; it&amp;#8217;s a pain in the ass to get configured on iis6! rather then have you fight through all these errors, i&amp;#8217;ve documented the errors that not only i encountered during the setup, but also was able to create. hopefully this will [...]&lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rip747.wordpress.com&amp;amp;blog=295460&amp;amp;post=939&amp;amp;subd=rip747&amp;amp;ref=&amp;amp;feed=1" width="1" height="1"/&gt;</description>
         <guid isPermaLink="false">http://rip747.wordpress.com/?p=939</guid>
         <pubDate>Tue, 18 Oct 2011 01:28:04 +0000</pubDate>
         <content:encoded><![CDATA[<p>railo is a great alternative to adobe&#8217;s cfml server, but there lets face it&#8230; it&#8217;s a pain in the ass to get configured on iis6! rather then have you fight through all these errors, i&#8217;ve documented the errors that not only i encountered during the setup, but also was able to create. hopefully this will save you from getting frustrated.</p>
<p>the following errors may happen when installing railo on IIS6 and visiting the site. (note: all paths assume that you installed railo to the c:&#92;railo directory)</p>
<h3>Error: Invalid function</h3>
<p>Cause: This happens when you haven&#8217;t chosen to install the iis connector or something screwed up in the installation of the iis connector. you can see this if you go into the C:&#92;railo&#92;connector&#92;isapi_redirect-1.2.31.properties and you see @@install_dir@@ in the file. those markers were suppose to be replaced with the directory you installed railo.</p>
<p>Fix: don&#8217;t just try to change these markers to the installation directory as they aren&#8217;t just in this file. the best bet is to run the installation again and make sure you check to install the iis connector.</p>
<h3>Error: The system cannot find the path specified.</h3>
<p>Cause: you forgot to configure the jakarta virtual directory for the site in iis.</p>
<p>Fix: go into iis and add a virtual directory called &#8220;jakarta&#8221; to the site experiencing the error. make sure to point it to the c:&#92;railo&#92;connector directory. Make sure to give the virtual directory &#8220;scripts and executables&#8221; permissions.</p>
<h3>Error: You get prompted to download the cfm file</h3>
<p>Cause: you forgot to give the jakarta virtual directory &#8220;scripts and executables&#8221; permissions.</p>
<p>Fix: give the jakarta virtual directory &#8220;scripts and executables&#8221; permissions.</p>
<h3>Error: you get a 404, page not found error (from IIS)</h3>
<p>Cause: you have not allowed unknown cgi and isapi extensions in IIS</p>
<p>Fix: click on the web server extenstions folder in iis admin. allow both unknown cgi extensions and unknown isapi extensions.</p>
<p>Cause: this could also be because the application extension aren&#8217;t configured for *.cfm extensions.</p>
<p>Fix: the railo installation instructions forgets to mention that you need to configure the site with application extensions for *.cfm extensions. go into the properties for the site and click the &#8220;home directory&#8221; tab. next click the &#8220;configuration&#8221; button next to where the execute permissions drop down is. on the next page, click the &#8220;add&#8221; button under the application extensions section. for the executable, browse to the  isapi_redirect dll located in the c:&#92;railo&#92;connector directory. for extension, enter in *.cfm. uncheck the &#8220;verify that file exists&#8221; checkbox. repeat this process for *.cfc if you site uses components.</p>
<p>PROTIP!!!!: if you want you can configure all the sites and future sites with these application extension by right clicking on the &#8220;web sites&#8221; folder and following the instructions above.</p>
<h3>Error: you get a railo missinginclude error</h3>
<p>Cause: you have configured the host section of server.xml wrong</p>
<p>Fix: most likely the cause is when you have misspelled an alias. make sure that all the aliases are spelled correctly and that the host section is configured properly.</p>
<h3>Error: Unspecified error</h3>
<p>Cause: you don&#8217;t have the isapi filter configured for your website.</p>
<p>Fix: the installation instructions for railo forget to mention that you need to configure an isapi filter for the website in order for railo to work. go into the properties of the site and click on the ispai filter tab. add a filter called &#8220;railo&#8221; and for the executable, point it to the isapi_redirect-X.dll located in the connector directory. so for 3.3.1 the path would be c:&#92;railo&#92;connector&#92;isapi_redirect-1.2.31.dll.</p>
<br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/rip747.wordpress.com/939/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rip747.wordpress.com/939/"/></a> <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/godelicious/rip747.wordpress.com/939/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rip747.wordpress.com/939/"/></a> <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gofacebook/rip747.wordpress.com/939/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rip747.wordpress.com/939/"/></a> <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gotwitter/rip747.wordpress.com/939/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rip747.wordpress.com/939/"/></a> <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gostumble/rip747.wordpress.com/939/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rip747.wordpress.com/939/"/></a> <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/godigg/rip747.wordpress.com/939/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rip747.wordpress.com/939/"/></a> <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/goreddit/rip747.wordpress.com/939/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rip747.wordpress.com/939/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rip747.wordpress.com&amp;blog=295460&amp;post=939&amp;subd=rip747&amp;ref=&amp;feed=1" width="1" height="1"/><img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/UBKK4PRlXms" height="1" width="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/f09f0a0d45c19276540a9899d0e6b667?s=96&amp;amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96">
            <media:title type="html">rip747</media:title>
         </media:content>
      </item>
      <item>
         <title>Podcast discussing Mylyn Tasktop and Adobe Flash ColdFusion Builder</title>
         <link>http://www.henke.ws/post.cfm/podcast-discussing-mylyn-tasktop-and-adobe-flash-coldfusion-builder</link>
         <description>&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;Recently, I was honored to be on the &lt;a rel="nofollow" target="_blank" href="http://www.2ddu.com/"&gt;2 Devs from Down Under&lt;/a&gt; podcast discussing an upcoming session for &lt;a rel="nofollow" target="_blank" href="http://www.cfobjective.com.au/"&gt;CFObjective ANZ&lt;/a&gt; titled "Task-Oriented Workflow With Adobe Flash &amp;amp; ColdFusion Builder". &lt;a rel="nofollow" target="_blank" href="http://d2rqv4eo8j237w.cloudfront.net/2-devs-from-downunder-XIII-edited.mp3"&gt;I edited down my discussion to just over 17 mins here.&lt;/a&gt; I was on a panel of 2 other speakers. If you wish to listen to the whole podcast, you can find it here: &lt;a rel="nofollow" target="_blank" href="http://www.2ddu.com/2011/09/22/even-more-speakers-and-kai-wins/"&gt;Even more speakers &amp;#8211; and Kai wins&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I briefly mentioned the One Day &lt;a rel="nofollow" target="_blank" href="http://www.cfobjective.com.au/program/workshops/"&gt;ColdFusion On Wheels Intro&lt;/a&gt; before the conference. &lt;strong&gt;&lt;em&gt;Please sign up and support the conference and training!&lt;/em&gt;&lt;/strong&gt; Thanks&lt;/p&gt;
&lt;p&gt;I had such a great time, &lt;a rel="nofollow" target="_blank" href="http://www.stillnetstudios.com/"&gt;Ryan Stille&lt;/a&gt; and I are going to give podcasting a try for three eposides over the next 6 weeks. We are going to keep it light and short (under 20 minutes) mentioning items from my shared &lt;a rel="nofollow" target="_blank" href="http://www.google.com/reader/shared/henkemike"&gt;Google Reader&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://twitter.com/#!/mikehenke/favorites"&gt;favorite tweets&lt;/a&gt; along with news Ryan finds interesting.&lt;/p&gt;


						
						 
						&lt;h4 class="podcastPostHeading"&gt;Listen to the Podcast&lt;/h4&gt;
						&lt;div class="playerHolder"&gt;
							&lt;embed type="application/x-shockwave-flash"

 src="http://www.google.com/reader/ui/3523697345-audio-player.swf"
 width="400"
 height="27"
&gt;&lt;/iframe&gt;
						&lt;/div&gt;
						
						
						&lt;div class="downloadPodcast"&gt;
							&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://d2rqv4eo8j237w.cloudfront.net/2-devs-from-downunder-XIII-edited.mp3" title="Download Audio" class="downloadLink"&gt;Download Audio&lt;/a&gt;&lt;/p&gt;
							
						&lt;/div&gt;
						
						
						&lt;div class="clearLinks"&gt;&lt;/div&gt;
						
						&lt;table&gt;&lt;tr&gt;&lt;td style="vertical-align:top;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/T1BshHMmbCo" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://www.henke.ws/post.cfm/podcast-discussing-mylyn-tasktop-and-adobe-flash-coldfusion-builder</guid>
         <pubDate>Mon, 10 Oct 2011 21:19:58 +0000</pubDate>
      </item>
      <item>
         <title>Setting up MXUnit Eclipse plugin with CFWheels</title>
         <link>http://www.henke.ws/post.cfm/setting-up-mxunit-eclipse-plugin-with-cfwheels</link>
         <description>&lt;p&gt;I setup up &lt;a rel="nofollow" target="_blank" href="http://mxunit.org/"&gt;MXUnit&lt;/a&gt; Eclipse plugin with &lt;a rel="nofollow" target="_blank" href="http://cfwheels.org/"&gt;CFWheels&lt;/a&gt; this afternoon. The &lt;a rel="nofollow" target="_blank" href="http://cfinnovate.com:9082/display/default/MXUnit+Documentation"&gt;MXUnit documentation&lt;/a&gt; is very good. I downloaded MXUnit and dropped the mxunit folder in my Wheels root which happens to be the web root also. Then I &lt;a rel="nofollow" target="_blank" href="http://cfinnovate.com:9082/display/default/Install+the+Eclipse+Plugin"&gt;installed the MXUnit Eclipse plugin&lt;/a&gt;. Once installed, I &lt;a rel="nofollow" target="_blank" href="http://cfinnovate.com:9082/display/default/Running+your+Tests+under+the+Application+Scope+--+Custom+RemoteFacades"&gt;created custom Remote Facade&lt;/a&gt; in my wheels application web root.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" width="640" height="400"/&gt;&lt;/p&gt;
&lt;p&gt;Next I point the Eclipse project containing the Wheels application to the new remote facade URL as mentioned in the directions above: Right click on the project name in the Navigator or Project Explorer, Select "Properties"Select &amp;#8211; "MXUnit Properties" then add the path to your custom remote URL. And I tested using the "Test Facade URL" button.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" width="640" height="400"/&gt;&lt;/p&gt;
&lt;p&gt;Next I walked through the &lt;a rel="nofollow" target="_blank" href="http://cfinnovate.com:9082/display/default/Configure+and+Test+the+Plugin"&gt;Configure and Test the Plugin&lt;/a&gt; section from MXUnit's documentation and here are my results.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" width="640" height="400"/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;table&gt;&lt;tr&gt;&lt;td style="vertical-align:top;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/H3HWf_rU0Jw" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://www.henke.ws/post.cfm/setting-up-mxunit-eclipse-plugin-with-cfwheels</guid>
         <pubDate>Mon, 26 Sep 2011 20:23:31 +0000</pubDate>
      </item>
      <item>
         <title>CFWheels StatesAndCountries Plugin Updated</title>
         <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/7WuDHAJvXik/cfwheels-statesandcountries-plugin-updated</link>
         <description>&lt;p&gt;
	&lt;p&gt;With many thanks due to Jordan Clark, my &lt;a rel="nofollow" target="_blank" href="http://cfwheels.org/plugins/listing/52" title="StatesAndCountries CFWheels Plugin"&gt;StatesAndCountries plugin&lt;/a&gt;&amp;nbsp;for CFWheels has been updated.&lt;/p&gt;
&lt;p&gt;Because my CFML work is focused solely on Railo and I do not have a current Adobe ColdFusion installation on my main work machine, I missed that there was an issue on ACF with the plugin (it could not find the asset files).&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Jordan tweaked the plugin to work for him on ACF and then I went back in and made a few tweaks so that it will work on both now.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Thanks, again, to Jordan for his assistance and recommitting the code (pull requesting, whatever :) to the GitHub repo. This is why I freaking love open source code!&lt;/p&gt;
	


&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://craigkaminsky.me/cfwheels-statesandcountries-plugin-updated"&gt;Permalink&lt;/a&gt; 

	| &lt;a rel="nofollow" target="_blank" href="http://craigkaminsky.me/cfwheels-statesandcountries-plugin-updated#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/R7Yx7xRwvYI" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://craigkaminsky.me/cfwheels-statesandcountries-plugin-updated</guid>
         <pubDate>Fri, 23 Sep 2011 18:40:00 +0000</pubDate>
      </item>
      <item>
         <title>CFWheels and SES URLs</title>
         <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/KRESU6nUaG4/cfwheels-and-ses-urls</link>
         <description>&lt;p&gt;
	&lt;p&gt;I&amp;rsquo;ve been talking with a fellow CF'er and he was having some trouble getting SES URLs rolling in a Tomcat and CFWheels application that he&amp;rsquo;s working on. Since I had to go through all sorts of &amp;lsquo;fun&amp;rsquo; times with SES URLs and Wheels a year ago, I thought I&amp;rsquo;d write up a little post on my experiences and how I got the URLs I want. And, really, it ain&amp;rsquo;t that bad.&lt;/p&gt;

&lt;h2&gt;URLRewriteFilter&lt;/h2&gt;

&lt;p&gt;First things first, download the excellent Java Web Filter library, &lt;a rel="nofollow" target="_blank" href="http://www.tuckey.org/urlrewrite/"&gt;URLRewriteFilter&lt;/a&gt;. Once downloaded, expand the Zip Archive. You will see a WEB-INF folder, inside of which, are two important items: urlrewrite.xml and lib/urlrewrite-3.2.0.jar. From here, it&amp;rsquo;s not too difficult to figure out what&amp;rsquo;s next &amp;hellip; move these items (the XML and JAR) into the corresponding locations in your application&amp;rsquo;s WEB-INF folder. Note that you may need to create a lib folder in your WEB-INF (I did).&lt;/p&gt;

&lt;h2&gt;WEB.XML&lt;/h2&gt;

&lt;p&gt;Next up, you need to add a declaration to your web.xml file (also located in WEB-INF) so that your server knows to load the URLRewriteFilter JAR. The addition is pretty simple.&lt;/p&gt;

&lt;p&gt;&lt;div class="data type-text"&gt;
      &lt;table class="lines" cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            &lt;pre class="line_numbers"&gt;&lt;span id="L1"&gt;1&lt;/span&gt;
&lt;span id="L2"&gt;2&lt;/span&gt;
&lt;span id="L3"&gt;3&lt;/span&gt;
&lt;span id="L4"&gt;4&lt;/span&gt;
&lt;span id="L5"&gt;5&lt;/span&gt;
&lt;span id="L6"&gt;6&lt;/span&gt;
&lt;span id="L7"&gt;7&lt;/span&gt;
&lt;span id="L8"&gt;8&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
                &lt;div class="highlight"&gt;&lt;pre &gt;&lt;div class="line" id="LC1"&gt;&amp;lt;filter&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;	&amp;lt;filter-name&amp;gt;UrlRewriteFilter&amp;lt;/filter-name&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC3"&gt;	&amp;lt;filter-class&amp;gt;org.tuckey.web.filters.urlrewrite.UrlRewriteFilter&amp;lt;/filter-class&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC4"&gt;&amp;lt;/filter&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC5"&gt;&amp;lt;filter-mapping&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC6"&gt;	&amp;lt;filter-name&amp;gt;UrlRewriteFilter&amp;lt;/filter-name&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC7"&gt;	&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC8"&gt;&amp;lt;/filter-mapping&amp;gt;  &lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
  &lt;/div&gt;

&lt;p&gt;Now the filter will be loaded when your server starts.&lt;/p&gt;

&lt;h2&gt;URLREWRITE.XML&lt;/h2&gt;

&lt;p&gt;Next, you need to instruct the URLRewriteFilter &lt;em&gt;how&lt;/em&gt; to filter and pass on your requests, which is done by providing the conditions under which the filter should not run (in this case). For Wheels, there were two levels at which I did not want the filter to kick in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when certain folders were requested&lt;/li&gt;
&lt;li&gt;when specific files were requested&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;For organization and readability, I organized my filter declarations by folders and then files. As you can see from the XML document belowm I select all the major folders where your CFML server is doing stuff (e.g., flex2gateway or railo-context) or where static files are server (e.g., javascripts, stylesheets).&lt;/p&gt;

&lt;p&gt;Once your conditions are in place, you need to just tell the filter from what and to which URLs should it rewrite. For Wheels, this appears as follows:&lt;/p&gt;

&lt;p&gt;&lt;div class="data type-text"&gt;
      &lt;table class="lines" cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            &lt;pre class="line_numbers"&gt;&lt;span id="L1"&gt;1&lt;/span&gt;
&lt;span id="L2"&gt;2&lt;/span&gt;
&lt;span id="L3"&gt;3&lt;/span&gt;
&lt;span id="L4"&gt;4&lt;/span&gt;
&lt;span id="L5"&gt;5&lt;/span&gt;
&lt;span id="L6"&gt;6&lt;/span&gt;
&lt;span id="L7"&gt;7&lt;/span&gt;
&lt;span id="L8"&gt;8&lt;/span&gt;
&lt;span id="L9"&gt;9&lt;/span&gt;
&lt;span id="L10"&gt;10&lt;/span&gt;
&lt;span id="L11"&gt;11&lt;/span&gt;
&lt;span id="L12"&gt;12&lt;/span&gt;
&lt;span id="L13"&gt;13&lt;/span&gt;
&lt;span id="L14"&gt;14&lt;/span&gt;
&lt;span id="L15"&gt;15&lt;/span&gt;
&lt;span id="L16"&gt;16&lt;/span&gt;
&lt;span id="L17"&gt;17&lt;/span&gt;
&lt;span id="L18"&gt;18&lt;/span&gt;
&lt;span id="L19"&gt;19&lt;/span&gt;
&lt;span id="L20"&gt;20&lt;/span&gt;
&lt;span id="L21"&gt;21&lt;/span&gt;
&lt;span id="L22"&gt;22&lt;/span&gt;
&lt;span id="L23"&gt;23&lt;/span&gt;
&lt;span id="L24"&gt;24&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
                &lt;div class="highlight"&gt;&lt;pre &gt;&lt;div class="line" id="LC1"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;&amp;lt;!DOCTYPE urlrewrite PUBLIC &amp;quot;-//tuckey.org//DTD UrlRewrite 2.6//EN&amp;quot; &amp;quot;http://tuckey.org/res/dtds/urlrewrite2.6.dtd&amp;quot;&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC3"&gt;&amp;lt;urlrewrite&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC4"&gt;	&amp;lt;rule match-type=&amp;quot;regex&amp;quot;&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC5"&gt;		&amp;lt;!-- folder conditions --&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC6"&gt;		&amp;lt;condition type=&amp;quot;request-uri&amp;quot; operator=&amp;quot;notequal&amp;quot; next=&amp;quot;and&amp;quot;&amp;gt;/flex2gateway/*&amp;lt;/condition&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC7"&gt;		&amp;lt;condition type=&amp;quot;request-uri&amp;quot; operator=&amp;quot;notequal&amp;quot; next=&amp;quot;and&amp;quot;&amp;gt;/jrunscripts/*&amp;lt;/condition&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC8"&gt;		&amp;lt;condition type=&amp;quot;request-uri&amp;quot; operator=&amp;quot;notequal&amp;quot; next=&amp;quot;and&amp;quot;&amp;gt;/cfide/*&amp;lt;/condition&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC9"&gt;		&amp;lt;condition type=&amp;quot;request-uri&amp;quot; operator=&amp;quot;notequal&amp;quot; next=&amp;quot;and&amp;quot;&amp;gt;/files/*&amp;lt;/condition&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC10"&gt;		&amp;lt;condition type=&amp;quot;request-uri&amp;quot; operator=&amp;quot;notequal&amp;quot; next=&amp;quot;and&amp;quot;&amp;gt;/flash/*&amp;lt;/condition&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC11"&gt;		&amp;lt;condition type=&amp;quot;request-uri&amp;quot; operator=&amp;quot;notequal&amp;quot; next=&amp;quot;and&amp;quot;&amp;gt;/images/*&amp;lt;/condition&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC12"&gt;		&amp;lt;condition type=&amp;quot;request-uri&amp;quot; operator=&amp;quot;notequal&amp;quot; next=&amp;quot;and&amp;quot;&amp;gt;/javascripts/*&amp;lt;/condition&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC13"&gt;		&amp;lt;condition type=&amp;quot;request-uri&amp;quot; operator=&amp;quot;notequal&amp;quot; next=&amp;quot;and&amp;quot;&amp;gt;/miscellaneous/*&amp;lt;/condition&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC14"&gt;		&amp;lt;condition type=&amp;quot;request-uri&amp;quot; operator=&amp;quot;notequal&amp;quot; next=&amp;quot;and&amp;quot;&amp;gt;/stylesheets/*&amp;lt;/condition&amp;gt;  &lt;/div&gt;&lt;div class="line" id="LC15"&gt;		&amp;lt;condition type=&amp;quot;request-uri&amp;quot; operator=&amp;quot;notequal&amp;quot; next=&amp;quot;and&amp;quot;&amp;gt;/railo-context/*&amp;lt;/condition&amp;gt;  &lt;/div&gt;&lt;div class="line" id="LC16"&gt;		&amp;lt;!-- file conditions --&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC17"&gt;		&amp;lt;condition type=&amp;quot;request-uri&amp;quot; operator=&amp;quot;notequal&amp;quot; next=&amp;quot;and&amp;quot;&amp;gt;/robots.txt&amp;lt;/condition&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC18"&gt;		&amp;lt;condition type=&amp;quot;request-uri&amp;quot; operator=&amp;quot;notequal&amp;quot; next=&amp;quot;and&amp;quot;&amp;gt;/sitemap.xml&amp;lt;/condition&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC19"&gt;		&amp;lt;condition type=&amp;quot;request-uri&amp;quot; operator=&amp;quot;notequal&amp;quot; next=&amp;quot;and&amp;quot;&amp;gt;/404.shtml&amp;lt;/condition&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC20"&gt;		&amp;lt;condition type=&amp;quot;request-uri&amp;quot; operator=&amp;quot;notequal&amp;quot; next=&amp;quot;and&amp;quot;&amp;gt;/favicon.ico&amp;lt;/condition&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC21"&gt;		&amp;lt;from&amp;gt;^(.*)$&amp;lt;/from&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC22"&gt;		&amp;lt;to last=&amp;quot;true&amp;quot;&amp;gt;/rewrite.cfm?&amp;#92;$pathinfo=$1&amp;amp;amp;%{query-string}&amp;lt;/to&amp;gt;&lt;/div&gt;&lt;div class="line" id="LC23"&gt;	&amp;lt;/rule&amp;gt; &lt;/div&gt;&lt;div class="line" id="LC24"&gt;&amp;lt;/urlrewrite&amp;gt;         &lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
  &lt;/div&gt;

&lt;h2&gt;CFWheels&lt;/h2&gt;

&lt;p&gt;The last piece of the puzzle &amp;hellip; the framework itself. There are two (easy) steps to making URL rewrites happen in Wheels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tell Wheels to turn on URLRewriting&lt;/li&gt;
&lt;li&gt;Add a piece of code to events/onrequeststart.cfm for populating the path info**&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The first step is super-duper easy. Just add the following line in your config/settings.cfm file:&lt;/p&gt;

&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;set(URLRewriting=&amp;quot;On&amp;quot;)&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The second step is also easy. Add the following to events/onrequeststart.cfm:&lt;/p&gt;

&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;if(structKeyExists(url,&amp;quot;$pathinfo&amp;quot;)){
    request.cgi.path_info = url.$pathinfo
}&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;**EDIT: Many thanks to Tony Petruzzi for pointing out this far more elegant solution.&lt;/p&gt;

&lt;p&gt;That&amp;rsquo;s it. From here, restart your CFML server and you&amp;rsquo;re ready to roll. To see my SES URLs in action, head to &lt;a rel="nofollow" target="_blank" href="http://www.ourayclimbing.com"&gt;Ouray Climbing&lt;/a&gt; and start clicking some links!&lt;/p&gt;

&lt;p&gt;P.S. I did write this post rather quickly, so let me know if you spot any errors or have any issues trying the same thing.&lt;/p&gt;
	


&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://craigkaminsky.me/cfwheels-and-ses-urls"&gt;Permalink&lt;/a&gt; 

	| &lt;a rel="nofollow" target="_blank" href="http://craigkaminsky.me/cfwheels-and-ses-urls#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/aPFT32xLAto" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://craigkaminsky.me/cfwheels-and-ses-urls</guid>
         <pubDate>Mon, 19 Sep 2011 18:11:00 +0000</pubDate>
      </item>
      <item>
         <title>cfWheels - Active Directory / LDAP authentication</title>
         <link>http://www.oxalto.co.uk/blog/post.cfm/cfwheels-active-directory-ldap-authentication</link>
         <description>&lt;p&gt;Adding login and administrative features to your cfWheels apps has cropped up on the mailing list a few times, so I thought I'd just pull together a simple example for Active Directory / LDAP authentication.&lt;/p&gt;
&lt;p&gt;In this particular snippet, I want to establish a user a) has credentials on the server, and b) belongs to a group called 'ContactsDatabaseUsers'.&lt;/p&gt;
&lt;p&gt;This method has the benefit of a) not having to store user's passwords in your application database and b) allowing system administrators to control access to the application.&lt;/p&gt;
&lt;p&gt;This example assumes you have a login form at /main/login/ which posts params.username and params.password to /main/dologin/&lt;/p&gt;
&lt;p&gt;I also would have a local users model where I could add additional application specific options: i.e, when they last logged in, etc. &lt;/p&gt;
&lt;p&gt;This information would then be copied to the session scope. ie. session.currentuser&lt;/p&gt;
&lt;p&gt;When the users first login, this local entry needs to be created, or copied to the session scope from the existing entry.&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/th4Rbkg2Okg" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://www.oxalto.co.uk/blog/post.cfm/cfwheels-active-directory-ldap-authentication</guid>
         <pubDate>Sun, 18 Sep 2011 14:13:21 +0000</pubDate>
      </item>
      <item>
         <title>Bar Camp Omaha 2011 – Open Source CFML</title>
         <link>http://www.henke.ws/post.cfm/bar-camp-omaha-2011-open-source-cfml</link>
         <description>&lt;p&gt;I did a quick 30 minute presentation over CFML open source options at &lt;a rel="nofollow" target="_blank" href="http://www.barcampomaha.org/"&gt;Barcamp Omaha&lt;/a&gt;. I wasn't going to present this BarCamp but Ryan Stille egged me on so I had to run home to get my laptop :-) Thanks to Mathew Woodward for getting me &lt;a rel="nofollow" target="_blank" href="http://t.co/xMjHxpk"&gt;slides from a previous presentation&lt;/a&gt; he gave. I was all over the place but tried to focus on how if you know HTML, you can code CFML using the tag syntax. Questions from the attendants had me discuss CFWheels, Eclipse, CFEclipse, CFBuilder, Adobe, Hibernate, PDF/Excel generation, war deployment, etc.&lt;/p&gt;
&lt;p&gt;Here are the links from a text file shown during the presentation:&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="https://github.com/mhenke/CFML-in-100-minutes/blob/develop/cfml100mins.markdown"&gt;CFML in 100 minutes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ColdFusion Markup Language (CFML) is a web programming language, which is especially suited for new developers as it was written to make a programmer's job easy and not care if the computer's job is hard. In this brief introduction we'll look at key language features you need to get started.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.meetup.com/coldfusionmeetup/events/10155442/"&gt;"Running Multiple CFML Engines on Apache Tomcat", with Matt &amp;#8230;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Apr 9, 2009 &amp;#8211; "Running Multiple CFML Engines on Apache Tomcat", with Matt Woodward. Thursday, April 16 &amp;#8230; Online meeting via Adobe Connect. Meeting &amp;#8230;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://blog.mattwoodward.com/installing-and-configuring-apache-22-tomcat-6"&gt;Installing and Configuring Apache 2.2, Tomcat 6.0, and Open &amp;#8230;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Apr 5, 2009 &amp;#8211; Installing and Configuring Apache 2.2, Tomcat 6.0, and Open &amp;#8230; Apache 2.2, Tomcat 6.0, and Open BlueDragon on a Windows 2003 Server, I figured &amp;#8230; Not sure that's the greatest idea, but that's the way it seems to be on the Mac&amp;#8230; makes no difference since we'll be pointing Tomcat directly to Java anyway&amp;#8230;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://experts.na3.acrobat.com/p38155839/"&gt;CFMeetup: Living in the Cloud: CFML Apps on Google App Engine&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2010-05-20 &amp;#8211; If you want to take advantage of the power of cloud computing but want to focus on applications instead of server infrastructure, you owe it to yourself to check out Google App Engine. Google App Engine lets you deploy applications to Google's infrastructure with the push of a button, and the best part is that for many applications it's entirely free of cost. In this presentation we'll discuss both the benefits and downsides of living in the cloud, outline how Google App Engine differs from other cloud sol&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;table&gt;&lt;tr&gt;&lt;td style="vertical-align:top;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/RdcykPH6LPM" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://www.henke.ws/post.cfm/bar-camp-omaha-2011-open-source-cfml</guid>
         <pubDate>Sat, 10 Sep 2011 20:22:41 +0000</pubDate>
      </item>
      <item>
         <title>ColdFusion discussed on Rails Engine Yard podcast</title>
         <link>http://www.henke.ws/post.cfm/coldfusion-discussed-on-engine-yard-podcast</link>
         <description>&lt;p&gt;I enjoy listening to &lt;a rel="nofollow" target="_blank" href="http://www.halhelms.com/"&gt;Hal Helms&lt;/a&gt; and he recently was on an &lt;a rel="nofollow" target="_blank" href="http://www.engineyard.com/"&gt;Engine Yard&lt;/a&gt; podcast, &lt;a rel="nofollow" target="_blank" href="http://www.engineyard.com/podcasts"&gt;Cloud Out Loud&lt;/a&gt;. He brings a thought provoking perspective to discussions. He learned a new skillset, &lt;a rel="nofollow" target="_blank" href="http://rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt;, after being a long time &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/ColdFusion"&gt;ColdFusion&lt;/a&gt; programmer. &lt;a rel="nofollow" target="_blank" href="http://www.engineyard.com/podcast/s01e37-hal-helms"&gt;The podcast is definately worth listening to&lt;/a&gt; and is just over 15 minutes. I wish he would have mentioned ColdFusion is not only &lt;a rel="nofollow" target="_blank" href="http://www.adobe.com/products/coldfusion-family.html"&gt;Adobe&lt;/a&gt; but does have open source options like &lt;a rel="nofollow" target="_blank" href="http://www.getrailo.com/"&gt;Railo&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://www.openbluedragon.org/"&gt;OpenBD&lt;/a&gt; during the open source discussion. The ACF long release cycle is a thought provoking point compared to quick release cylce software especially these days when technology advances and changes so fast. Also a mention of &lt;a rel="nofollow" target="_blank" href="http://www.cfwheels.org"&gt;ColdFusion on Wheels&lt;/a&gt;, a framework based on Rails, would have been awesome.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Podcast Information&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.engineyard.com/podcast/s01e37-hal-helms"&gt;S01E37: Hal Helms&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Published: August 26, 2011&lt;/p&gt;
&lt;p&gt;Summary: Hal Helms discusses his Cold Fusion background and his interest in Ruby and Rails.&lt;/p&gt;&lt;table&gt;&lt;tr&gt;&lt;td style="vertical-align:top;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/jr3f5lHiqbQ" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://www.henke.ws/post.cfm/coldfusion-discussed-on-engine-yard-podcast</guid>
         <pubDate>Tue, 06 Sep 2011 13:00:00 +0000</pubDate>
      </item>
      <item>
         <title>CFWheels 1 day Workshop in Melbourne</title>
         <link>http://www.henke.ws/post.cfm/cfwheels-1-day-workshop-in-melbourne</link>
         <description>&lt;p&gt;A one day &lt;a rel="nofollow" target="_blank" href="http://www.cfwheels.org"&gt;ColdFusion On Wheels&lt;/a&gt; intensive workshop will be held November 16th in Melbourne, Australia. It will consolidate the 2 day training held before &lt;a rel="nofollow" target="_blank" href="http://www.cfobjective.com/"&gt;CF.Objective&lt;/a&gt; this past year. You can find all the training details at the &lt;a rel="nofollow" target="_blank" href="http://www.cfobjective.com.au/program/workshops/"&gt;cf.Objective(ANZ) website&lt;/a&gt; with &lt;a rel="nofollow" target="_blank" href="http://www.cfobjective.com.au/register"&gt;registration links&lt;/a&gt;. This 1 day workshop can be booked independently of the cf.Objective(ANZ) conference tickets &amp;#8211; you do not have to attend the conference to book and attend a workshop. If you book now you can save over 20 percent.&lt;/p&gt;
&lt;h2&gt;Introducing ColdFusion On Wheels&lt;/h2&gt;
&lt;h3&gt;Presenter: Mike Henke&lt;/h3&gt;
&lt;h3&gt;Price: AU$349 (Early Bird until the 30th of September). AU$449 (Full Price).&lt;/h3&gt;
&lt;p&gt;ColdFusion On Wheels is a powerful web application framework that has become popular in the past few years. It is relatively easy to develop with and can be used for sites like AmtrakGuestRewards.com, or larger ones like Meritbuilder.com and Singsnap.com.&lt;/p&gt;
&lt;p&gt;You'll spend the day working through a single concept by creating a simple blog system and learning the basics of ColdFusion On Wheels including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Models, Views, and Controllers&lt;/li&gt;
&lt;li&gt;Data Structures &amp;amp; Relationships&lt;/li&gt;
&lt;li&gt;Routing&lt;/li&gt;
&lt;li&gt;Migrations&lt;/li&gt;
&lt;li&gt;Views with forms, partials, and helpers&lt;/li&gt;
&lt;li&gt;RESTful design&lt;/li&gt;
&lt;li&gt;Using Wheels plugins&lt;/li&gt;
&lt;/ul&gt;&lt;table&gt;&lt;tr&gt;&lt;td style="vertical-align:top;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/LR7sP8g21eU" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://www.henke.ws/post.cfm/cfwheels-1-day-workshop-in-melbourne</guid>
         <pubDate>Mon, 05 Sep 2011 16:07:30 +0000</pubDate>
      </item>
      <item>
         <title>Don't forget nested functions in CFWheels</title>
         <link>http://www.oxalto.co.uk/blog/post.cfm/don-t-forget-nested-functions-in-cfwheels</link>
         <description>&lt;p&gt;Occasionally I forget clever little things, like using functions as argument values.&lt;/p&gt;
&lt;p&gt;Here's a small snippet which I ended up using when doing a blog front page, where I wanted to strip the tags out of the blog body, truncate it to 300 characters, and then add a 'read more' link at the end of the paragraph with an ellipsis.&lt;/p&gt;
&lt;p&gt;There's a load of nice little functions in CFWheels for this - stripTags(), truncate() and linkTo().&lt;/p&gt;
&lt;p&gt;Here's what the helper in the loop ended up as:&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/Sl7-tR2FDd0" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://www.oxalto.co.uk/blog/post.cfm/don-t-forget-nested-functions-in-cfwheels</guid>
         <pubDate>Wed, 10 Aug 2011 12:58:40 +0000</pubDate>
      </item>
      <item>
         <title>Upcoming D2WC conference and CFWheels training in July</title>
         <link>http://www.henke.ws/post.cfm/upcoming-d2w-conference-and-cfwheels-training-in-july</link>
         <description>&lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;
&lt;h2&gt;D2WC conference&lt;/h2&gt;
&lt;p&gt;Just a reminder, the &lt;a rel="nofollow" target="_blank" href="http://d2wc.com/"&gt;D2WC conference&lt;/a&gt; is coming up in a few weeks, July 14-16, in Kansas City. It is a conference focusing on &lt;strong&gt;workflow &lt;/strong&gt;for designers and developers.&lt;/p&gt;
&lt;p&gt;
&lt;img style="visibility:visible;" src="http://d2wc.com/wp-content/uploads/2011/04/21.jpg" alt=""/&gt;&lt;/p&gt;
&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;
&lt;h3&gt;Speakers&lt;/h3&gt;
&lt;p&gt;We
 have some of the best speakers in the business at D2W. Many were here 
last year as well, like Paul Trani and Doug Winnie from Adobe. This year
 Seb Lee-Delisle is doing a 2-Day Hands-on Creative JS class prior to 
D2W.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" class="jcycle-button" target="_blank" href="http://d2wc.com/sessions"&gt;Sign Up&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is workflow?&lt;/strong&gt;
 Workflow is something we all do, day in and day out &amp;#8211; although you may 
not even think about it. Do you work with multiple applications during 
the day? Do you work with team members, departments, clients, etc.? Are 
you a designer who wants to learn more about code? A developer who wants
 to know more about design? Either wanting to get into the mobile world?&lt;/p&gt;
&lt;h2&gt;Introducing ColdFusion On Wheels&lt;/h2&gt;
&lt;p&gt;Another July training event is an &lt;a rel="nofollow" target="_blank" href="http://cfwheels-training.stagehq.com/events/769"&gt;Introducing ColdFusion On Wheels&lt;/a&gt; the following weeking, July 22-23, in Omaha. It is a two day course working through a single concept by creating a simple blog system, going from an idea to a finished product.&lt;/p&gt;
&lt;p&gt;The main goals of the course are learning:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Models, Views, and Controllers&lt;/li&gt;
&lt;li&gt;Data Structures &amp;amp; Relationships&lt;/li&gt;
&lt;li&gt;Routing&lt;/li&gt;
&lt;li&gt;Migrations&lt;/li&gt;
&lt;li&gt;Views with forms, partials, and helpers&lt;/li&gt;
&lt;li&gt;RESTful design&lt;/li&gt;
&lt;li&gt;Using Wheels plugins&lt;/li&gt;
&lt;/ul&gt;&lt;table&gt;&lt;tr&gt;&lt;td style="vertical-align:top;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/s6gy_wTukWo" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://www.henke.ws/post.cfm/upcoming-d2w-conference-and-cfwheels-training-in-july</guid>
         <pubDate>Tue, 05 Jul 2011 13:25:47 +0000</pubDate>
      </item>
      <item>
         <title>Password Hashing and Salting</title>
         <link>http://www.oxalto.co.uk/blog/post.cfm/password-hashing-and-salting</link>
         <description>&lt;p&gt;As I'm (hopefully) going to release my first open source project soon, I thought it would be  a good time to revisit application security, specifically password hashing, salting and general encryption. If you've not come across &lt;a rel="nofollow" target="_blank" href="http://www.12robots.com/index.cfm/2008/6/2/User-Login-with-Salted-and-Hashed-passwords--Security-Series-45"&gt;Jason Dean's blog&lt;/a&gt;, I'd recommend that as a first port of call, as most of what I'm referring to is explained there.&lt;/p&gt;
&lt;p&gt;Password security is one of those never ending journeys; you have to assume that it'll never be perfect, and that there's always room for improvement. I'd recently had an idea to improve password hashing a little, which someone might find useful in principle.&lt;/p&gt;
&lt;p&gt;Let's take a simple password, like 'myPassword1' (incidentally, if you actually have any passwords like that, please go and get lastpass or password1 immediately and wash your keyboard out with soap).&lt;/p&gt;
&lt;p&gt;'myPassword1' stored in a database in plain text is obviously a very, very bad idea. Most people's gut reaction would be to hash it, which at least is one way. &lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;But wait!, let's assume 90% of our users are stupid, or at least, uninformed. If two people have the same password, their hashes will appear identically in the password column. On top of that, if I hash the password again, I'll get exactly the same resultant string. So a hashed (unsalted) password is really not that useful. You could perform a 'rainbow table' attack: password hashes from your database can be compared against a table of known hashes (such the hash for myPassword1), et voila, password revealed.&lt;/p&gt;
&lt;p&gt;So the next step is to introduce salting: that is, appending or prepending a unique string to the password to make the resultant hash unique, and make rainbow table attacks much much harder.&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;This has the advantage that attacks require the salt to even attempt some sort of dictionary/rainbow table attack. Usually the salt is stored alongside the hashed and salted password in the database.&lt;/p&gt;
&lt;p&gt;This is the part which I think could be improved by a relatively small step. By storing the salt alongside the password in the users table, we're essentially giving a hacker the necessary ammunition to attempt to compromise the password. Let's make it a little harder. Let's encrypt the salt itself using another key, stored outside the webroot. So I might have a folder called 'auth' on the same level as my 'webroot' or 'html' folder. In there, I'm going to store a text file with a UUID inside. When I want to compare a password hash, I now have to decrypt the salt before I can use it (as I acutally need the salt value, I'm not hashing it, as that's one way) using the key read in via CFFILE outside the webroot.&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;So why do this? If your database is compromised, you at least have an additional key to the puzzle missing for the attacker: they would have to do both a compromise of the filesystem AND the database to get anywhere. Additionally, you could quickly invalidate all the passwords in your application by deleting/regenerating the 'master key' at a file system level (this also assumes you have a half decent 'forgotten/reset password' feature in your application), which could be useful is you suspect the database and file system to be compromised at any point.&lt;/p&gt;
&lt;p&gt;Whilst this is hardly comprehensive explanation, by adding additional layers and parts to the process, we'll hopefully make any attackers lives a little more difficult. Jason Dean adds another step I like &lt;a rel="nofollow" target="_blank" href="http://www.12robots.com/index.cfm/2008/5/29/Salting-and-Hashing-Code-Example--Security-Series-44"&gt;looping the hashing process over 1000 times&lt;/a&gt; - if you made this number completely arbitary between 1000 and 1500, you'd have another variable the attacker would have to get, and this one would be stored in the source code of the application itself. &lt;/p&gt;
&lt;p&gt;So assuming you added all the above measures, you'd have to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt; compromise the database (for the password hash, and the encrypted salt),&lt;/li&gt;
&lt;li&gt; the source code for the application (to get the number of hashing loops), and &lt;/li&gt;
&lt;li&gt;get the facility to navigate outside the (potentially) locked webroot (to get the master key to decrypt the encrypted salt).&lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://feeds.feedburner.com/~r/cfwheels/bloggers/~4/675jNLejgRQ" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://www.oxalto.co.uk/blog/post.cfm/password-hashing-and-salting</guid>
         <pubDate>Tue, 05 Jul 2011 10:22:28 +0000</pubDate>
      </item>
   </channel>
</rss><!-- fe1.yql.bf1.yahoo.com compressed/chunked Sat Feb  4 04:15:23 UTC 2012 -->

