<?xml version="1.0" encoding="utf-8"?>
			
			<rss version="2.0">
			<channel>
			<title>CounterMarch Systems Blog</title>
			<link>http://www.countermarch.com/blog/index.cfm</link>
			<description>CounterMarch Systems is a software consulting firm specializing in Adobe technologies</description>
			<language>en-us</language>
			<pubDate>Mon, 06 Sep 2010 23:32:35 -0400</pubDate>
			<lastBuildDate>Mon, 02 Aug 2010 12:32:00 -0400</lastBuildDate>
			<generator>BlogCFC</generator>
			<docs>http://blogs.law.harvard.edu/tech/rss</docs>
			<managingEditor>helpdesk@countermarch.com</managingEditor>
			<webMaster>helpdesk@countermarch.com</webMaster>
			
			<item>
				<title>Pour a little out for CFUNITED</title>
				<link>http://www.countermarch.com/blog/index.cfm/2010/8/2/Pour-a-little-out-for-CFUNITED</link>
				<description>
				
				&lt;p&gt;Commingled with the fun and excitement of attending this year&apos;s CFUNITED conference was an acknowledged sadness associated with knowing it was to be the last. We&apos;ve grown accustomed to seeing each other once a year (for some not often enough, for others...just the right amount) and the loss of an opportunity to reconnect is a moment we should recognize and appreciate.&lt;/p&gt;

&lt;p&gt;Many of us can say a lot of the same things about CFUNITED: we&apos;ve seen great and not-so-great presentations, enjoyed great and not-so-great food, partied into the wee hours racking up bar tabs that were impressive or simply outrageous, and met the people that we call our community. Or more accurately: our friends.&lt;/p&gt;

&lt;p&gt;A community without a place to commune isn&apos;t complete, and simply doing it on the internet isn&apos;t enough. Michael Smith and the TeraTech/Stellr team identified the need for a physical place for our rabid online community to gather outside of DevCon/MAX and user group meetings. The creation of CFUN and subsequent evolution (and growth) into CFUNITED gave us just that place. CFUNITED became one of those few gatherings that was both technically *and* socially valuable to the full spectrum of ColdFusion developers. CFUNITED also helped other members of the community identify the things they wanted in a conference, implicitly leading to the creation of cf.Objective to cater to the advanced CF crowd with many others to follow suit in their own way. All of these things added credibility and value to our community as a whole.&lt;/p&gt;

&lt;p&gt;It is for those reasons CFUNITED will always represent a special place and time for us all. This conference turned newbies into real developers, the fortuitous hallway/bar conversations turned intermediate developers into professionals, and creative topic selections turned quiet cube monkeys into amazing speakers and teachers. Simply being together made us all feel a little less weird for being so enthusiastic about what ColdFusion enables us to do.

So as we move ahead without another CFUNITED on the calendar, I hope we all remember that the community is more important than any one event, that none of these things that we appreciate would be here without our continued passion and participation, and that it&apos;s important for us to support the things we have and the things to come. Doug Boude said it best: &quot;now that one of the larger trees in the forest has sadly fallen, the vacancy it leaves us with is the opportunity and catalyst to allow for the currently smaller, more focused, and/or regional conferences to flourish and fill this niche.&quot;&lt;/p&gt;

&lt;p&gt;NCDevCon, BFusion/BFlex, cf.Objective, RIA Unleashed, D2WC, and tons of user group meetings (online and in person) happen every single year. MAX will always be there with the extremely promising CF Unconference component. Out of the collective will of the ColdFusion community new events will emerge, and as they do we&apos;ll find our new normal. We&apos;ve inherited a great gift: a passionate community and proof that there is significant interest in conferences at all skill levels.&lt;/p&gt;

&lt;p&gt;This is a fond farewell and thank you to CFUNITED for what its creation and ending have done for our community. Thank you, everyone, who ever attended and made my CFUNITED experience better as both an attendee and speaker. I look forward to the day we&apos;re all in the same place again.&lt;/p&gt; 
				</description>
				
				<category>cfunited</category>				
				
				<pubDate>Mon, 02 Aug 2010 12:32:00 -0400</pubDate>
				<guid>http://www.countermarch.com/blog/index.cfm/2010/8/2/Pour-a-little-out-for-CFUNITED</guid>
				
			</item>
			
			<item>
				<title>Mach-II is (still) awesome</title>
				<link>http://www.countermarch.com/blog/index.cfm/2010/7/29/MachII-is-still-awesome</link>
				<description>
				
				&lt;p&gt;Mach-II rocks. It is one of the more &quot;mature&quot; surviving ColdFusion application frameworks, and as such doesn&apos;t get nearly the amount of buzz that the new (interesting, different, creative, awesome-in-their-own-way) frameworks get. If you&apos;re looking at frameworks, I encourage you to take a look at the amazingly capable &lt;a href=&quot;http://www.mach-ii.com&quot;&gt;Mach-II&lt;/a&gt; - we&apos;ve had fantastic success with it!&lt;/p&gt;

&lt;p&gt;Things I really, really like about Mach-II:&lt;/p&gt;

&lt;h3&gt;Backwards compatibility&lt;/h3&gt;
&lt;p&gt;Take an old (Mach-II 1.1 app, circa 2006) and update the framework to 1.8 (released 2009). Replace the application.cfm file with application.cfc, comment out everything in index.cfm and *boom*...you&apos;re done. I can&apos;t really assess how challenging it is for the team to maintain backwards compatibility, but I sure do appreciate how simple it is to upgrade. Instant feature add with zero headaches.&lt;/p&gt;

&lt;h3&gt;Coldspring integration&lt;/h3&gt;
&lt;code&gt;&lt;include file=&quot;./mach-ii_coldspringProperty.xml&quot; /&gt;&lt;/code&gt; 

&lt;p&gt;and in your listeners:&lt;/p&gt;

&lt;code&gt;&lt;cfcomponent name=&quot;mpListener&quot; extends=&quot;MachII.framework.Listener&quot; 

depends=&quot;howConfigManager,mpManager,reportManager,notificationManager&quot;&gt;&lt;/code&gt;

&lt;p&gt;I don&apos;t think it gets much easier than that. Instant Coldspring integration for dependency injection (and more), radically simplifying the configuration of all of my listener and model cfcs.  Now we&apos;ve got all the power of Coldspring cleanly available to our Mach-II application.&lt;/p&gt;

&lt;h3&gt;Faster Fixes&lt;/h3&gt;
&lt;p&gt;Knowing where to find things is one of the hallmarks of any good framework.  Some do it by convention, some by configuration. Mach-II falls into the latter camp but that&apos;s perfectly fine by me.  Getting back into the mental model of an application months (or years) after deployment is a challenge but by simply cracking open mach-ii.xml I can see what happens where within seconds and bend it to my will.  I love this.&lt;/p&gt;

&lt;h3&gt;Modularity&lt;/h3&gt;
&lt;p&gt;This wasn&apos;t in the framework back in the 1.0 and 1.1 days (when we created some mammoth apps), but by 1.5 (which came out in 2008) the ability to break up large Mach-II applications into separate modules was baked in and oh-so-handy. It&apos;s two years later and we&apos;ve been able to make the easy changes to break those older apps into a collection of modularized sub-apps for much easier maintenance.  Perfect example is an extranet: lots of only slightly related apps put under one common umbrella sharing security or UI components. This is easy to implement and support in a well-designed Mach-II application. All of our more recent apps make use of this feature.&lt;/p&gt;

&lt;h3&gt;The Team&lt;/h3&gt;
&lt;p&gt;The people who created and have since improved and evolved Mach-II are some of the smartest folks who are or have been involved in the ColdFusion community.  &lt;a href=&quot;http://www.mach-ii.com/index.cfm/go/contributors/&quot;&gt;Look at this list&lt;/a&gt;.  Not only have they created something awesome, but they&apos;re incredibly responsive on the &lt;a 
href=&quot;http://trac.mach-ii.com/machii/wiki&quot;&gt;wiki&lt;/a&gt;, &lt;a href=&quot;http://groups.google.com/group/mach-ii-
developers&quot;&gt;development Google group&lt;/a&gt;, and &lt;a href=&quot;http://groups.google.com/group/mach-ii-for-
coldfusion&quot;&gt;framework users Google group&lt;/a&gt;.  They use this framework at their day jobs so you know that each release has been painstakingly designed, implemented, tested, re-tested, piloted and then released.  Plus, they&apos;re open to new ideas (even if you personally have no idea how to make them happen!).  Code is great, but the people are the best.&lt;/p&gt;

&lt;h3&gt;The View Loader&lt;/h3&gt;
&lt;p&gt;This is where some of those &quot;convention-based&quot; concepts have crept in to Mach-II much to the benefit of the users.  Back in the &quot;bad old days&quot; your mach-ii.xml file would contain a block that looked sorta like this, except far longer:&lt;/p&gt;

&lt;code&gt;
	&lt;page-views&gt;
		&lt;page-view name=&quot;showWelcome&quot; 		page=&quot;views/showWelcome.cfm&quot; /&gt;
		&lt;page-view name=&quot;showHome&quot; 		page=&quot;views/home.cfm&quot; /&gt;
		&lt;page-view name=&quot;baseTemplate&quot; 		page=&quot;views/baseTemplate2010.cfm&quot; /&gt;
		&lt;page-view name=&quot;blankTemplate&quot; 	page=&quot;views/blankTemplate.cfm&quot; /&gt;
		&lt;page-view name=&quot;welcomeLanding&quot; 	page=&quot;views/welcome_landing.cfm&quot; /&gt;
		&lt;page-view name=&quot;showSendPassword&quot; 	page=&quot;views/showSendPassword.cfm&quot; /&gt;
		&lt;page-view name=&quot;showAppHelp&quot; 		page=&quot;views/showAppHelp.cfm&quot; /&gt;
	(and so on)
&lt;/code&gt;

&lt;p&gt;Each page would have a page-view defined. Someone called shenanigans on it and now we have the PatternViewLoader to replace ALL of it!&lt;/p&gt;

&lt;code&gt;
&lt;page-views&gt;
	&lt;!-- This would load all views with the pattern of &quot;/views/**/*.cfm&quot; which is the most basic and common pattern --&gt;
    &lt;view-loader type=&quot;MachII.framework.viewLoaders.PatternViewLoader&quot; /&gt;
