<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>RSS feed for InstantSpot site Blog of Dave</title><link>http://daveshuck.instantspot.com</link><description>Dave Shuck&apos;s ramblings on - ColdFusion, Flex, and Java, and life.</description><language>en-us</language><copyright>This work is Copyright &#xA9; 2010 by Blog of Dave</copyright><generator>RSSVille ColdFusion FeedMaker, version 1.0</generator><pubDate>Sat, 13 Mar 2010 19:27:37 GMT</pubDate><item><title>How to install a Mac theme for Windows</title><link>http://daveshuck.instantspot.com/blog/2010/03/13/How-to-install-a-Mac-theme-for-Windows/</link><description>I was just delivered a new laptop from my company.  It is a smoking smoking Dell E6500 duo core processor with a sweet solid stated drive and.... Windows XP (booo!).&lt;br /&gt;&lt;br /&gt;While it is a very stable system, I can&apos;t help but have flashbacks to the early 2000&apos;s when I look at the XP windows manager.  It just looks so dated by today&apos;s standards.  After about 20 minutes I just couldn&apos;t take it any more and had to modify the look.  I came across a great looking Mac theme for XP and I have to say that overall I am pretty pleased with the look and feel now. Here is a screenshot of what it looks like now:&lt;br /&gt;&lt;br /&gt;(click for full-size)&lt;br /&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://dl.dropbox.com/u/101948/blog/entries/mac_theme_for_windows/mac_theme.png&quot;&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/mac_theme_for_windows/mac_theme_550x344.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you want your Windows XP machine to look like that, then do the following.  First you will need to run a patch utility that allows you to install non-Microsoft approved themes such as this.  Given the restrictive nature of Microsoft software, this is surprisingly easy to do.  Download the &lt;a href=&quot;http://www.softpedia.com/progDownload/UXTheme-MultiPatcher-Download-2369.html&quot;&gt;UXtheme Multi-patcher for free&lt;/a&gt; from softpedia.com.&amp;nbsp; Inside the zip file you will find a single executable file.&amp;nbsp; Run it and follow the instructions.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;When that step is complete, you have now freed yourself to be able to install any theme you like.&amp;nbsp; You can find lots of themes at places like deviantArt and&amp;nbsp; &lt;a href=&quot;http://wincustomize.com&quot;&gt;WinCustomize.com&lt;/a&gt;.&amp;nbsp; The former is where I found &lt;a href=&quot;http://-kol.deviantart.com/art/Panther-1-5-6018605&quot;&gt;the Mac Panther theme&lt;/a&gt; that we will be using.&amp;nbsp; Download that theme and unzip the contained &quot;Panther&quot; folder to C:\WINDOWS\Resources\Themes.&amp;nbsp; Once you do this, go into that folder and double-click the file &lt;b&gt;Panther.msstyles&lt;/b&gt;.&amp;nbsp; With this step, you have now installed the theme.&amp;nbsp; To finish the look though, I took a few other steps.&lt;br /&gt;&lt;br /&gt;First, I moved my start bar to the top of the screen.&amp;nbsp; If you can&apos;t drag yours, you may need to right-click on the task bar and un-check &quot;Lock the Taskbar&quot;.&amp;nbsp; After I moved it, I found that it left an undesirable border line on the bottom of the bar that I corrected by rechecking &quot;Lock the Taskbar&quot;.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;So what about that background?&amp;nbsp; I found a pretty nice looking version of that &lt;a href=&quot;http://www.linuxwallpapers.org/apple/slides/mac_wallpaper.html&quot;&gt;Mac inspired wallpaper here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And lastly, it is time to create that launcher that you see at the bottom of the screen.&amp;nbsp; RocketDock is an really clean (and free!) application launcher for windows.&amp;nbsp; &lt;a href=&quot;http://www.rocketdock.com/download&quot;&gt;Download RocketDock from here&lt;/a&gt; and install.&amp;nbsp; Customize the options as you see fit and you are done!&lt;br /&gt;&lt;br /&gt;So here is the bottom line... Is this whole idea a little bit goofy?&amp;nbsp; Perhaps.&amp;nbsp; However, it is far less goofy than a default XP theme for damn sure.&amp;nbsp; It gives it a really clean feel and I am no longer quite as bitter about having XP. :)&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; alt=&quot;&quot; src=&quot;http://img.zemanta.com/pixy.gif?x-id=45b05ca0-e455-8a89-8180-f60001451b4f&quot; /&gt;&lt;/div&gt;</description><pubDate>Sat, 13 Mar 2010 16:26:04 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2010/03/13/How-to-install-a-Mac-theme-for-Windows/</guid><category>Tips and Tricks,Windows,Technology</category></item><item><title>ColdFusion 9 bug: Change in behavior with CGI variables</title><link>http://daveshuck.instantspot.com/blog/2010/03/12/ColdFusion-9-bug-Change-in-behavior-with-CGI-variables/</link><description>&lt;p&gt;&lt;strong&gt;EDIT:&amp;nbsp; &lt;/strong&gt;&lt;em&gt;As Raymond Camden has pointed out in the comments, this is actually documented behavior, so&amp;nbsp;I would like to state that this obviously isn&apos;t a bug in ColdFusion.&amp;nbsp; However the fact remains that two developers (the only 2 out of 12+ that have upgraded to CF9) are seeing different behavior after upgrading to CF9 than the rest of the team. &amp;nbsp;Unfortunately I will be unable to test this further until 3/15 and will update this post then.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Our company has an application that leverages SiteMinder for authentication.&amp;nbsp; One of our developers, Andrew Leaf, noticed that when he installed ColdFusion 9 that he could no longer authenticate to the application.&amp;nbsp; I was using an early beta version of CF9 and had no problems, so I initially dismissed the notion that this could be a ColdFusion 9 issue.&amp;nbsp; After spending some time with Andrew as he walked through the ColdFusion Builder step debugger, we found the suspect block of code.&amp;nbsp; The application code checked to see if a CGI variable has been set using StructKeyExists() and if it does, it sets session information based on that value.&amp;nbsp; Today I set ColdFusion 9 up on new machine and am seeing the exact same behavior.&amp;nbsp; What we are seeing is that with ColdFusion 9, when you test for existence of *any* variables in the CGI scope, it always returns true.&lt;br /&gt; &lt;br /&gt; It essentially behaves in such a way that any variable name appears to be defined and paramed with a blank value in the CGI scope.&amp;nbsp; For instance:&lt;br /&gt; &lt;b&gt;&amp;lt;cfdump var=&amp;quot;#StructKeyExists(cgi,&amp;quot;someRandomString&amp;quot;)&amp;quot; /&amp;gt;&lt;/b&gt; outputs YES&lt;br /&gt; &lt;br /&gt; Likewise:&lt;br /&gt; &lt;b&gt;&amp;lt;cfdump var=&amp;quot;#cgi.someRandomString#&amp;quot; /&amp;gt;&lt;/b&gt; outputs [empty string]&lt;/p&gt;</description><pubDate>Fri, 12 Mar 2010 20:52:00 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2010/03/12/ColdFusion-9-bug-Change-in-behavior-with-CGI-variables/</guid><category>ColdFusion,Technology,CFML</category></item><item><title>Need a &quot;rock star&quot; ColdFusion speaker for 7/30/2010 event in Dallas</title><link>http://daveshuck.instantspot.com/blog/2010/03/03/Need-a-rock-star-ColdFusion-speaker-for-7302010-event-in-Dallas/</link><description>Last year was the second annual &lt;a href=&quot;http://www.dallastechfest.com&quot;&gt;Dallas TechFest&lt;/a&gt;, which is a 1-day multi-platform event centered around programming.&amp;nbsp; They approached me at that time about bringing ColdFusion into the event, and giving us a dedicated track in one of the rooms.&amp;nbsp; I made a optimistic claim that we could bring in 50+ CFML devs from the area, and low and behold, we ended up with 70+ people that registered with the discount code from &lt;a href=&quot;http://www.dfwcfug.org&quot;&gt;our user group&lt;/a&gt;.&amp;nbsp; It was very successful and had a good buzz with the local community.&amp;nbsp; Additionally, we blew the PHP and Ruby groups out of the water! :)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;For 2010, the organizers have offered a travel and expenses budget to to each track (CF being one of those) to pay for travel and expenses to get one &quot;rock star&quot; from each of the technologies. Based on last year&apos;s attendees, I would say that a large percentage were beginner-intermediate, with our regular core of advanced guys around as well.&amp;nbsp; The event will be on Friday July 30, in Addison.&amp;nbsp; Unfortunately this falls during the same week as &lt;a href=&quot;http://cfunited.com/2010/&quot;&gt;CFUnited&lt;/a&gt;, which obviously zaps a number of speakers from the pool of availability, but if you are interested in speaking, please let me know!&amp;nbsp; I am dshuck pretty much everywhere... gmail, twitter, facebook, etc.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; alt=&quot;&quot; src=&quot;http://img.zemanta.com/pixy.gif?x-id=a89de899-3fe6-8c45-8d90-066016cfdc53&quot; /&gt;&lt;/div&gt;</description><pubDate>Wed, 03 Mar 2010 17:24:55 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2010/03/03/Need-a-rock-star-ColdFusion-speaker-for-7302010-event-in-Dallas/</guid><category>ColdFusion,General,Technology,Conferences,CFML</category></item><item><title>UDF: pcase() - Captilize first letter of each word in a string</title><link>http://daveshuck.instantspot.com/blog/2010/02/25/UDF-pcase--Captilize-first-letter-of-each-word-in-a-string/</link><description>This is a UDF that I keep on hand for converting strings to &quot;proper case&quot;, such as a person&apos;s name.&amp;nbsp; For instance, in a database we might have a name stored like &lt;b&gt;DAVID B. SHUCK&lt;/b&gt;, but when they log into our site and we welcome them, we don&apos;t necessarily want to shout it at them!&amp;nbsp;&amp;nbsp; Saying &quot;Hello David B. Shuck...&quot; would hopefully be a bit less abrasive.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Enter the user-defined function pcase().&amp;nbsp; Through the use of regular expressions we are doing a search for word patterns and capitalizing the first letter in each word.&amp;nbsp; Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;cffunction name=&quot;pcase&quot; access=&quot;public&quot; output=&quot;false&quot;  returntype=&quot;string&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;cfargument name=&quot;string&quot;  type=&quot;string&quot; required=&quot;true&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;cfreturn  REReplaceNoCase(LCase(arguments.string),&quot;(^[a-z*]|[ *][a-z*])&quot;,&quot;\U\1\E&quot;,&quot;all&quot;)  /&amp;gt;&lt;br /&gt;&amp;lt;/cffunction&amp;gt;&lt;br /&gt;&lt;/code&gt;</description><pubDate>Thu, 25 Feb 2010 16:34:00 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2010/02/25/UDF-pcase--Captilize-first-letter-of-each-word-in-a-string/</guid><category>ColdFusion,Tips and Tricks,Technology,CFML,UDF</category></item><item><title>Implicit constructor and CF9 style implicit accessors without ColdFusion 9</title><link>http://daveshuck.instantspot.com/blog/2010/02/25/Implicit-constructor-and-CF9-style-implicit-accessors-without-ColdFusion-9/</link><description>One of the broadly welcomed features of ColdFusion 9 has been the addition of implicit getters and setters to CFCs.&amp;nbsp; What this means is that you no longer have to hand code the repetitive boiler plate getXXX() and setXXX() methods for each property in your model objects. However, you don&apos;t need ColdFusion 9, (or even ColdFusion for that matter) to enjoy the benefits of the new implicit accessors with the version 9 release.&amp;nbsp; Since ColdFusion 8, developers have had access to the OnMissingMethod() method which makes tasks like this very simple to implement on your own.&amp;nbsp; The OnMissingMethod is also available in current versions of OpenBlueDragon and Railo.&lt;br /&gt;&lt;br /&gt;For my implementation of this, I use a standard BaseBean class in a number of my projects which is extended by all of my model class objects.&amp;nbsp; By leveraging the OnMissingMethod() in this BaseBean, I create these implicit accessors, in addition to an implicit constructor &lt;b&gt;init()&lt;/b&gt; method as well.&lt;br /&gt;&lt;br /&gt;There are multiple examples on the internet that show how you can use OnMissingMethod(), but for the most part, the examples that I have come across do not protect the class from being having infinite previously undefined properties added to it from the outside.&amp;nbsp; For instance, I could have a class named Person.cfc with define properties of &quot;firstName&quot; and &quot;lastName&quot;, but nothing would stop someone from doing &lt;b&gt;Person.setThisIsNotAProperty(true)&lt;/b&gt; and that value would be dynamically added to the Person instance.&lt;b&gt;&amp;nbsp; &lt;/b&gt;While some might argue that the flexibility that this approach offers is a positive thing, I prefer to lock my classes down just a bit more.&amp;nbsp; For instance&lt;b&gt; &lt;/b&gt;I like the fact that I can open up a model class and see exactly what properties it can contain with clearly defined &amp;lt;cfproperty/&amp;gt; tags.&amp;nbsp;&amp;nbsp; From a maintainability standpoint the idea of &quot;mystery&quot; dynamic properties strike me as just wrong.&lt;br /&gt;&lt;br /&gt;For my implicit constructor, I take an approach where I loop through any named arguments that were passed, and if the name matches a property that I have defined with &amp;lt;cfproperty/&amp;gt;, then it will be passed to a setter method.&amp;nbsp; Any arguments that are passed that are not defined as a property are discarded.&lt;br /&gt;&lt;br /&gt;So let&apos;s take a look at what this looks like.&amp;nbsp; First I will paste the entire BaseBean, and below we will break it apart to discuss what is going on.&lt;br /&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;&amp;lt;cfcomponent output=&amp;quot;false&amp;quot;&amp;gt;       &amp;lt;cffunction name=&amp;quot;init&amp;quot; access=&amp;quot;public&amp;quot; output=&amp;quot;false&amp;quot; returntype=&amp;quot;BaseBean&amp;quot;&amp;gt;   &amp;lt;cfset var i = &amp;quot;&amp;quot; /&amp;gt;   &amp;lt;cfset initializePropertyList() /&amp;gt;   &amp;lt;cfloop list=&amp;quot;#this.propertyList#&amp;quot; index=&amp;quot;i&amp;quot;&amp;gt;    &amp;lt;cfif StructKeyExists(arguments,i)&amp;gt;     &amp;lt;cfset set(i,arguments[i]) /&amp;gt;    &amp;lt;/cfif&amp;gt;   &amp;lt;/cfloop&amp;gt;     &amp;lt;cfreturn this /&amp;gt;  &amp;lt;/cffunction&amp;gt;      &amp;lt;cffunction name=&amp;quot;initializePropertyList&amp;quot; access=&amp;quot;private&amp;quot; output=&amp;quot;false&amp;quot; returntype=&amp;quot;void&amp;quot;&amp;gt;   &amp;lt;cfset var i = &amp;quot;&amp;quot; /&amp;gt;   &amp;lt;cfif NOT StructKeyExists(this,&amp;quot;propertyList&amp;quot;)&amp;gt;    &amp;lt;cfset this.propertyList = &amp;quot;&amp;quot; /&amp;gt;    &amp;lt;cfif ArrayLen(GetMetadata(this).properties)&amp;gt;     &amp;lt;cfloop from=&amp;quot;1&amp;quot; to=&amp;quot;#ArrayLen(GetMetadata(this).properties)#&amp;quot; index=&amp;quot;i&amp;quot;&amp;gt;      &amp;lt;cfset this.propertyList = ListAppend(this.propertyList,GetMetadata(this).properties[i].name)&amp;gt;     &amp;lt;/cfloop&amp;gt;    &amp;lt;/cfif&amp;gt;   &amp;lt;/cfif&amp;gt;     &amp;lt;cfreturn /&amp;gt;   &amp;lt;/cffunction&amp;gt;      &amp;lt;cffunction name=&amp;quot;onMissingMethod&amp;quot; access=&amp;quot;public&amp;quot; output=&amp;quot;false&amp;quot; returntype=&amp;quot;any&amp;quot;&amp;gt;   &amp;lt;cfargument name=&amp;quot;missingMethodName&amp;quot; type=&amp;quot;string&amp;quot; required=&amp;quot;true&amp;quot; /&amp;gt;   &amp;lt;cfargument name=&amp;quot;missingMethodArguments&amp;quot; type=&amp;quot;struct&amp;quot; required=&amp;quot;true&amp;quot; /&amp;gt;      &amp;lt;cfset var property = &amp;quot;&amp;quot; /&amp;gt;            &amp;lt;cfif ReFindNoCase(&amp;quot;^[gs](et)&amp;quot;,arguments.missingMethodName)&amp;gt;    &amp;lt;cfset property = ReReplaceNoCase(arguments.missingMethodName,&amp;quot;^[gs](et)&amp;quot;,&amp;quot;&amp;quot;) /&amp;gt;    &amp;lt;cfset initializePropertyList() /&amp;gt;     &amp;lt;cfif ListFindNoCase(this.propertyList,property)&amp;gt;     &amp;lt;cfif StructIsEmpty(arguments.missingMethodArguments)&amp;gt;      &amp;lt;cfreturn get(property) /&amp;gt;     &amp;lt;cfelse&amp;gt;      &amp;lt;cfset set(property,arguments.missingMethodArguments[1]) /&amp;gt;      &amp;lt;cfreturn this /&amp;gt;     &amp;lt;/cfif&amp;gt;     &amp;lt;cfelse&amp;gt;     &amp;lt;cfthrow message=&amp;quot;The class #GetMetadata(this).name# does not have a property named #property# so the implicit #arguments.missingMethodName#() method is not available.&amp;quot; /&amp;gt;      &amp;lt;/cfif&amp;gt;    &amp;lt;/cfif&amp;gt;    &amp;lt;cfreturn /&amp;gt;   &amp;lt;/cffunction&amp;gt;    &amp;lt;cffunction name=&amp;quot;get&amp;quot; access=&amp;quot;public&amp;quot; output=&amp;quot;false&amp;quot; returntype=&amp;quot;any&amp;quot;&amp;gt;   &amp;lt;cfargument name=&amp;quot;property&amp;quot; type=&amp;quot;string&amp;quot; required=&amp;quot;true&amp;quot; /&amp;gt;   &amp;lt;cfset var value = &amp;quot;&amp;quot; /&amp;gt;        &amp;lt;cfset value = variables[arguments.property] /&amp;gt;       &amp;lt;cfreturn value /&amp;gt;   &amp;lt;/cffunction&amp;gt;    &amp;lt;cffunction name=&amp;quot;set&amp;quot; access=&amp;quot;public&amp;quot; output=&amp;quot;false&amp;quot; returntype=&amp;quot;void&amp;quot;&amp;gt;   &amp;lt;cfargument name=&amp;quot;property&amp;quot; type=&amp;quot;string&amp;quot; required=&amp;quot;true&amp;quot; /&amp;gt;   &amp;lt;cfargument name=&amp;quot;value&amp;quot; type=&amp;quot;any&amp;quot; required=&amp;quot;true&amp;quot; /&amp;gt;      &amp;lt;cfset variables[arguments.property] = arguments.value /&amp;gt;      &amp;lt;cfreturn /&amp;gt;  &amp;lt;/cffunction&amp;gt;   &amp;lt;/cfcomponent&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Before we walk through the actual flow, I would like to point out the method &lt;b&gt;initializePropertyList()&lt;/b&gt; that you see here:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;&amp;lt;cffunction name=&amp;quot;initializePropertyList&amp;quot; access=&amp;quot;private&amp;quot; output=&amp;quot;false&amp;quot; returntype=&amp;quot;void&amp;quot;&amp;gt;  &amp;lt;cfset var i = &amp;quot;&amp;quot; /&amp;gt;  &amp;lt;cfif NOT StructKeyExists(this,&amp;quot;propertyList&amp;quot;)&amp;gt;   &amp;lt;cfset this.propertyList = &amp;quot;&amp;quot; /&amp;gt;   &amp;lt;cfif ArrayLen(GetMetadata(this).properties)&amp;gt;    &amp;lt;cfloop from=&amp;quot;1&amp;quot; to=&amp;quot;#ArrayLen(GetMetadata(this).properties)#&amp;quot; index=&amp;quot;i&amp;quot;&amp;gt;     &amp;lt;cfset this.propertyList = ListAppend(this.propertyList,GetMetadata(this).properties[i].name)&amp;gt;    &amp;lt;/cfloop&amp;gt;   &amp;lt;/cfif&amp;gt;  &amp;lt;/cfif&amp;gt;    &amp;lt;cfreturn /&amp;gt;  &amp;lt;/cffunction&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;By using the GetMetadata() function, we are able to introspect our instance and create a list of property names which we can reference in our other methods.&amp;nbsp; This is what enables us to enforce the rules that I described above in which we make sure that a property exists before setting it in the constructor or through an implicit accessor.&amp;nbsp; You will see in both the &lt;b&gt;init() &lt;/b&gt;and &lt;b&gt;OnMissingMethod()&lt;/b&gt; methods that we call this method to ensure the list of properties is available before testing against it.&lt;br /&gt;&lt;br /&gt;With that established, let&apos;s take a look at the &lt;b&gt;init()&lt;/b&gt; constructor method:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;&amp;lt;cffunction name=&amp;quot;init&amp;quot; access=&amp;quot;public&amp;quot; output=&amp;quot;false&amp;quot; returntype=&amp;quot;BaseBean&amp;quot;&amp;gt;  &amp;lt;cfset var i = &amp;quot;&amp;quot; /&amp;gt;  &amp;lt;cfset initializePropertyList() /&amp;gt;  &amp;lt;cfloop list=&amp;quot;#this.propertyList#&amp;quot; index=&amp;quot;i&amp;quot;&amp;gt;   &amp;lt;cfif StructKeyExists(arguments,i)&amp;gt;    &amp;lt;cfset set(i,arguments[i]) /&amp;gt;   &amp;lt;/cfif&amp;gt;  &amp;lt;/cfloop&amp;gt;    &amp;lt;cfreturn this /&amp;gt; &amp;lt;/cffunction&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;After making sure that our propertyList has been initialized, we loop through that list and if there is a matching named argument, we call the &lt;b&gt;set()&lt;/b&gt; method which sets that value into the variables scope.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;&lt;br /&gt;So with the object initialized, let&apos;s take a look at our accessors.&amp;nbsp; For our example, let&apos;s say that we have a &lt;b&gt;Person&lt;/b&gt; object and we are doing to set our &lt;b&gt;firstName&lt;/b&gt; property like this: &lt;b&gt;person.setFirstName(&quot;Dave&quot;)&lt;/b&gt;.&amp;nbsp; Since that setter method doesn&apos;t exist in our Person class, the OnMissingMethod() below will be invoked.&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;&amp;lt;cffunction name=&amp;quot;onMissingMethod&amp;quot; access=&amp;quot;public&amp;quot; output=&amp;quot;false&amp;quot; returntype=&amp;quot;any&amp;quot;&amp;gt;  &amp;lt;cfargument name=&amp;quot;missingMethodName&amp;quot; type=&amp;quot;string&amp;quot; required=&amp;quot;true&amp;quot; /&amp;gt;  &amp;lt;cfargument name=&amp;quot;missingMethodArguments&amp;quot; type=&amp;quot;struct&amp;quot; required=&amp;quot;true&amp;quot; /&amp;gt;    &amp;lt;cfset var property = &amp;quot;&amp;quot; /&amp;gt;          &amp;lt;cfif ReFindNoCase(&amp;quot;^[gs](et)&amp;quot;,arguments.missingMethodName)&amp;gt;   &amp;lt;cfset property = ReReplaceNoCase(arguments.missingMethodName,&amp;quot;^[gs](et)&amp;quot;,&amp;quot;&amp;quot;) /&amp;gt;   &amp;lt;cfset initializePropertyList() /&amp;gt;    &amp;lt;cfif ListFindNoCase(this.propertyList,property)&amp;gt;    &amp;lt;cfif StructIsEmpty(arguments.missingMethodArguments)&amp;gt;     &amp;lt;cfreturn get(property) /&amp;gt;    &amp;lt;cfelse&amp;gt;     &amp;lt;cfset set(property,arguments.missingMethodArguments[1]) /&amp;gt;     &amp;lt;cfreturn this /&amp;gt;    &amp;lt;/cfif&amp;gt;    &amp;lt;cfelse&amp;gt;    &amp;lt;cfthrow message=&amp;quot;The class #GetMetadata(this).name# does not have a property named #property# so the implicit #arguments.missingMethodName#() method is not available.&amp;quot; /&amp;gt;     &amp;lt;/cfif&amp;gt;   &amp;lt;/cfif&amp;gt;   &amp;lt;cfreturn /&amp;gt;  &amp;lt;/cffunction&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;We are then doing a regular expression test to see if the missing method names starts with either &quot;get&quot; or &quot;set&quot;.&amp;nbsp; If so, we derive the name of the target property by stripping the &quot;get&quot; or &quot;set&quot; off of the string.&amp;nbsp; After making sure that our propertyList has been defined, we then look in that list to see if the target property actually exists in the instance.&amp;nbsp; If it does, the request is then routed on to either the getter or the setter depending on whether arguments were passed to it.&amp;nbsp; Otherwise an exception will be thrown to let the developer know that he or she has attempted to access an undefined property.&lt;br /&gt;&lt;br /&gt;One thing you might notice is that when our conditional block routes the request to the setter, we return an instance of the class itself.&amp;nbsp; This allows us to do method chaining like this:&amp;nbsp; &lt;b&gt;person.setFirstName(&quot;Dave&quot;).setLastName(&quot;Shuck&quot;)&lt;/b&gt;.&amp;nbsp; it should be noted that this is not the approach that Adobe took with ColdFusion 9.&lt;br /&gt;&lt;br /&gt;So let&apos;s take a look at it in action.&amp;nbsp; Here is our Person.cfc class.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;&amp;lt;cfcomponent output=&amp;quot;false&amp;quot; extends=&amp;quot;BaseBean&amp;quot;&amp;gt;    &amp;lt;cfproperty name=&amp;quot;id&amp;quot; type=&amp;quot;string&amp;quot; /&amp;gt;  &amp;lt;cfproperty name=&amp;quot;firstName&amp;quot; type=&amp;quot;string&amp;quot; /&amp;gt;  &amp;lt;cfproperty name=&amp;quot;lastName&amp;quot; type=&amp;quot;string&amp;quot; /&amp;gt;   &amp;lt;/cfcomponent&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;As you can see in the &amp;lt;cfcomponent/&amp;gt; tag, we are extending our BaseBean which is all that we need to have a workable domain class object. &lt;br /&gt;&lt;br /&gt;When we put this together and access it in our code, we can do this:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;&amp;lt;cfset person = CreateObject(&amp;quot;component&amp;quot;,&amp;quot;Person&amp;quot;).init(id=7,firstName=&amp;quot;Dave&amp;quot;, lastName=&amp;quot;Shuck&amp;quot;) /&amp;gt;  &amp;lt;cfdump var=&amp;quot;#person#&amp;quot; /&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/100225/implicit-accessors/person_dump_1.png&quot; /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;&lt;br /&gt;Once we have an instance, we can modify those properties like so:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;&amp;lt;cfset person.setId(8).setFirstName(&amp;quot;Johnny&amp;quot;).setLastName(&amp;quot;Rotten&amp;quot;) /&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/100225/implicit-accessors/person_dump_2.png&quot; /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;&lt;br /&gt;I have not actually tested this on Railo, but I can confirm that it works in OpenBlueDragon (including GAE version), and ColdFusion versions 8 and 9.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; alt=&quot;&quot; src=&quot;http://img.zemanta.com/pixy.gif?x-id=2c92c98f-15c9-815f-9118-37ac4f41aacc&quot; /&gt;&lt;/div&gt;</description><pubDate>Thu, 25 Feb 2010 11:56:00 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2010/02/25/Implicit-constructor-and-CF9-style-implicit-accessors-without-ColdFusion-9/</guid><category>ColdFusion,Tips and Tricks,Technology,CFML</category></item><item><title>Link to the HFDP 4 CF Connect recordings</title><link>http://daveshuck.instantspot.com/blog/2010/02/09/Link-to-the-HFDP-4-CF-Connect-recordings/</link><description>I have been asked more times than I would like to admit to put together a list of the meeting recordings that we have archived for our &quot;Head First Design Patterns for ColdFusion Developers&quot; series that the &lt;a href=&quot;http://dfwcfug.instantspot.com&quot;&gt;DFWCFUG&lt;/a&gt; has been doing since September of last year.&amp;nbsp; I will be appending to that entry in the next couple of months as we near the end, so you may want to bookmark it for future reference if you are interested in following.&lt;br /&gt;&lt;br /&gt;The entire archive &lt;a href=&quot;http://www.dfwcfug.org/blog/2010/02/09/Recording-list-for-Head-First-Design-Patterns-for-CFML-presentations&quot;&gt;can be found here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; alt=&quot;&quot; src=&quot;http://img.zemanta.com/pixy.gif?x-id=3c151189-0ee2-8354-b84e-67e00f57cc10&quot; /&gt;&lt;/div&gt;</description><pubDate>Wed, 10 Feb 2010 03:00:15 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2010/02/09/Link-to-the-HFDP-4-CF-Connect-recordings/</guid><category>ColdFusion,Technology</category></item><item><title>First Run in my Vibram Five Fingers KSOs</title><link>http://daveshuck.instantspot.com/blog/2009/12/26/First-Run-in-my-Vibram-Five-Fingers-KSOs/</link><description>&lt;a href=&quot;http://dl.dropbox.com/u/101948/blog/vibram/vibram_1024.png&quot;&gt;&lt;img alt=&quot;Vibram Five Finger KSOs on the sidewalk&quot; title=&quot;Vibram Five Finger KSOs on the sidewalk&quot; style=&quot;max-width: 800px; float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/vibram/vibram_300.png&quot; /&gt;&lt;/a&gt;I just got back from my first run in my new Vibram Five Fingers KSOs that I got for Christmas.&amp;nbsp; To call them a minimalist running shoe would be an understatement.&amp;nbsp; They are essentially a rubber sole strapped to your foot by way of neoprene, nylon, and velcro.&amp;nbsp; I was first kind of intrigued on the theory of them after seeing &lt;a href=&quot;http://www.wired.com/video/hot-summer-gear-vibram-fivefingers/29013939001&quot;&gt;this review on wired.com&lt;/a&gt; over the summer.&amp;nbsp; In fact, if you don&apos;t know anything about the Vibram Five Fingers, go watch that 2 minute video to see where I am coming from.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;As that video explains, traditional running shoes encourage us to run in a pattern that our bodies weren&apos;t designed for.&amp;nbsp; The big heals typically cause us to follow a heal-to-toe pattern where the heal - and subsequently your leg - end up taking the shock of each step.&amp;nbsp; Barefoot runners do not run like this, but instead land more on the ball of the foot, allowing the foot and leg to work together to become a shock absorber.&amp;nbsp; A lot of studies suggest that the latter approach leads to less of the common injuries associated with running, such as shin splints, calf strain, and plantar fasciitis.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Over the summer, I began developing a calf strain injury that I simply couldn&apos;t shake.&amp;nbsp; It started when one day I was feeling great and decided to tack on 2 miles to my regular run.&amp;nbsp; From that day on, my legs absolutely lit up with pain when I would try to run.&amp;nbsp; Eventually I just took a month off of running an began easing myself back in following the &lt;a href=&quot;http://www.coolrunning.com/engine/2/2_3/181.shtml&quot;&gt;Couch To 5K running program&lt;/a&gt;, building up to a longer run.&amp;nbsp; While that approach has worked, I still feel a constant tinge in my left leg when I run where I feel like I am almost on the verge of hurting it again. &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://dl.dropbox.com/u/101948/blog/vibram/vibram_snow-1024.png&quot;&gt;&lt;img style=&quot;max-width: 800px; float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/vibram/vibram_snow-300.png&quot; /&gt;&lt;/a&gt;The more that I read about the Vibram Five Fingers and the more reviews that I read from people that have used them, I wondered if they might actually offer me a solution for not only avoiding injury, but getting stronger, and running more like I was designed to run from the beginning!&lt;br /&gt;&lt;br /&gt;For Christmas, after hearing me talk about them again and again, my wife surprised me with a pair of the black KSOs (Keep Stuff Out), which are an improvement on the original design in that they come a bit higher on the foot to keep dirt and stuff out from the foot.&amp;nbsp; And today ( December 26th ) I went for my first run.&lt;br /&gt;&lt;br /&gt;I was a little bit apprehensive to be honest.&amp;nbsp; I had heard a number of people say that it works your legs in a different fashion - most notably your calves - so start by doing shorter runs and working your way up to longer runs over time.&amp;nbsp; I have had such great results with the Couch To 5K program, both with my introduction into running, and in my calf strain recovery, that I decided to invoke it yet again and start with Week 1 of the program.&amp;nbsp; This is essentially 9 sets of 60 second run/90 second walk.&amp;nbsp; Given my running speed that equates to a little less than a mile of actually running, and in hindsight, I feel that I could have definitely pushed a lot harder than that.&lt;br /&gt;&lt;br /&gt;It was such a cool experience!&amp;nbsp; I absolutely loved everything about it.&amp;nbsp; On one hand, I could feel little things - even the cracks in the sidewalk - but not so much that it created pain or was any kind of interference.&amp;nbsp; It just made me feel more in tune with my scene.&amp;nbsp; I found that I had to take slightly shorter steps in an effort to make my foot land where I needed it to, but it became natural in mere moments.&amp;nbsp; On the 1 mile track that I run there are a couple of steep hills and I found myself digging in on these hills to tackle them rather than feeling dread as I saw them approaching.&amp;nbsp; There is something about the whole experience that felt very liberating, and gave me almost a primal, tribal pleasure as I kept thinking about the fact that this is how man has run for millenia!&lt;br /&gt;&lt;br /&gt;Aside from the mental feeling, I got finished and realized that not a single thought went to my legs.&amp;nbsp; Over the past 6 months or so, they haven&apos;t been far from the front of my mind when I ran as I kept wondering when I was going to push them too far and tweak them again.&amp;nbsp; I got home and felt completely exhilarated.&amp;nbsp; My legs feel great, and I am looking forward to my next run!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; alt=&quot;&quot; src=&quot;http://img.zemanta.com/pixy.gif?x-id=f74140b9-e58f-8acf-8be4-efa6e5902ada&quot; /&gt;&lt;/div&gt;</description><pubDate>Sat, 26 Dec 2009 22:35:00 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2009/12/26/First-Run-in-my-Vibram-Five-Fingers-KSOs/</guid><category>General,Health,Running</category></item><item><title>Remaking Prodigy&apos;s Smack My B**** Up using Ableton</title><link>http://daveshuck.instantspot.com/blog/2009/12/17/Remaking-Prodigys-Smack-My-B-Up-using-Ableton/</link><description>Very cool video showing a producer named &lt;span class=&quot;description&quot;&gt;Jim Pavloff re-creating this Prodigy classic using Ableton music production software, bringing in the samples one at a time and modifying them eventually building the entire track.&amp;nbsp;&amp;nbsp; I need me some Ableton! .... and some talent. :(&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class=&quot;youtube-video&quot;&gt;&lt;object height=&quot;355&quot; width=&quot;425&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/eU5Dn-WaElI&amp;amp;feature=youtube_gdata&quot;&gt; &lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt; &lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/eU5Dn-WaElI&amp;amp;feature=youtube_gdata&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; height=&quot;355&quot; width=&quot;425&quot;&gt; &lt;/embed&gt;  &lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Making Prodigy&apos;s &quot;Smack My Bitch Up&quot; in Ableton by Jim Pavloff&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; alt=&quot;&quot; src=&quot;http://img.zemanta.com/pixy.gif?x-id=0bf7e9e0-0a1d-8a84-a9d8-16e5fd83a3bc&quot; /&gt;&lt;/div&gt;</description><pubDate>Thu, 17 Dec 2009 12:53:23 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2009/12/17/Remaking-Prodigys-Smack-My-B-Up-using-Ableton/</guid><category>Technology,Music</category></item><item><title>Naked Domains in Google App Engine with GoDaddy</title><link>http://daveshuck.instantspot.com/blog/2009/12/16/Naked-Domains-in-Google-App-Engine-with-GoDaddy/</link><description>I recently set up a new site (&lt;a href=&quot;http://www.hikethecanyon.org&quot;&gt;hikethecanyon.org&lt;/a&gt;) on the &lt;a href=&quot;http://appengine.google.com/&quot;&gt;Google App Engine&lt;/a&gt; running &lt;a href=&quot;http://www.openbluedragon.org&quot;&gt;OpenBlueDragon&lt;/a&gt;.&amp;nbsp; By default when you set up a new site on GAE (Google App Engine), you choose an ID for your application, which must be unique on their system as it also serves as the hostname of the URL like this: http://[your ID].appspot.com.&amp;nbsp;&amp;nbsp; For those that would like to use a different domain name, Google App Engine has mechanisms for doing so.&amp;nbsp; In the administration panel of your application, you can add a domain and then choose hostnames from that domain that the application should respond to.&amp;nbsp; However, it makes no provisions for serving the &quot;naked domain&quot;.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;What does this mean?&amp;nbsp; For my example of hikethecanyon.org, I originally set the site up with an id of &lt;b&gt;hikethecanyon-org &lt;/b&gt;which was initially served as &lt;b&gt;http://hikethecanyon-org.appspot.com&lt;/b&gt;.&amp;nbsp; After adding the domain hikethecanyon.org, I was able to add the host &quot;www&quot; so that it would respond to &lt;b&gt;http://www.hikethecanyon.org&lt;/b&gt;.&amp;nbsp; However, since GAE doesn&apos;t support naked domains, I was unable to set it up to respond to &lt;b&gt;http://hikethecanyon.org&lt;/b&gt;.&amp;nbsp; I was able find a workaround using GoDaddy&apos;s domain forwarding functionality.&amp;nbsp; While walking fellow CFML developer &lt;a href=&quot;http://blog.kukiel.net/&quot;&gt;Paul Kukiel&lt;/a&gt; through the process today, he mentioned that someone should blog this, so here it is with screenshots along the way &lt;i&gt;(edit - it appears that he decided to blog it himself as well!)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;For my example, I am going to use a domain I have had sitting around doing nothing for a few years (j4n.org) and walk through the process with some screenshots and explanations along the way.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;First, you need to create your application in the GAE dashboard and deploy your application.&amp;nbsp; Many people have covered this topic in our community including Paul Kukiel and &lt;a href=&quot;http://www.aaronjlynch.com&quot;&gt;Aaron Lynch&lt;/a&gt;, so I will skip to the next step and assume that you have a running application on Google App Engine. As you can see below, I have set up an app with an ID of &lt;b&gt;j4n-org&lt;/b&gt; that is answering on &lt;b&gt;http://j4n-org.appspot.com&lt;/b&gt; which is just running a Mach-II skeleton application.&lt;br /&gt;&lt;div align=&quot;left&quot;&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/naked_domains_gae/mach_ii_skeleton.png&quot; height=&quot;514&quot; width=&quot;600&quot; /&gt;&lt;br /&gt;&lt;br /&gt;The next thing that we want to do is add the &lt;b&gt;j4n.org&lt;/b&gt; domain to this application.&amp;nbsp; When you go into the GAE dashboard, you will see that option under the &quot;Application Settings&quot; section labeled &quot;Domain Setup&quot;&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/naked_domains_gae/gae_admin_add_domain_button.png&quot; height=&quot;502&quot; width=&quot;600&quot; /&gt;&lt;br /&gt;&lt;br /&gt;On this page you will see a note that tells you that the domain you add must be set up for Google Apps, a service that allows all sorts of functionality, including email services and more.&amp;nbsp; NOTE:&amp;nbsp; You do not have to use any of those services, you simply need to sign up!&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/naked_domains_gae/gae_google_app_required.png&quot; height=&quot;390&quot; width=&quot;600&quot; /&gt;&lt;br /&gt;&lt;br /&gt;By clicking the link that says &lt;b&gt;Sign up for Google Apps&lt;/b&gt;, you will be taken to a page like this:&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/naked_domains_gae/google_app_enter_domain.png&quot; height=&quot;459&quot; width=&quot;600&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Walk through the process filling out your personal information and you will come to a screen that looks like this:&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/naked_domains_gae/google_app_create_cname_1.png&quot; height=&quot;455&quot; width=&quot;600&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For our example, we are going to choose to create a new CNAME record in DNS to prove to Google that we own the domain.&amp;nbsp; By choosing that option&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/naked_domains_gae/google_app_create_cname_2.png&quot; height=&quot;418&quot; width=&quot;600&quot; /&gt;&lt;br /&gt;&lt;br /&gt;At this point we need to go to the GoDaddy DNS manager and create a host name &lt;b&gt;google46353a9a2d07a035&lt;/b&gt; and point it to &lt;b&gt;google.com&lt;/b&gt;.&amp;nbsp; You can see what that looks like below:&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/naked_domains_gae/godaddy_cname.png&quot; height=&quot;387&quot; width=&quot;600&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once that record is in place we can go back to the Google Apps page and click the button labeled &lt;b&gt;I&apos;ve completed the steps above&lt;/b&gt;.&amp;nbsp; If all goes well, you will see a page directing you through additional setup.&amp;nbsp; For our purposes in this example, we are done with Google Apps for the time being.&amp;nbsp; Now we want to go back to the GAE dashboard and tell it that we want to use the &lt;b&gt;j4n.org&lt;/b&gt; domain.&lt;br /&gt;&lt;br /&gt;When you enter that domain you should see a message that looks like this:&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/naked_domains_gae/gae_admin_add_domain_confirm.png&quot; height=&quot;480&quot; width=&quot;600&quot; /&gt;&lt;br /&gt;&lt;br /&gt;This will bring us back into the Google Apps control panel for the &lt;b&gt;j4n.org&lt;/b&gt; domain and we can add hostnames to our application like this:&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/naked_domains_gae/google_app_add_www.png&quot; height=&quot;344&quot; width=&quot;600&quot; /&gt;&lt;br /&gt;&lt;br /&gt;When you click add you will see an page like the one below instructing you to add another CNAME to GoDaddy for the host &quot;www&quot;.&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/naked_domains_gae/google_app_add_www_2.png&quot; height=&quot;445&quot; width=&quot;600&quot; /&gt;&lt;br /&gt;&lt;br /&gt;In the screen below you will see that we have successfully added the &quot;www&quot; host and while we were in there I went ahead and deleted the temporary CNAME that we had to create earlier to validate the ownership of the domain. &lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/naked_domains_gae/godaddy_add_www.png&quot; height=&quot;482&quot; width=&quot;600&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;At this point we can actually reach our application with the address &lt;b&gt;http://www.j4n.org&lt;/b&gt; as you see below:&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/naked_domains_gae/www.j4n.org.png&quot; height=&quot;300&quot; width=&quot;600&quot; /&gt;&lt;br /&gt;&lt;br /&gt;While this is pretty cool and all, we still can&apos;t access our application with &lt;b&gt;http://j4n.org&lt;/b&gt;.&amp;nbsp; For this, we will count on GoDaddy to do the rest.&amp;nbsp; Go back into the GoDaddy domain manager look for this link:&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/naked_domains_gae/godaddy_forward_manage.png&quot; height=&quot;376&quot; width=&quot;600&quot; /&gt;&lt;br /&gt;&lt;br /&gt;On the next page, you will want to fill out the field like you see before.&amp;nbsp; However, before you do, click the &quot;learn more&quot; link in the bottom left corner.&amp;nbsp; On that page there is a very important note:&amp;nbsp; &lt;u&gt;&lt;b&gt;For your domain to forward, your domain&apos;s A record must be &lt;code&gt;64.202.189.170&lt;/code&gt;.&lt;/b&gt;&amp;nbsp;&lt;/u&gt; If you note my DNS information above, that is not what the default parked domain IP is.&amp;nbsp; I won&apos;t bore you with yet another screen shot, but make sure you alter your domain&apos;s A record.&amp;nbsp; Now when we ping &lt;b&gt;j4n.org&lt;/b&gt; we get a response from 64.202.189.170.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Once we enter in &lt;b&gt;www.j4n.org&lt;/b&gt; you can see that our plan is going to work by hitting the &quot;Preview&quot; link to the right and seeing a snapshot of our app!&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/naked_domains_gae/godaddy_forward_add.png&quot; height=&quot;417&quot; width=&quot;600&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You will notice that we accepted the default settings which actually does a 301 redirect from &lt;b&gt;http://j4n.org&lt;/b&gt; to &lt;b&gt;http://www.j4n.org&lt;/b&gt;.&amp;nbsp; This means that we will never actually see &lt;b&gt;http://j4n.org&lt;/b&gt; in the address bar after the page has loaded.&amp;nbsp; If you click on the advanced settings you can select &quot;masking&quot; which allows the url to remain in the address bar as http://j4n.org.&amp;nbsp; Each option has its own advantages.&amp;nbsp; Select what is right for your application and choose OK.&lt;br /&gt;&lt;br /&gt;That is all you need to do!&amp;nbsp; Now, a word of warning... we have all gotten spoiled by the seemingly instant DNS changes in recent years.&amp;nbsp; You will find that when you make this forwarding change, you may need to wait up to half an hour or so before you can see the finished product (your mileage may vary).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; alt=&quot;&quot; src=&quot;http://img.zemanta.com/pixy.gif?x-id=384d57d8-afd1-8848-ba2b-41b2e1f9d6ba&quot; /&gt;&lt;/div&gt;</description><pubDate>Thu, 17 Dec 2009 03:11:47 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2009/12/16/Naked-Domains-in-Google-App-Engine-with-GoDaddy/</guid><category>ColdFusion,Servers,Technology,Java</category></item><item><title>Relaunched HikeTheCanyon.org on OpenBD and GAE</title><link>http://daveshuck.instantspot.com/blog/2009/12/15/Relaunched-HikeTheCanyonorg-on-OpenBD-and-GAE/</link><description>Around a year or so ago, I inadvertently took &lt;a href=&quot;http://www.hikethecanyon.org&quot;&gt;hikethecanyon.org&lt;/a&gt; offline in a server move.&amp;nbsp; Considering that it is a very low traffic site that is little more than a scrapbook of hiking pictures and descriptions, there is no active user community to send me nasty messages begging for me to bring it back online.&amp;nbsp; Finally this past weekend, I spent a bit of time and revived the code base off an old server, moved all the images out to Amazon S3 and brought the site up running under OpenBlueDragon on the Google App Engine.&amp;nbsp; Other than a very rudimentary Lightbox drop-in I did on the gallery to replace a no-longer functioning Flash image gallery, I didn&apos;t actually touch the codebase or the design.&amp;nbsp; So if it looks dated to you, that is because it is!&amp;nbsp; &lt;br /&gt;&lt;br /&gt;For those interested in hiking, you may want to give it a look.&amp;nbsp; It documents a hike of the Grand Canyon that I took with my dad in 2005 with a very detailed trip report and over 300 pictures.&amp;nbsp; Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.hikethecanyon.org&quot;&gt;&lt;big&gt;&lt;b&gt;HikeTheCanyon.org&lt;/b&gt; - Rim-to-Rim through the Grand Canyon on North Kaibab and the Bright Angel Trail&lt;/big&gt;&lt;/a&gt;&lt;br /&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://www.hikethecanyon.org&quot;&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://daveshuck.instantspot.com/userfiles/073006/91/hikethecanyon.org.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; alt=&quot;&quot; src=&quot;http://img.zemanta.com/pixy.gif?x-id=c80c897b-b851-8081-af34-eee406ccd4f8&quot; /&gt;&lt;/div&gt;</description><pubDate>Tue, 15 Dec 2009 16:44:05 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2009/12/15/Relaunched-HikeTheCanyonorg-on-OpenBD-and-GAE/</guid><category>ColdFusion,Technology</category></item><item><title>Setting up ColdSpring AOP and interesting behavior with return types</title><link>http://daveshuck.instantspot.com/blog/2009/12/07/Setting-up-ColdSpring-AOP-and-interesting-behavior-with-return-types/</link><description>This weekend I had a task in which I needed to add a behavior onto a method in an existing production method in a service object.&amp;nbsp; The new behavior is more or less notifying a 3rd party application whenever a particular method was being called.&amp;nbsp; Considering that it is not really an essential part of the process, it didn&apos;t really belong inline as part of that method, nor did I really want to affect existing &quot;sealed&quot; production code.&amp;nbsp; Although I understood that the AOP functionality of ColdSpring was designed for exactly that type of work, I had never actually used it before this task.&amp;nbsp; I put together a little proof-of-concept application that validated what I wanted to do, then applied it to my application.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;My goal was to set up an &quot;afterReturningAdvice&quot; object/method - that being a method which will be called at the completion of the target method, which is Member.saveMember() - where I could externalize the new behavior without touching the service itself.&amp;nbsp; While I did get it to perform essentially how I expected, there were a couple of gotchas about this process. One of which makes good sense, the other... not so much.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;For starters, my MemberService was defined in ColdSpring like this...&lt;br /&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;[codeblock 450]&lt;br /&gt;&lt;br /&gt;In order to make this change without causing broad sweeping changes throughout the application (in theory!), we are going to create a proxy object that masquerades as the MemberService that will pass requests onto the original MemberService.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;[codeblock 451]&lt;br /&gt;&lt;br /&gt;As you can see, our &lt;b&gt;MemberService&lt;/b&gt; is now actually of type &lt;b&gt;coldspring.aop.framework.ProxyFactoryBean&lt;/b&gt;. &amp;nbsp; We have defined its target as a bean named &lt;b&gt;MemberServiceTarget&lt;/b&gt; which points to our original &lt;b&gt;MemberService&lt;/b&gt; that has been renamed.&amp;nbsp; it now has an &quot;interceptors&quot; property that basically wires in a new bean named &lt;b&gt;RecordUpdatedMemberAfterReturningAdvisor&lt;/b&gt; that will serve as an interceptor anytime the &lt;b&gt;&quot;MemberService&quot;&lt;/b&gt; is accessed.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;So lets take a look at our interceptor definition:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;[codeblock 452]&lt;br /&gt;&lt;br /&gt;You can see that the&lt;/span&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;&lt;b&gt;RecordUpdatedMemberAfterReturningAdvisor&lt;/b&gt; that we declared in our previous snippet is defined here as type &lt;b&gt;coldspring.aop.support.NamedMethodPointcutAdvisor&lt;/b&gt;, which is a another built-in type in the ColdSpring framework.&amp;nbsp; We have defined a property &quot;mappedNames&quot; which will list any methods in our target object that we would like this interceptor to act on.&amp;nbsp; In our case we are only wanting to act on the &lt;b&gt;saveMember()&lt;/b&gt; method, which you see in the &lt;value&gt; property.&amp;nbsp; The &quot;advice&quot; property tells the interceptor that whenever our &lt;b&gt;saveMember()&lt;/b&gt; method is called, that we need to notify our &lt;b&gt;RecordUpdatedMemberAfterReturningAdvice&lt;/b&gt;. This is an object at we create that extends the &lt;b&gt;coldspring.aop.AfterReturningAdvice &lt;/b&gt;abstract class that is included with the framework.&amp;nbsp; When you use this advice, you must have a concrete implementation of the &lt;b&gt;afterReturning()&lt;/b&gt; method, which is were we will actually put our code that notifies the 3rd party application.&amp;nbsp; That method will contain the arguments: returnVal, method, args, and target, which will let you know all about the target method that was just called.&amp;nbsp; Pretty cool huh?&lt;br /&gt;&lt;br /&gt;Here is what that &lt;/value&gt;&lt;/span&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;&lt;b&gt;RecordUpdatedMemberAfterReturningAdvice&lt;/b&gt; looks like:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;[codeblock 453]&lt;br /&gt;&lt;br /&gt;You can see that our required &lt;b&gt;afterReturning()&lt;/b&gt; method is what finally does the work that we were trying to implement.&amp;nbsp; And all of this with no changes to our original application!&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;Well.... not exactly.&amp;nbsp; &lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;While this is certainly a pretty low impact change to our application, the idea that it would not affect any existing code wasn&apos;t the actual reality for a couple of reasons.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&amp;nbsp;MemberService&lt;/b&gt; is no longer a &lt;b&gt;MemberService!&lt;/b&gt;&amp;nbsp; In about eleventy thousand places in my application, I had services that were wired with a dependency of our MemberService.&amp;nbsp; Each of these had a getter/setter that looked something like this:&lt;br /&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;[codeblock 454]&lt;br /&gt;&lt;br /&gt;With the changes that we have implemented, our MemberService&lt;/span&gt; is a completely different animal!&amp;nbsp; Every single one of my getters and setters failed since my MemberService is now actually of type &lt;b&gt;coldspring.aop.framework.ProxyFactoryBean&lt;/b&gt;.&amp;nbsp; I altered them all to have type &quot;any&quot; (in case I remove this AOP piece later!) and all works.&amp;nbsp; I suppose it is a worthwhile change, but it would be nicer if this change was truly transparent to my application. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;This one is the head scratcher, and as of the time of this blog posting I have no explanation whatsoever.... but a &lt;b&gt;Member&lt;/b&gt; isn&apos;t always a &lt;b&gt;Member&lt;/b&gt;?!?&amp;nbsp; In my &lt;b&gt;MemberService&lt;/b&gt;, I have a &lt;b&gt;getMember()&lt;/b&gt; method which returns a type &lt;b&gt;my.objects.Member&lt;/b&gt;.&amp;nbsp; In my initial testing I had no problems with this at all.&amp;nbsp; However, once I rolled it into production, there was a process that called the &lt;b&gt;MemberService.getMember() &lt;/b&gt;method that I had not hit in my initial tests.&amp;nbsp; When it was called I received the following exception:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;b&gt;Message:The value returned from function fnct_&lt;/b&gt;&lt;div id=&quot;:1it&quot; class=&quot;ii gt&quot;&gt;&lt;wbr/&gt;&lt;b&gt;673EC50CBDBD5294E06289EE40D44A&lt;/b&gt;&lt;wbr/&gt;&lt;b&gt;BE() is not of type Member&lt;br /&gt;&lt;/b&gt;Our proxy MemberService creates a dynamic method that forwards requests onto the original target &lt;b&gt;getMember()&lt;/b&gt; method.&amp;nbsp; For whatever reason, in this one case, it was unable to validate that the returned object was indeed a &lt;b&gt;Member&lt;/b&gt;.&amp;nbsp; I modified my original &lt;b&gt;MemberService&lt;/b&gt; to make the returntype of &lt;b&gt;getMember()&lt;/b&gt; &quot;any&quot; an all is now working well.&amp;nbsp; If anyone has an explanation for that one I am all ears!&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;Aside from those two issues, my new AOP functionality is now in production and working exactly as I had hoped.&amp;nbsp; Overall, I think that this is a very cool feature of ColdSpring, and one that I will definitely be making more use of moving forward.&lt;br /&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; alt=&quot;&quot; src=&quot;http://img.zemanta.com/pixy.gif?x-id=d2c0dcd3-0b5e-8640-8495-903100f55a7f&quot; /&gt;&lt;/div&gt;</description><pubDate>Mon, 07 Dec 2009 15:00:07 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2009/12/07/Setting-up-ColdSpring-AOP-and-interesting-behavior-with-return-types/</guid><category>ColdFusion,Technology</category></item><item><title>Create SSL sites in Apache on Windows with OpenSSL</title><link>http://daveshuck.instantspot.com/blog/2009/11/12/Create-SSL-sites-in-Apache-on-Windows-with-OpenSSL/</link><description>To get a secure SSL site up and running on Apache under Windows, there are a few hoops to jump through that are not very intuitive.&amp;nbsp; To that end, I am going to document my approach to setting up SSL using OpenSSL.&amp;nbsp; This approach assumes that you already have Apache up and running on your machine, so if you have not done that, head over to the &lt;a href=&quot;http://httpd.apache.org/download.cgi&quot;&gt;HTTPD download page&lt;/a&gt; and set that up before continuing.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Setting up OpenSSL&lt;br /&gt;&lt;/b&gt;First we need to get &lt;a href=&quot;http://www.openssl.org&quot;&gt;OpenSSL&lt;/a&gt; setup on our system, which is not included with the Apache Windows binaries.&amp;nbsp; In fact the OpenSSL project doesn&apos;t even provide the binaries themselves, but you can find them at &lt;a href=&quot;http://www.slproweb.com/products/Win32OpenSSL.html&quot;&gt;Shining Light Productions&lt;/a&gt;.&amp;nbsp; For this example, I will be choosing the &lt;a href=&quot;http://www.slproweb.com/download/Win32OpenSSL_Light-0_9_8k.exe&quot;&gt;Win32 OpenSSL v0.9.8k Light&lt;/a&gt; version.&amp;nbsp; If you see a message like the one below, you will need to install the &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?familyid=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF&amp;amp;displaylang=en&quot;&gt;Microsoft Visual C++ 2008 Redistributable Package&lt;/a&gt; and then attempt the OpenSSL installation again.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://daveshuck.instantspot.com/userfiles/073006/91/c++error.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Once you have it installed, you can do a quick test to make sure that it is set up properly:&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://daveshuck.instantspot.com/userfiles/073006/91/openssltest.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Creating Certificates&lt;br /&gt;&lt;/b&gt;Next, we will use the OpenSSL terminal interface to create our self-signed certificates.&amp;nbsp; To explain a bit about what is going on below, I have a site already existing on my system that can be reached at http://scribble.&amp;nbsp; What we are doing is creating a secure subdomain of https://secure.scribble. &amp;nbsp; Typically when I create certificates, I name the files with the host/domain obvious so that they can be easily identified later.&amp;nbsp; Obviously you will want to replace the domain name to match your setup, but type the following in the terminal in the OpenSSL/bin directory:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;[codeblock 433]&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;That will generate what you see below.&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/ssl_on_apache/create-cert1.png&quot; height=&quot;420&quot; width=&quot;650&quot; /&gt;&lt;br /&gt;&lt;br /&gt;You may notice that I left a lot of the prompts blank.&amp;nbsp; Considering this is a dummy certificate in a development environment, that approach makes sense.&amp;nbsp; You may choose to be more explicit based on your needs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If we were to use this key as it is, we would be prompted for the password every time that Apache starts.&amp;nbsp; Since that is less than ideal, we will now generate a non-protected key from the one we created in the previous step by typing the following:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;[codeblock 434]&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/ssl_on_apache/create-cert2.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can see that I was prompted for a pass phrase.&amp;nbsp; This is the same password that you created when we generated the certificate above.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now we need to need to build the certificate that we will actually import into Apache.&amp;nbsp; You can do so by typing:&lt;br /&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;&lt;br /&gt;[codeblock 435]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This will result in the following output:&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://dl.dropbox.com/u/101948/blog/entries/ssl_on_apache/create-cert3.png&quot; height=&quot;443&quot; width=&quot;650&quot; /&gt;&lt;br /&gt;&lt;br /&gt;You can see that we now have a .cert, .csr, .key, and .pem file for our domain.&amp;nbsp; We will use a combination of the .key and the .cert&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Configuring Apache&lt;br /&gt;&lt;/b&gt;Now we need to make sure that your Apache server is ready to serve SSL requests.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;First, let&apos;s put the .key and .cert files that we created above into a directory under Apache.&amp;nbsp; In your &quot;conf&quot; directory, create a subdirectory named &quot;ssl&quot; and move secure.scribble.key and secure.scribble.cert into that new directory.&lt;br /&gt;&lt;br /&gt;Next we need to make sure that the mod_ssl module is enabled.&amp;nbsp; Open up the httpd.conf file for your Apache webserver.&amp;nbsp; Search for &quot;mod_ssl&quot; and you should find a line that looks like this:&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://daveshuck.instantspot.com/userfiles/073006/91/mod_sso.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Yours will likely be commented out with a &apos;#&apos; sign in front of the line.&amp;nbsp; You will want to delete that &apos;#&apos; so that it looks like the highlighted line above.&lt;br /&gt;&lt;br /&gt;Next you will need to make sure that you have uncommented the line that includes the httpd-ssl.conf file like you see below:&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://daveshuck.instantspot.com/userfiles/073006/91/conf_ssl.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;The last thing we need to do is configure our site.&amp;nbsp; Open up the conf/extra/httpd-ssl.conf file in an editor.&amp;nbsp; You will see that there is an amazingly huge and complex site definition in there already that starts with &lt;virtualhost _default_:443=&quot;&quot;&gt; and ends about 150 lines later with &lt;/virtualhost&gt;.&amp;nbsp; We need to disable this site.&amp;nbsp; If you are feeling bold, you can simply delete it.&amp;nbsp; However, I take the approach of commenting it out entirely so that I still have it as a reference, which is my recommendation as well.&amp;nbsp;&amp;nbsp; Starting with the line &lt;virtualhost _default_:443=&quot;&quot;&gt;, put a &apos;#&apos; at the start of every line that doesn&apos;t already have one and continue until you comment out the &lt;/virtualhost&gt; line.&lt;br /&gt;&lt;br /&gt;Now it is finally time for us to create the site definition for our https://secure.scribble site.&amp;nbsp; We will use some of the concepts in the example, but eliminate most of them.&amp;nbsp; Here is what mine looks like after paring down all the excess:&lt;br /&gt;&lt;span style=&quot;padding: 0pt 10px 10px 0pt;&quot;&gt;[codeblock 436]&lt;br /&gt;&lt;br /&gt;In that code you can see where we are pointing to the .key and .cert files that we created above.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Now, restart your Apache server and you are now serving up securely! &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; alt=&quot;&quot; src=&quot;http://img.zemanta.com/pixy.gif?x-id=9d1b1403-fab2-8595-83d6-897a928c54c5&quot; /&gt;&lt;/div&gt;</description><pubDate>Fri, 13 Nov 2009 03:47:33 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2009/11/12/Create-SSL-sites-in-Apache-on-Windows-with-OpenSSL/</guid><category>Tips and Tricks,Servers,Windows,Technology</category></item><item><title>The Jungle Rockers</title><link>http://daveshuck.instantspot.com/blog/2009/11/09/The-Jungle-Rockers/</link><description>This past weekend I made a trip down to The &lt;a href=&quot;http://www.double-wide.com/&quot;&gt;Doublewide&lt;/a&gt; in Dallas and caught a really cool band called &lt;a href=&quot;http://www.myspace.com/thejunglerockers&quot;&gt;The Jungle Rockers&lt;/a&gt; (a few streamed tracks on there).&amp;nbsp; They are Austin transplants from Cleveland but now hail from ATX, playing regularly around Texas.&amp;nbsp; Their vibe is kind of a modern rockabilly sound with obvious influences from 50s rock and roll.&amp;nbsp;&amp;nbsp; They have a 6 track EP available that I bought at the show that is definitely a great listen, and if you get the chance to catch them live, I highly recommend it.&lt;br /&gt;&lt;br /&gt;Here is a vid I found of them...&lt;br /&gt;&lt;div class=&quot;youtube-video&quot;&gt;&lt;object height=&quot;355&quot; width=&quot;425&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/d1GCsl24Qt0&amp;amp;feature=youtube_gdata&quot;&gt; &lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt; &lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/d1GCsl24Qt0&amp;amp;feature=youtube_gdata&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; height=&quot;355&quot; width=&quot;425&quot;&gt; &lt;/embed&gt;   &lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The Jungle Rockers &quot;Shake It&quot;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; alt=&quot;&quot; src=&quot;http://img.zemanta.com/pixy.gif?x-id=40a821c2-eb9a-8347-ac85-538ea8994d56&quot; /&gt;&lt;/div&gt;</description><pubDate>Mon, 09 Nov 2009 20:07:21 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2009/11/09/The-Jungle-Rockers/</guid><category>Music</category></item><item><title>Talking through some current issues with ColdFusion Event Gateways</title><link>http://daveshuck.instantspot.com/blog/2009/11/09/Talking-through-some-current-issues-with-ColdFusion-Event-Gateways/</link><description>Normally on my blog I attempt to throw out some tip, trick, or nugget of some sort.&amp;nbsp; This time?&amp;nbsp; Not so!&amp;nbsp;&amp;nbsp; I am currently trying to find a solution to a problem at hand and am brainstorming the best way to handle a few things.&amp;nbsp; I am really just talking this out for my own benefit, but I would love to hear thoughts from others that have perhaps solved similar issues.&lt;br /&gt;&lt;br /&gt;On a project that I am currently engaged in I am leveraging ColdFusion Event Gateways which work as a subscriber to a SonicMQ JMS server.&amp;nbsp; My gateway instance listens for messages on the ESB (Enterprise Service Bus) on a particular destination name (topic/queue).&amp;nbsp; When it receives a message, it parses the XML that it received, and plays traffic cop pushing data into various services that need it.&amp;nbsp; I have this working flawlessly in my small development environment.&amp;nbsp; However, I have a couple of complexities ahead of me that I am having difficulty coming up with a good solution.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Running in the cloud - &lt;/b&gt;Our production environment will have any number of CF instances, not clustered, but rather running as isolated applications with a load balancer directing the requests using sticky sessions.&amp;nbsp; Our system will be bringing new instances on/off line as traffic traffic dictates.&amp;nbsp; I have yet to solve the issue of how to set up my JMS Event Gateway in this environment.&amp;nbsp; I definitely don&apos;t want 20 different listeners out there all doing the same work.&amp;nbsp; I have considered the idea of having some sort of a support database where a listener can insert a row with a specific JMS message ID and when any other server picks up a message with that ID it will see that it is already being acted upon and it can safely ignore it. There are a couple of negatives that I can see right off the bat.&amp;nbsp; First is that every single subscribed instance will have to pull in the same message and test to see whether or not it should be acted upon.&amp;nbsp; It just seems like a little bit of redundancy that shouldn&apos;t be there.&amp;nbsp; Secondly, there is a chance that two servers could pick up the same request within milliseconds of each other and both could end up doing the work.&amp;nbsp; Duplicate processing could not only be wasteful, but could also create some data integrity issues.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Different environments have different settings (dynamic config)&lt;/b&gt; - Right now in our development phase, we have a single config file with setting specific to our development JMS server (credentials, domain, URL, Initial Context Factory, etc).&amp;nbsp; However, soon I will need to have this process support a number of different environments: multiple dev environments, multiple integration environments, multiple QA environments, and eventually production.&amp;nbsp; Ideally it would be wonderful if I could find some way to load a specific config into the event gateway at server init time, but as of today I have _NO_ idea how to solve this one.&amp;nbsp; First, there is no real intrinsic indicator at the server level that lets it know what environment is currently running (yet anyway...) and secondly, ColdFusion event gateway architecture isn&apos;t conducive in any way to dynamically loading a specific config.&amp;nbsp; &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;So now I am counting on you CFML community.&amp;nbsp; Help me brain storm on this!&amp;nbsp; Do you have any thoughts/ideas that might help me here?&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; alt=&quot;&quot; src=&quot;http://img.zemanta.com/pixy.gif?x-id=acb39c0d-d2f4-8647-b4f4-44e30f8e673e&quot; /&gt;&lt;/div&gt;</description><pubDate>Mon, 09 Nov 2009 16:28:07 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2009/11/09/Talking-through-some-current-issues-with-ColdFusion-Event-Gateways/</guid><category>ColdFusion,Technology,Java</category></item><item><title>A linux guy&apos;s experience with Windows 7</title><link>http://daveshuck.instantspot.com/blog/2009/10/19/A-linux-guys-experience-with-Windows-7/</link><description>&lt;p&gt;Anyone who knows me well knows that I am typically somewhat of an anti-Windows guy. I absolutely love linux, and get very frustrated by Windows in general. The only thing that I really dislike about linux is the lack of application support by a number of companies (ahem&amp;hellip;. Adobe).&amp;nbsp; Before going to the Adobe MAX conference, I decided I should swap out OSes on my personal laptop so that I could run all the stuff I would need for labs without constantly cursing about being stuck in a VM, limited functionality, etc.&amp;nbsp; A friend had just bought a package of Windows 7 licenses and sold me one for 5 bucks, which I considered to be a pretty reasonable risk.&amp;nbsp; I opted for installing Windows 7 on my laptop.&lt;br /&gt; &lt;br /&gt; Given that background and my previous feelings about Windows, I have to say that it is a pretty dang nice operating system.&amp;nbsp; It is by far the best offering to date by MS in my opinion.&amp;nbsp; There are a few things that they still haven&apos;t managed to get right (native file copy still makes me want to stick forks in my eyes), but by and large they have done a great job with Windows 7.&amp;nbsp; Other than having to track down a few drivers for my laptop, the installation was painless &amp;ndash; if not fast.&amp;nbsp; This is still an area that linux, and especially Ubuntu, wins hands down though.&amp;nbsp; Apps run extremely stable, and with the addition of a new concept of &amp;quot;Libraries&amp;quot;, directories that I need access to regularly are right at hand instead of having to tree down through big hierarchies.&amp;nbsp; I am also not finding what I expected would be an immediate degradation of performance after installing all the servers and development tools that I use on a daily basis.&amp;nbsp; Over all, so far so good.&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;A few things that I think are a *must* for the way that I use it. &lt;/strong&gt;&lt;/p&gt; &lt;ul&gt;     &lt;li&gt;I found a &amp;quot;sudo&amp;quot; program called &lt;a href=&quot;http://brandontools.com/content/StartPlusPlus.aspx&quot;&gt;Start++&lt;/a&gt; that allows me to open applications from the terminal or start menu as Administrator by typing &lt;strong&gt;sudo notepad&lt;/strong&gt; [or some other program].&amp;nbsp; It will prompt you for the UAC stuff and the program will open as administrator.&amp;nbsp; I use this regularly for editing system files like hosts, apache configs, and use it to open a terminal to fire off j2ee servers.&amp;nbsp;&lt;/li&gt;     &lt;li&gt;Install &lt;a href=&quot;http://www.codesector.com/teracopy.php&quot;&gt;Teracopy&lt;/a&gt; which is a replacement for the Windows copy program.&amp;nbsp; While certainly not as fast/efficient as a linux terminal, it greatly increases file copy speed over the native windows GUI file copy.&amp;nbsp; No more &amp;quot;preparing to copy&amp;quot; waits while your system bogs down.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Things that annoy me&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt;     &lt;li&gt;I still wish I could have a real terminal and be able to use VI in sudo, but that is just something I will have to get over I guess.&lt;/li&gt;     &lt;li&gt;I hate that I now have to be so careful with regard to viruses and spyware.&amp;nbsp; I love the protection that linux offers in that area, and having to go out of my to stay protected seems a bit cumbersome.&lt;/li&gt;     &lt;li&gt;I miss being able to easily try out software with the ease of the synaptic package manager.&amp;nbsp; It seems foreign now to have to download an exe run an installer and have settings being obscurely written all over a &amp;quot;black box&amp;quot; registry.&lt;/li&gt;     &lt;li&gt;I miss built-in networking tools.&amp;nbsp; Even simply things like being able to run &amp;quot;whois&amp;quot; from the teminal.&lt;/li&gt;     &lt;li&gt;My drive is getting fragmented far faster than with linux, and I find that I am running the defrag tool fairly often.&amp;nbsp; Linux just manages this under the covers and I never have to worry about it.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;All said, after using it for about the past 4 weeks, I can honestly say that I am surprised (and perhaps even a bit disappointed) that I like it as much as I do.&amp;nbsp; I planned on just running it while I was at the Adobe MAX conference and going back to linux when I got home, but it looks like I will be keeping it for a while longer.&lt;/p&gt; &lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;img src=&quot;http://img.zemanta.com/pixy.gif?x-id=8f740e60-f3eb-8f02-a041-715c13c72d2d&quot; alt=&quot;&quot; class=&quot;zemanta-pixie-img&quot; /&gt;&lt;/div&gt;</description><pubDate>Mon, 19 Oct 2009 13:58:00 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2009/10/19/A-linux-guys-experience-with-Windows-7/</guid><category>Windows,Technology,Linux</category></item><item><title>Strange behavior with ColdFusion ExpandPath() when using Symbolic Links</title><link>http://daveshuck.instantspot.com/blog/2009/09/23/Strange-behavior-with-ColdFusion-ExpandPath-when-using-Symbolic-Links/</link><description>&lt;p&gt;I was playing around with the Quicksilver framework last night, and for some reason it was unable to find and instantiate my CFCs properly.&amp;nbsp; After digging into the framework a bit and determining where it was breaking, I discovered something strange about the way that ColdFusion interprets ExpandPath() when it exists in a directory that is defined as a symbolic link.&amp;nbsp; I am not sure if the same behavior exists on Macs, but I would imagine it does.&amp;nbsp; If someone could confirm that to be the case, I would be interested.&lt;br /&gt; &lt;br /&gt; For starters, I usually have a &apos;www&apos; directory in my user home directory. This way when I pass my user profile around from distro to distro, my development work is included in my home directory.&amp;nbsp; For ease of configuration I typically have a symbolic link in my OS that points &lt;strong&gt;/www/&lt;/strong&gt; ---&amp;gt; &lt;strong&gt;/home/dshuck/www/&lt;/strong&gt;.&amp;nbsp; Then when I am creating a new web project called &apos;davescode&apos;, I would put it in &lt;strong&gt;/home/dshuck/www/davescode&lt;/strong&gt;, but my Apache config would usually point to &lt;strong&gt;/www/davescode&lt;/strong&gt;.&amp;nbsp; For the past several years, this approach has worked will for me.&amp;nbsp; That is until last night when experimenting with Quicksilver.&amp;nbsp; &lt;br /&gt; &lt;br /&gt; When Quicksilver loads, it creates a list of service CFCs in the the application in such a way that if I had Foo.cfc in a directory &lt;strong&gt;&apos;com&apos; &lt;/strong&gt;in the root of my davescode site, it would look like &lt;strong&gt;/home/dshuck/www/davescode/com/Foo.cfc&lt;/strong&gt;.&amp;nbsp; When I initted the application, I was getting an error that&amp;nbsp; it couldn&apos;t find the CFC &lt;strong&gt;home/dshuckcom/Foo.cfc&lt;/strong&gt;.&amp;nbsp; Essentially what was happening is that it was getting the full path of the CFC and replacing the path to the root of the site with &amp;quot;&amp;quot;.&amp;nbsp; In a perfect world the value of the path after the string replace would have looked like &lt;strong&gt;com/Foo.cfc.&amp;nbsp; &lt;/strong&gt;Unfortunately that was not so.&amp;nbsp; Here&apos;s why!&lt;br /&gt; &lt;br /&gt; I put a test file called path.cfm in the root of my davescode site that considted of the following:&lt;br /&gt; &lt;div class=&quot;code&quot; &gt;&lt;pre&gt;&amp;lt;cfoutput&amp;gt;#ExpandPath(&amp;quot;./&amp;quot;)#&amp;lt;/cfoutput&amp;gt; &amp;lt;br/&amp;gt; &amp;lt;cfoutput&amp;gt;#ExpandPath(&amp;quot;/&amp;quot;)#&amp;lt;/cfoutput&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt; The result was &lt;em&gt;very&lt;/em&gt; surprising!&lt;br /&gt; &lt;div class=&quot;code&quot; &gt;&lt;pre&gt;/home/dshuck/www/davescode/ /www/davescode/&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt; For some reason when you do ExpandPath(&amp;quot;/&amp;quot;) it looks at the symbolic link path, but when you do ExpandPath(&amp;quot;./&amp;quot;), it looks at the true file path.&amp;nbsp; For the life of me, I can&apos;t think of why that would be.&amp;nbsp; If anyone has an explanation, I would be all ears!&lt;/p&gt; &lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; alt=&quot;&quot; src=&quot;http://img.zemanta.com/pixy.gif?x-id=49729c7f-e4fe-8ce3-a08f-2bd5d5e173f3&quot; /&gt;&lt;/div&gt;</description><pubDate>Wed, 23 Sep 2009 14:11:00 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2009/09/23/Strange-behavior-with-ColdFusion-ExpandPath-when-using-Symbolic-Links/</guid><category>ColdFusion,Technology,Linux</category></item><item><title>Photos from the Dallas Adobe User Group Tour event</title><link>http://daveshuck.instantspot.com/blog/2009/06/29/Photos-from-the-Dallas-Adobe-User-Group-Tour-event/</link><description>&lt;p&gt;We had a great time Friday night with around 170 in attendance!  Terry did a great job and everyone left hungry for the new releases that he teased.  Here are some pics from the night.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;&lt;object width=&quot;400&quot; height=&quot;300&quot;&gt; &lt;param value=&quot;offsite=true&amp;lang=en-us&amp;page_show_url=%2Fphotos%2Fdaveshuck%2Fsets%2F72157620588183099%2Fshow%2F&amp;page_show_back_url=%2Fphotos%2Fdaveshuck%2Fsets%2F72157620588183099%2F&amp;set_id=72157620588183099&amp;jump_to=&quot; name=&quot;flashvars&quot; /&gt; &lt;param value=&quot;http://www.flickr.com/apps/slideshow/show.swf?v=71649&quot; name=&quot;movie&quot; /&gt; &lt;param value=&quot;true&quot; name=&quot;allowFullScreen&quot; /&gt;&lt;embed width=&quot;400&quot; height=&quot;300&quot; flashvars=&quot;offsite=true&amp;lang=en-us&amp;page_show_url=%2Fphotos%2Fdaveshuck%2Fsets%2F72157620588183099%2Fshow%2F&amp;page_show_back_url=%2Fphotos%2Fdaveshuck%2Fsets%2F72157620588183099%2F&amp;set_id=72157620588183099&amp;jump_to=&quot; allowfullscreen=&quot;true&quot; src=&quot;http://www.flickr.com/apps/slideshow/show.swf?v=71649&quot; type=&quot;application/x-shockwave-flash&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;</description><pubDate>Mon, 29 Jun 2009 21:13:00 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2009/06/29/Photos-from-the-Dallas-Adobe-User-Group-Tour-event/</guid><category>InstantSpot,Tips and Tricks</category></item><item><title>Solving java.lang.SecurityException: Seed must be between 20 and 64 bytes. Only 8 bytes supplied.</title><link>http://daveshuck.instantspot.com/blog/2009/05/08/Solving-javalangSecurityException-Seed-must-be-between-20-and-64-bytes-Only-8-bytes-supplied/</link><description>&lt;p&gt;Recently I have began working with JMS and ColdFusion, in which we are building a system that subscribes to an enterprise JMS server and picks up messages relevant to its needs and acts on them. I had my proof of concept working with the open source Apache ActiveMQ server and was very pleased with the results.&amp;nbsp; However, in our production environment, the powers that be decided to use the very non-free SonicMQ server.&lt;/p&gt; &lt;p&gt;As I tried to convert the event gateway over to the SonicMQ server, it failed on initialization with the following exception:&amp;nbsp; &lt;div class=&quot;code&quot; &gt;&lt;pre&gt;javax.naming.NamingException [Root exception is java.lang.SecurityException: Seed must be between 20 and 64 bytes. Only 8 bytes supplied.]  at com.sonicsw.jndi.mfcontext.MFConnectionManager.connect(Unknown Source)  at com.sonicsw.jndi.mfcontext.MFConnectionManager.&amp;lt;init&amp;gt;(Unknown Source)  at com.sonicsw.jndi.mfcontext.MFConnectionManager.getManager(Unknown Source)  at com.sonicsw.jndi.mfcontext.MFContext.&amp;lt;init&amp;gt;(Unknown Source)  at com.sonicsw.jndi.mfcontext.MFContextFactory.getInitialContext(Unknown Source)  at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)  at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)  at javax.naming.InitialContext.init(InitialContext.java:223)  at javax.naming.InitialContext.&amp;lt;init&amp;gt;(InitialContext.java:197)  at examples.JMS.JMSConsumer.start(Unknown Source)  at examples.JMS.JMSGateway.startGateway(Unknown Source)  at coldfusion.eventgateway.GenericGateway.start(GenericGateway.java:118)  at coldfusion.eventgateway.EventServiceImpl$GatewayStarter.run(EventServiceImpl.java:1428)&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt; &lt;p&gt;In my research on this problem, I found several people reporting similar errors, each on CF8, and each talking to 3rd party tools.&amp;nbsp; Eventually I found the solution through an email discussion between one of the developers in my company and an Adobe developer.&amp;nbsp; Apparently in CF8, they added FIPS security, which disables the Sun JCE (encryption libraries).&amp;nbsp; To solve this error, you need to add the following line to your java.args in your jvm.config file in JRun.&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;-Dcoldfusion.disablejsafe=true&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt; &lt;p&gt;Now restart your server and try again!&lt;/p&gt;</description><pubDate>Fri, 08 May 2009 14:24:00 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2009/05/08/Solving-javalangSecurityException-Seed-must-be-between-20-and-64-bytes-Only-8-bytes-supplied/</guid><category>ColdFusion,Java</category></item><item><title>Making your application flow obvious in Mach-II with event-mappings</title><link>http://daveshuck.instantspot.com/blog/2009/04/11/Making-your-application-flow-obvious-in-MachII-with-eventmappings/</link><description>&lt;p&gt;I recently joined a company that makes use of Mach-II in a few applications.&amp;nbsp; Some of them were created as the developers were learning the framework and employ some obvious un-best practices.&amp;nbsp;&amp;nbsp; The team is made up of people from various skill levels, but I have noticed that about half of the team just absolutely cringes when they hear &amp;quot;Mach-II&amp;quot;.&amp;nbsp; They talk about how difficult it is to troubleshoot and how it is next to impossible to follow application flow.&amp;nbsp;&amp;nbsp; I was very surprised to hear that response, because I think one of the big benefits of using Mach-II is that I can look at a config XML and read the story of my application.&amp;nbsp;&amp;nbsp; I will touch on this in more detail in a bit.&lt;br /&gt; &lt;br /&gt; So the other day I had my first experience digging in deeply into one of they apps to solve a problem... and it took me &lt;em&gt;&lt;strong&gt;forever&lt;/strong&gt;&lt;/em&gt; to figure out where the hell anything was.&amp;nbsp; I started on the default home event, which only had a filter that announced other events, that had listeners that announced other events and so on until I was *&lt;em&gt;&lt;strong&gt;EIGHT&lt;/strong&gt;&lt;/em&gt;* events deep.&amp;nbsp; In each one of these announcements, I had to go find the listener/filter, look into the methods, and search for where I might be going next.&amp;nbsp; It suddenly became overtly clear why the other developers hate Mach-II.&lt;br /&gt; &lt;br /&gt; Now, back to why my config files tell a story... first of all, I can&apos;t think of many cases where an app needs to announce 8 events before it gets to a destination.&amp;nbsp; However, troubleshooting this would have been so much simpler if only the developer had been clear in the XML using event-mappings.&amp;nbsp; As a rule, if I ever alter the flow of my application from within a filter/listener, I &lt;em&gt;&lt;strong&gt;always&lt;/strong&gt;&lt;/em&gt; have an event-mapping that shows this in my config.&amp;nbsp; That way I can quickly skim the XML and know what possible exits I have.&amp;nbsp; In most cases, it should be pretty obvious where you are going based on that alone,&amp;nbsp; and you don&apos;t even need to open the CFCs to figure it out.&amp;nbsp; Although I certainly do use event-mapping for aliases, more often than not they will look like this:&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;&amp;lt;event-mapping event=&amp;quot;SomeEvent&amp;quot; mapping=&amp;quot;SomeEvent&amp;quot; /&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt; &lt;p&gt;It serves no actual functinal purpose other acting as a means to document the flow. Does anyone else use the practice?&amp;nbsp; How do you keep the application flow obvious in your configuration files?&amp;nbsp;&lt;/p&gt; &lt;p&gt;I was talking to &lt;a href=&quot;http://www.aaronjlynch.com&quot;&gt;Aaron Lynch&lt;/a&gt; about this (who uses the same practice) and from that conversation I decided I would open this up for conversation.&amp;nbsp; What I would love to see is some type of optional setting in Mach-II that would enforce this so that all developer on a team had to use this methodology.&amp;nbsp;&amp;nbsp; Maybe something along the lines where when an event is announced from within a CFC and it hasn&apos;t been mapped in the XML it would barf up an exception?&amp;nbsp;&lt;/p&gt; &lt;p&gt;I have no doubt that some people will hate this idea.&amp;nbsp; However, in the bigger picture I would like to see less people hating frameworks, and if we can make things more clear from a troubleshooting/maintanence perspective, I think that there would be less FUD!&lt;/p&gt; &lt;p&gt;Any thoughts on this?&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>Sat, 11 Apr 2009 18:46:00 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2009/04/11/Making-your-application-flow-obvious-in-MachII-with-eventmappings/</guid><category>ColdFusion</category></item><item><title>How to set JAVA_HOME environment variable in Ubuntu </title><link>http://daveshuck.instantspot.com/blog/2009/03/20/How-to-set-JAVAHOME-environment-variable-in-Ubuntu-/</link><description>&lt;p&gt;I am actually creating this blog entry as a bookmark for myself, but since I know that I never remember how to do it, others might benefit as well!&lt;/p&gt; &lt;p&gt;One way that you can set your JAVA_HOME variable and add to your PATH, is be doing the folowing.&amp;nbsp; As &apos;sudo&apos; open up &lt;strong&gt;/etc/bash.bashrc&lt;/strong&gt; and add the following to the end of the file.&amp;nbsp; NOTE: Set the java path to whatever the actual path is on your environment if it does not match &lt;strong&gt;/usr/lib/jvm/java&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;JAVA_HOME=/usr/lib/jvm/java export JAVA_HOME PATH=$PATH:$JAVA_HOME/bin export PATH&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt; &lt;p&gt;When you reboot, try running the following:&lt;/p&gt; &lt;p&gt;&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;$ echo $JAVA_HOME /usr/lib/jvm/java  echo $PATH [probably lots of paths]:/usr/lib/jvm/java/bin  &lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;</description><pubDate>Sat, 21 Mar 2009 01:02:00 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2009/03/20/How-to-set-JAVAHOME-environment-variable-in-Ubuntu-/</guid><category>Ubuntu,Tips and Tricks</category></item></channel></rss>