<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:posterous="http://posterous.com/help/rss/1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>self.is_a? Blog</title>
    <link>http://craigkaminsky.me</link>
    <description>random tech drivelings from ouray, colorado</description>
    <generator>posterous.com</generator>
    <link xmlns="http://www.w3.org/2005/Atom" href="http://posterous.com/api/sup_update#7b0ebe355" type="application/json" rel="http://api.friendfeed.com/2008/03#sup" />
    
    
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/CraigKaminskysPosterous" /><feedburner:info uri="craigkaminskysposterous" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://posterous.superfeedr.com/" /><item>
      <pubDate>Mon, 02 Apr 2012 13:07:00 -0700</pubDate>
      <title>Gett Yourr Sh$tt Togetherr with Taskk - Task Management Done Right</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/llRSiajWsmY/gett-yourr-shtt-togetherr-with-taskk-task-man</link>
      <guid isPermaLink="false">http://craigkaminsky.me/gett-yourr-shtt-togetherr-with-taskk-task-man</guid>
      <description>
        <![CDATA[<p>
	<p><strong>Try As I Might</strong><br />For years (and I mean that, literally), I have tried more task management applications than I can shake a stick at. Hell, I actually have one that I built myself after starting an Active Admin (Rails) tutorial (<a href="http://morecraptodo.com" title="More Crap To-Do" target="_blank">more crap to-do</a>). All of them, my own included, did not work for me. For the longest time, I could not figure out why they did not work for me. The long and short of it was that I would spend time creating my lists and then never do anything with them from there ... after the first week or so of using whatever particular software I was on at that time.&nbsp;</p>
<p><strong>Enter Taskk</strong><br />Recently, I had the opportunity to try <a href="http://taskk.it" title="Taskk" target="_blank">Taskk.it</a>&nbsp;(<a href="https://twitter.com/taskk_it" title="Taskk on Twitter" target="_blank">@taskk_it</a>), &nbsp;which is currently in an invite-only beta (I have some invites, so ping me if you are interested in trying it out). Although it's in an early beta state, Taskk is, hands down, the best task management application I've used.&nbsp;</p>
<p><strong>Why Taskk?</strong><br />For me, Taskk separates itself in on key area from its competitors: it tells you what to do next! Yeah, you heard me. Taskk not only compiles and maintains a list of your projects and their tasks but it also calculates what tasks you should be working on each day.</p>
<p><strong>I'm Sorry. Say What?</strong><br />Yeah, I'll say it again. Taskk tells you what to work on next. But how? Hell if I know. It's probably fairies or pixie dust in the code. Alright, that may not be the case but here's a little overview on Taskk's magic and why I like it so much.&nbsp;</p>
<p><strong>The Process</strong><br />It's actually quite easy to get rolling with Taskk. First, you set up a list. Then, for each list, you create a series of tasks (ToDos), all of which you have entered with a time estimate, notes, deadlines, etc. Once you've entered all your ToDos, you can rearrange them (drag &amp; drop) to set their priority level.&nbsp;</p>
<p>From here, you head over to what Taskk calls the "Planner". And this is where Taskk starts to set itself apart. You go through the available days in your planner and let Taskk know how many hours you have each day to work on your list(s). Once you have entered your available hours, you click the "Update Planner" and Taskk creates your work schedule.&nbsp;</p>
<p><strong>But Something Changed</strong><br />Got a new assignment? Ran into a wall working on a particular task? Just slow one day? No worries. Anytime you want to recalculate your schedule, you only need to visit the Planner page and click the "Update Planner" button and you're good to go.&nbsp;</p>
<p><strong>Going Forward</strong><br />I am very excited to have Taskk as part of my toolbelt. I've been using it to plan out and manage several side projects as my new full-time gig has plenty of project management tools, which work great for the team, and it's helped me stay on track and keep those projects moving forward.&nbsp;</p>
<p>As I mentioned above, if you are interested in trying Taskk out, please let me know. I have a few invites left to give out and would be happy to share.&nbsp;</p>
	
</p>

<p><a href="http://craigkaminsky.me/gett-yourr-shtt-togetherr-with-taskk-task-man">Permalink</a> 

	| <a href="http://craigkaminsky.me/gett-yourr-shtt-togetherr-with-taskk-task-man#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/gett-yourr-shtt-togetherr-with-taskk-task-man</feedburner:origLink></item>
    <item>
      <pubDate>Thu, 22 Mar 2012 12:12:00 -0700</pubDate>
      <title>What Time is It? It's TDD with ColdFusion Koans (and MXUnit) Time!</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/0ClC6-yUb90/what-time-is-it-its-tdd-with-coldfusion-koans</link>
      <guid isPermaLink="false">http://craigkaminsky.me/what-time-is-it-its-tdd-with-coldfusion-koans</guid>
      <description>
        <![CDATA[<p>
	<p>I started a new CFML position on a Knowledge Management (KM) project this past Monday. It's a a great bunch of folks and an awesome team of CFML developers, in particular.</p>
<p>My new position has me working on the mobile team, on which we are currently building an Air desktop application for our KM project. The only 'drag' with my first week is that my team lead is out for vacation ... and the mobile team is the smallest team in the company, consisting of the team lead and me.&nbsp;</p>
<p>So, my assignment this week has been twofold: (1) get up and running and (2) start working on unit tests for the existing methods in the mobile project.&nbsp;</p>
<p>The first task was no big deal. The second task, however, is both exciting and intimidating. It's exciting because I have read and toyed with test driven development (TDD)&nbsp;for years but was not disciplined about testing and did not use TDD across my projects.</p>
<p>It's intimidating because, as I just noted, I have not yet used TDD consistently in my projects, let alone employing TDD inside a new, existing, large project that heretofore has not used TDD/unit tests.&nbsp;</p>
<p>The development teams have decided that we should start out with adding unit tests for all existing methods so that we can do regressing testing as we add new features, etc. Going forward, I believe the mobile team will go full-on TDD.</p>
<p>Great. But, why am I boring you all with this? Well, mostly because I'm sort of evil that way :).&nbsp;</p>
<p>Okay, I am not that evil. I wanted to write this post because of how important I think it is that more and more CFML developers give TDD (or BDD, if that's your thing) a long, hard look.&nbsp;But where do we go to get started?&nbsp;</p>
<p>Here's the approach I took to get myself rolling:&nbsp;</p>
<ol>
<li><a href="http://mxunit.org" title="MXUnit" target="_blank">MXUnit</a><ol>
<li>Download mxunit (and the eclipse plugin, if you use CFEclipse or ColdFusion Builder)</li>
<li>Follow the <a href="http://wiki.mxunit.org/display/default/MXUnit+Documentation" title="MXUnit Wiki" target="_blank">wiki's</a>&nbsp;Getting Started section to make sure you have it installed and running correctly</li>
<li>Read through the Testing Basics section of the wiki to give yourself a general sense of how unit testing works</li>
<li>Read through the Using the Eclipse Plugin section of the wiki (if you're using an Eclipse-based IDE, that is)</li>
</ol></li>
<li><a href="http://bittersweetryan.github.com/ColdFusion-Koans/" title="ColdFusion Koans" target="_blank">ColdFusion Koans</a>&nbsp;(<a href="https://github.com/bittersweetryan/ColdFusion-Koans" title="Github ColdFusion Koans" target="_blank">Github URL</a>)<ol>
<li>Read the initial documentation on the Koans page</li>
<li>Clone the github repository and get to work making and running tests!</li>
</ol></li>
<li>Back to MXUnit<ol>
<li>Complete reading through the wiki (Advanced Stuf and the API Reference sections)</li>
</ol></li>
<li>Start a simple project and go TDD all the way<ol>
<li>I did the now-standard "To-Do" project to get myself more into the mindset of TDD)</li>
</ol></li>
</ol>
<p><a href="https://twitter.com/bittersweetryan" target="_blank">Ryan Anklam</a> and <a href="https://twitter.com/mikehenke" target="_blank">Mike Henke</a> have done a great job with Koans. Not only does Koans teach you a lot about TDD in ColdFusion but it's also a great project to learn ColdFusion/CFML or just refresh your knowledge of it.&nbsp;</p>
<p>There you have it ... in my opinion, it's time to start living the TDD lifestyle. And, with kick-ass projects like MXUnit and ColdFusion Koans, there is no time like the present to get started!&nbsp;</p>
	
</p>

<p><a href="http://craigkaminsky.me/what-time-is-it-its-tdd-with-coldfusion-koans">Permalink</a> 

	| <a href="http://craigkaminsky.me/what-time-is-it-its-tdd-with-coldfusion-koans#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/what-time-is-it-its-tdd-with-coldfusion-koans</feedburner:origLink></item>
    <item>
      <pubDate>Mon, 30 Jan 2012 11:32:37 -0800</pubDate>
      <title>CFDynamo: Weekend Updates</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/V1lcfiRs3GY/cfdynamo-weekend-updates</link>
      <guid isPermaLink="false">http://craigkaminsky.me/cfdynamo-weekend-updates</guid>
      <description>
        <![CDATA[<p>
	<p>Over the weekend I knocked out a few wrapper methods for CFDynamo (and pushed them to the <a href="https://github.com/imageaid/cfdynamo" title="CFDynamo on Github" target="_blank">Github Repo</a>). I was hoping to get a bit farther but I'm the boys basketball coach here in Ouray (pop. 900) and we had homecoming this weekend. I was a bit more wiped out than I expected on Sunday!</p>
<p>The following methods have been added and tested:&nbsp;</p>
<ul>
<li>create_table</li>
<li>update_table</li>
<li>delete_table</li>
</ul>
<p>The following methods will be added/enhanced/cleaned up later today and tomorrow:</p>
<ul>
<li>get_item (will be added)</li>
<li>update_item (will be added)</li>
<li>put_item (enhanced to better handle the varying return/result options of this call)</li>
<li>create_ update_, and delete_ table methods (ehnaced/cleaned up to hold AWS call backs added to asses the progress of table changes)&nbsp;</li>
</ul>
<p>After getting these in place today and tomorrow, I intend to complete, test and push the query and scan methods, at which point CFDynamo should be at a solid 1.0 release state. That should happen by Thursday.&nbsp;</p>
<p>Let me know if you have any questions or suggestions and do feel free to fork the project on Github and add to it!</p>
	
</p>

<p><a href="http://craigkaminsky.me/cfdynamo-weekend-updates">Permalink</a> 

	| <a href="http://craigkaminsky.me/cfdynamo-weekend-updates#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/cfdynamo-weekend-updates</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 27 Jan 2012 10:51:35 -0800</pubDate>
      <title>CFDynamo: A CFC Wrapper for Amazon DynamoDB</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/i58xw07KZe4/my-day-with-the-aws-java-sdk-and-cfml</link>
      <guid isPermaLink="false">http://craigkaminsky.me/my-day-with-the-aws-java-sdk-and-cfml</guid>
      <description>
        <![CDATA[<p>
	<p>Earlier this week I began implementing a DynamoDB solution for a client. <a href="http://aws.amazon.com/dynamodb/" title="Amazon DynamoDB" target="_blank">DynamoDB</a> is a NoSQL solution long ago planned but only recently released on <a href="http://aws.amazon.com/" title="AWS" target="_blank">Amazon Web Services</a>. It is more closely related to Cassandra than MongoDB or CouchDB but offers some interesting and enticing features (e.g., all DynamoDB tables exist on SSDs, so the I/O is pretty damn fast!).&nbsp;</p>
<p>My client's site is built with CFML and runs on Tomcat/Railo 3.3.1 (to be upgraded to 3.3.2 this weekend) on a load-balanced EC2 instance that employs several other AWS services, such as a MySQL DB on RDS, S3, CloudFront and the new ElastiCache. While our RDS database serves most of our needs, some of our data is quite complex and we feel we would better served breaking some items out into a NoSQL solution.&nbsp;</p>
<p>After an initial review of NoSQL options, we thought we'd go with MongoDB but, with the announcement of DynamoDB, we decided that it would be a better choice for our team because all DynamoDB instances are managed by Amazon's experts ... and this seemed a might better option than building and managing our own MongoDB cluster!</p>
<p>As many/most CFML developers know, there is no CFML SDK for Amazon Web Services. And, if you want to write CFML code to directly access AWS services such as DynamoDB, it can be a pain in the ass, to say the least.</p>
<p>Why such a pain? Primarily because you have to manage your security credentials and session tokens yourself/in your CFML code and none of these actions are straight-forward or easy. Plus, it ends up pretty non-CFMLy because it requires a shit-ton of code (IMHO). The pre-built AWS SDKs, on the other hand, handle all these security actions for you.&nbsp;</p>
<p>Fortunately, there is an <a href="http://aws.amazon.com/sdkforjava/" title="AWS SDK for Java" target="_blank">AWS Java SDK</a>, as I am sure you all know. And, thankfully, we CFML developers can (fairly) easily access and use Java APIs/libraries directly in our CFML code. Hooray!</p>
<p>So, to make my life easier, I created and started working on a project I named CFDynamo (yep, typically uninspired CFML project name :). To start, I have integrated the security aspect (i.e., enabling CFDynamo to access your DynamoDB instance) and table listings. To get started quicker, I created a couple of tables in the AWS console.&nbsp;</p>
<p>If you are interested in the project, please check it out on <a href="https://github.com/imageaid/cfdynamo" title="CFDynamo Repo" target="_blank">Github</a>. The README contains instructions for getting the Java SDK setup and running on either Tomcat/Railo or ACF 9. I won't bore you with more setup details here.</p>
<p>I'll be adding more API functions/calls to CFDynamo between today and Monday. Feel free to watch the Github repo for updates, which should come in the following order:&nbsp;</p>
<ul>
<li>createTable</li>
<li>deleteTable</li>
<li>updateTable</li>
<li>getItem</li>
<li>updateItem</li>
<li>query</li>
<li>scan</li>
<li>refine putItem</li>
</ul>
<p>And, of course, please fork the project and make some better coding updates than I will and I can merge your pull requests!</p>
<ul>
</ul>
	
</p>

<p><a href="http://craigkaminsky.me/my-day-with-the-aws-java-sdk-and-cfml">Permalink</a> 

	| <a href="http://craigkaminsky.me/my-day-with-the-aws-java-sdk-and-cfml#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/my-day-with-the-aws-java-sdk-and-cfml</feedburner:origLink></item>
    <item>
      <pubDate>Thu, 27 Oct 2011 11:17:16 -0700</pubDate>
      <title>A sight we rarely see...Marley tolerating Dobie!</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/QZtKgXRg6Gg/a-sight-we-rarely-seemarley-tolerating-dobie</link>
      <guid isPermaLink="false">http://craigkaminsky.me/a-sight-we-rarely-seemarley-tolerating-dobie</guid>
      <description>
        <![CDATA[<p>
	<a href="http://instagr.am/p/Rp2Wa/"><div class='p_embed p_image_embed'>
<a href="http://getfile4.posterous.com/getfile/files.posterous.com/craigkaminsky/aqdudnHemsfrdaldClGDFgJfyDahaGlskCqtFaCmpjEdmsmmEaresvBnoiuI/media_httpimagesinsta_nDzEu.jpg.scaled1000.jpg"><img alt="Media_httpimagesinsta_ndzeu" height="500" src="http://getfile2.posterous.com/getfile/files.posterous.com/craigkaminsky/aqdudnHemsfrdaldClGDFgJfyDahaGlskCqtFaCmpjEdmsmmEaresvBnoiuI/media_httpimagesinsta_nDzEu.jpg.scaled500.jpg" width="500" /></a>
</div>
</a>
	
</p>

<p><a href="http://craigkaminsky.me/a-sight-we-rarely-seemarley-tolerating-dobie">Permalink</a> 

	| <a href="http://craigkaminsky.me/a-sight-we-rarely-seemarley-tolerating-dobie#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
      <media:content type="image/jpeg" height="612" width="612" url="http://getfile4.posterous.com/getfile/files.posterous.com/craigkaminsky/aqdudnHemsfrdaldClGDFgJfyDahaGlskCqtFaCmpjEdmsmmEaresvBnoiuI/media_httpimagesinsta_nDzEu.jpg">
        <media:thumbnail height="500" width="500" url="http://getfile2.posterous.com/getfile/files.posterous.com/craigkaminsky/aqdudnHemsfrdaldClGDFgJfyDahaGlskCqtFaCmpjEdmsmmEaresvBnoiuI/media_httpimagesinsta_nDzEu.jpg.scaled500.jpg" />
      </media:content>
    <feedburner:origLink>http://craigkaminsky.me/a-sight-we-rarely-seemarley-tolerating-dobie</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 23 Sep 2011 11:40:00 -0700</pubDate>
      <title>CFWheels StatesAndCountries Plugin Updated</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/7WuDHAJvXik/cfwheels-statesandcountries-plugin-updated</link>
      <guid isPermaLink="false">http://craigkaminsky.me/cfwheels-statesandcountries-plugin-updated</guid>
      <description>
        <![CDATA[<p>
	<p>With many thanks due to Jordan Clark, my <a href="http://cfwheels.org/plugins/listing/52" title="StatesAndCountries CFWheels Plugin" target="_blank">StatesAndCountries plugin</a>&nbsp;for CFWheels has been updated.</p>
<p>Because my CFML work is focused solely on Railo and I do not have a current Adobe ColdFusion installation on my main work machine, I missed that there was an issue on ACF with the plugin (it could not find the asset files).&nbsp;</p>
<p>Jordan tweaked the plugin to work for him on ACF and then I went back in and made a few tweaks so that it will work on both now.&nbsp;</p>
<p>Thanks, again, to Jordan for his assistance and recommitting the code (pull requesting, whatever :) to the GitHub repo. This is why I freaking love open source code!</p>
	
</p>

<p><a href="http://craigkaminsky.me/cfwheels-statesandcountries-plugin-updated">Permalink</a> 

	| <a href="http://craigkaminsky.me/cfwheels-statesandcountries-plugin-updated#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/cfwheels-statesandcountries-plugin-updated</feedburner:origLink></item>
    <item>
      <pubDate>Mon, 19 Sep 2011 11:11:00 -0700</pubDate>
      <title>CFWheels and SES URLs</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/KRESU6nUaG4/cfwheels-and-ses-urls</link>
      <guid isPermaLink="false">http://craigkaminsky.me/cfwheels-and-ses-urls</guid>
      <description>
        <![CDATA[<p>
	<p>I&rsquo;ve been talking with a fellow CF'er and he was having some trouble getting SES URLs rolling in a Tomcat and CFWheels application that he&rsquo;s working on. Since I had to go through all sorts of &lsquo;fun&rsquo; times with SES URLs and Wheels a year ago, I thought I&rsquo;d write up a little post on my experiences and how I got the URLs I want. And, really, it ain&rsquo;t that bad.</p>

<h2>URLRewriteFilter</h2>

<p>First things first, download the excellent Java Web Filter library, <a href="http://www.tuckey.org/urlrewrite/">URLRewriteFilter</a>. Once downloaded, expand the Zip Archive. You will see a WEB-INF folder, inside of which, are two important items: urlrewrite.xml and lib/urlrewrite-3.2.0.jar. From here, it&rsquo;s not too difficult to figure out what&rsquo;s next &hellip; move these items (the XML and JAR) into the corresponding locations in your application&rsquo;s WEB-INF folder. Note that you may need to create a lib folder in your WEB-INF (I did).</p>

<h2>WEB.XML</h2>

<p>Next up, you need to add a declaration to your web.xml file (also located in WEB-INF) so that your server knows to load the URLRewriteFilter JAR. The addition is pretty simple.</p>

<p><div class="data type-text">
      <table class="lines" cellspacing="0" cellpadding="0">
        <tr>
          <td>
            <pre class="line_numbers"><span rel="#L1" id="L1">1</span>
<span rel="#L2" id="L2">2</span>
<span rel="#L3" id="L3">3</span>
<span rel="#L4" id="L4">4</span>
<span rel="#L5" id="L5">5</span>
<span rel="#L6" id="L6">6</span>
<span rel="#L7" id="L7">7</span>
<span rel="#L8" id="L8">8</span>
</pre>
          </td>
          <td width="100%">
                <div class="highlight"><pre /><div class="line" id="LC1">&lt;filter&gt;</div><div class="line" id="LC2">	&lt;filter-name&gt;UrlRewriteFilter&lt;/filter-name&gt;</div><div class="line" id="LC3">	&lt;filter-class&gt;org.tuckey.web.filters.urlrewrite.UrlRewriteFilter&lt;/filter-class&gt;</div><div class="line" id="LC4">&lt;/filter&gt;</div><div class="line" id="LC5">&lt;filter-mapping&gt;</div><div class="line" id="LC6">	&lt;filter-name&gt;UrlRewriteFilter&lt;/filter-name&gt;</div><div class="line" id="LC7">	&lt;url-pattern&gt;/*&lt;/url-pattern&gt;</div><div class="line" id="LC8">&lt;/filter-mapping&gt;  </div></pre></div>
          </td>
        </tr>
      </table>
  </div></p>

<p>Now the filter will be loaded when your server starts.</p>

<h2>URLREWRITE.XML</h2>

<p>Next, you need to instruct the URLRewriteFilter <em>how</em> to filter and pass on your requests, which is done by providing the conditions under which the filter should not run (in this case). For Wheels, there were two levels at which I did not want the filter to kick in:</p>

<ul>
<li>when certain folders were requested</li>
<li>when specific files were requested</li>
</ul>


<p>For organization and readability, I organized my filter declarations by folders and then files. As you can see from the XML document belowm I select all the major folders where your CFML server is doing stuff (e.g., flex2gateway or railo-context) or where static files are server (e.g., javascripts, stylesheets).</p>

<p>Once your conditions are in place, you need to just tell the filter from what and to which URLs should it rewrite. For Wheels, this appears as follows:</p>

<p><div class="data type-text">
      <table class="lines" cellspacing="0" cellpadding="0">
        <tr>
          <td>
            <pre class="line_numbers"><span rel="#L1" id="L1">1</span>
<span rel="#L2" id="L2">2</span>
<span rel="#L3" id="L3">3</span>
<span rel="#L4" id="L4">4</span>
<span rel="#L5" id="L5">5</span>
<span rel="#L6" id="L6">6</span>
<span rel="#L7" id="L7">7</span>
<span rel="#L8" id="L8">8</span>
<span rel="#L9" id="L9">9</span>
<span rel="#L10" id="L10">10</span>
<span rel="#L11" id="L11">11</span>
<span rel="#L12" id="L12">12</span>
<span rel="#L13" id="L13">13</span>
<span rel="#L14" id="L14">14</span>
<span rel="#L15" id="L15">15</span>
<span rel="#L16" id="L16">16</span>
<span rel="#L17" id="L17">17</span>
<span rel="#L18" id="L18">18</span>
<span rel="#L19" id="L19">19</span>
<span rel="#L20" id="L20">20</span>
<span rel="#L21" id="L21">21</span>
<span rel="#L22" id="L22">22</span>
<span rel="#L23" id="L23">23</span>
<span rel="#L24" id="L24">24</span>
</pre>
          </td>
          <td width="100%">
                <div class="highlight"><pre /><div class="line" id="LC1">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;</div><div class="line" id="LC2">&lt;!DOCTYPE urlrewrite PUBLIC &quot;-//tuckey.org//DTD UrlRewrite 2.6//EN&quot; &quot;http://tuckey.org/res/dtds/urlrewrite2.6.dtd&quot;&gt;</div><div class="line" id="LC3">&lt;urlrewrite&gt;</div><div class="line" id="LC4">	&lt;rule match-type=&quot;regex&quot;&gt;</div><div class="line" id="LC5">		&lt;!-- folder conditions --&gt;</div><div class="line" id="LC6">		&lt;condition type=&quot;request-uri&quot; operator=&quot;notequal&quot; next=&quot;and&quot;&gt;/flex2gateway/*&lt;/condition&gt;</div><div class="line" id="LC7">		&lt;condition type=&quot;request-uri&quot; operator=&quot;notequal&quot; next=&quot;and&quot;&gt;/jrunscripts/*&lt;/condition&gt;</div><div class="line" id="LC8">		&lt;condition type=&quot;request-uri&quot; operator=&quot;notequal&quot; next=&quot;and&quot;&gt;/cfide/*&lt;/condition&gt;</div><div class="line" id="LC9">		&lt;condition type=&quot;request-uri&quot; operator=&quot;notequal&quot; next=&quot;and&quot;&gt;/files/*&lt;/condition&gt;</div><div class="line" id="LC10">		&lt;condition type=&quot;request-uri&quot; operator=&quot;notequal&quot; next=&quot;and&quot;&gt;/flash/*&lt;/condition&gt;</div><div class="line" id="LC11">		&lt;condition type=&quot;request-uri&quot; operator=&quot;notequal&quot; next=&quot;and&quot;&gt;/images/*&lt;/condition&gt;</div><div class="line" id="LC12">		&lt;condition type=&quot;request-uri&quot; operator=&quot;notequal&quot; next=&quot;and&quot;&gt;/javascripts/*&lt;/condition&gt;</div><div class="line" id="LC13">		&lt;condition type=&quot;request-uri&quot; operator=&quot;notequal&quot; next=&quot;and&quot;&gt;/miscellaneous/*&lt;/condition&gt;</div><div class="line" id="LC14">		&lt;condition type=&quot;request-uri&quot; operator=&quot;notequal&quot; next=&quot;and&quot;&gt;/stylesheets/*&lt;/condition&gt;  </div><div class="line" id="LC15">		&lt;condition type=&quot;request-uri&quot; operator=&quot;notequal&quot; next=&quot;and&quot;&gt;/railo-context/*&lt;/condition&gt;  </div><div class="line" id="LC16">		&lt;!-- file conditions --&gt;</div><div class="line" id="LC17">		&lt;condition type=&quot;request-uri&quot; operator=&quot;notequal&quot; next=&quot;and&quot;&gt;/robots.txt&lt;/condition&gt;</div><div class="line" id="LC18">		&lt;condition type=&quot;request-uri&quot; operator=&quot;notequal&quot; next=&quot;and&quot;&gt;/sitemap.xml&lt;/condition&gt;</div><div class="line" id="LC19">		&lt;condition type=&quot;request-uri&quot; operator=&quot;notequal&quot; next=&quot;and&quot;&gt;/404.shtml&lt;/condition&gt;</div><div class="line" id="LC20">		&lt;condition type=&quot;request-uri&quot; operator=&quot;notequal&quot; next=&quot;and&quot;&gt;/favicon.ico&lt;/condition&gt;</div><div class="line" id="LC21">		&lt;from&gt;^(.*)$&lt;/from&gt;</div><div class="line" id="LC22">		&lt;to last=&quot;true&quot;&gt;/rewrite.cfm?\$pathinfo=$1&amp;amp;%{query-string}&lt;/to&gt;</div><div class="line" id="LC23">	&lt;/rule&gt; </div><div class="line" id="LC24">&lt;/urlrewrite&gt;         </div></pre></div>
          </td>
        </tr>
      </table>
  </div></p>

<h2>CFWheels</h2>

<p>The last piece of the puzzle &hellip; the framework itself. There are two (easy) steps to making URL rewrites happen in Wheels:</p>

<ul>
<li>Tell Wheels to turn on URLRewriting</li>
<li>Add a piece of code to events/onrequeststart.cfm for populating the path info**</li>
</ul>


<p>The first step is super-duper easy. Just add the following line in your config/settings.cfm file:</p>

<div class="CodeRay">
  <div class="code"><pre>set(URLRewriting=&quot;On&quot;)</pre></div>
</div>


<p>The second step is also easy. Add the following to events/onrequeststart.cfm:</p>

<div class="CodeRay">
  <div class="code"><pre>if(structKeyExists(url,&quot;$pathinfo&quot;)){
    request.cgi.path_info = url.$pathinfo
}</pre></div>
</div>


<p>**EDIT: Many thanks to Tony Petruzzi for pointing out this far more elegant solution.</p>

<p>That&rsquo;s it. From here, restart your CFML server and you&rsquo;re ready to roll. To see my SES URLs in action, head to <a href="http://www.ourayclimbing.com">Ouray Climbing</a> and start clicking some links!</p>

<p>P.S. I did write this post rather quickly, so let me know if you spot any errors or have any issues trying the same thing.</p>
	
</p>

<p><a href="http://craigkaminsky.me/cfwheels-and-ses-urls">Permalink</a> 

	| <a href="http://craigkaminsky.me/cfwheels-and-ses-urls#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/cfwheels-and-ses-urls</feedburner:origLink></item>
    <item>
      <pubDate>Sat, 10 Sep 2011 07:40:00 -0700</pubDate>
      <title>Rails HAML Heads Up with CSRF Tag and Destroy Calls</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/vcFsIZhM7-0/rails-haml-heads-up-with-csrf-tag-and-destroy</link>
      <guid isPermaLink="false">http://craigkaminsky.me/rails-haml-heads-up-with-csrf-tag-and-destroy</guid>
      <description>
        <![CDATA[<p>
	<h2>Rails HAML Gotcha with CSRF</h2>

<p>I&rsquo;ve been doing a good bit of work with Ruby 1.9.2 and Rails 3.0 and 3.1 lately. It&rsquo;s been a pretty exciting time as I have not really delved heavily into a new language in a couple of years (I had lots of CFML work from 2009-2011).</p>

<p>Right now, I&rsquo;m working on a site for our volunteer fire department, of which I am a member. I&rsquo;ve got the front-end of the site in place and lots of the admin/CMS section done, too. However, as I started running through admin/CMS tests, I found that none of my delete/destroy calls were not working. Every time I&rsquo;d try to delete something, it would log me out, force me to log back in and then fail to have run the delete.</p>

<p>I researched the issue on the Interwebs but only found references to needing the cross site request forgery meta tag in place (csrf_meta_tag) in your documents. However, I did have this in place &hellip; see the code block below:</p>

<h2>Admin Head Section</h2>

<div class="CodeRay">
  <div class="code"><pre><span class="tag">%head</span>
    <span class="tag">%title</span> Website Administration
    <span class="tag">%meta</span>{ <span class="symbol">:http_equiv</span>=&gt;<span class="string"><span class="delimiter">'</span><span class="content">Content-Type</span><span class="delimiter">'</span></span>, <span class="symbol">:content</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">text/html;</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">charset</span><span class="delimiter">'</span></span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">utf-8</span><span class="delimiter">'</span></span> }    
    = stylesheet_link_tag <span class="string"><span class="delimiter">&quot;</span><span class="content">960</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">reset</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">text</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">red</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">smoothness/ui</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">wysiwyg/jquery.wysiwyg</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">lightbox</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">admin</span><span class="delimiter">&quot;</span></span>
    = javascript_include_tag <span class="string"><span class="delimiter">&quot;</span><span class="content">jquery.min</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">jquery-ui-1.8.7.custom.min.js</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">jquery.blend-min</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">wysiwyg/jquery.wysiwyg</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">jquery.lightbox</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">jquery.slideto.min</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">jquery_ujs</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">admin</span><span class="delimiter">&quot;</span></span>        
    <span class="comment">/[if IE 6]</span>
        = stylesheet_link_tag <span class="string"><span class="delimiter">&quot;</span><span class="content">iefix</span><span class="delimiter">&quot;</span></span>
        = javascript_include_tag <span class="string"><span class="delimiter">&quot;</span><span class="content">pngfix</span><span class="delimiter">&quot;</span></span>
        <span class="tag">%script</span>{<span class="symbol">:type</span>=&gt;<span class="string"><span class="delimiter">&quot;</span><span class="content">text/javascript</span><span class="delimiter">&quot;</span></span>, <span class="symbol">:language</span>=&gt;<span class="string"><span class="delimiter">&quot;</span><span class="content">javascript</span><span class="delimiter">&quot;</span></span>} DD_belatedPNG.fix('#menu ul li a span span');
        = csrf_meta_tag</pre></div>
</div>


<p>Notice anything screwy in that? Because I clearly did not. My csrf_meta_tag was indented one step too far so that it was included in the IE6 conditional comments. D'oh!</p>

<p>It should have been &hellip;</p>

<div class="CodeRay">
  <div class="code"><pre><span class="tag">%head</span>
    <span class="tag">%title</span> Website Administration
    <span class="tag">%meta</span>{ <span class="symbol">:http_equiv</span>=&gt;<span class="string"><span class="delimiter">'</span><span class="content">Content-Type</span><span class="delimiter">'</span></span>, <span class="symbol">:content</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">text/html;</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">charset</span><span class="delimiter">'</span></span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">utf-8</span><span class="delimiter">'</span></span> }    
    = stylesheet_link_tag <span class="string"><span class="delimiter">&quot;</span><span class="content">960</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">reset</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">text</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">red</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">smoothness/ui</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">wysiwyg/jquery.wysiwyg</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">lightbox</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">admin</span><span class="delimiter">&quot;</span></span>
    = javascript_include_tag <span class="string"><span class="delimiter">&quot;</span><span class="content">jquery.min</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">jquery-ui-1.8.7.custom.min.js</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">jquery.blend-min</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">wysiwyg/jquery.wysiwyg</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">jquery.lightbox</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">jquery.slideto.min</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">jquery_ujs</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">admin</span><span class="delimiter">&quot;</span></span>                                                                                                
    = csrf_meta_tag   
    <span class="comment">/[if IE 6]</span>
        = stylesheet_link_tag <span class="string"><span class="delimiter">&quot;</span><span class="content">iefix</span><span class="delimiter">&quot;</span></span>
        = javascript_include_tag <span class="string"><span class="delimiter">&quot;</span><span class="content">pngfix</span><span class="delimiter">&quot;</span></span>
        <span class="tag">%script</span>{<span class="symbol">:type</span>=&gt;<span class="string"><span class="delimiter">&quot;</span><span class="content">text/javascript</span><span class="delimiter">&quot;</span></span>, <span class="symbol">:language</span>=&gt;<span class="string"><span class="delimiter">&quot;</span><span class="content">javascript</span><span class="delimiter">&quot;</span></span>} DD_belatedPNG.fix('#menu ul li a span span');</pre></div>
</div>


<p>Or &hellip;</p>

<div class="CodeRay">
  <div class="code"><pre><span class="tag">%head</span>
    <span class="tag">%title</span> Website Administration
    <span class="tag">%meta</span>{ <span class="symbol">:http_equiv</span>=&gt;<span class="string"><span class="delimiter">'</span><span class="content">Content-Type</span><span class="delimiter">'</span></span>, <span class="symbol">:content</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">text/html;</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">charset</span><span class="delimiter">'</span></span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">utf-8</span><span class="delimiter">'</span></span> }    
    = stylesheet_link_tag <span class="string"><span class="delimiter">&quot;</span><span class="content">960</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">reset</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">text</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">red</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">smoothness/ui</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">wysiwyg/jquery.wysiwyg</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">lightbox</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">admin</span><span class="delimiter">&quot;</span></span>
    = javascript_include_tag <span class="string"><span class="delimiter">&quot;</span><span class="content">jquery.min</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">jquery-ui-1.8.7.custom.min.js</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">jquery.blend-min</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">wysiwyg/jquery.wysiwyg</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">jquery.lightbox</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">jquery.slideto.min</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">jquery_ujs</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">admin</span><span class="delimiter">&quot;</span></span>        
    <span class="comment">/[if IE 6]</span>
        = stylesheet_link_tag <span class="string"><span class="delimiter">&quot;</span><span class="content">iefix</span><span class="delimiter">&quot;</span></span>
        = javascript_include_tag <span class="string"><span class="delimiter">&quot;</span><span class="content">pngfix</span><span class="delimiter">&quot;</span></span>
        <span class="tag">%script</span>{<span class="symbol">:type</span>=&gt;<span class="string"><span class="delimiter">&quot;</span><span class="content">text/javascript</span><span class="delimiter">&quot;</span></span>, <span class="symbol">:language</span>=&gt;<span class="string"><span class="delimiter">&quot;</span><span class="content">javascript</span><span class="delimiter">&quot;</span></span>} DD_belatedPNG.fix('#menu ul li a span span');
    = csrf_meta_tag</pre></div>
</div>


<p>Long story short, be sure to check your HAML indentations and orders if something is not working as expected!</p>
	
</p>

<p><a href="http://craigkaminsky.me/rails-haml-heads-up-with-csrf-tag-and-destroy">Permalink</a> 

	| <a href="http://craigkaminsky.me/rails-haml-heads-up-with-csrf-tag-and-destroy#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/rails-haml-heads-up-with-csrf-tag-and-destroy</feedburner:origLink></item>
    <item>
      <pubDate>Mon, 01 Aug 2011 10:25:09 -0700</pubDate>
      <title>How I Got Started in ColdFusion</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/ptAZmrtpi1s/how-i-got-started-in-coldfusion</link>
      <guid isPermaLink="false">http://craigkaminsky.me/how-i-got-started-in-coldfusion</guid>
      <description>
        <![CDATA[<p>
	<p>
<p><a href="http://www.bryantwebconsulting.com/blog/" target="_blank">Steve Bryant</a>&nbsp;recently suggested we make August 1, "How I Got Started in ColdFusion" day. The idea is to get as many CFML developers to write a blog post detailing how they got started with ColdFusion. I think it's a wonderful idea and, as such, following is my own story.&nbsp;</p>
<p>My first forray into ColdFusion began late in the magical decade that brought us grunge, a revival of hippie/jam-band music, and a booming economy: the 90's. I had just finished my Masters degree in Anthropology at the University of California, Santa Barbara and was moving (back) to the Washington DC area to get married. After an extended honeymoon of several months backpacking in the US West and another several months in Europe, I needed a job. Surprisingly, an MA in Anthropology did not yield jobs outside of a McDonald's. Weird, I know.&nbsp;</p>
<p>Shortly after I graduated from the University of Pittsburgh in 1992, I got a job at Quark, Inc. as a support technician. After a couple years at Quark, I was asked to and happily pitched in on the company's first-ever website. As a result of my QuarkXPress knowledge and experience, I was able to get a job in the marketing department for Government Executive magazine; designing and laying out brochures, simple HTML websites/web pages for events, mailers and the like.</p>
</p>
<p>After a month on the job, my boss requested that I build a website for an upcoming conference our magazine. The company's online magazine was built with ColdFusion 4.0 and we decided that it would be best for me to go ahead and use ColdFusion to build my marketing site. So, I set off one day after work with the following book under my arm:&nbsp;<div class='p_embed p_image_embed'>
<img alt="51echyjxyrl" height="300" src="http://getfile0.posterous.com/getfile/files.posterous.com/temp-2011-08-01/lufaDttEClwsdeBweIoEjnkjEaamnojHgrvrpJfisHJGJveneeBteidootvd/51ECHYJXYRL._SL500_AA300_.jpg.scaled500.jpg" width="300" />
</div>
</p>
<p>I spent a week, and this is what I LOVE about CFML, working through the book and some examples. One week later, we had a database-driven website for our upcoming Excellence in Government 2001 Conference. I just think this is the amazing thing about CFML ... I knew some HTML and some JavaScript and before I knew it, I had a nice looking, fully functional database-driven website to promote and provide all the required details about our upcoming conference. From a total novice to a solid, well working (albeit not a complex) site in two weeks ... that is just awesome!&nbsp;</p>
<p>Okay, fine ... get picky ... I was using Access and maybe calling that a database-driven site is giving it a bit too much credit :). I kid. I kid.&nbsp;</p>
<p>The site was a huge success and before I knew it my job had morphed from a marketing person to, basically, a web developer creating ColdFusion-driven websites for every thing and anything our directors could think of.&nbsp;</p>
<p>From there, I never looked back. Anthropology was a thing of the past and web development with ColdFusion was the way forward. And I could not be happier about how it all unfolded.&nbsp;</p>
	
</p>

<p><a href="http://craigkaminsky.me/how-i-got-started-in-coldfusion">Permalink</a> 

	| <a href="http://craigkaminsky.me/how-i-got-started-in-coldfusion#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
      <media:content type="image/jpeg" height="300" width="300" url="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2011-08-01/lufaDttEClwsdeBweIoEjnkjEaamnojHgrvrpJfisHJGJveneeBteidootvd/51ECHYJXYRL._SL500_AA300_.jpg">
        <media:thumbnail height="300" width="300" url="http://getfile0.posterous.com/getfile/files.posterous.com/temp-2011-08-01/lufaDttEClwsdeBweIoEjnkjEaamnojHgrvrpJfisHJGJveneeBteidootvd/51ECHYJXYRL._SL500_AA300_.jpg.scaled500.jpg" />
      </media:content>
    <feedburner:origLink>http://craigkaminsky.me/how-i-got-started-in-coldfusion</feedburner:origLink></item>
    <item>
      <pubDate>Thu, 16 Jun 2011 11:08:53 -0700</pubDate>
      <title>From VPS to the Cloud (AWS): Setting up an AMI for Railo</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/_A2ps1PugIU/from-vps-to-the-cloud-aws-setting-up-an-ami-f</link>
      <guid isPermaLink="false">http://craigkaminsky.me/from-vps-to-the-cloud-aws-setting-up-an-ami-f</guid>
      <description>
        <![CDATA[<p>
	<h2>From VPS to the AWS Cloud</h2>

<p>As I mentioned in one of my <a href="http://craigkaminsky.me/migrating-a-railo-application-from-a-traditio">last posts</a>, my primary client and I have undertaken a mission to make the application <a href="http://www.kronum.com/">kronum.com</a> more scalable and nimble, as we are experiencing sudden and dramatic spikes in our traffic.</p>

<p>The process of migrating from a traditional VPS stack to a nimbler Cloud setup has been quite educational and illuminating. It definitely alters how you view the architecture of your application. It&rsquo;s hard but fun.</p>

<h3>Disclaimer</h3>

<p>I want to call out that I am new to this AWS world and recognize that some or many of the options I&rsquo;ve selected may not be ideal or the best ones. I did my best to research it thoroughly and make good choices.</p>

<h3>Build the AMI YOU Want</h3>

<p>I&rsquo;ve been mulling over how to approach this series and, as if often the case, I find myself typically searching for similar topics over and over. One thing I often check for is how to install things on a Unix server. So, I wanted to detail how I built our current server on AWS, what services I chose to install, how I configured them and how it&rsquo;s played out.</p>

<p>I suppose the best place to start is to list off what we&rsquo;ll install and in which order these services will be installed. Please note that our production instance is a large 64-bit Ubuntu machine while the one I&rsquo;ll create below is for our staging system and will be a small 32-bit machine. Despite the differences in instance type (large v. small) and bit (64-bit v. 32-bit), the process for installing and the software chosen is identical.</p>

<h4>The Amazon Machine Image (AMI)</h4>

<p>I chose the pre-built <a href="http://aws.amazon.com/amazon-linux-ami/">Amazon Linux AMI</a> made available publically via the AWS console. For the purposes of this blog post, I chose this image because it&rsquo;s a minimal Linux install (you don&rsquo;t need to remove lots of options/software from some of the other available images) yet has the AWS configurations built in.</p>

<p>With my server chosen and running, I set out to begin installing the services I would need to run our application. In order of installation, they are:</p>

<ul>
<li>Apache Tomcat 7.0.x</li>
<li>ActiveMQ 5.5.x</li>
<li>Apache 2.2.x</li>
<li>Railo 3.3.000.x</li>
<li>VFTPD (ftp)</li>
<li>Postfix (mail)</li>
</ul>


<h4>Picking an Instance</h4>

<ul>
<li>Log onto AWS and select the EC2 tab</li>
<li>Click the Launch Instance button</li>
<li>Select the Amazon Basic 32-bit Amazon Linux AMI 2011.02.1 Beta (note: the date may change depending on when Amazon makes updates and this post is read)</li>
<li>Follow the Request Instances Wizard steps to complete the setup of your AMI</li>
<li>You should probably pick the Small instance (a few bucks per month) or the micro (free) unless you know you want a large instance (more money)</li>
<li>It will take a few minutes but, in short order, your instance will be up and running</li>
</ul>


<p>The instance wizard looks like this (and we&rsquo;re using the top AMI in this screen shot):
<img src="http://imageaid-bucket.s3.amazonaws.com/aws.instance.wizard.jpg" alt="Instance Wizard" /></p>

<h4>Elastic IP</h4>

<p>One thing to note about AWS is that each time you shut down (versus reboot) your instance, the IP address assigned to it will &lsquo;go away&rsquo; and upon your next boot, a new one will be assigned. This can be a pain in the ass for SSH connections, FTP, DNS, etc. To get around this issue, AWS has Elastic IP addresses. These IPs are static in that AWS allocates them to you. What&rsquo;s cool is that you can assign this IP address to any instance you want &hellip; and it will persist beyond stop/starts.</p>

<p>Getting started with an Elastic IP is quite easy.</p>

<ul>
<li>Select the Elastic IP link on the left-hand side of the EC2 page (under the section for Networking &amp; Security)</li>
<li>Press the button to allocate a new IP address and follow the prompts</li>
<li>Select the Elastic IP in the grid</li>
<li>Click the now-enabled button: Associate Address</li>
<li>Select your instance identifier from the select list</li>
</ul>


<p>Now you have a static IP from which you can access your server.</p>

<h4>Installing the Software/Services</h4>

<p>The first step to installing your software is to connect to the server itself. I use my Terminal and connect via SSH. For help doing this, return to the Instances section of the EC2 tab and select your instance in the grid. Then, expand the Instance Actions menu and select Connect. This will show you the SSH details. If you&rsquo;re not familiar with SSH and PEM key files, spend a few minutes learning about them.</p>

<p>Once connected to your instance, you&rsquo;re ready to install. To make your life easier for the installations, type &lsquo;sudo su&rsquo; (no quotes) at the prompt so you are now working as the super-user.</p>

<h4>Next Post</h4>

<p>In order to keep the posts fairl readable, in terms of length, I&rsquo;ll stop here and create a new post, which I am working on now, for the actual installations.</p>
	
</p>

<p><a href="http://craigkaminsky.me/from-vps-to-the-cloud-aws-setting-up-an-ami-f">Permalink</a> 

	| <a href="http://craigkaminsky.me/from-vps-to-the-cloud-aws-setting-up-an-ami-f#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/from-vps-to-the-cloud-aws-setting-up-an-ami-f</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 15 Apr 2011 18:30:00 -0700</pubDate>
      <title>CFML Many-to-Many ORM Gotcha ... Well, It Got Me!</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/Ho_1T4oBNco/cfml-many-to-many-orm-gotcha-well-it-got-me</link>
      <guid isPermaLink="false">http://craigkaminsky.me/cfml-many-to-many-orm-gotcha-well-it-got-me</guid>
      <description>
        <![CDATA[<p>
	<h2>Many-to-Many&rsquo;s</h2>

<p>I&rsquo;m working on a few ORM entities in a client&rsquo;s application tonight and came across an error that baffled me for a bit longer than it should have! I thought I would post it just in case someone else comes across it.</p>

<p>I have two entities: Teams and Sessions. A team can play in many sessions and a session can have many teams. They are joined via a link table in the DB. That table, SessionsTeams, has two columns: sessionid and teamid. It&rsquo;s nothing more than a basic many-to-many relationship.</p>

<p>The problem was that every time I attempted to load the entities the application threw an error: invalid column name &lsquo;teamid&rsquo;. After some searching and failed attempts at fixing the issue via the fkcolumn and inversejoincolumn attributes, it hit me that those attributes were fine and I was, simply, assigning the wrong column name to the orderby attribute. Here&rsquo;s where I went wrong:</p>

<h3>CFC Entities</h3>

<div class="CodeRay">
  <div class="code"><pre>// Team.cfc
component displayname=&quot;Team&quot; alias=&quot;Team&quot; output=&quot;false&quot; accessors=&quot;true&quot; persistent=&quot;true&quot; entityname=&quot;Team&quot; table=&quot;Teams&quot;{ 
    property name=&quot;ID&quot; type=&quot;string&quot; ormtype=&quot;string&quot; column=&quot;id&quot; generator=&quot;assigned&quot; fieldtype=&quot;id&quot;;
    property name=&quot;name&quot; type=&quot;string&quot; ormtype=&quot;string&quot; column=&quot;name&quot;;
    property name=&quot;sessions&quot; type=&quot;array&quot; fieldtype=&quot;many-to-many&quot; CFC=&quot;Session&quot; linktable=&quot;SessionsTeams&quot; FKColumn=&quot;teamid&quot; inversejoincolumn=&quot;sessionid&quot; lazy=&quot;false&quot; remotingFetch=&quot;true&quot; cascade=&quot;all&quot; orderby=&quot;team_id&quot;;   
    public Team function init(){
        return this;
    }
}   
// Session.cfc
component displayname=&quot;Session&quot; alias=&quot;Session&quot; output=&quot;false&quot; accessors=&quot;true&quot; persistent=&quot;true&quot; entityname=&quot;Session&quot; table=&quot;Sessions&quot;{     
    property name=&quot;sessionID&quot; type=&quot;numeric&quot; ormtype=&quot;integer&quot; column=&quot;id&quot; generated=&quot;insert&quot; generator=&quot;native&quot; fieldtype=&quot;id&quot;;
    property name=&quot;sessionTitle&quot; type=&quot;string&quot; ormtype=&quot;string&quot; column=&quot;session_title&quot;;
    property name=&quot;sessionTeams&quot; type=&quot;array&quot; fieldtype=&quot;many-to-many&quot; CFC=&quot;Team&quot; linktable=&quot;SessionsTeams&quot; FKColumn=&quot;sessionid&quot; inversejoincolumn=&quot;teamid&quot; remotingFetch=&quot;true&quot; lazy=&quot;false&quot; cascade=&quot;all&quot; orderby=&quot;id&quot;;          
    public Session function init(){
        return this;
    }
}</pre></div>
</div>


<h3>Ah-ha!</h3>

<p>I mistakenly thought that the orderby attribute is meant to reference a column in the link table and not the source table.  So, changing the orderby to reference the &lsquo;id&rsquo; column/property in the source entity solved the issue.</p>

<div class="CodeRay">
  <div class="code"><pre>// In Team.cfc
property name=&quot;sessions&quot; type=&quot;array&quot; fieldtype=&quot;many-to-many&quot; ... orderby=&quot;id&quot;;
// In Session.cfc
property name=&quot;sessionTeams&quot; type=&quot;array&quot; fieldtype=&quot;many-to-many&quot; ... orderby=&quot;id&quot;;</pre></div>
</div>


<p>When I was learning about creating the many-to-many relationship with CFML&rsquo;s (Railo in my case) ORM, I never saw details in the docs about this attribute. So, I thought I&rsquo;d post my screw-up story in the event someone else ends up down the path I took (and I hope no one does ;&ndash;).</p>
	
</p>

<p><a href="http://craigkaminsky.me/cfml-many-to-many-orm-gotcha-well-it-got-me">Permalink</a> 

	| <a href="http://craigkaminsky.me/cfml-many-to-many-orm-gotcha-well-it-got-me#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/cfml-many-to-many-orm-gotcha-well-it-got-me</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 15 Apr 2011 07:51:00 -0700</pubDate>
      <title>Migrating a Railo Application from a Traditional VPS to the Cloud (AWS): It Begins</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/ZdRdarvjnkU/migrating-a-railo-application-from-a-traditio</link>
      <guid isPermaLink="false">http://craigkaminsky.me/migrating-a-railo-application-from-a-traditio</guid>
      <description>
        <![CDATA[<p>
	<p>This has been a very exciting week with the Kronum project (<a href="http://kronum.com" title="Kronum Website" target="_blank">kronum.com</a>). Kronum is a new entry to the American sports scene. It's a mashup of several different sports (basketball, soccer, and others) played on a circular field outdoors. Over the past two weeks, we've seen our web traffic go from ~200 visitors per day to 13,000+. What happened to increase our traffic so dramatically and so quickly?&nbsp;The beauty of the viral web is what happened.</p>
<p>About 10 days ago, we got tweeted about from actor Rob Lowe and that's where it seems to have started. From there, Kronum ended up featured on <a href="http://www.wired.com/playbook/2011/04/kronum-unholy-sports-mashup/" title="Kronum Wired Article" target="_blank">Wired</a>, then on <a href="http://www.facebook.com/sportsnation" title="ESPN Sportsnation on Facebook" target="_blank">ESPN Sportsnation's Facebook</a> page and will soon be featured on the Sportsnation TV show as well as in ESPN the magazine. While the Lowe tweet got the ball rolling, the Wired article really upped the ante. We broke 30,000 visitors in the 24 hours after that story was launched.</p>
<p>All in all, this initial load was handled fairly well, especially given the nature of the site (more on that below). There were two server crashes during this traffic: one was a result of a corrupted CouchDB cached document and the other was Apache HTTPD failing because of too many concurrent requests. Both of which were easy enough to resolve.</p>
<p>However, the rapid spike in traffic and the consistent trending of Kronum across the intrawebs and other traditional media led the Kronum team to reevaluate their infrastructure. The team realizes that they are on the cusp of things really taking off and that what happened in the past two weeks was nothing compared to what is (hopefully) coming.</p>
<p>The Kronum League is about to begin their first recreation league session in Philadelphia, where the sport is located and headquartered, and its third official, professional season of the sport starts later this summer. The start of these seasons, coupled with the growing media and web attention, should provide an even greater spike in traffic over the coming months.&nbsp;</p>
<p>My part in all this is really small. I am the (only) guy responsible for three large areas of the application: back-end code, the database, and the servers. Okay, not really a 'small' part, huh?&nbsp;</p>
<p>Here's where we are today.</p>
<p>The Web and DB Servers Specs:</p>
<ul>
<li>Railo 3.2 (with BlazeDS)</li>
<li>Apache Tomcat 7 (64-bit)</li>
<li>Apache HTTPD 2.2.15 (32-bit)</li>
<li>MS SQL Server 2008 Web edition</li>
<li>Apache CouchDB 1.0.2 (for cache)</li>
<li>Apache ActiveMQ 5.4.1 (for messaging)</li>
</ul>
<p>The Code/Application:&nbsp;</p>
<ul>
<li>Back-end written in CFML with no framework</li>
<li>Java used in specific spots for handling ActiveMQ messaging and connections</li>
<li>CFTracker 2.1 to monitor memory and sessions on our application</li>
<li>Front-end is a 100% Flex/Flash application</li>
</ul>
<p>Server I:</p>
<ul>
<li>Win2K3 R2 64-bit (SP 2 installed)</li>
<li>8 GB RAM</li>
<li>Intel Xeon Quad 2.33 GHz Processor</li>
<li>~400GB of disk space</li>
<li>Primary role is that of the web server (Apache HTTPD, Apache Tomcat, and Railo)</li>
<li>Secondary role is that of a DB server for our staging site</li>
</ul>
<p>Server II (this server was added about a year after Server I):</p>
<ul>
<li>Win2K3 R2 64-bit</li>
<li>8 GB of RAM</li>
<li>Intel Xeon 8 core 2.4 GHz Processor</li>
<li>~400GB of disk space</li>
<li>Primary role is that of a DB server (SQL Server 2008)</li>
<li>Secondary role is that of a web server for our staging site</li>
</ul>
<p>As you can see, the server is pretty beefy, which might beg the question, "Why move and why move to AWS in particular?" The primary motivation is twofold: (1) a move to AWS will reduce the existing server costs by ~35% and (2) the application needs to be nimble for these spikes in traffic. It is this second motivation that is truly driving the change (though the fact that we could now run 2 web servers and 1 dedicated DB server for the same price as the current hosting cost doesn't hurt).</p>
<p><strong>Disclaimer</strong>: I will not name our current web host because our transition has nothing to do with them. They have been fantastic to work with and do a great job of responding to requests, etc. The move is entirely to save some money and, as I said above, to be more nimble in times of heavy load.</p>
<p>The Application's Problems:</p>
<ul>
<li>The front-end of the site is built entirely in Flex/Flash and is VERY graphic intensive (it is not just large graphics ... it sends 100s of graphics to the client).</li>
<li>The front-end is made up of 4.5 MB of Flash SWFs (the main SWF and accompanying modules), not counting the aforementioned images/graphics.&nbsp;</li>
<li>Caching is barely used at all on the front-end (e.g., the homepage alone sends 6.3 MB of graphics to the client, of which only 847.7 KB worth are grabbed from cache).&nbsp;</li>
<li>The back-end, which I inherited and unfortunately, had to follow, is a horrible mess of objects. There are remote services for Flex connections but these remote services then call internal services that then do all the work (and those services then call various DAOs, other services and VOs/Beans). Given that one of CFML's weaknesses is the speed at which objects are created we create a boatload of objects unnecessarily with each request.</li>
<li>There are many expensive database calls and there is not a really great way around them (more sql-tuning, sure, but it's one of those "they are what we thought they would be" things ... ass kickers :).</li>
<li>There is minimal caching on the back-end (not for my lack of wanting to implement it).</li>
<li>We server all our images from the local web server (videos are streamed from a CDN).</li>
</ul>
<p>The Server's Problems:</p>
<ul>
<li>They are pretty expensive (not to say that they are undervalued).</li>
<li>It takes a good bit to get another server setup, configured and running (1-2 business days)</li>
<li>We are locked into SQL Server 2008 Web edition, which lacks replication, unless we want to pay ~$17,000 for the Enterprise license on our two DB server installs.&nbsp;</li>
<li>We prefer Apache servers and they simply do not run as well on Windows as they do on Linux.</li>
<li>The Win2K3 OS takes away precious server resources not as readily lost in a Linux server.</li>
<li>Security is tougher on Windows than Linux (note this is a comparative statement and not a statement that there are no security issues on Linux) and while this is handled admirably by our current host, it's still a point of concern, albeit a minor one.</li>
</ul>
<p>We are now in the process of migrating to Amazon Web Services (AWS). We have setup our initial machine image (AMI) with the following:</p>
<ul>
<li>Large Instance (64-bit, 7.5 GB RAM, 850 GB disk, 2 virtual cores with 2 EC2 compute cycles each, and high I/O performance)</li>
<li>Ubuntu 10.10 Server 64-bit</li>
<li>Sun/Oracle's JDK 1.6.0_24 64-bit</li>
<li>Apache HTTPD 2.2.x (I forget the exact rev)&nbsp;64-bit</li>
<li>Apache Tomcat 7.0.12&nbsp;64-bit</li>
<li>Apache&nbsp;Tomcat Native Connectors&nbsp;64-bit</li>
<li>Apache CouchDB 1.0.1&nbsp;64-bit</li>
<li>Apache ActiveMQ 5.5&nbsp;64-bit</li>
<li>Railo 3.3 (w/ BlazeDS, of course)</li>
<li>VSFTP</li>
<li>openSSL</li>
<li>The code base</li>
<li>EBS volume tied to our AMI</li>
</ul>
<p>Next up, we'll be making the following changes and migrations:</p>
<ul>
<li>Complete testing and tuning of new AMI and flip the switch to use this server (Saturday night is the 'big date').</li>
<li>Migrate the SQL Server 2008 DB to MySQL 5.1.x running on Amazon's RDS, which supplies replication and backups as part of the service as well as failover protection! In the short run, we will continue to use our SQL Server DB from our existing server with the new site server.</li>
<li>Migrate sending mail from the application to Amazon SES.</li>
<li>Begin to serve our images and other static content from S3 (it's already been set up on S3).</li>
<li>Utilize Amazon's CloudWatch service to auto-scale the site as needed.</li>
<li>Setup the Elastic Load Balancer.</li>
</ul>
<p>Over the next couple of weeks, I'm going to be doing some posts in the following categories:</p>
<ul>
<li>Getting started on AWS for CFML applications (i.e., building your server, installing software, configuring the server for security and performance, getting ActiveMQ and Tomcat to talk)</li>
<li>Migrating from MS SQL to MySQL on RDS</li>
<li>Load testing your site</li>
<li>Scaling on the cloud</li>
<li>Kick-ass OSS CFML applications to help you run a better site (CFTracker and Hoth in particular)</li>
<li>Refactoring your CFML code (i.e., transition to S3 for serving static content, cache the shit out of your app, get rid of overly complex OOP in favor of lighter and nimbler OOP, integrating ORM into an existing, non-ORM application, tuning DB queries when ORM is not enough)&nbsp;</li>
</ul>
<p>This migration is a pretty huge and really cool project; one that I am very excited to be a part. If there is something else involved in making such a transition please let me know and I can add it to my list of forthcoming posts. If you have any other questions on what we're doing and why, please don't hesitate to send me a note or drop a comment.&nbsp;</p>
	
</p>

<p><a href="http://craigkaminsky.me/migrating-a-railo-application-from-a-traditio">Permalink</a> 

	| <a href="http://craigkaminsky.me/migrating-a-railo-application-from-a-traditio#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/migrating-a-railo-application-from-a-traditio</feedburner:origLink></item>
    <item>
      <pubDate>Wed, 23 Mar 2011 15:16:00 -0700</pubDate>
      <title>Railo/CFML Spreadsheets Made Easy (Well, Easier, Really)</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/K1ZRDRlA9rQ/railocfml-spreadsheets-made-easy-well-easier</link>
      <guid isPermaLink="false">http://craigkaminsky.me/railocfml-spreadsheets-made-easy-well-easier</guid>
      <description>
        <![CDATA[<p>
	<h2>Spreadsheets Made Even Easier in Railo</h2>

<p>First and foremost, I want to give a huge shout out and thanks to Andy Jarrett (<a href="http://www.twitter.com/andyj">@andyj</a> and <a href="http://www.andyjarrett.co.uk/blog/">Blog</a> ) for his work on the  tag &amp; functions extension for Railo. His work on this extension, and making it publicly available for all of us, just made my life infinitely easier.</p>

<h3>The Problem</h3>

<p>My client wanted to get a list of all members on his site who have logged in over the last year. He wanted to know how many times each user logged in each month over the previous year (previous year being determined by the current date). He wanted the data presented in an XLS file, sorted from the most logons to the least.</p>

<h3>The Solution</h3>

<p>We all know that there are plenty of ways to go about creating a spreadsheet from CFML and none of them are too awful. However, I needed something that would be very easy and fast because I knew the data was going to be a bit of a bear to work with and time was limited. The new CF9 spreadsheet functionality fit the bill, however, it has not yet been incorporated into the Railo core.</p>

<p>At the database level, I had some fun creating a couple of UDFs and a View so that I could easily call for this data from CFML. No problems here. Okay, I&rsquo;ll confess that the view and udfs were a bit tricky … but they were fun problems to solve (NERD ALERT :)!</p>

<p>Enter Andy&rsquo;s extension. To start, I had to install the extension on Railo (duh). Like the update process for Railo, it&rsquo;s incredibly easy to add extensions to your Railo server. Since Andy wrote up all the basics needed for installation on his blog, you should check out his post <a href="http://www.andyjarrett.co.uk/blog/index.cfm/2011/1/4/cfspreadsheet-for-Railo-update">http://www.andyjarrett.co.uk/blog/index.cfm/2011/&frac14;/cfspreadsheet-for-Railo-update</a> for installation/setup details.</p>

<p>Once the extension was installed and the server restarted, which took a few minutes tops, all of CF9&rsquo;s spreadsheet functions and the cfspreadsheet tag are now at my disposal in Railo.</p>

<p>From here, it took me ~10 minutes to write and test the code that would generate and output my XLS file … and this is all the code it took!</p>

<p><div class="data type-text">
      <table class="lines" cellspacing="0" cellpadding="0">
        <tr>
          <td>
            <pre class="line_numbers"><span rel="#L1" id="L1">1</span>
<span rel="#L2" id="L2">2</span>
<span rel="#L3" id="L3">3</span>
<span rel="#L4" id="L4">4</span>
<span rel="#L5" id="L5">5</span>
<span rel="#L6" id="L6">6</span>
<span rel="#L7" id="L7">7</span>
<span rel="#L8" id="L8">8</span>
<span rel="#L9" id="L9">9</span>
<span rel="#L10" id="L10">10</span>
<span rel="#L11" id="L11">11</span>
<span rel="#L12" id="L12">12</span>
<span rel="#L13" id="L13">13</span>
<span rel="#L14" id="L14">14</span>
<span rel="#L15" id="L15">15</span>
<span rel="#L16" id="L16">16</span>
<span rel="#L17" id="L17">17</span>
<span rel="#L18" id="L18">18</span>
<span rel="#L19" id="L19">19</span>
<span rel="#L20" id="L20">20</span>
<span rel="#L21" id="L21">21</span>
<span rel="#L22" id="L22">22</span>
<span rel="#L23" id="L23">23</span>
<span rel="#L24" id="L24">24</span>
<span rel="#L25" id="L25">25</span>
<span rel="#L26" id="L26">26</span>
<span rel="#L27" id="L27">27</span>
<span rel="#L28" id="L28">28</span>
<span rel="#L29" id="L29">29</span>
<span rel="#L30" id="L30">30</span>
<span rel="#L31" id="L31">31</span>
<span rel="#L32" id="L32">32</span>
<span rel="#L33" id="L33">33</span>
<span rel="#L34" id="L34">34</span>
<span rel="#L35" id="L35">35</span>
<span rel="#L36" id="L36">36</span>
<span rel="#L37" id="L37">37</span>
<span rel="#L38" id="L38">38</span>
<span rel="#L39" id="L39">39</span>
<span rel="#L40" id="L40">40</span>
<span rel="#L41" id="L41">41</span>
<span rel="#L42" id="L42">42</span>
</pre>
          </td>
          <td width="100%">
                <div class="highlight"><pre /><div class="line" id="LC1">// the CFC I use to grab the data</div><div class="line" id="LC2">component displayname=&quot;MemberActivity&quot; hint=&quot;I generate reports on Member Activity&quot;{</div><div class="line" id="LC3"><br /></div><div class="line" id="LC4">	public MemberActivity function init(){</div><div class="line" id="LC5">		return this;</div><div class="line" id="LC6">	}</div><div class="line" id="LC7"><br /></div><div class="line" id="LC8">	public query function getMemberLogonActivity(){</div><div class="line" id="LC9">		var result = &quot;&quot;;</div><div class="line" id="LC10">		var q_service = new query();</div><div class="line" id="LC11">		q_service.setDatasource(MYDSNVAR);</div><div class="line" id="LC12">		q_service.setName(&quot;getMemberLogonActivity&quot;);</div><div class="line" id="LC13">		q_service.setSQL(</div><div class="line" id="LC14">			&quot;SELECT first_name, last_name, email, state, registration_date, personality_factor, </div><div class="line" id="LC15">			month_1_logons, month_2_logons, month_3_logons, month_4_logons, month_5_logons, month_6_logons,</div><div class="line" id="LC16">			month_7_logons, month_8_logons, month_9_logons, month_10_logons, month_11_logons, month_12_logons,</div><div class="line" id="LC17">			total_annual_logons</div><div class="line" id="LC18">			FROM vw_MemberLogonActivity</div><div class="line" id="LC19">			WHERE total_annual_logons &gt; 0</div><div class="line" id="LC20">			ORDER BY total_annual_logons DESC&quot;</div><div class="line" id="LC21">		);</div><div class="line" id="LC22">		result = q_service.execute();</div><div class="line" id="LC23">		return result.getResult();</div><div class="line" id="LC24">	}</div><div class="line" id="LC25"><br /></div><div class="line" id="LC26">}</div><div class="line" id="LC27"><br /></div><div class="line" id="LC28">// In the calling template: </div><div class="line" id="LC29">&lt;cfscript&gt;</div><div class="line" id="LC30">	service = createObject(&quot;component&quot;,&quot;MemberActivity&quot;).init();</div><div class="line" id="LC31">	activity = service.getMemberLogonActivity();</div><div class="line" id="LC32">	// first we create the spreadsheet object</div><div class="line" id="LC33">	spreadsheet = spreadsheetNew(&quot;memberactivityreport&quot;);</div><div class="line" id="LC34">	// next we add the header row</div><div class="line" id="LC35">	spreadsheetAddRow(spreadsheet,&quot;first_name, last_name, email, state, registration_date, personality_factor, month_1_logons, month_2_logons, month_3_logons, month_4_logons, month_5_logons, month_6_logons, month_7_logons, month_8_logons, month_9_logons, month_10_logons, month_11_logons, month_12_logons, total_annual_logons&quot;);</div><div class="line" id="LC36">	// I want to format my headers so that they&#39;re bold and centered</div><div class="line" id="LC37">	spreadsheetFormatRow(spreadsheet,{bold=true,alignment=&quot;center&quot;},1);</div><div class="line" id="LC38">	// Ah, CFML how I love you. Just use the spreadsheetAddRows method to add your entire query to the spreadsheet</div><div class="line" id="LC39">	spreadsheetAddRows(spreadsheet,activity);</div><div class="line" id="LC40">	// finally, write the file to the server/file system</div><div class="line" id="LC41">	spreadsheetWrite(spreadsheet,&quot;/path/to/file/member_activity_#dateFormat(now(),&#39;mm_dd_yyyy&#39;)#.xls&quot;);</div><div class="line" id="LC42">&lt;/cfscript&gt;</div></pre></div>
          </td>
        </tr>
      </table>
  </div></p>

<h3>CFMLove</h3>

<p>I love the fact that CFML (and Andy&rsquo;s extension!) allowed me to spend the majority of my time working on the data and, once I had that sorted, I did not have to eff around trying to figure out how to present it. That part was easy and just freaking worked!</p>

<p>If you need to do some spreadsheet output and you&rsquo;re on Railo, be sure to checkout the extension. I&rsquo;m pretty sure you&rsquo;ll be as stoked about it as I am!</p>
	
</p>

<p><a href="http://craigkaminsky.me/railocfml-spreadsheets-made-easy-well-easier">Permalink</a> 

	| <a href="http://craigkaminsky.me/railocfml-spreadsheets-made-easy-well-easier#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/railocfml-spreadsheets-made-easy-well-easier</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 04 Mar 2011 13:11:00 -0800</pubDate>
      <title>CFEclipse Themerations</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/cvjuc1whpk8/cfeclipse-themerations</link>
      <guid isPermaLink="false">http://craigkaminsky.me/cfeclipse-themerations</guid>
      <description>
        <![CDATA[<p>
	<h2>CFEclipse Themes</h2>

<p>I&rsquo;ll admit it &hellip; I&rsquo;m one of those developers who prefers to work with dark backgrounds in his IDEs. To that end, I use <a href="http://www.aptana.com">Atpana Studio 3</a> and <a href="http://www.cfeclipse.org">CFeclipse</a> for the bulk of my work.</p>

<p>Aptana Studio 3 has some great theme options out there (you can actually import <a href="http://www.macromates.com">TextMate</a> themes directly to Aptana). So, when I&rsquo;m coding my JavaScript, XML, CSS, and HTML editors look bad-ass. Naturally, I needed CFEclipse to be bad-ass too!</p>

<p>To that end, I created a few CFEclipse themes, for lack of a better word, to match my most commonly used Aptana Studio 3 themes. I have four currently online for download. One important thing to note: I removed my primary and secondary browser details from the prefs. I also removed my snippets path. These pref files/themes only contain color details.</p>

<h3>Downloadable Themes/Prefs</h3>

<ol>
<li><a href="https://s3.amazonaws.com/oss-projects/cfeclipse.themes/org.cfeclipse.cfml.twilight.prefs">Twilight</a></li>
<li><a href="https://s3.amazonaws.com/oss-projects/cfeclipse.themes/org.cfeclipse.cfml.barf.prefs">Barf</a></li>
<li><a href="https://s3.amazonaws.com/oss-projects/cfeclipse.themes/org.cfeclipse.cfml.creeper.prefs">Creeper</a></li>
<li><a href="https://s3.amazonaws.com/oss-projects/cfeclipse.themes/org.cfeclipse.cfml.monokai.dark.prefs">Monokai Dark</a></li>
</ol>


<p>I&rsquo;ve tested/used these on 1.4.4+ of CFEclipse. No problems or anything like that &hellip; well, other than my wife walking by my screen and making fake vomitting noises!</p>

<h3>To install</h3>

<ol>
<li>Shut down Eclipse (if running).</li>
<li>Download the desired prefs file or files.</li>
<li>Rename the file so that the theme name is remove (i.e., org.cfeclipse.cfml.barf.prefs should become org.cfeclipse.cfml.prefs).</li>
<li>Get to your theme location for Eclipse (/YOURWORKSPACEFOLDER/.metadata/.plugins/org.eclipse.core.runtime/.settings).</li>
<li>For the love of all that&rsquo;s good, back up your existing CFEclipse prefs :).</li>
<li>Drop in the newly downloaded prefs file.</li>
<li>Start Eclipse.</li>
</ol>


<p>That&rsquo;s it. You now have some tasteless, I mean bad-ass, color schemes for CFEclipse!</p>

<h3>Preview Themes/Color Schemes</h3>

<p>Thanks to Dan Switzer (@dswitzer2) for calling out my laziness at not having screen shots. I&rsquo;ve gotten off my ass and done that. Thanks, Dan :)!</p>

<p><em>Twilight</em>
<img src="https://s3.amazonaws.com/oss-projects/cfeclipse.themes/cfeclipse.twilight.jpg" alt="Twilight" /></p>

<p><em>Barf</em>
<img src="https://s3.amazonaws.com/oss-projects/cfeclipse.themes/cfeclipse.barf.jpg" alt="Barf" /></p>

<p><em>Creeper</em>
<img src="https://s3.amazonaws.com/oss-projects/cfeclipse.themes/cfeclipse.creeper.jpg" alt="Creeper" /></p>

<p><em>Monokai Dark</em>
<img src="https://s3.amazonaws.com/oss-projects/cfeclipse.themes/cfeclipse.monokai.dark.jpg" alt="Monokai Dark" /></p>
	
</p>

<p><a href="http://craigkaminsky.me/cfeclipse-themerations">Permalink</a> 

	| <a href="http://craigkaminsky.me/cfeclipse-themerations#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/cfeclipse-themerations</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 18 Feb 2011 06:58:00 -0800</pubDate>
      <title>Time for Something New</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/B5QGqskpLzo/time-for-something-new</link>
      <guid isPermaLink="false">http://craigkaminsky.me/time-for-something-new</guid>
      <description>
        <![CDATA[<p>
	<p>The first two months of the year are always the toughest for me. In early January my middle school basketball coaching starts up in earnest (we start pre-season practices in late October but those are just not the same as when the real season gets rolling). I basically spend the first 8 weeks of the year treading water; keeping my clients' projects moving along but not really having much time for other projects and such.&nbsp;Well, my basketball season ends Saturday and that's all about to change!&nbsp;</p>
<p>Yesterday, on a short break, I perused some tweets and came across <a href="https://twitter.com/#!/bittersweetryan/status/38263466951323648" target="_blank">one</a> from <a href="http://twitter.com/#!/bittersweetryan" target="_blank">@bitterweetryan</a> that caught my eye. The idea in his tweet is simple: CFML developers need to branch out and learn new languages. Then, we should bring back ideas from these learnings, if you will, to CFML.&nbsp;It's an excellent idea.&nbsp;</p>
<p>Over the last 10 years, I have found no better web development option than CFML. And, I've found no better group of developers with whom to interact, work and share. We CFML'ers love our language dearly, but sometimes, I see us get stuck in the ways of the force, 'er CFML, and fail to see the other options or approaches that surround us.&nbsp;</p>
<p>With this in mind, I am going to begin a set of classes at the&nbsp;<a href="http://www.oreillyschool.com/" target="_blank">O'Reilly School of Technology</a>&nbsp;(OST) to get 'certified' in in <a href="http://www.oreillyschool.com/certificates/python-programming.php" target="_blank">Python</a> starting this Monday. As I get going on the courses required to earn the Python certificate, I am going to implement some things I learn into my on-going CFML project at Kronum.com. Naturally I'll write long-winded, inane blog posts about the process.&nbsp;</p>
<p>I'm very excited to get started and, once again, want to give a shout out to <a href="http://blog.bittersweetryan.com/" target="_blank">Ryan Anklam</a>&nbsp;for the initial inspiration to get this ball rolling.&nbsp;</p>
<p>Also, and for a bit of fun, you can see my old testimonial on the OST '<a href="http://www.oreillyschool.com/why/testimonials.php" target="_blank">Why</a>' page. I'm the one with the humongous snake wrapped around my neck. That sounds worse than it is ... really ;-)!</p>
<p>&nbsp;</p>
	
</p>

<p><a href="http://craigkaminsky.me/time-for-something-new">Permalink</a> 

	| <a href="http://craigkaminsky.me/time-for-something-new#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/time-for-something-new</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 28 Jan 2011 07:04:00 -0800</pubDate>
      <title>Some New CFWheels Plugins to Checkout</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/4IWt0EwcVKs/some-new-cfwheels-plugins-to-checkout</link>
      <guid isPermaLink="false">http://craigkaminsky.me/some-new-cfwheels-plugins-to-checkout</guid>
      <description>
        <![CDATA[<p>
	<p>A couple of pretty sweet-looking plugins have been released on the CFWheels site's <a href="http://cfwheels.org/plugins" target="_blank">plugin page</a>.</p>
<p>I'm particularly excited about <a href="http://cfwheels.org/plugins/listing/57" target="_blank">WURFL</a> (love the name as it reminds me of a radio station's call signs :). It's a wrapper for the Java API for mobile device capabilities and features. It's one of those projects that I wanted to actually create a plugin for but, fortunately, someone smarter (and probably better looking, too) did it.&nbsp;</p>
<p>Some other interesting CFWheels plugins released yesterday include:</p>
<ul>
<li><a href="http://cfwheels.org/plugins/listing/58" target="_blank">UploadableFiles</a>: Moves upload logic to the model. Pretty interesting.</li>
<li><a href="http://cfwheels.org/plugins/listing/54" target="_blank">LocaleRB</a>: An easy way to use a locale class in CFWheels. Nice feature for translating a site across languages.</li>
<li><a href="http://cfwheels.org/plugins/listing/55" target="_blank">MaxMindGeoIP</a>: Now, this just looks bad-ass.&nbsp;</li>
</ul>
<p>Those are a few of the newly released ones. So, if you're a Wheels user, do check out the new plugins available on the CFWheels site.&nbsp;</p>
	
</p>

<p><a href="http://craigkaminsky.me/some-new-cfwheels-plugins-to-checkout">Permalink</a> 

	| <a href="http://craigkaminsky.me/some-new-cfwheels-plugins-to-checkout#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/some-new-cfwheels-plugins-to-checkout</feedburner:origLink></item>
    <item>
      <pubDate>Thu, 20 Jan 2011 12:15:00 -0800</pubDate>
      <title>WireFrame Sketcher - Excellent Eclipse Plugin</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/8DlOxFOdyDU/wireframe-sketcher-excellent-eclipse-plugin</link>
      <guid isPermaLink="false">http://craigkaminsky.me/wireframe-sketcher-excellent-eclipse-plugin</guid>
      <description>
        <![CDATA[<p>
	<p>In late December, I was given an opportunity to test <a href="http://wireframesketcher.com/" target="_blank">WireFrameSketcher</a>, a wireframe plugin for Eclipse.</p>
<p>I've used (and enjoyed) Balsamiq mockups over the past year or two and I like it very much. However, I found that I typically gave up on those mockups because I had to open another app, toggle between the apps, and so on. Enter <a href="http://wireframesketcher.com/" target="_blank">WireFrameSketcher</a> ...</p>
<p>Rather than a lengthy review of features, I thought I'd do a general summary about using the software and then offer a pro/con list for more specific things I like, etc.&nbsp;</p>
<p><strong>My Development Environment</strong>:<br />First, and because I think it's quite relevant, most of my development is done on a&nbsp;Mac and I use Aptana Studio 3, with CFEclipse installed for CFML work, as my main IDE. While I do use some other tools (most notably, TextMate and IntelliJ IDEA), most of my day is spent in Eclipse (if not Aptana, then Flash Builder). As such, I was very excited to have a wireframe tool that fit right into my IDE.</p>
<p><strong>Using WireFrameSketcher</strong>:<br />Getting started could not have been easier. Install WireFrameSketcher as you would any other <a href="http://wiki.eclipse.org/FAQ_How_do_I_install_new_plug-ins%3F" target="_blank">Eclipse plugin</a>. From there, you simply select the Sketching perspective, create a new (general) project and off you go! You start by creating a 'screen' in your new project. This is the wireframe itself.</p>
<p>As far as creating the wireframes, this, too, was quite easy to get rolling. Create a new project (there is not a specific wireframe project type, so you just create a new, generic project) and get started with a new screen or storyboard.</p>
<p>As you get to working on your wireframe, there is a handy Palette view that offers all of the basic widgets for wireframes. The Palette view also allows you to search or filter the widgets by category. Additionally, and I love this, you can add images and other items to a directory in your project called assets (you need to manually create this folder/directory). Doing so will cause the items in this directory to appear in the assets section of the Palette view. Pretty awesome way to use logos, actual photos and the like in your wireframes. Gives them a more polished touch, I think.</p>
<p>With a few wireframes completed, one feature I love in WireFrameSketcher is its storyboards. These are templates upon which you assemble your screens/wireframes. It's pretty sweet and a great tool for creating professional storyboards for clients (you can export the storyboard or your individual wire frames as PDFs).</p>
<p>All in all, I've found WireFrameSketcher to be a better fit for my workflow and needs than other wireframe tools. The fact that it integrates with Eclipse and is straightforward to use (I did not have to read one line of a manual and I was effectively creating wireframes in minutes), is a huge selling point to me. &nbsp;</p>
<p><strong>Cons</strong>:<br />I decided to start with the cons because, to be honest, there are not many. &nbsp;</p>
<ul>
<li>Not open source (but at $75, it's a few bucks cheaper than the 'main' competition).</li>
<li>Balsamiq has some more options for mockups (iPhone templates, etc.) but, to be honest, I find most of that overkill and overwhelming.</li>
<li>The lock icon in the Properties view is not clearly marked as an icon that locks the element on the stage. It looks more like the Aspect Ratio lock icon from other applications and that threw me.</li>
</ul>
<p><strong>Pros</strong>:<br />There are a lot of pros ... but I'll stick to my main ones!</p>
<ul>
<li>Integrates into Eclipse (i.e., it's an Eclipse plugin).</li>
<li>Excellent performance (no lags on my machines, snappy, etc.).</li>
<li>Nice, but not overwhelming, selection of Widgets.</li>
<li>Robust Properties view for working with the selected element on the stage.</li>
<li>The Outline view rocks ... enables you to move quickly and easily through your wireframes, no matter how involved they get.</li>
<li>Good and detailed options from the context menu (when clicking on an element in the stage).</li>
<li>Easy to create links between screens ... love this.</li>
<li>Filter your Palette view to find the tool/option you want in seconds.</li>
<li>The asset directory -- hard to beat this one for me. Load it up and grab your assets as you need them.&nbsp;</li>
<li>You can also add an image from your local file system or a remote URL to a wireframe element from the Properties view.&nbsp;</li>
</ul>
<p><strong><span style="font-weight: normal;"><strong>Overall Application Rating</strong>: 4 of 5 Stars ... not that I have a rating system or stars but you get the idea :)!</span><br /></strong>All in all, I am really enjoying <a href="http://wireframesketcher.com/" target="_blank">WireFrameSketcher</a>. It is very easy to use. Took no time at all to get going AND be effective with the task at hand (i.e., creating wireframes worthy of showing to a client). If you're an Eclipse user and looking to get a user-friendly wireframe tool, it's worth your while to check out WireFrameSketcher!</p>
	
</p>

<p><a href="http://craigkaminsky.me/wireframe-sketcher-excellent-eclipse-plugin">Permalink</a> 

	| <a href="http://craigkaminsky.me/wireframe-sketcher-excellent-eclipse-plugin#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/wireframe-sketcher-excellent-eclipse-plugin</feedburner:origLink></item>
    <item>
      <pubDate>Tue, 18 Jan 2011 11:59:00 -0800</pubDate>
      <title>CFWheels Plugin - States and Countries</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/xZHqG3qknOQ/cfwheels-plugin-states-and-countries</link>
      <guid isPermaLink="false">http://craigkaminsky.me/cfwheels-plugin-states-and-countries</guid>
      <description>
        <![CDATA[<p>
	<p>While working on an on-going CFWheels project for <a href="http://www.OurayClimbing.com/" title="Ouray Climbing - San Juan Mountain Guides" target="_blank">OurayClimbing.com</a>, I have been spending a ton of time on the CMS. As is always the case for me, I have several form fields in a CMS that require select lists for US States and Countries. In the past, I've thrown this data into a DB, queried it as needed, etc.&nbsp;</p>
<p>Since I am using CFWheels and a bit plugin crazed, I decided to create a basic plugin that would allow me to quickly and easily get this data in my controllers and views. The plugin is available at either of the following locations:</p>
<ul>
<li>CFWheels&mdash;<a href="http://cfwheels.org/plugins/listing/52" target="_blank">http://cfwheels.org/plugins/listing/52</a></li>
<li>gihub&mdash;<a href="https://github.com/imageaid/StatesAndCountries" target="_blank">https://github.com/imageaid/StatesAndCountries</a></li>
</ul>
<p>In the interest of less typing, here are the details from my plugin's index.cfm file.</p>
<h1>StatesAndCountries for Wheels v1.0</h1>
<p>A very basic plugin to access queries for US states, Canadian provinces, and Countries. I created this because I cannot recall an application that I've built over the years that did not need a State or Country drop-down in some form somewhere in the application.</p>
<p>The plugin comes with three asset files: us_states.xml, canadian_provinces.xml, and countries.xml. When one of the four methods (below) are called for the first time, the relevant XML file is read and a query is created, stored in the application scope and returned. Subsequent calls to the same method will pull the query from the application scope rather than recreating it time and again.</p>
<h2>Usage</h2>
<p>This plugin provides four methods for use in your controllers: <tt>getUSStates()</tt>, <tt>getCanadianProvinces()</tt>, <tt>getUSStatesAndCanadianProvinces()</tt> <tt>getCountries()</tt>. All methods do not accept parameters and all return a query. Each row in the returned query has two columns: <tt>name</tt> and <tt>abbreviation</tt>.</p>
<h2>Examples</h2>
<p>Once installed, the plugin is quite easy to use. In the desired controller(s), call the plugin method you want to access.</p>
<div class="CodeRay">
  <div class="code"><pre>&lt;cfscript&gt;
    // this is an excerpt from a controller called Users
    function new(){
        usStates = getUSStates();
        countries = getCountries();
        user = model(&quot;User&quot;).new();
        renderPage(layout=&quot;admin&quot;);
    }
&lt;/cfscript&gt;</pre></div>
</div>

<p>In the relevant view, you could loop over the queries and output the data or use the queries in a select() call along the lines of the following:</p>
<div class="CodeRay">
  <div class="code"><pre>&lt;cfoutput&gt;
    &lt;div class=&quot;form_field&quot;&gt;
      #select(objectName='user', property='state', label='State', options=usStates, valueField=&quot;abbreviation&quot;, textField=&quot;name&quot;)#
    &lt;/div&gt;
        &lt;div class=&quot;form_field&quot;&gt;
      #select(objectName='user', property='state', label='State', options=countries, valueField=&quot;abbreviation&quot;, textField=&quot;name&quot;)#
    &lt;/div&gt;
&lt;/cfoutput&gt;</pre></div>
</div>
	
</p>

<p><a href="http://craigkaminsky.me/cfwheels-plugin-states-and-countries">Permalink</a> 

	| <a href="http://craigkaminsky.me/cfwheels-plugin-states-and-countries#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/cfwheels-plugin-states-and-countries</feedburner:origLink></item>
    <item>
      <pubDate>Thu, 13 Jan 2011 07:19:00 -0800</pubDate>
      <title>Manage your TextMate Bundles with GetBundles</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/WbGZnZ9PnWI/manage-your-textmate-bundles-with-getbundles</link>
      <guid isPermaLink="false">http://craigkaminsky.me/manage-your-textmate-bundles-with-getbundles</guid>
      <description>
        <![CDATA[<p>
	<p>I dig TextMate a lot. I use it for all my scratch CFML (a la the Scribble option in CFEclipse) and some small projects. It's simple, lightweight and quite efficient for small projects and tasks.&nbsp;</p>
<p>Well, this morning, I was reading a couple of posts on the <a href="http://www.newtriks.com/" title="newtriks" target="_blank">newtricks</a> blog about <a href="http://www.newtriks.com/?p=1119" target="_blank">ColdFusion Unit Testing with MXUnit and TextMate</a>&nbsp;and stumbled over this line:<br />Install the GetBundles tmbundle (<a href="https://github.com/adamsalter/GetBundles.tmbundle" target="_blank">github.com/adamsalter/GetBundles.tmbundle</a>).&nbsp;</p>
<p>This bundle is pretty freaking cool. It has some trouble updating a few plugins ere and there but, basically, it provides you with plugin details as well as the ability to install, update and all around manage your TextMate bundles. It's markedly better than scouring the web (github, SVN repos, etc.) for TextMate bundles and updates!</p>
	
</p>

<p><a href="http://craigkaminsky.me/manage-your-textmate-bundles-with-getbundles">Permalink</a> 

	| <a href="http://craigkaminsky.me/manage-your-textmate-bundles-with-getbundles#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/manage-your-textmate-bundles-with-getbundles</feedburner:origLink></item>
    <item>
      <pubDate>Thu, 30 Dec 2010 10:29:00 -0800</pubDate>
      <title>SimpleFlickr - My First CFWheels Plugin</title>
      <link>http://feedproxy.google.com/~r/CraigKaminskysPosterous/~3/mTZ0Sp22TqM/simpleflickr-my-first-cfwheels-plugin</link>
      <guid isPermaLink="false">http://craigkaminsky.me/simpleflickr-my-first-cfwheels-plugin</guid>
      <description>
        <![CDATA[<p>
	<h2>The Task and the Flickr API</h2>

<p>One of the projects I am currently working on is <a href="http://www.ourayclimbing.com">Ouray Climbing</a>. It&rsquo;s for a friend&rsquo;s mountain and ice climbing guide service in our hometown of <a href="http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=OUray,+Co&amp;sll=37.0625,-95.677068&amp;sspn=51.04407,86.044922&amp;ie=UTF8&amp;hq=&amp;hnear=Ouray,+Colorado&amp;t=h&amp;z=15&amp;iwloc=A">Ouray, Colorado</a>. The guys and gals at Ouray Climbing are world-renowned bad-asses (for real &hellip; I&rsquo;m not exaggerating). If you ever get the chance to come to Ouray and want to head into the backcountry with some expert guides, check them out.</p>

<p>Just before the winter holidays, I met with my buddy and he asked if it would be possible to pull down some photos from Flickr to be displayed on the company&rsquo;s destination pages using our standard slideshow widget.</p>

<p>I never previously used the <a href="http://www.fickr.com/services/api">Flickr API</a> but knew it was possible to accomplish what they wanted. So, I set about exploring the API docs and the general steps I needed to take to implement the desired functionality. Ultimately, we decided that the Ouray Climbing team would create a photo set for each of their destinations and upload a series of photos for each set. The photoset ID would then be stored in the DB and, if one exists for a destination, we would make a call to Flickr and grab the photos. Simple enough, eh?</p>

<p>All in all, it was pretty simple to get the photos from a photoset. The Flickr API, IMHO, is pretty well documented and easy to use. The challenge for me was more in how to best integrate it into the site&rsquo;s framework: <a href="http://www.cfwheels.org">CFWheels</a>. <em>Aside</em>: I&rsquo;ve said it before and I&rsquo;ll say it again, I freaking dig CFWheels.*</p>

<h2>Plugins are the Answer (if only I knew the question)</h2>

<p>Initially, I created a Flickr CFC and called it from my Destinations controller (CFC). It all worked and worked fairly well. However, I know enough about CFWheels to be dangerous (hey-o! Couldn&rsquo;t resist the cliche!). Ok, sorry. I know enough about CFWheels to know that this is not the best way to implement the desired Flickr functionality.</p>

<p>So, I created a plugin, called SimpleFlickr, to be used across the application from any controller. I won&rsquo;t bore you (further) with how I created the plugin. The Wheels crew takes care of that just fine on their site (<a href="http://cfwheels.org/docs/1-1/chapter/using-and-creating-plugins">Using and Creating Plugins</a>).</p>

<p>Why are plugins the answer? Because Wheels injects your plugin&rsquo;s methods into the framework and you can call any of the plugin&rsquo;s methods from your controllers (or models or views) as though they were standard methods of the framework. No object creation, no inits, nada. Just access to the methods, plain and simple. Freaking sweet!!</p>

<h2>Why SimpleFlickr?</h2>

<p>There are already a couple of well-thought out, robust Flickr tools for CFML: <a href="http://cflickr.riaforge.org/">CFlickr</a> and <a href="http://flickrpics.riaforge.org/">flickrpics</a>. Why didn&rsquo;t I use them? Well, flickrpics is for populating a Mango Blog sidebar pod and CFlickr has more functionality than I needed for this project. I just needed something, well, simple. Plus, I was excited by the prospect of creating my own plugin!</p>

<h2>SimpleFlickr Plugin and Repository</h2>

<p>The alpha version of this plugin is currently available for download on github (<a href="https://github.com/imageaid/SimpleFlickr">SimpleFlickr on github</a>). For the initial release, there are three public methods available: public void $setSimpleFlickrConfig(), public array function getFlickrPhotoSetPhotos(), and public xml function getFlickrPhotoSet().</p>

<p>To configure the plugin with your Flickr API access data (api key, secret, etc.), you can call $setSimpleFlickrConfig(), passing in the individual parameters (or an argumentCollection struct).</p>

<p>Calling getFlickrPhotoSetPhotos() will return an array of structures for each photo in the set. Each structure has two keys: url and title, which can be used to populate an image tag or something else in your application.</p>

<p>Calling getFlickrPhotoSet() will return the XML result of the http call to the Flickr API. As a publically invoked method, it doesn&rsquo;t serve much of a purpose at this juncture; rather, it is used by the getFlickrPhotoSetPhotos() method to retrieve the XML from Flickr, which will is then parsed into the aforementioned array. Down the road, however, I think it&rsquo;ll be useful on its own.</p>

<h2>Alpha Version Limitations</h2>

<p>As of the 0.1 release, the plugin knowingly works on ACF 9 and Railo 3.2 because it makes use of the newly added http() method inside a CFSCRIPT block. Also, the configuration method currently accepts a parameter called flickrURLMethod, which maps to the relevant API call you wish to make. This really doesn&rsquo;t belong in the configuration and will be moved out of it shortly (it&rsquo;s a remanant from the initial Flickr CFC I built).</p>

<h2>Going Forward</h2>

<p>Over the coming days and week, I will be actively updating the plugin to include a few additional Flickr API methods/calls as well as making a few teaks to how Flickr API access is configured. Additionally, I will create and add true documentation for configuring and using the plugin. Once the plugin reaches version 0.5 (or so), I will submit it to the Wheels team for approval in the hopes that it will be added to the Wheels plugin directory.</p>

<p>Finally, if folks out there think such a tool would be useful on its own (i.e., not as a Wheels plugin), I&rsquo;ll submit a project to <a href="http://www.riaforge.org">RIAforge</a> for general CFML usage.</p>

<p>Thanks, as always, for reading and I am very open to and welcoming of any and all feedback!</p>

<h3>Disclamer &hellip; Sort Of</h3>

<p>*I want to note that my adoration for Wheels is in no way a slight towards or dig at any of the other rockin' CF frameworks out there. Admittedly, I&rsquo;m a framework fanboi and find that Wheels, in particular, both speeds up and improves my CFML development process. I note this because, in my opinion, too often a positive comment about one CFML framework is seen as an implicit dig at others &hellip; and that just isn&rsquo;t the case for me. I have so much respect for the develoeprs behind our community&rsquo;s frameworks, I would never want to insult them or their hard (and awesome) work. Good lord, I sound like a politico &hellip; I&rsquo;ve clearly spent too much time visting my family in Washington DC the past week-and-a-half :)!</p>
	
</p>

<p><a href="http://craigkaminsky.me/simpleflickr-my-first-cfwheels-plugin">Permalink</a> 

	| <a href="http://craigkaminsky.me/simpleflickr-my-first-cfwheels-plugin#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>

</p>]]>
      </description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1583657/xfit-dowork.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4bmPBE8h4kql</posterous:profileUrl>
        <posterous:firstName>Craig</posterous:firstName>
        <posterous:lastName>Kaminsky</posterous:lastName>
        <posterous:nickName>craigkaminsky</posterous:nickName>
        <posterous:displayName>Craig Kaminsky</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://craigkaminsky.me/simpleflickr-my-first-cfwheels-plugin</feedburner:origLink></item>
  </channel>
</rss>