&lt;/page-views&gt;
&lt;/code&gt;

&lt;p&gt;So, so simple. Love this line of the config file more than any other.&lt;/p&gt;

&lt;h3&gt;Better apps, faster.&lt;/h3&gt;
&lt;p&gt;Take Mach-II off the shelf and use it as your &quot;glue.&quot;  Add Coldspring to manage your model.  Use ColdFusion 9&apos;s new Hibernate ORM capabilities to cut the lines of code in your model by a huge factor. Redirect some of the saved time into building a better UI using jQuery, improving your cross-browser capabilities with clean CSS and making your client happier by communicating more frequently.  Result: a better app, designed to be maintainable and much more in line with your client&apos;s spoken and unspoken expectations. How could any craftsman not feel good about that? Mach-II is a key component to that successful formula for us.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.mach-ii.com/&quot;&gt;Try Mach-II&lt;/a&gt;. Need help? &lt;a href=&quot;http://groups.google.com/group/mach-ii-for-coldfusion&quot;&gt;Talk to the team on the list&lt;/a&gt;.  Build great things.&lt;/p&gt; 
				</description>
				
				<category>mach-ii</category>				
				
				<category>ColdFusion</category>				
				
				<pubDate>Thu, 29 Jul 2010 16:21:00 -0400</pubDate>
				<guid>http://www.countermarch.com/blog/index.cfm/2010/7/29/MachII-is-still-awesome</guid>
				
			</item>
			
			<item>
				<title>On conferences and venturing outside</title>
				<link>http://www.countermarch.com/blog/index.cfm/2010/7/27/On-conferences-and-venturing-outside</link>
				<description>
				
				&lt;p&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images//higheredcamp_logo2.png&quot; align=&quot;right&quot; width=&quot;200&quot;&gt;&lt;a href=&quot;http://www.countermarch.com/blog/index.cfm/2008/7/22/Conference-Surfing&quot;&gt;Two years ago&lt;/a&gt; I blogged about having attended a conference completely outside the &apos;geek crowd&apos; and how much of an eye-opening experience it was. Since then, not only have the marketers&apos; forecasts become reality (Twitter going big and them taking advantage of it) but I&apos;ve also been fortunate to attend &lt;a href=&quot;http://www.higheredphilly.com/&quot;&gt;Higher Ed Camp Philly&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Higher Ed Philly was a great experience. I was really surprised at the great blend of technical folks and educators (from both public schools and universities) in attendance. The effect this had on the sessions was tremendous and has completely changed what I want to get out of attending a conference. In short, it was nothing like what I expected...it was way better!&lt;/p&gt;

&lt;p&gt;From the perspective of a tech person who generally attends tech conferences, the interaction among the attendees was totally different.  Instead of constant hardcore technical discussion, there was a balance of talk about tools and practical application.  The educators&apos; minds worked quite differently from ours but in a really valuable, interesting way.  I found myself wanting to attend more of the educator-focused sessions simply to further understand their way of looking at the things we create as the starting point for their work to take off.&lt;/p&gt; 

&lt;p&gt;Consider this: we create, sometimes in a vacuum, but always with limited feedback.  The educator must somehow translate the practical utility of whatever it is we created into something that the average human can understand and then apply to their own want or need. Their entire job is to act as our forgotten intermediary; a good number of them spend most of their time trying to keep other teachers up to speed on what&apos;s possible.  Their (presumptive) reason for attending was to get a head start on that process.&lt;/p&gt;

&lt;p&gt;Every session I attended included elements of show and tell, the educators talking about what they see as useful, and the techies trying to offer suggestions on the spot.  We live to solve problems, and the challenges put forward by our fellow attendees were some of the most creative, interesting ones I got to think about all week.  I think that&apos;s awesome and should stand as a strong message to all of us that we have to get out of our niche and spend more conference (unguarded, relaxed, non-work) time in a similarly blended community.&lt;/p&gt;

&lt;p&gt;I bet we could have taught some of those teachers and instructional technology people at Higher Ed Philly a couple lines of CFML and made them dangerously powerful.  I bet they could teach us a few things about how to understand methods of learning and made us dangerously effective communicators and trainers. Together we were kicking around ideas that wouldn&apos;t have naturally evolved from either camp alone and improved ourselves in ways we never expected.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;Later today, the final CFUNITED conference will get underway. I&apos;ll miss it for all of the reasons that the attendees from any year share.  But in retrospect, and through the lens of this new outlook on conference participation, I realize that the best learning I ever did there was from the informal chatter of people talking about their challenges, their daily realities, in a group of people we&apos;d all like to consider colleagues.  We talk about problems that are technical (solvable) and political (not always). We bring differing skills but a common understanding of CFML to the table and have a great time learning from one another.&lt;/p&gt;

&lt;p&gt;CFUNITED has served us well as the table around which we gather, but tables also make us focus inward.  In its absence next year, I hope to see the regional events (like &lt;a href=&quot;http://www.cfobjective.com&quot;&gt;CF.Objective&lt;/a&gt;, &lt;a href=&quot;http://www.riaunleashed.com/&quot;&gt;RIA Unleashed&lt;/a&gt;, &lt;a href=&quot;http://ncdevcon.com/&quot;&gt;NCDevCon&lt;/a&gt; and &lt;a href=&quot;http://bflex.info/&quot;&gt;BFlex/BFusion&lt;/a&gt; to name a few) continue their excellent growth right alongside unconferences and meetups that blend our technical proficiency with people from other disciplines in the same space. We can&apos;t lock ourselves up in our own tech-specific shows all the time and expect to grow our community and grow our skills in a career-savvy way.  The ColdFusion community, while awesome, will need to look outside the realm of those who work with competing technologies and instead turn towards people with complementary skills and interests to evangelize CFML as a platform.&lt;/p&gt;

&lt;p&gt;Use the end of CFUNITED as a reason to expand your participation in new directions. Show off what your CF skills can do while scratching someone else&apos;s itch. And once you&apos;ve done it, come back and share with everyone else.  It&apos;s a big world, and we&apos;re all students of everyone else.&lt;/p&gt;

&lt;p&gt;See you in Virginia!&lt;/p&gt; 
				</description>
				
				<category>cfunited</category>				
				
				<category>learning</category>				
				
				<pubDate>Tue, 27 Jul 2010 01:50:00 -0400</pubDate>
				<guid>http://www.countermarch.com/blog/index.cfm/2010/7/27/On-conferences-and-venturing-outside</guid>
				
			</item>
			
			<item>
				<title>Mobile Apps for Alumni Relations - Cornell Compass</title>
				<link>http://www.countermarch.com/blog/index.cfm/2010/6/22/cornell-compass</link>
				<description>
				
				&lt;p&gt;We recently had the privilege of working with &lt;a href=&quot;http://twitter.com/agossen&quot;&gt;Andrew Gossen&lt;/a&gt; in Cornell&apos;s office of &lt;a href=&quot;http://alumni.cornell.edu/&quot;&gt;Alumni Affairs&lt;/a&gt; on a sweet little mobile project.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/0041.png&quot; align=&quot;right&quot;/&gt;The &lt;a href=&quot;http://www.cornellcompass.com&quot; target=&quot;new&quot;&gt;Cornell Compass&lt;/a&gt; web application uses geolocation features exposed through mobile browsers to determine the distance and bearing from where you&apos;re standing to the center of Cornell&apos;s campus. It&apos;s fun! It would be way more fun if the orientation of the device was exposed as well (then we could make the compass dynamically spin in real time).&lt;/p&gt;

&lt;p&gt;Once your location is determined you have the opportunity to &quot;Check In&quot; and drop a marker on a map with your name and class year (both optional).  The map is visible both on the mobile device and via the &lt;a href=&quot;http://www.cornellcompass.com/map.cfm&quot;&gt;website&lt;/a&gt; (we do some browser sniffing so the content is device-appropriate). All visitors are encouraged to share the link to the site via Facebook and Twitter.&lt;/p&gt; 

&lt;p&gt;The Compass app is optimized for iPhone, but is functional on both Blackberry and Android devices as well. The backend (which is trivially simple) is ColdFusion with Microsoft SQL Server.  The bulk of the front end work was done using jQuery and a few assistive javascript libraries for doing the bearing calculations.&lt;/p&gt;

&lt;p&gt;We&apos;re working with Cornell to design the next version of this application with more features that make it useful to Cornellians all over the world looking to deepen their relationships with each other. Interested in learning more? Please &lt;a href=&quot;mailto:helpdesk@countermarch.com&quot;&gt;drop me an email&lt;/a&gt;!  We&apos;re interested in working with other organizations to enhance the usefulness of the app including integration with alumni online communities and CRM systems.&lt;/p&gt; 
				</description>
				
				<category>ColdFusion</category>				
				
				<category>alumni relations</category>				
				
				<category>mobile</category>				
				
				<pubDate>Tue, 22 Jun 2010 10:10:00 -0400</pubDate>
				<guid>http://www.countermarch.com/blog/index.cfm/2010/6/22/cornell-compass</guid>
				
			</item>
			
			<item>
				<title>Flash Player 10.1 for Mobile</title>
				<link>http://www.countermarch.com/blog/index.cfm/2010/6/22/Flash-Player-101-for-Mobile</link>
				<description>
				
				&lt;p&gt;Today&apos;s the day! The long-awaited &lt;a href=&quot;http://www.adobe.com/aboutadobe/pressroom/pressreleases/201006/06222010FlashPlayerAvailability.html&quot;&gt;release of Flash player&lt;/a&gt; for mobile devices has finally arrived.&lt;/p&gt;

&lt;p&gt;For those of you with Android-based devices, once you&apos;ve upgraded to FroYo (2.2) you&apos;ll be able to install the player. Looks like Adobe has also released it to the companies behind Blackberry, webOS and Windows Mobile phones as well. Those of us with Apple devices, well, we&apos;re going to just have to stare at that little blue brick until mommy and daddy stop fighting.&lt;/p&gt;

&lt;p&gt;As for what makes this release special, consider that Adobe (and before that Macromedia) has been promising a viable Flash runtime for mobile for what feels like forever. 10.1 is the first full Flash runtime built from the ground up for mobile devices, taking into account their inherent limitations (processor power, screen size, battery life) and still providing what early reviews say is outstanding performance.  Short version: you can now watch more videos, play more games and access more rich internet applications on your mobile devices than ever before.&lt;/p&gt;

&lt;p&gt;There&apos;s a lot here for the developer community too.  Until today we were stuck building web based applications (as it turns out, mobile devices aren&apos;t immune to browser implementation quirks either) or going fully native (thus incurring the cost of building new for every targeted platform). Now, we can build modern, web-friendly, high-performance applications that will run on a wide variety of devices from all but one of the top-tier mobile device manufacturers once and only once.&lt;/p&gt;

&lt;p&gt;The mobile market is changing rapidly.  HTML5 is years away from an official standard. Mobile browser-based applications will always have to work around implementation quirks, even if the feature set is striving towards parity with what Flash player has had for years. I&apos;m excited to have the option of building an app once, having it available everywhere and knowing that it&apos;ll &quot;just work.&quot; &lt;/p&gt; 
				</description>
				
				<category>flash</category>				
				
				<pubDate>Tue, 22 Jun 2010 09:14:00 -0400</pubDate>
				<guid>http://www.countermarch.com/blog/index.cfm/2010/6/22/Flash-Player-101-for-Mobile</guid>
				
			</item>
			
			<item>
				<title>ColdFusion 9 Security Lockdown Guide</title>
				<link>http://www.countermarch.com/blog/index.cfm/2010/5/26/ColdFusion-9-Security-Lockdown-Guide</link>
				<description>
				
				&lt;p&gt;&lt;a href=&quot;http://bit.ly/cf9secure&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images//cf9_security_cover1.JPG&quot; align=&quot;right&quot; /&gt;&lt;/a&gt; Adobe published the work of &lt;a href=&quot;http://www.petefreitag.com/&quot;&gt;Pete Freitag&lt;/a&gt; today - a 35 page guide to &lt;a href=&quot;http://bit.ly/cf9secure&quot; target=&quot;_blank&quot;&gt;secure installation and configuration of ColdFusion&lt;/a&gt;. Even if you feel like your ColdFusion server(s) are tightened up, it&apos;s always a good idea to take a moment to do a review. 
&lt;/p&gt;
&lt;p&gt;While the guide does not go into detail on building secure applications, Pete&apos;s PDF is a step-by-step tutorial that even someone not familiar with ColdFusion administration could follow.  Grab the PDF and spend the 15 minutes to check up on all of your servers (including your local development environment) - it&apos;s well worth it.&lt;/p&gt;

&lt;p&gt;When you&apos;re done with that, check out the Security section of the &lt;a href=&quot;http://www.adobe.com/devnet/coldfusion/security.html&quot;&gt;ColdFusion Developer Center&lt;/a&gt; on the Adobe Developer Connection for lots of articles on how to write safe and solid code too!&lt;/p&gt; 
				</description>
				
				<category>ColdFusion</category>				
				
				<pubDate>Wed, 26 May 2010 17:06:00 -0400</pubDate>
				<guid>http://www.countermarch.com/blog/index.cfm/2010/5/26/ColdFusion-9-Security-Lockdown-Guide</guid>
				
			</item>
			
			<item>
				<title>CS5, Adobe, Flash and (sigh) Apple</title>
				<link>http://www.countermarch.com/blog/index.cfm/2010/4/10/CS5-Adobe-Flash-and-sigh-Apple</link>
				<description>
				
				&lt;p&gt;While CS5 is going to be a &lt;a href=&quot;http://cs5launch.adobe.com/&quot;&gt;fantastic release&lt;/a&gt;, one feature in one product of the suite was perceived as sufficiently threatening to actually get a reaction from Steve Jobs.  So if one feature was that awesome, consider what else is going to be in that box on Monday! But I digress...&lt;/p&gt;
&lt;p&gt;Adobe is doing what it does best: release tools that make designers and developers more productive.  This has little to do with Flash and everything to do with unleashing the collective output of the web development community.  Flash is merely an enabler for the most dynamic, engaging and portable web-connected software experiences we have.  But Dreamweaver, ColdFusion Builder, Flash Builder and the upcoming Flash Catalyst are the tools that make it all possible. They&apos;re not sexy but it&apos;s what we get to look at all day long.&lt;/p&gt;
&lt;p&gt;The ability to develop an app using a language and IDE you&apos;re comfortable with means that you, the developer, can focus more on the creative and innovative aspects of your product instead of getting tripped up on syntax or negotiating the quirks of a new platform.  That&apos;s just good business sense and makes for a happy, productive development team.  Apple doesn&apos;t see it that way and would prefer that we do it their way, using their tools or just stick to web development.&lt;/p&gt;
&lt;p&gt;It&apos;s not about getting Flash on the iWhatever; it&apos;s about getting developers working on apps for the iWhatever using Adobe tools.  Really. Apple has plenty of specious reasons for not allowing Flash on their mobile hardware and only one legitimite one. Adobe&apos;s not out to decimate ITMS or the App Store (even if that might be fun) - it&apos;s looking to increase the size of the Flash developer market and thus sell more tools (which also includes our server-side favorites like ColdFusion and Flash Media Server). Flash isn&apos;t perfect (and if you actually read posts from Adobe folks, they&apos;re not arrogant enough to assert otherwise) but it&apos;s really fantastic for what it did for rich media delivery and standardizing the delivery of application experiences in the browser, a task that the major browser vendors continue to struggle with. Performance will never be as good as native apps - so what? Adobe continues to throw resources at optimizing the player and now that they have (at least in this one area) help from Apple on hardware acceleration the OSX crowd should be somewhat placated.&lt;/p&gt;
&lt;p&gt;The blowback from the developer community on the latest SDK changes is the sound of people ticked off that the iPhone/iPad will remain mostly inaccessible without learning Objective-C.  Not everything we&apos;d want to do is exposed through the browser. It&apos;s an inferior platform and forever relegated to second class citizen status on the device.  Why do developers like Flash in a desktop/laptop/netbook browser? &lt;strong&gt;Because it gives back a lot of things that the browser takes away.&lt;/strong&gt; These things Apple wishes to keep for itself and a small cabal of trusted (or at least solid revenue generating) developers.  HTML5 does not restore them - that seems to have been conveniently forgotten - despite Steve&apos;s assertions that the browser is all we should be paying attention to. &lt;/p&gt;
&lt;p&gt;This will still be a great week for Adobe.  It&apos;s also a great week for the web development community. One sentence in one document tells us where to shift our attention - away from Cupertino and towards a more open future.&lt;/p&gt;
&lt;p&gt;Fine. I didn&apos;t want to pay your rent anyway, Steve.&lt;/p&gt;
&lt;p&gt;Adobe wins, with or without you.  &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt; 
				</description>
				
				<category>flash</category>				
				
				<pubDate>Sat, 10 Apr 2010 23:54:00 -0400</pubDate>
				<guid>http://www.countermarch.com/blog/index.cfm/2010/4/10/CS5-Adobe-Flash-and-sigh-Apple</guid>
				
			</item>
			
			<item>
				<title>CASE Benchmarking Toolkit featured on Adobe Flex Showcase</title>
				<link>http://www.countermarch.com/blog/index.cfm/2010/3/22/CASE-Benchmarking-Toolkit-featured-on-Adobe-Flex-Showcase</link>
				<description>
				
				&lt;p&gt;One of our systems has been included in the Adobe Flex showcase on the newly relaunched &lt;a href=&quot;http://www.flex.org&quot;&gt;Flex.org&lt;/a&gt; website: the CASE Benchmarking Toolkit.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.countermarch.com/blog/images//cbt_showcase_capture.JPG&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images//cbt_showcase_capture_500.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The toolkit is a Flex and ColdFusion application used by CASE and select member &apos;communities of practice&apos; to develop, collect and report on common performance metrics for fundraising and alumni relations in the world of higher education.  This system is used by decision makers in thousands of institutions worldwide.  You can read more about it in the &lt;a href=&quot;http://www.countermarch.com/blog/index.cfm/2009/8/25/Benchmarking-and-Analytics-Toolkit-for-Higher-Education-powered-by-Adobe-ColdFusion-and-Flex&quot;&gt;Benchmarking and Analytics Toolkit for Higher Education&lt;/a&gt;
post I put up a few months ago. Needless to say, this is very exciting!&lt;/p&gt;

&lt;p&gt;I wish I could give you a direct link, but I&apos;ll give you directions instead. Flex.org -&gt; What&apos;s Possible -&gt; View Full Showcase.  We&apos;re in there somewhere.  There&apos;s plenty of design inspiration to be taken from the other apps listed as well.&lt;/p&gt; 
				</description>
				
				<category>shameless self promotion</category>				
				
				<category>Flex</category>				
				
				<pubDate>Mon, 22 Mar 2010 14:21:00 -0400</pubDate>
				<guid>http://www.countermarch.com/blog/index.cfm/2010/3/22/CASE-Benchmarking-Toolkit-featured-on-Adobe-Flex-Showcase</guid>
				
			</item>
			
			<item>
				<title>CFSpreadsheet presentation and samples</title>
				<link>http://www.countermarch.com/blog/index.cfm/2010/1/15/CFSpreadsheet-presentation-and-samples</link>
				<description>
				
				&lt;p&gt;I&apos;d like to thank &lt;a href=&quot;http://fusiongrokker.com/&quot;&gt;Adam Tuttle&lt;/a&gt; and the &lt;a href=&quot;http://www.phillycfug.org&quot;&gt;Philadelphia CFUG&lt;/a&gt; for inviting me to speak last night on CFSpreadsheet.  While the thought of listening to someone talk about spreadsheet generation from an hour would only make a true techie&apos;s heart race, I think those who were there got a good overview of what this new functionality can do for them. If anything I hope that I lowered the bar for many in attendance while simultaneously increasing pressure on their bosses to &lt;a href=&quot;https://store1.adobe.com/cfusion/store/html/index.cfm?event=displayProduct&amp;categoryOID=3254038&amp;store=OLS-US&quot;&gt;buy those licenses&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;My preso focused on the basics (here&apos;s the tag, here are the functions) up front and followed up with 6 examples of how these new functions can be used to manage spreadsheet creation and editing no matter how mangled or ugly. If you want the &lt;a href=&quot;http://www.countermarch.com/cfspreadsheet&quot;&gt;CFSpreadsheet presentation assets and (commented) sample code&lt;/a&gt;, feel free to pull this ZIP.  &lt;strong&gt;I will be updating it this weekend&lt;/strong&gt; with Derby databases so you can just unzip and run everything. For now, unpack the zip into a folder in your webroot. You may need to comment out the ORM settings in Application.cfc to make it run. Ping me with any questions either here or via twitter (@scrittler).&lt;/p&gt;


&lt;p&gt;I also had the opportunity to touch (very lightly) on the new ORM features of ColdFusion 9 during the presentation.  One of my demos (not in the zip file) is the start of an app that is intended to replace a spreadsheet with a web app.  After 90 minutes of work I had the spreadsheet imported to a db using Hibernate, a quick add/edit form put together and a re-export (since the end users still cling to Excel) of the current db.  If I had to write all that SQL it could have easily taken far longer. Finishing the app should be trivial from here, so props to Adobe for putting all the right pieces in the box for me to play with!&lt;/p&gt;

&lt;p&gt;It&apos;s pretty clear that the whole concept of using an ORM engine is very, very new to most of the ColdFusion world and is definitely holding back adoption.  You don&apos;t need to know terribly much to use Hibernate with ColdFusion but letting go of having to write SQL is certainly showing to be more difficult than expected.  It&apos;s a different way of thinking, one that the user group community can definitely help to encourage. The time savings and maintainability improvements alone are well worth starting the trip. I know the Philly CFUG calendar is pretty well packed, but I hope we can put together some talks on this topic (preferably hands on) soon.&lt;/p&gt;

&lt;p&gt;Again, thank you to the CFUG for inviting me to speak. I look forward to seeing everyone at the next meeting on Feb. 25!&lt;/p&gt; 
				</description>
				
				<category>ColdFusion</category>				
				
				<pubDate>Fri, 15 Jan 2010 14:20:00 -0400</pubDate>
				<guid>http://www.countermarch.com/blog/index.cfm/2010/1/15/CFSpreadsheet-presentation-and-samples</guid>
				
			</item>
			
			<item>
				<title>CFSpreadsheet and Conditional Formatting</title>
				<link>http://www.countermarch.com/blog/index.cfm/2010/1/11/CFSpreadsheet-and-Conditional-Formatting</link>
				<description>
				
				&lt;p&gt;CFSpreadsheet pretty much rocks the house when it comes to simplifying the task of creating spreadsheets (Excel and Open Office compatible) from ColdFusion.  On Thursday January 14 I&apos;ll be giving a talk at the &lt;a href=&quot;http://www.phillycfug.org/post/january-meeting-you-got-your-db-in-my-spreadsheet-you-got-your-spreadsheet-in-my-db&quot;&gt;Philadelphia CFUG meeting&lt;/a&gt; on this topic, but something I was working on last night has me particularly excited and requires a blog post.&lt;/p&gt;

&lt;p&gt;Several of the spreadsheets we currently generate for clients have some degree of pretty formatting associated with them.  The way we&apos;ve typically done it is to export a decorated &quot;source&quot; Excel file in Excel&apos;s XML spreadsheet format, chop it up and jack the appropriate data into the document, setting style attributes on the cell tags appropriately based on server-side logic.  But what if you wanted to create the spreadsheet such that the conditional logic was built in to the spreadsheet itself?  The people that use these spreadsheets like to play with the data and it would be awesome if the conditional formatting (highlight in some color, change font size, whatever you like) would apply to their edited data.&lt;/p&gt;

&lt;p&gt;It didn&apos;t seem immediately possible using CFSpreadsheet or any of the 37(!) functions exposed in ColdFusion...but then I remembered that this functionality is built on top of &lt;a href=&quot;http://poi.apache.org/&quot;&gt;Apache POI&lt;/a&gt;, so there had to be a way to get down and dirty with the Java internals. It&apos;s not hard to get there, but whoa the code to implement conditional formatting is definitely verbose.&lt;/p&gt;

&lt;p&gt;What I want to do is set up a conditional formatting rule on the 6th column (F) such that if the value is greater than 10 the background is set to yellow.&lt;/p&gt;

&lt;code&gt;
&lt;cfset objSS = spreadsheetNew(&quot;faculty&quot;) /&gt;
	
&lt;!--- get a handle on the underlying POI object ---&gt;
&lt;cfset objWorkbook = objSS.getWorkbook() /&gt;

&lt;cfset objSheet = objWorkbook.getSheetAt(objWorkbook.getActiveSheetIndex()) /&gt;
	
&lt;!--- get a handle on the conditional formatting property of the sheet ---&gt;
&lt;cfset objCF = objSheet.getSheetConditionalFormatting() /&gt;
	
&lt;!--- now add the format rule that we want on the doc ---&gt;
&lt;!--- formatting rule: 
&lt;cfset HSSFConditionalFormattingRule = objCF.createConditionalFormattingRule(
    																		5, &lt;!--- org.apache.poi.hssf.record.CFRuleRecord.ComparisonOperator.GT ---&gt;
    																		&quot;10&quot;, &lt;!--- the value i want the cell to be greater than for the format to kick in ---&gt;
     																		javacast(&quot;null&quot;, &quot;&quot;)     &lt;!--- 2nd formula is not used for GT/GE ---&gt;
 																		) /&gt;

 
&lt;!--- Create yellow background format definition ---&gt;
&lt;cfset HSSFPatternFormatting = HSSFConditionalFormattingRule.createPatternFormatting() /&gt;

&lt;cfset HSSFPatternFormatting.setFillBackgroundColor(createObject(&apos;java&apos;, &apos;org.apache.poi.hssf.util.HSSFColor$LIGHT_YELLOW&apos;).getIndex()) /&gt;
 
&lt;!--- Define a region that only impacts the &quot;tenure&quot; column (which we know to be the 5th (zero based)) ---&gt;
&lt;cfset regions = arrayNew(1) /&gt;
&lt;cfset regions[1] = createObject(&apos;java&apos;, &apos;org.apache.poi.ss.util.CellRangeAddress&apos;).init(1,1000,5,5) /&gt;
&lt;!--- CellRangeAddress(firstrow, lastrow, firstcol, lastcol) ---&gt;
	     
&lt;!--- Apply Conditional Formatting rule defined above to the regions  ---&gt;
&lt;cfset objCF.addConditionalFormatting(regions, HSSFConditionalFormattingRule) /&gt;
&lt;/code&gt;
&lt;p&gt;Then it&apos;s just a matter of inserting the spreadsheet contents as usual.&lt;/p&gt;
&lt;code&gt;
&lt;!--- generate the new worksheet ---&gt;
&lt;cfquery name=&quot;qFaculty&quot; datasource=&quot;#application.datasource#&quot;&gt;
	select 
			facultyID, pidm, loginID, firstName, lastName, startYear, department, title
	from 
	 		coe_faculty
	order by
			lastName
&lt;/cfquery&gt;


&lt;!--- headers are considered friendly ---&gt;
&lt;cfset spreadsheetAddRow(objSS, &quot;ID,PIDM,Login,First Name,Last Name, tenure, startYear, title, department&quot;) /&gt;

&lt;!--- i hate columns that show up as #### or truncated ---&gt;
&lt;cfset spreadsheetSetColumnWidth(objSS, 2, 13) /&gt;
&lt;cfset spreadsheetSetColumnWidth(objSS, 3, 8) /&gt;
&lt;cfset spreadsheetSetColumnWidth(objSS, 8, 20) /&gt;
&lt;cfset spreadsheetSetColumnWidth(objSS, 9, 25) /&gt;

&lt;!--- loop over the data - calc the tenure and style accordingly ---&gt;
&lt;cfloop query=&quot;qFaculty&quot; startrow=&quot;2&quot;&gt;

	&lt;cfset excelFormula = &quot;(year(today())-G&quot; &amp; qFaculty.currentRow &amp; &quot;)&quot; /&gt;

	&lt;cfset spreadsheetSetCellValue(objSS, qFaculty.facultyID , qFaculty.currentRow, 1) /&gt;
	&lt;cfset spreadsheetSetCellValue(objSS, qFaculty.pidm, qFaculty.currentRow, 2) /&gt;
	&lt;cfset spreadsheetSetCellValue(objSS, qFaculty.loginID, qFaculty.currentRow, 3) /&gt;
	&lt;cfset spreadsheetSetCellValue(objSS, qFaculty.firstName, qFaculty.currentRow, 4) /&gt;
	&lt;cfset spreadsheetSetCellValue(objSS, qFaculty.lastName, qFaculty.currentRow, 5) /&gt;
	&lt;cfset spreadsheetSetCellFormula(objSS, excelFormula, qFaculty.currentRow, 6) /&gt;
	&lt;cfset spreadsheetSetCellValue(objSS, qFaculty.startYear, qFaculty.currentRow, 7) /&gt;
	&lt;cfset spreadsheetSetCellValue(objSS, qFaculty.title, qFaculty.currentRow, 8) /&gt;
	&lt;cfset spreadsheetSetCellValue(objSS, qFaculty.department, qFaculty.currentRow, 9) /&gt;

&lt;/cfloop&gt;

&lt;!--- append the worksheet to a new spreadsheet file ---&gt;
&lt;cfspreadsheet action=&quot;write&quot; filename=&quot;#request.rootDirectory#\sheets\faculty_style_cf.xls&quot; name=&quot;objSS&quot; sheet=&quot;1&quot; overwrite=&quot;true&quot; /&gt;
&lt;/code&gt;
&lt;p&gt;The end result:&lt;/p&gt;
&lt;img src=&quot;http://www.countermarch.com/blog/images//coe_faculty_ss_example.png&quot; /&gt;&lt;br /&gt;
&lt;p&gt;Checking the conditional formatting panel in Excel we see that it&apos;s legit and not hard coded.&lt;/p&gt;
&lt;img src=&quot;http://www.countermarch.com/blog/images//coe_faculty_ss_example2.png&quot; /&gt;

&lt;p&gt;I&apos;ll post more as I dig in and build more complex examples.  This is a simple expression, but it should be enough to get you started if you need to do this kind of thing with ColdFusion and a generated spreadsheet!&lt;/p&gt; 
				</description>
				
				<category>ColdFusion</category>				
				
				<pubDate>Mon, 11 Jan 2010 10:28:00 -0400</pubDate>
				<guid>http://www.countermarch.com/blog/index.cfm/2010/1/11/CFSpreadsheet-and-Conditional-Formatting</guid>
				
			</item>
			
			<item>
				<title>Presenting at the Philadelphia CFUG</title>
				<link>http://www.countermarch.com/blog/index.cfm/2009/12/15/Presenting-at-the-Philadelphia-CFUG</link>
				<description>
				
				&lt;p&gt;&lt;a href=&quot;http://www.fusiongrokker.com/&quot;&gt;Adam&lt;/a&gt; posted the January 2010 meeting announcement to the &lt;a href=&quot;http://www.phillycfug.org&quot;&gt;CFUG website&lt;/a&gt; today -- I&apos;ll be doing a presentation on the &quot;powerful simplicity&quot; that is CFSpreadsheet (and associated functions) on the 14th at Penn.&lt;/p&gt;

&lt;p&gt;I&apos;m especially excited about this topic because of the frequency with which I generally have to work with(against) Excel.  Pretty much every project of ours uses Excel as a report output format and we&apos;ve tried everything from building tabular data in HTML and &quot;faking it&quot; to &lt;a href=&quot;http://www.countermarch.com/blog/index.cfm/2007/4/4/Creating-Excel-XML-files-with-ColdFusion&quot;&gt;saving Excel files in XML format&lt;/a&gt; and rebuilding on the server side.  Both of these options had limitations (the first being stylistic, the second being fragility), so now that ColdFusion has a simple way to build them I&apos;m a happy camper.  I didn&apos;t really want to get in to messing with POI.&lt;/p&gt;

&lt;p&gt;Long story short: we will always have to work with spreadsheets because that&apos;s what &quot;business users&quot; understand (read: as flat as possible).  ColdFusion 9 has built-in features that make reading and creating spreadsheets much easier than it&apos;s ever been.  I&apos;m excited about this and think you should come out to the &lt;a href=&quot;http://www.phillycfug.org/post/january-meeting-you-got-your-db-in-my-spreadsheet-you-got-your-spreadsheet-in-my-db&quot;&gt;next meeting on January 14, 2010&lt;/a&gt; to learn more!&lt;/p&gt; 
				</description>
				
				<category>ColdFusion</category>				
				
				<category>cfug</category>				
				
				<pubDate>Tue, 15 Dec 2009 17:20:00 -0400</pubDate>
				<guid>http://www.countermarch.com/blog/index.cfm/2009/12/15/Presenting-at-the-Philadelphia-CFUG</guid>
				
			</item>
			
			<item>
				<title>CounterMarch Systems is 5!</title>
				<link>http://www.countermarch.com/blog/index.cfm/2009/9/1/CounterMarch-Systems-is-5</link>
				<description>
				
				&lt;p&gt;CounterMarch Systems is 5 today! I have spent the last few days thinking back over projects we&apos;ve done, clients we&apos;ve worked with and what I&apos;ve learned simply by living it. It&apos;s been the most challenging thing I&apos;ve ever done, not always fun but I can&apos;t imagine working any other way. Self employment, given the option, is an opportunity everyone should have for themselves at least once. Steep and sharp curves are the most fun!&lt;/p&gt;
&lt;p&gt;So here&apos;s CounterMarch Systems, a retrospective, at 5 years old:&lt;/p&gt;

&lt;h3&gt;Origins&lt;/h3&gt;
&lt;p&gt;CounterMarch Systems started on a couch in a 3rd floor apartment in Langhorne, PA in September 2004. At the time it was just me (Steve), three clients, and my trusty IBM T41 laptop. I even had a little routine - work from home on Monday and Friday, work on campus with a client Tuesday and Wednesday (crashing on a grad student friend&apos;s couch overnight) and camp out at my dad&apos;s office on Thursday. It felt like I was living out of my car. All of my client files were in a crate in the trunk right next to my sleeping bag. I think having a routine yet varying work environment kept me sharp, though I&apos;m pretty certain that my coffee/latte intake was fairly extreme. Weekends, well, let&apos;s just say those were a blur too.&lt;/p&gt;
&lt;p&gt;Those first three clients led to almost &lt;a href=&quot;http://www.countermarch.com/clients.cfm&quot;&gt;every single client&lt;/a&gt; and project we&apos;ve had since. &lt;strong&gt;Lesson learned: don&apos;t underestimate the power of working your ass off and having someone else talk you up! &lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;Help Wanted&lt;/h3&gt;
&lt;p&gt;Through a series of fortuitous connections I was introduced to Matt Cass later that year, who started as a pseudo-intern and very quickly got tossed into the deep end of one of our most important projects. By January we had a comfortable workflow going, so much so that it didn&apos;t make sense for him to be anything less than full time. The &amp;quot;offer&amp;quot; was made at a career networking reception in Philly after which our circle of friends adjourned to the bar  to socialize and celebrate (something that became a repeating event in our work week). Through every single project since Matt has been my partner and friend, developing technical chops and helping to beat some sense into my ideas that have been absolutely key to our success. Confidence in our ability to work together has allowed the company to consistently take on bigger and better projects.&lt;/p&gt;
&lt;p&gt;I&apos;d be entirely remiss to complete this section without mentioning those who worked with us but have since moved on. Chris Hamilton, our first real intern and indespensible Linux resource, is absolutely brilliant. On one project he had to work out a very tricky integration that we could only theorize would work - he didn&apos;t quit until it was working. He&apos;s just like that. Graduation took him away from us, but we&apos;d hire him away from his current employer if we could. He likes playing with hardware too much. Chris, be warned...we&apos;re going to keep coming after you until you cave! Also on our team for an  extended period was Dayne Mickelson. I can&apos;t say enough about the fanatically disciplined approach to software development that Dayne brought to the task. I&apos;m pretty sure that if I printed out his code and shot it that the bullet wouldn&apos;t go through the paper - it was, literally, bulletproof. He contributed to two of our most important projects, one of which was responsible for a good deal of financial processing so it had to be good (and was!) The good news is that Dr. Mickelson will be coming to a hospital near you in a few years - we wish him well and miss our weekly cheap pizza lunches that we discontinued in his honor when he fled for Washington. Both Chris and Dayne came to us from client referrals too!&lt;/p&gt;

&lt;p&gt;The connections that led to Matt&apos;s employment (and full partnership) and our other employees has led to the growth of the company in ways I could have never expected. &lt;strong&gt;Lesson learned: choose your partner(s) wisely and recruit without recruiting.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;Getting Good&lt;/h3&gt;
&lt;p&gt;We&apos;ve operated through five years of projects, finding our focus, adjusting to follow the market and getting a lot better at what we do.  
ColdFusion was always a staple technology with us, but now we&apos;ve added proficiency with Flex and AIR. From a business standpoint, we&apos;ve developed a deep understanding of alumni relations, fundraising, benchmarking, CRM and (oddly, but only from a thematic perspective) semiconductor manfuacturing. You can&apos;t pick up a single book and be good at any of those areas. Only the experience that comes with either being a practitioner or working side by side with a practitioner in those areas would you ever know enough to implement the right solution. We have been able to do that on every engagement by being fully present when listening to our clients and playing &amp;quot;idea volleyball&amp;quot; back in the office on the best technical solution to the issue at hand. It&apos;s great fun to solve a persistent problem with a combination of technical wizardry and clear business understanding. I&apos;d say that our athletics recruitment system is the finest example of this, bar none.&lt;/p&gt;
&lt;p&gt;Long term client engagements have led to in-depth business knowledge, which has in turn allowed us to develop software that meets the business need and hits all the technical requirements of the project. &lt;strong&gt;Lesson learned: listen fully, question gently, debate vigorously and implement wisely.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;Work Hard, Play Hard&lt;/h3&gt;
&lt;p&gt;Much like golf (which we never have time to play), it&apos;s important to swing through the ball. In our case, just becoming good consultants and the maintainers of software we&apos;ve delivered is not the final step of our engagement with any of our clients. No good developer (or development shop) should ever stop sharpening their saw, no manager should ever stop seeking out ways for staff members to improve and no salesman should ever let the phone go cold. We have clients who have been with us through all five years, working through several projects and the challenge of brining new code to life. I don&apos;t think we&apos;d be in a position to do that if we weren&apos;t great technologists, if we weren&apos;t great self-managers or if we weren&apos;t great at standing behind our work. The better we get at learning the more proficient we are and the more value we can deliver with every project. That&apos;s terrifically exciting and I intend to keep up the pace, delivering better stuff every single time. It&apos;s FUN to do what we do and if we didn&apos;t love it we couldn&apos;t be nearly as effective.&lt;/p&gt;
&lt;p&gt;We learned that in college and it&apos;s just as true in business. &lt;strong&gt;Lesson learned: work hard, play hard.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;Now for our next act...&lt;/h3&gt;
&lt;p&gt;Five years is an awfully long time to be doing anything and far exceeds the typical lifespan of a startup. That we have been fortunate enough to be successful at it through the highs and lows is due to the trust, guidance and (let&apos;s be honest) money of those who think we&apos;re worth it. We&apos;re proud of the company and reputation we&apos;ve built. &lt;/p&gt;
&lt;p&gt;Matt and I have a few really big, exciting goals for the upcoming year and a very full pipeline of projects to get done (plus a big announcement very, very soon). I&apos;ll be sure to blog about them as we get there; Twitter isn&apos;t great for everything!&lt;/p&gt;
&lt;p&gt;So from two guys in an office with more PCs per person than OSHA would think appropriate, thank you for your support and your business. We look forward to working with you, learning with you and enjoying whatever comes next!&lt;/p&gt; 
				</description>
				
				<category>shameless self promotion</category>				
				
				<pubDate>Tue, 01 Sep 2009 18:08:00 -0400</pubDate>
				<guid>http://www.countermarch.com/blog/index.cfm/2009/9/1/CounterMarch-Systems-is-5</guid>
				
			</item>
			
			<item>
				<title>Benchmarking and Analytics Toolkit for Higher Education powered by Adobe ColdFusion and Flex</title>
				<link>http://www.countermarch.com/blog/index.cfm/2009/8/25/Benchmarking-and-Analytics-Toolkit-for-Higher-Education-powered-by-Adobe-ColdFusion-and-Flex</link>
				<description>
				
				&lt;p&gt;Earlier this year one of our projects went from soft-launch mode to officially &quot;live&quot; mode: The &lt;a href=&quot;http://benchmarking.case.org&quot; title=&quot;CASE Benchmarking Toolkit&quot;&gt;CASE Benchmarking Toolkit&lt;/a&gt;, a system we designed and implemented for &lt;a href=&quot;http://www.case.org/&quot; target=&quot;_blank&quot; title=&quot;CASE&quot;&gt;CASE, the Council for Advancement and Support of Education&lt;/a&gt;. CASE represents over 2000 institutions of higher education worldwide with over 75,000 members.&lt;/p&gt;

&lt;div style=&quot;width:250px; padding:1em; float:right;&quot;&gt;
&lt;fieldset style=&quot;background-color:#eeeeee;&quot;&gt;
	&lt;legend&gt;Technical Specs&lt;/legend&gt;
	&lt;p&gt;
		&lt;strong&gt;Interface&lt;/strong&gt;: Flex 3.3&lt;br /&gt;
		&lt;strong&gt;Backend&lt;/strong&gt;: ColdFusion 8&lt;br /&gt;
		&lt;strong&gt;Database&lt;/strong&gt;: Microsoft SQL Server 2000
	&lt;/p&gt;
	&lt;p&gt;
		Integration with their member management and AMS/CRM system, iMIS.&lt;br /&gt;
		Consumes data provided by IPEDS.&lt;br /&gt;
	&lt;/p&gt;
&lt;/fieldset&gt;
&lt;/div&gt;
&lt;p&gt;The Toolkit enables the CASE research division and interested communities of practice&lt;sup&gt;1&lt;/sup&gt; to build quantitative benchmarking surveys, collect data, generate reports (text and graphical) and design summary dashboards through an easy-to-use interface. We wanted to share a little bit about what it does, why this is great for the alumni relations and advancement profession and why we as Adobe fans are so proud to have built it.&lt;/p&gt;

&lt;h4&gt;History&lt;/h4&gt;
&lt;p&gt;The origins of this project start back in 2005 with our friends at &lt;a href=&quot;http://www.pcuad.org/&quot; title=&quot;PCUAD: Association of Private College and University Alumni Directors&quot; target=&quot;_blank&quot;&gt;PCUAD&lt;/a&gt;.  We implemented a surveying and benchmarking system for them that reduced the amount of time required to collect, output and analyze the data gathered from thirty higher education institutions. The &quot;&lt;a href=&quot;http://www.pcuad.org&quot; title=&quot;PCUAD ARAMP&quot; target=&quot;_blank&quot;&gt;Alumni Relations Assessment and Measurement Program&lt;/a&gt;&quot; (ARAMP) was the first attempt by any community of practice organization to quantitatively measure the performance of an alumni relations operation. It was an overnight success and continues to be used by PCUAD. About a year later we replaced the HTML UI with a Flex-based UI for use by the &lt;a href=&quot;http://www.nearweb.org&quot; title=&quot;NEAR&quot; target=&quot;_blank&quot;&gt;North East Alumni Relations&lt;/a&gt; group (NEAR).&lt;/p&gt;
&lt;p&gt;Word got out pretty fast that PCUAD had not only created a great survey to &apos;measure&apos; Alumni Relations but also the software to back it up. PCUAD was all too happy to help us get connected with the team at CASE to see if we could push this forward as a global benchmarking system. Once the decision was made to move ahead, we set about redesigning everything - the data model, the middleware and especially the user interface to work seamlessly with the CASE CRM system (iMIS - also a ColdFusion-powered product!)- using the experience we gained supporting PCUAD and NEAR to inform our decision making.&lt;/p&gt;
&lt;p&gt;We delivered the system to CASE in February 2008 for beta testing, flipping the &quot;go-live&quot; switch in May.&lt;/p&gt;
&lt;p&gt;Perhaps more importantly, we delivered the system to them &lt;em&gt;&lt;u&gt;on time and under budget&lt;/u&gt;&lt;/em&gt;. &lt;/p&gt;

&lt;h4&gt;Fast, integrated survey creation&lt;/h4&gt;
&lt;p&gt;Administrators can whip up a survey in next to no time. The CBT supports a wide variety of question types including question matrices. The system strongly encourages question reuse and enables the cloning of questions, sections and even entire surveys. It is through this capability that year-over-year data can be compared and analyzed. Since the user directory is fully integrated with iMIS, assigning permissions can be done anywhere within CASE which makes provisioning and access control a piece of cake.&lt;/p&gt;

&lt;h4&gt;Pain-free survey taking&lt;/h4&gt;
&lt;p&gt;For starters, this product is not Survey Monkey.  Responses to surveys are intended to reflect institutional (not individual) performance; for any given survey many people from an institution can work on it but there is only one submission per school.  This allows us to aggregate and filter the reports by specific institutional characteristics. Assistive text is available for each question in a survey, which when it comes to financial reporting is absolutely crucial. There are many ways to tabulate donations, donors, volunteers and many other aspects of a modern-day advancement organization.&lt;/p&gt;

&lt;h4&gt;Reporting and Exporting&lt;/h4&gt;
&lt;p&gt;Reporting is also a breeze. We know that advancement professionals use a lot of Word and Powerpoint documents in their line of work so we made it really simple to get exactly what they want from the available survey data. Not only can you select which of the available criteria to filter on, but you can view charts and graphs, calculate aggregate values and export it all to Excel (report data) and jpg (charts). We found that using ColdFusion to generate the appropriate data and Flex to render it was a very efficient, powerful combination. &lt;/p&gt;
&lt;p&gt;Filtering report data was done through a very straightforward interface based on research and design we did for our RecruitWeb product. Criteria are displayed down the left side of the screen for selection; each item carries with it additional parameters that are user-defined. Use of colors to indicate active filters and the translation of selections to &amp;quot;plain English&amp;quot; gives the user a very good idea of what they can expect to see in the requested report.&lt;/p&gt;
&lt;p&gt;Aggregate values are calculated for multi institution reports and privacy is protected for specific types of surveys under certain circumstances. We learned just how protective advancement professionals are of their financial data yet found a way to present actionable and useful information without compromising privacy. &lt;/p&gt;

&lt;h4&gt;Screenshots&lt;/h4&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/1_login.png&quot; 					class=&quot;lightbox&quot; title=&quot;The CBT login screen&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/1_login.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/2_creation1.png&quot; 				class=&quot;lightbox&quot; title=&quot;Admin: Survey list&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/2_creation1.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/3_editsurvey1.png&quot; 			class=&quot;lightbox&quot; title=&quot;Admin: Editing a survey&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/3_editsurvey1.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/4_editsurvey2.png&quot; 			class=&quot;lightbox&quot; title=&quot;Admin: Editing a survey section&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/4_editsurvey2.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/5_editsurvey3.png&quot; 			class=&quot;lightbox&quot; title=&quot;Admin: Editing a survey question. Many question types are supported.&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/5_editsurvey3.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/6_reports1.png&quot; 				class=&quot;lightbox&quot; title=&quot;Reporting: Raw data, conditioned on user selections and precompiled dashboards&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/6_reports1.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/7_reports.png&quot; 				class=&quot;lightbox&quot; title=&quot;Raw data reports can be generated for multiple institutions or multiple years&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/7_reports.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/8_reportcriteria1.png&quot; 		class=&quot;lightbox&quot; title=&quot;Report filter criteria&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/8_reportcriteria1.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/9_reportcritera2.png&quot; 		class=&quot;lightbox&quot; title=&quot;Selecting allowable values for a specific data point&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/9_reportcritera2.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/10_reportcritera3.png&quot; 		class=&quot;lightbox&quot; title=&quot;Report filter criteria showing active criteria and the plain-english translation of the selections&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/10_reportcritera3.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/11_report.png&quot; 				class=&quot;lightbox&quot; title=&quot;Single institution report; icon in right most column generates a chart for this datapoint&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/11_report.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/12_reportchart.png&quot; 			class=&quot;lightbox&quot; title=&quot;Single datapoint chart; sorry we don&apos;t have comparative data to share!&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/12_reportchart.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/13_reportmulityear.png&quot; 		class=&quot;lightbox&quot; title=&quot;Selecting sister years for a multiyear report&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/13_reportmulityear.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/14_reportmulityear.png&quot; 		class=&quot;lightbox&quot; title=&quot;A generated multiyear report&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/14_reportmulityear.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/20_surveytaker.png&quot; 			class=&quot;lightbox&quot; title=&quot;Survey taker: first screen showing available surveys&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/20_surveytaker.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/21_surveytaker2.png&quot; 			class=&quot;lightbox&quot; title=&quot;Home screen of the survey showing instructional text, links to export (printable!) and all survey sections&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/21_surveytaker2.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/22_surveypreview.png&quot; 		class=&quot;lightbox&quot; title=&quot;Downloading a survey preview report&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/22_surveypreview.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/23_surveypreviewexport.png&quot; 	class=&quot;lightbox&quot; title=&quot;The survey preview report in Excel&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/23_surveypreviewexport.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.countermarch.com/blog/images/cbt/24_takingsurvey.png&quot; 			class=&quot;lightbox&quot; title=&quot;Taking a survey - showing inline assistive text&quot;&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/cbt/scroll/24_takingsurvey.jpg&quot; width=&quot;150&quot; height=&quot;113&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;

&lt;h4&gt;What&apos;s ahead&lt;/h4&gt;
&lt;p&gt;Overall, we&apos;re extremely pleased with what we were able to deliver. ColdFusion made the middleware and business logic a snap. Flex allowed us to prepare a rich, responsive user interface. Using Flex also provides the server with some additional scalability. Similar to an ajax-powered application, the less we have to generate and send over the wire the more resources are available to support a larger number of connected clients. &lt;/p&gt;
&lt;p&gt;Thinking ahead, it would be great if we could deliver an AIR application to enable push messaging - new survey notifications, even faster desktop reporting and possibly even survey completion alerts. The more data this system contains the more valuable it becomes to all of the CASE member institutions. The more tools we can provide that encourage people to participate the better!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. A &amp;quot;community of practice&amp;quot; is an assembly of peer institutions connected by similar characteristics like alumni population, annual fund budget, or undergraduate population - not the traditional groupings like &amp;quot;Ivy League&amp;quot; or &amp;quot;Big 10.&amp;quot; This ensures an &amp;quot;apples to apples&amp;quot; comparison of data for each discipline represented by the toolkit.&lt;/p&gt; 
				</description>
				
				<category>RIAs</category>				
				
				<category>ColdFusion</category>				
				
				<category>Flex</category>				
				
				<pubDate>Tue, 25 Aug 2009 17:27:00 -0400</pubDate>
				<guid>http://www.countermarch.com/blog/index.cfm/2009/8/25/Benchmarking-and-Analytics-Toolkit-for-Higher-Education-powered-by-Adobe-ColdFusion-and-Flex</guid>
				
			</item>
			
			<item>
				<title>Acrobat Connect drives alumni career services success</title>
				<link>http://www.countermarch.com/blog/index.cfm/2009/8/3/Acrobat-Connect-drives-alumni-career-services-success</link>
				<description>
				
				&lt;p&gt;An &lt;a href=&quot;http://www.nytimes.com/2009/08/02/fashion/02alumni.html&quot;&gt;article&lt;/a&gt; in this past weekend&apos;s New York Times profiled &lt;a href=&quot;http://www.lehigh.edu&quot;&gt;our alma mater&apos;s&lt;/a&gt; amazingly successful &lt;a href=&quot;http://www3.lehigh.edu/alumni/career/&quot;&gt;alumni career solutions&lt;/a&gt; program. &lt;/p&gt;

&lt;p&gt;Undergraduate career services are widely known but not nearly as many folks know about similar services that the truly class-leading alumni associations under visionary leadership started providing earlier this decade. Alumni databases existed long before the days of Facebook and LinkedIn; leveraging that information (and the requisite institutional affinity) to keep as many alumni employed as possible seemed like an obvious win-win. Lehigh&apos;s alumni director Chris Marshall (now at Cornell) saw the need and hired two great people to staff this new program; the next challenge was giving them the right tools to maximize their impact. Undergraduate populations are easily served (they&apos;re all in one place) - serving a globally-distributed alumni body...not so much. &lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.countermarch.com/blog/images/connectlogo.jpg&quot; align=&quot;left&quot; width=&quot;200&quot; /&gt; Lehigh&apos;s program has been able to assist far more people due to their heavy use of a system we recommended to them: &lt;a href=&quot;http://www.adobe.com/products/acrobatconnect/&quot;&gt;Adobe Acrobat Connect&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Every week, Lori and Robin put on multiple web seminars on topics immediately useful to alumni in transition like salary negotiation, interview skills and grad school prep.  These aren&apos;t pre-recorded sessions; they are presented live at a variety of times so that alumni can sneak it in over their lunch hour or later in the day at home.  When all you need is a web browser to participate, the barriers to getting help are significantly lowered.  Acrobat Connect has kept the cost of providing this service to an affordable minimum while maximizing the number of people served every month.&lt;/p&gt;

&lt;p&gt;We&apos;re happy to have pointed them in the right direction so they can help as many alumni as possible, especially in these challenging economic times. Congratulations on getting some &lt;a href=&quot;http://www.nytimes.com/2009/08/02/fashion/02alumni.html&quot;&gt;well-warranted recognition&lt;/a&gt;, Lehigh!&lt;/p&gt; 
				</description>
				
				<category>alumni relations</category>				
				
				<pubDate>Mon, 03 Aug 2009 23:50:00 -0400</pubDate>
				<guid>http://www.countermarch.com/blog/index.cfm/2009/8/3/Acrobat-Connect-drives-alumni-career-services-success</guid>
				
			</item>
			
			<item>
				<title>ColdFusion 9: ORM, Part 2</title>
				<link>http://www.countermarch.com/blog/index.cfm/2009/8/3/ColdFusion-9-ORM-Part-2</link>
				<description>
				
				&lt;p&gt;In &lt;a href=&quot;http://www.countermarch.com/blog/index.cfm/2009/8/2/ORM_Part_1&quot;&gt;part one&lt;/a&gt; I dipped my toes into the world of ORM in ColdFusion 9.  Today I&apos;m diving in...and I know there&apos;s far more to this than what I&apos;m about to try, so there may be a Part 3 yet to come.  As with part one, I&apos;m writing this as I go...mistakes and all.&lt;/p&gt;

&lt;p&gt;Today&apos;s challenge: get the rest of the spreadsheet imported into a more relational format.&lt;/p&gt;

&lt;p&gt;The source data has a set of columns for payment information, which is great if you only want to keep the most recent payment information.  Likewise, there&apos;s one column called &quot;comments&quot; that looks like it&apos;ll grow to be kinda nasty over time.&lt;/p&gt;

&lt;img src=&quot;http://www.countermarch.com/blog/images//orm_6.png&quot; width=&quot;550&quot;&gt;

&lt;p&gt;Ideally there&apos;s a one-to-many relationship between a person and payments and a person and comments. So how do we do that in an ORM configuration?&lt;/p&gt;

&lt;p&gt;Step one is to create a CFC for a comment, as that is somewhat more simple.&lt;/p&gt;

&lt;code&gt;

&lt;cfcomponent output=&quot;false&quot; persistent=&quot;true&quot;&gt;

	&lt;cfproperty name=&quot;commentID&quot; type=&quot;numeric&quot; fieldtype=&quot;id&quot; generator=&quot;increment&quot; /&gt;
	&lt;cfproperty name=&quot;person&quot; cfc=&quot;chiomega.mms.person&quot; fkcolumn=&quot;personID&quot; fieldtype=&quot;many-to-one&quot; lazy=&quot;true&quot; /&gt;
	&lt;cfproperty name=&quot;note&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;createDate&quot; type=&quot;date&quot; /&gt;

&lt;/cfcomponent&gt;

&lt;/code&gt;

&lt;p&gt;Once again we&apos;ve defined the CFC as &quot;persistent&quot; so Hibernate knows about it. As before we set the primary key field by defining the fieldtype and generator attributes on it.&lt;/p&gt;

&lt;p&gt;The second property is the fun one.  Usually when we&apos;re building a database, we&apos;d reflexively put &quot;personID&quot; as a foreign key on the table.  Remember, though, that what we&apos;re trying to capture here is the relationship between two objects. A comment &quot;belongs to&quot; a person.&lt;/p&gt;

&lt;p&gt;Deconstructing the attributes:
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;cfc&lt;/strong&gt;: the actual cfc object that this property references (person is in the /chiomega/mms folder)&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;fkcolumn&lt;/strong&gt;: I like to use the PK of the referenced object as the FK column name in the database.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;fieldtype&lt;/strong&gt;: truly magical - there are &quot;many&quot; comments for &quot;one&quot; person.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;lazy&lt;/strong&gt;: don&apos;t get the data for the person until I ask for it&lt;/li&gt;

&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;The options for &lt;a href=&quot;http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSE01EDE03-6E6B-4669-8C54-358460778450.html&quot;&gt;Lazy Loading&lt;/a&gt; are many...and extremely worth the read.  Any code where I can include an attribute &lt;strong&gt;lazy=&quot;extra&quot;&lt;/strong&gt; is beyond awesome to me!  Quite honestly, though, how many times have you written a very large SQL statement with many join conditions, knowing full well you won&apos;t use most of the data but prefer to use one &quot;getter&quot; statement?  Too many, right? No more. Let Hibernate take care of getting the data for you at the appropriate time.  I could write a blog post purely on the subject of lazy loading and how great this is.&lt;/p&gt;


&lt;p&gt;Back to the topic at hand: now that we&apos;ve got a &quot;comment&quot; object with a relationship to &quot;person&quot; defined, let&apos;s look at the &quot;person&quot; and set the inverse relationship.&lt;/p&gt;

&lt;code&gt;
&lt;cfcomponent displayname=&quot;person&quot; hint=&quot;person object&quot; output=&quot;false&quot; persistent=&quot;true&quot;&gt;

	&lt;cfproperty name=&quot;personID&quot; type=&quot;numeric&quot; fieldtype=&quot;id&quot; generator=&quot;increment&quot; /&gt;
	&lt;cfproperty name=&quot;firstName&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;lastName&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;address1&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;address2&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;city&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;state&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;postalCode&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;phoneNumber&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;emailAddress&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;profession&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;chapterName&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;initiationYear&quot; type=&quot;numeric&quot; /&gt;

	&lt;cfproperty name=&quot;comments&quot; singularName=&quot;comment&quot; type=&quot;array&quot; fieldtype=&quot;one-to-many&quot; cfc=&quot;chiomega.mms.comment&quot; fkcolumn=&quot;personID&quot; cascade=&quot;all&quot; /&gt;

&lt;/cfcomponent&gt;
&lt;/code&gt;

&lt;p&gt;That last property says that each person has a property called &quot;comments&quot; that is an array of &quot;comment&quot; entities of type &quot;chiomega.mms.comment&quot;.&lt;/p&gt;

&lt;p&gt;Whoa. Break it down:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;singularName&lt;/strong&gt;: in a &quot;one-to-many&quot; scenario, what we&apos;re referencing is plural...but there&apos;s also a need (which I&apos;ll clarify momentarily) to reference the items individually. &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;type&lt;/strong&gt;: valid types are array and struct. An array makes sense for this example.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;fieldtype&lt;/strong&gt;: the reverse of what we had on the &quot;comment&quot; entity. Each person can have 0 or more &quot;comment&quot; objects.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;cfc&lt;/strong&gt;: the type you&apos;re referencing, in this case the cfc we just created&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;fkcolumn&lt;/strong&gt;: the column in the &quot;child&quot; table that will represent this &quot;person&quot;; recall that we set fkColumn in the &quot;comment&quot; entity to &quot;personID&quot;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;cascade&lt;/strong&gt;: When I save a &quot;person&quot;, save any child comment records that exist (insert or update) on the person. Also goes for delete operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;singularName is incredibly useful: this is used to define the auto-generated add/remove methods for the related objects. Read more on what&apos;s created for you in the &lt;a href=&quot;http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSf0ed2a6d7fb07688310730d81223d0356fc-7fff.html&quot;&gt;ColdFusion 9 docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &quot;cascade&quot; attribute was a trial-by-error discovery.  There&apos;s a &lt;a href=&quot;http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WS5FFD2854-7F18-43ea-B383-161E007CE0D1.html&quot;&gt;cascade options&lt;/a&gt; section in the docs on your choices here - basically it defines how the relationship behaves on save/update operations.  If you get a &lt;strong&gt;object references an unsaved transient instance - save the transient instance before flushing&lt;/strong&gt; error, this is why -- go back and set a cascade on your parent entity so that child operations work properly.&lt;/p&gt;

&lt;p&gt;That should do it for configuration.  Let&apos;s tie it together and import people and comments from the spreadsheet again.&lt;/p&gt;

&lt;code&gt;
&lt;!--- reload the Hibernate config (great for development, DO NOT use for production!) ---&gt;
&lt;cfset ormReload() /&gt;

&lt;cfspreadsheet action=&quot;read&quot; src=&quot;master.xls&quot; query=&quot;sheet&quot; headerrow=&quot;1&quot; /&gt;

&lt;cfloop query=&quot;sheet&quot; startrow=&quot;2&quot;&gt;

	&lt;cfscript&gt;
		obj = EntityNew(&quot;person&quot;);
		obj.setFirstName(sheet[&quot;FIRST NAME&quot;][sheet.currentRow]);
		obj.setLastName(sheet[&quot;LAST NAME&quot;][sheet.currentRow]);
		obj.setAddress1(sheet[&quot;ADDRESS&quot;][sheet.currentRow]);
		obj.setAddress2(sheet[&quot;APT&quot;][sheet.currentRow]);
		obj.setCity(sheet[&quot;CITY&quot;][sheet.currentRow]);
		obj.setstate(sheet[&quot;STATE&quot;][sheet.currentRow]);
		obj.setPostalCode(sheet[&quot;ZIP&quot;][sheet.currentRow]);
		obj.setPhoneNumber(sheet[&quot;PHONE ##&quot;][sheet.currentRow]);
		obj.setEmailAddress(sheet[&quot;EMAIL&quot;][sheet.currentRow]);
		obj.setProfession(sheet[&quot;PROFESSION&quot;][sheet.currentRow]);
		obj.setChapterName(sheet[&quot;CHAPTER&quot;][sheet.currentRow]);
		obj.setInitiationYear(val(sheet[&quot;INITIATION YEAR&quot;][sheet.currentRow]));

		if(sheet[&quot;COMMENTS&quot;][sheet.currentRow] is not &apos;&apos;)
		{
			commentObj = entityNew(&quot;comment&quot;);
			commentObj.setNote(trim(sheet[&quot;COMMENTS&quot;][sheet.currentRow]));
			commentObj.setCreateDate(now());
			obj.addComment(commentObj);
		}
		
		entitySave(obj);
	&lt;/cfscript&gt;
	
&lt;/cfloop&gt;

&lt;/code&gt;

&lt;p&gt;&quot;obj&quot; is my person.  If we want to import a comment, we&apos;ll create a new entity of type &quot;comment&quot;.  Recall that these entities have getters and setters automagically created for us, so I populate the note and createDate properties of the comment with values from the spreadsheet.&lt;/p&gt;

&lt;p&gt;Once the comment is populated, I &quot;addComment&quot; to the person - the addComment is one of those &lt;a href=&quot;http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSf0ed2a6d7fb07688310730d81223d0356fc-7fff.html&quot;&gt;automatically generated methods&lt;/a&gt;.  Something I learned since the last post is that calling &lt;strong&gt;ormFlush()&lt;/strong&gt; isn&apos;t necessary - at the end of the request it&apos;s called implicitly.&lt;/p&gt;

&lt;p&gt;That was easy!  Following the same pattern, I added an entity for payments:&lt;/p&gt;

&lt;code&gt;
&lt;cfcomponent persistent=&quot;true&quot;&gt;

	&lt;cfproperty name=&quot;paymentID&quot; type=&quot;numeric&quot; fieldtype=&quot;id&quot; generator=&quot;increment&quot; /&gt;
	&lt;cfproperty name=&quot;person&quot; fieldtype=&quot;many-to-one&quot; fkcolumn=&quot;personID&quot; cfc=&quot;chiomega.mms.person&quot; lazy=&quot;true&quot; /&gt;
	&lt;cfproperty name=&quot;amount&quot; type=&quot;numeric&quot; /&gt;
	&lt;cfproperty name=&quot;paymentType&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;note&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;paymentDate&quot; type=&quot;date&quot; /&gt;
	
&lt;/cfcomponent&gt;
&lt;/code&gt;

&lt;p&gt;...and configured my &apos;person&apos; to reference them...&lt;/p&gt;

&lt;code&gt;
&lt;cfcomponent displayname=&quot;person&quot; hint=&quot;person object&quot; output=&quot;false&quot; persistent=&quot;true&quot;&gt;

	&lt;cfproperty name=&quot;personID&quot; type=&quot;numeric&quot; fieldtype=&quot;id&quot; generator=&quot;increment&quot; /&gt;
	&lt;cfproperty name=&quot;firstName&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;lastName&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;address1&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;address2&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;city&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;state&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;postalCode&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;phoneNumber&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;emailAddress&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;profession&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;chapterName&quot; type=&quot;string&quot; /&gt;
	&lt;cfproperty name=&quot;initiationYear&quot; type=&quot;numeric&quot; /&gt;

	&lt;cfproperty name=&quot;payments&quot; singularName=&quot;payment&quot; type=&quot;array&quot; fieldtype=&quot;one-to-many&quot; cfc=&quot;chiomega.mms.payment&quot; fkcolumn=&quot;personID&quot; cascade=&quot;all&quot; /&gt;
	&lt;cfproperty name=&quot;comments&quot; singularName=&quot;comment&quot; type=&quot;array&quot; fieldtype=&quot;one-to-many&quot; cfc=&quot;chiomega.mms.comment&quot; fkcolumn=&quot;personID&quot; cascade=&quot;all&quot; /&gt;

&lt;/cfcomponent&gt;
&lt;/code&gt;

&lt;p&gt;Then tweaked the importer to add those as well:&lt;/p&gt;

&lt;code&gt;
&lt;cfspreadsheet action=&quot;read&quot; src=&quot;master.xls&quot; query=&quot;sheet&quot; headerrow=&quot;1&quot; /&gt;

&lt;cfloop query=&quot;sheet&quot; startrow=&quot;2&quot;&gt;

	&lt;cfscript&gt;
		obj = EntityNew(&quot;person&quot;);
		obj.setFirstName(sheet[&quot;FIRST NAME&quot;][sheet.currentRow]);
		obj.setLastName(sheet[&quot;LAST NAME&quot;][sheet.currentRow]);
		obj.setAddress1(sheet[&quot;ADDRESS&quot;][sheet.currentRow]);
		obj.setAddress2(sheet[&quot;APT&quot;][sheet.currentRow]);
		obj.setCity(sheet[&quot;CITY&quot;][sheet.currentRow]);
		obj.setstate(sheet[&quot;STATE&quot;][sheet.currentRow]);
		obj.setPostalCode(sheet[&quot;ZIP&quot;][sheet.currentRow]);
		obj.setPhoneNumber(sheet[&quot;PHONE ##&quot;][sheet.currentRow]);
		obj.setEmailAddress(sheet[&quot;EMAIL&quot;][sheet.currentRow]);
		obj.setProfession(sheet[&quot;PROFESSION&quot;][sheet.currentRow]);
		obj.setChapterName(sheet[&quot;CHAPTER&quot;][sheet.currentRow]);
		obj.setInitiationYear(val(sheet[&quot;INITIATION YEAR&quot;][sheet.currentRow]));
		
		if(sheet[&quot;COMMENTS&quot;][sheet.currentRow] is not &apos;&apos;)
		{
			commentObj = entityNew(&quot;comment&quot;);
			commentObj.setNote(trim(sheet[&quot;COMMENTS&quot;][sheet.currentRow]));
			commentObj.setCreateDate(now());
			obj.addComment(commentObj);
		}
		
		if(sheet[&quot;DATE&quot;][sheet.currentRow] is not &apos;&apos;)
		{
			paymentObj = entityNew(&quot;payment&quot;);
			cleanAmount = trim(sheet[&quot;PAYMENT&quot;][sheet.currentRow]);
			cleanAmount = replace(cleanAmount, &quot;$&quot;, &quot;&quot;);
			paymentObj.setAmount(val(cleanAmount));
			paymentObj.setPaymentType(&apos;check&apos;);
			paymentObj.setNote(trim(sheet[&quot;CHK ##&quot;][sheet.currentRow]));
			paymentObj.setPaymentDate(sheet[&quot;DATE&quot;][sheet.currentRow]);
			
			obj.addPayment(paymentObj);
		}
		
		entitySave(obj);
	&lt;/cfscript&gt;
	
&lt;/cfloop&gt;
&lt;/code&gt;

&lt;p&gt;And, best of all, I haven&apos;t written a single line of SQL nor have I gone in and created tables/columns/relationships/constraints in the database, yet I have this ready and waiting for use:&lt;/p&gt;

&lt;img src=&quot;http://www.countermarch.com/blog/images//orm_8.png&quot;&gt;

&lt;p&gt;Up next: building an actual application using what we&apos;ve just created.  I&apos;m pumped...this is working out great so far!&lt;/p&gt; 
				</description>
				
				<category>ColdFusion</category>				
				
				<pubDate>Mon, 03 Aug 2009 11:56:00 -0400</pubDate>
				<guid>http://www.countermarch.com/blog/index.cfm/2009/8/3/ColdFusion-9-ORM-Part-2</guid>
				
			</item>
			</channel></rss>