<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://www.evenamonkey.com" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>even a monkey - coldfusion</title>
 <link>http://www.evenamonkey.com/taxonomy/term/26/0</link>
 <description></description>
 <language>en</language>
<item>
 <title>Agile Development - article I wrote earlier in this year</title>
 <link>http://www.evenamonkey.com/AgileIntroduction</link>
 <description>&lt;!-- google_ad_section_start --&gt;
&lt;p&gt;I will be blogging more and more about agile development and SCRUM. here is an article I wrote a few months back, after CFUNITED:&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
&lt;br&gt;&lt;/p&gt;
&lt;div style=&quot;padding: 5px 5px 15px;&quot;&gt;
&lt;h1&gt;CFUnited Session Review: Pragmatic ColdFusion: Build, Test, Deploy by John Paul Ashenfelter&lt;/h1&gt;
&lt;div id=&quot;titlesubbar&quot;&gt;
	&lt;strong&gt;Jul 03, 2007&lt;/strong&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;img src=&quot;http://www.fusionauthority.com/images/authors/doug_sims_small.jpg&quot; align=&quot;left&quot; hspace=&quot;20&quot;&gt;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;by Doug  Sims, CFUnited Correspondent&lt;/strong&gt;&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
&lt;a href=&quot;http://evenamonkey.com&quot; target=&quot;_Blank&quot;&gt;http://evenamonkey.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This year I found myself attending CFUnited after only six days in a new job and my first experience working in an Agile/SCRUM environment. I left San Antonio armed with the agile development book from Microsoft Press. Needless to say, I gained more knowledge about agile development in a one hour session with John Paul Ashenfelter than I did reading the first four chapters of the book on the plane.&lt;/p&gt;
&lt;p&gt;
John Paul was able to sum up the basic principals of Agile Development in only 24 words in his Agile Manifesto:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Individuals and Interactions&lt;/strong&gt; over processes and tools&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Working software&lt;/strong&gt; over comprehensive documentation&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Customer collaboration&lt;/strong&gt; over contract negotiation&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Responding to change&lt;/strong&gt; over following a plan&lt;/p&gt;
&lt;p&gt;Thank you, Mr. Ashenfelter. Awesome and concise, if I don&#039;t say so myself. First, let&#039;s expand upon these four goals in the Agile Manifesto, before discussing ways to meet some of these goals in practice.&lt;/p&gt;
&lt;h2&gt;Agile Goal: Individuals and interactions:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Build projects around motivated individuals. Give them the environment and support they need and trust them to get the job done.&lt;/li&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;li&gt;Business people and developers must work together daily throughout the project.&lt;/li&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;li&gt;The most efficient method of conveying information to and within a development team is face to face conversation.&lt;/li&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;li&gt;Agile processes promote sustainable development. The sponsors, developers and users should be able to maintain a constant pace indefinitely.&lt;/li&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;li&gt;The best architectures, requirements and designs emerge from self-organizing teams.&lt;/li&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;li&gt;At regular intervals the team reflects on how to become more effective, and then tunes and adjusts its behavior accordingly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Agile Goal: Working Software&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Our highest priority is to satisfy the customer though early and continuous delivery of valuable software.&lt;/li&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;li&gt;Deliver working software frequently from a couple of weeks to a couple of months with a preference to the shorter timescale.&lt;/li&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;li&gt;Working software is the primary measure of progress.&lt;/li&gt;
&lt;p&gt; &lt;br&gt;&lt;/p&gt;
&lt;li&gt;Continuous attention to the technical excellence and good design enhances agility.&lt;/li&gt;
&lt;p&gt; &lt;br&gt;&lt;/p&gt;
&lt;li&gt;Simplicity ? what is the simplest solution that will work in a given scenario?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Agile Goal: Customer Collaborations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Recognize that the customer/ end user is an active member of the development team.&lt;/li&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;li&gt;Business people and developers must work together daily throughout the project.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Agile Goal: Responding to Change&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Welcome changing requirements even late in development. Agile processes harness change for the customers competitive advantage.&lt;/li&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;li&gt;At regular intervals, the team reflects on how to become more effective, and then tunes and adjusts its behavior accordingly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;In practice, what does this mean?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Produce working software:&lt;/strong&gt; As this is the primary measurement of progress, give the customer constant access to the system, which is updated frequently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Individuals and Interactions:&lt;/strong&gt; The developers control the development process, including development tools, platforms, methodology&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Customer Collaboration:&lt;/strong&gt; Put the end user on your team. Collect user stories(personas), use short iterations and most importantly, make sure the application is always accessible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Respond to Change:&lt;/strong&gt; Embrace change in your development process. It&#039;s going to happen whether you plan for it or not, so better be prepared.&lt;/p&gt;
&lt;h2&gt;How to get Started:&lt;/h2&gt;
&lt;p&gt;Continuous integration has the quickest ROI (return on investment):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start with source control.&lt;/li&gt;
&lt;p&gt;  &lt;br&gt;&lt;/p&gt;
&lt;li&gt;Automate your deployment.&lt;/li&gt;
&lt;p&gt;  &lt;br&gt;&lt;/p&gt;
&lt;li&gt;Start testing now. (New applications should focus on unit testing, while existing applications should focus on application testing.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Investing in people is the biggest ROI:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;books&lt;/li&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;li&gt;conferences&lt;/li&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;li&gt;training&lt;/li&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;li&gt;work environment&lt;/li&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;li&gt;Downtime, Vacation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After working in a traditional development environment for the last seven years, I am more excited that ever to be working in an Agile environment. It is truly a smarter way to develop software. &lt;a href=&quot;http://www.controlchaos.com/about/&quot; target=&quot;_blank&quot;&gt;SCRUM methodologies&lt;/a&gt; take this even one step further with daily stand-up meetings where each team member communicates what they accomplished the last day, what they plan to accomplish in the next day and any impediments that need to be cleared for progress to continue. In other words, no excuses/high productivity. In our stand-up meeting, we pull up all code committed to the source code repository from the day before on the overhead projector for review by all developers, Quality Assurance and the meeting facilitator. This makes for better software by default, as each developer knows that with every line of code written or modified, they will need to be able to communicate not only &lt;strong&gt;what&lt;/strong&gt; the fix was, but also &lt;strong&gt;how&lt;/strong&gt; and &lt;strong&gt;why&lt;/strong&gt; this is the best solution to the issue at hand. In a popular add campaign a few years ago, Steve Jobs and Apple encouraged us to &#039;Think Different&#039; when we were choosing a computer platform. After seeing the flaws in the traditional corporate development environment for the last seven years, thinking different about software development is a refreshing change.&lt;/p&gt;
&lt;p&gt;&lt;hr&gt;
&lt;p&gt;Currently a Senior ColdFusion Developer for Harcourt Assessment in San Antonio, Doug Sims has developed enterprise level web application solutions for the heath care, education and broadcast industries. Besides delivering rich web applications and spending time with his family, he also has contributed music for the soundtracks of several independent films. His blog can be found at &lt;a href=&quot;http://evenamonkey.com&quot; target=&quot;_blank&quot;&gt;http://evenamonkey.com&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- google_ad_section_end --&gt;
</description>
 <comments>http://www.evenamonkey.com/AgileIntroduction#comment</comments>
 <category domain="http://www.evenamonkey.com/monkeyblog/agile">agile</category>
 <category domain="http://www.evenamonkey.com/monkeyblog/coldfusion">coldfusion</category>
 <pubDate>Fri, 21 Sep 2007 15:06:44 -0400</pubDate>
 <dc:creator>Doug Sims</dc:creator>
 <guid isPermaLink="false">51 at http://www.evenamonkey.com</guid>
</item>
<item>
 <title>Application Generation - The Song!</title>
 <link>http://www.evenamonkey.com/application_generation_the_song--2007--doug_sims</link>
 <description>&lt;!-- google_ad_section_start --&gt;
&lt;p&gt;My laptop does double duty as a DAW (digital audio workstation) and was working on song ideas on the flight to the Frameworks Conference last Feb. Since I am about to head back to bethesda for cfunited, I thought I would &#039;Release&#039; a rough mix of that session. look for the download link below:&lt;br /&gt;
&lt;a href=&#039;http://www.evenamonkey.com/files/applicationGeneration.mp3&#039;&gt;download&lt;/a&gt;&lt;br /&gt;
please feel free to leave your feedback.&lt;/p&gt;
&lt;!-- google_ad_section_end --&gt;
</description>
 <comments>http://www.evenamonkey.com/application_generation_the_song--2007--doug_sims#comment</comments>
 <category domain="http://www.evenamonkey.com/monkeyblog/coldfusion">coldfusion</category>
 <category domain="http://www.evenamonkey.com/monkeyblog/music">music</category>
 <enclosure url="http://www.evenamonkey.com/files/applicationGeneration.mp3" length="6260736" type="audio/mpeg" />
 <pubDate>Sun, 24 Jun 2007 12:34:09 -0400</pubDate>
 <dc:creator>Doug Sims</dc:creator>
 <guid isPermaLink="false">50 at http://www.evenamonkey.com</guid>
</item>
<item>
 <title>Reactor.xml: Understanding the difference between &#039;relate&#039; and &#039;link&#039;</title>
 <link>http://www.evenamonkey.com/reactor_xml_understanding_the_difference_between_relate_and_link--2007--doug_sims</link>
 <description>&lt;!-- google_ad_section_start --&gt;
&lt;p&gt;One of my favorite features of reactor (besides everything) is the ability to set up hasOne and HasMany relationships in your reactor.xml file and then be able to use iterators and get other related records and data from the record you are working with. setting up these relationship seems to be an area of confusion for people as they get started with reactor.&lt;/p&gt;
&lt;h3&gt;Relationships:&lt;/h3&gt;
&lt;p&gt;There are two basic relationship types: &lt;strong&gt;hasOne&lt;/strong&gt; and &lt;strong&gt;HasMany&lt;/strong&gt; to decide from. this should be an easy task if you already have a basic plan for the app. It may help if you imagine yourself as the object...I am a user object and I &#039;have many&#039; roles or I am a user and I &#039;have one&#039; address.&lt;/p&gt;
&lt;h3&gt;Relationship Types:&lt;/h3&gt;
&lt;p&gt;Inside the hasOne or hasMany tag, you can define the relationship type.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;There are two basic types of reactor.xml relationship types, Reactor syntax calls these &#039;relate&#039; and &#039;link&#039;&lt;/em&gt;&lt;br /&gt;
 This is HOW the objects are related. Either a direct relationship(relate) or through a linking table (link) &lt;/p&gt;
&lt;h3&gt;relate&lt;/h3&gt;
&lt;p&gt;This is when the Primary key(PK) of one table is used as a foreign key in a second table. This is the one to use if you are only involving 2 tables -with no linking table in the middle. In the below example the &#039;UserID&#039; PK in the User table is a foreign key in the Reports table. In this instance the user &#039;Has Many&#039; Reports using a relate tag:&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;object name=&amp;quot;User&amp;quot; &amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;hasMany name=&amp;quot;Report&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;relate from=&amp;quot;UserID&amp;quot; to=&amp;quot;UserID&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/hasMany&amp;gt;&lt;br /&gt; &amp;lt;/object&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;this is the easiet to set up in reactor as you just need only define the two objects with a &lt;relate&gt; tag within the hasOne or hasMany&lt;/p&gt;
&lt;h3&gt;link&lt;/h3&gt;
&lt;p&gt;the &#039;link&#039; syntax is for when you have a table in the middle like in the case of a user table, a role table and a table that links userID&#039;s to RoleID&#039;s (UserRole table) This requires three reactor object definitions. in this example: User, Role and UserRole&lt;br /&gt;
the user and role both &#039;have many&#039; of each other:&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;object name=&amp;quot;User&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;hasMany name=&amp;quot;Role&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;link name=&amp;quot;UserRole&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/hasMany&amp;gt;&lt;br /&gt; &amp;lt;/object&amp;gt;&lt;br /&gt; &amp;lt;object name=&amp;quot;Role&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;hasMany name=&amp;quot;User&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;link name=&amp;quot;UserRole&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/hasMany&amp;gt;&lt;br /&gt; &amp;lt;/object&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;The linking table (UserRole) has 2 hasOne definitions, relating back to the 2 PK&#039;s&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;object name=&amp;quot;UserRole&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;hasOne name=&amp;quot;User&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;relate from=&amp;quot;UserID&amp;quot; to=&amp;quot;UserID&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/hasOne&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;hasOne name=&amp;quot;Role&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;relate from=&amp;quot;RoleID&amp;quot; to=&amp;quot;RoleID&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/hasOne&amp;gt;&lt;br /&gt; &amp;lt;/object&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;!-- google_ad_section_end --&gt;
</description>
 <comments>http://www.evenamonkey.com/reactor_xml_understanding_the_difference_between_relate_and_link--2007--doug_sims#comment</comments>
 <category domain="http://www.evenamonkey.com/monkeyblog/coldfusion">coldfusion</category>
 <category domain="http://www.evenamonkey.com/monkeyblog/reactor">reactor</category>
 <pubDate>Thu, 22 Mar 2007 10:29:37 -0400</pubDate>
 <dc:creator>Doug Sims</dc:creator>
 <guid isPermaLink="false">48 at http://www.evenamonkey.com</guid>
</item>
<item>
 <title>Reactor Tip: Super.validate()</title>
 <link>http://www.evenamonkey.com/reactor_tip_super_validate--2006--doug_sims</link>
 <description>&lt;!-- google_ad_section_start --&gt;
&lt;p&gt;Using super.validate to add custom validation to reactor:&lt;/p&gt;
&lt;p&gt;If you have been copying the entire validate method from the reactor/project/XXX/validator to your extended object to overload the validate method and add extended custom validation, there is a much cleaner and more elegant way to do this. But first, lets cover some reactor validation basics:&lt;/p&gt;
&lt;h2&gt;Basic Reactor Validation information&lt;/h2&gt;
&lt;p&gt;Reactor generates basic validation methods based on database metadata. These validations are held in the base validator objects inside the reactor/project folder.&lt;br /&gt;
Reactor provides 2 cfc&#039;s that extend the base objects, located in the validator subfolder in your &quot;mapping&quot; directory path(set in your reactor configuration). There is one nonDB specific CFC which is also extended by a DB specific one (with the dbtype appended to the filename). Unless you are doing some database specific stuff on your validations You can use the nonDB specific CFC.  &lt;/p&gt;
&lt;h2&gt;Extending Validation&lt;/h2&gt;
&lt;p&gt;To add extended validation you will need to write a custom function in one of the extended validator CFC&#039;s.&lt;/p&gt;
&lt;p&gt;In my example below, we will add validation to check to see if one property of a populated record object is a valid choice based on another property. Here is my validation function&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;CFFUNCTION name=&amp;quot;validateSkyIsBlue&amp;quot; access=&amp;quot;public&amp;quot;&amp;nbsp; output=&amp;quot;false&amp;quot; returntype=&amp;quot;reactor.util.ErrorCollection&amp;quot;&amp;gt;&lt;br /&gt;	&amp;lt;CFARGUMENT name=&amp;quot;weatherRecord&amp;quot; hint=&amp;quot;I am the Record to validate.&amp;quot; required=&amp;quot;no&amp;quot; type=&amp;quot;reactor.project.MemberManager.Record.weatherRecord&amp;quot; /&amp;gt;&lt;br /&gt;	&amp;lt;CFARGUMENT name=&amp;quot;ErrorCollection&amp;quot; hint=&amp;quot;I am the error collection to populate. If not provided a new collection is created.&amp;quot; required=&amp;quot;no&amp;quot; type=&amp;quot;reactor.util.ErrorCollection&amp;quot; default=&amp;quot;#createErrorCollection(arguments.weatherRecord._getDictionary())#&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;!--Blue is only allowed as a selection for Sky for people&amp;nbsp; whose weathercode = 5--&amp;gt;&lt;br /&gt;	&amp;lt;CFIF&amp;nbsp; arguments.weatherRecord.getsky() is &amp;quot;Blue&amp;quot; and arguments.weatherRecord.getweathercode() neq 5 &amp;gt;&lt;br /&gt;			&amp;lt;CFSET arguments.ErrorCollection.addError(&amp;quot;weather.sky.noBlueAllowed&amp;quot;) /&amp;gt;	&amp;lt;/CFIF&amp;gt;&lt;br /&gt;	&amp;lt;CFRETURN arguments.ErrorCollection /&amp;gt;&lt;br /&gt;&amp;lt;/CFFUNCTION&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;(in my dictionary xml files, i added a definition for weather.sky.noBlueAllowed)&lt;/p&gt;
&lt;p&gt;To call this method, we need  to overload the validate() method to include this validation as well as the reactor generated validation methods. There are two ways to accomplish this, you can copy the entire contents of the validate method from the base object (which I &lt;i&gt;reluctantly&lt;/i&gt; admit I was doing until a few weeks ago), Or you can use the &quot;super&quot; keyword to call the base validate method. You will need to pass in the record and the error collection. Here is my validate method as it exists in the extended object:&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;CFFUNCTION name=&amp;quot;validate&amp;quot; access=&amp;quot;public&amp;quot; hint=&amp;quot;I validate an&amp;nbsp; record&amp;quot; output=&amp;quot;false&amp;quot; returntype=&amp;quot;reactor.util.ErrorCollection&amp;quot;&amp;gt;&lt;br /&gt;		&amp;lt;CFARGUMENT name=&amp;quot;weatherRecord&amp;quot; hint=&amp;quot;I am the Record to validate.&amp;quot; required=&amp;quot;no&amp;quot; type=&amp;quot;reactor.project.WeatherManager.Record.weatherRecord&amp;quot; /&amp;gt;&lt;br /&gt;		&amp;lt;CFARGUMENT name=&amp;quot;ErrorCollection&amp;quot; hint=&amp;quot;I am the error collection to populate. If not provided a new collection is created.&amp;quot; required=&amp;quot;no&amp;quot; type=&amp;quot;reactor.util.ErrorCollection&amp;quot; default=&amp;quot;#createErrorCollection(arguments.weatherRecord._getDictionary())#&amp;quot; /&amp;gt;&lt;br /&gt;			&amp;lt;CFSET validateSkyIsBlue(arguments.weatherRecord, arguments.ErrorCollection) /&amp;gt;&lt;br /&gt;			&amp;lt;CFSET super.validate(arguments.weatherRecord, arguments.ErrorCollection) /&amp;gt;&lt;br /&gt;		&amp;lt;CFRETURN arguments.ErrorCollection /&amp;gt;&lt;br /&gt;	&amp;lt;/CFFUNCTION&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;One error collection is returned containg any or all validation errors.&lt;br /&gt;
The benefit of doing this as opposed to copying the validate method from the base object is that now you need to make no change to catch validation for new and modified fields in the database.&lt;/p&gt;
&lt;!-- google_ad_section_end --&gt;
</description>
 <comments>http://www.evenamonkey.com/reactor_tip_super_validate--2006--doug_sims#comment</comments>
 <category domain="http://www.evenamonkey.com/monkeyblog/coldfusion">coldfusion</category>
 <category domain="http://www.evenamonkey.com/monkeyblog/reactor">reactor</category>
 <pubDate>Mon, 21 Aug 2006 09:36:18 -0400</pubDate>
 <dc:creator>Doug Sims</dc:creator>
 <guid isPermaLink="false">44 at http://www.evenamonkey.com</guid>
</item>
<item>
 <title>Thanks Tom! - Reactor nightly builds</title>
 <link>http://www.evenamonkey.com/thanks_tom_reactor_nightly_builds--2006--doug_sims</link>
 <description>&lt;!-- google_ad_section_start --&gt;
&lt;p&gt;If you are not on the reactor list you may have missed this:&lt;/p&gt;
&lt;h2&gt;Bleeding Edgers rejoice!&lt;/h2&gt;
&lt;p&gt;Tom Chiverton is providing nightly builds of reactor for those of you who cannot access the reactor subversion repository through WebDEV.&lt;/p&gt;
&lt;p&gt;The builds can be found at&lt;br /&gt;
&lt;a href=&quot;http://www.falkensweb.com/reactor.html&quot;&gt;http://www.falkensweb.com/reactor.html&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Thanks Tom!&lt;/h4&gt;
&lt;p&gt;and everyone else who makes the reactor list such a great resource.&lt;/p&gt;
&lt;!-- google_ad_section_end --&gt;
</description>
 <comments>http://www.evenamonkey.com/thanks_tom_reactor_nightly_builds--2006--doug_sims#comment</comments>
 <category domain="http://www.evenamonkey.com/monkeyblog/coldfusion">coldfusion</category>
 <category domain="http://www.evenamonkey.com/monkeyblog/reactor">reactor</category>
 <pubDate>Fri, 18 Aug 2006 15:05:50 -0400</pubDate>
 <dc:creator>Doug Sims</dc:creator>
 <guid isPermaLink="false">43 at http://www.evenamonkey.com</guid>
</item>
<item>
 <title>Eclipse / CFEclipse - local history feature</title>
 <link>http://www.evenamonkey.com/eclipse_cfeclipse_local_history_feature--2006--doug_sims</link>
 <description>&lt;!-- google_ad_section_start --&gt;
&lt;p&gt;This may be old news to some, but I just stumbled upon it. Several co-workers and I have recently switched to &lt;a href=&quot;http://www.cfeclipse.org/&quot;&gt;CFEclipse&lt;/a&gt;, in prep for some JAVA crosstraining. I just stumbled upon the local history feature, that functions like a little local source repository. Every time you save a file, a snapshot is taken. to browse history on any specific file, right-click on it in the navigator and choose  team &amp;gt; compare to local history.&lt;/p&gt;
&lt;p&gt;By default this history is only maintained for 7 days, 50 entries per file, or 1 meg backup file size. If you want to use this for long term history, you would need to adjust those in:&lt;br /&gt;
  Window &amp;gt; Preferences &amp;gt; General &amp;gt; Workspace &amp;gt; Local History&lt;/p&gt;
&lt;!-- google_ad_section_end --&gt;
</description>
 <comments>http://www.evenamonkey.com/eclipse_cfeclipse_local_history_feature--2006--doug_sims#comment</comments>
 <category domain="http://www.evenamonkey.com/monkeyblog/cfeclipse">CFeclipse</category>
 <category domain="http://www.evenamonkey.com/monkeyblog/coldfusion">coldfusion</category>
 <pubDate>Fri, 18 Aug 2006 14:25:28 -0400</pubDate>
 <dc:creator>Doug Sims</dc:creator>
 <guid isPermaLink="false">42 at http://www.evenamonkey.com</guid>
</item>
<item>
 <title>Reactor mixed case gotcha</title>
 <link>http://www.evenamonkey.com/reactor_mixed_case_gotcha--2006--doug_sims</link>
 <description>&lt;!-- google_ad_section_start --&gt;
&lt;p&gt;It has come up on the Reactor mailing list that since the Coldfusion XML functions are all case specific,&lt;br /&gt;
extra care has to be taken to be sure the db fields and the reacor.xml &lt;code&gt;&amp;lt;object&amp;gt;&lt;/code&gt; definitions and subtags all match in case. &lt;/p&gt;
&lt;p&gt; Care must also be taken when throwing custom validation messages.&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;		&amp;lt;CFSET arguments.ErrorCollection.addError(&amp;quot;emailAddress.emailAddress.NoAtSign&amp;quot;) /&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h3&gt;Is different from: &lt;/h3&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;		&amp;lt;CFSET arguments.ErrorCollection.addError(&amp;quot;EmailAddress.emailAddress.NoAtSign&amp;quot;) /&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
Which ever variation does not exactly match the dictionary.xml file for that object will throw an exception:&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;Message&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  An error occured while Transforming an XML document.&lt;br /&gt;Detail&amp;nbsp; Empty expression!&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;So after painstakingly making sure all the DB fields (dev and production) matched the object tags, that matched the validation error definitions, that matched the case in the dictionary.xml files, I mysteriously received the error again. But this time it worked in one place in the app, and not in another, both using almost identical code. The only difference was what the reactorfactory was passed as the object name.&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;Reactor.createRecord(&amp;quot;emailAddress&amp;quot;) /&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h3&gt;is not the same as:&lt;/h3&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;Reactor.createRecord(&amp;quot;EmailAddress&amp;quot;) /&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;I currenly develop mainly in coldfusion/IIS, but these three mixed case gotchas have really gotten me thinking about becoming more aware of case no matter what I am coding. Maybe I can make make case consistancy second nature before I switch languages/platforms and really need it. &lt;/p&gt;
&lt;!-- google_ad_section_end --&gt;
</description>
 <comments>http://www.evenamonkey.com/reactor_mixed_case_gotcha--2006--doug_sims#comment</comments>
 <category domain="http://www.evenamonkey.com/monkeyblog/coldfusion">coldfusion</category>
 <category domain="http://www.evenamonkey.com/monkeyblog/reactor">reactor</category>
 <pubDate>Mon, 24 Jul 2006 14:11:58 -0400</pubDate>
 <dc:creator>Doug Sims</dc:creator>
 <guid isPermaLink="false">41 at http://www.evenamonkey.com</guid>
</item>
<item>
 <title>Reactor - Using the field tag to to alias duplicate columns</title>
 <link>http://www.evenamonkey.com/reactor_using_the_field_tag_to_to_alias_duplicate_columns--2006--doug_sims</link>
 <description>&lt;!-- google_ad_section_start --&gt;
&lt;p&gt;It is mentioned in the &lt;a href=&quot;livedocs.reactorframework.com&quot;&gt;Reactor docs &lt;/a&gt; that the &lt;code&gt;&amp;lt;field&amp;gt;&lt;/code&gt;  tag can be used within your object definitions to pretty up ugly column names such as txt_lastname or strCity, but it should also be noted it can be used to diferentiate between two tables which both have fields with the same name.&lt;/p&gt;
&lt;h3&gt;for example, if all my tables have a modified date timestamp&lt;/h3&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;object name=&amp;quot;User&amp;quot;&amp;gt;&lt;br /&gt;	&amp;lt;field name=&amp;quot;ModifiedDate&amp;quot; alias=&amp;quot;UserModifiedDate&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;hasMany name=&amp;quot;Task&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;relate from=&amp;quot;Taskid&amp;quot; to=&amp;quot;Taskid&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/hasMany&amp;gt;&lt;br /&gt;&amp;lt;/object&amp;gt;&lt;br /&gt;&amp;lt;object name=&amp;quot;Task&amp;quot;&amp;gt;&lt;br /&gt;	&amp;lt;field name=&amp;quot;ModifiedDate&amp;quot; alias=&amp;quot;TaskModifiedDate&amp;quot; /&amp;gt;&lt;br /&gt;	&amp;lt;hasOne name=&amp;quot;User&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;relate from=&amp;quot;UserId&amp;quot; to=&amp;quot;UserId&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/hasOne&amp;gt;&lt;br /&gt;&amp;lt;/object&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Then, when I am doing a join later, I can reference the modified dates correctly.&lt;/p&gt;
&lt;!-- google_ad_section_end --&gt;
</description>
 <comments>http://www.evenamonkey.com/reactor_using_the_field_tag_to_to_alias_duplicate_columns--2006--doug_sims#comment</comments>
 <category domain="http://www.evenamonkey.com/monkeyblog/coldfusion">coldfusion</category>
 <category domain="http://www.evenamonkey.com/monkeyblog/reactor">reactor</category>
 <pubDate>Wed, 19 Jul 2006 11:55:07 -0400</pubDate>
 <dc:creator>Doug Sims</dc:creator>
 <guid isPermaLink="false">40 at http://www.evenamonkey.com</guid>
</item>
<item>
 <title>Organizing ModelGlue Events</title>
 <link>http://www.evenamonkey.com/organizing_modelglue_events--2006--doug_sims</link>
 <description>&lt;!-- google_ad_section_start --&gt;
&lt;p&gt;This may be old news, but did everyone know you can include ModelGlue.xml file within your main modelglue.xml files. The framework has provided an  tag within the modelglue config file. you can include as many XML files as you need as long as they are formatted correctly.&lt;/p&gt;
&lt;p&gt;The include tag goes after the opening&lt;code&gt; &amp;lt;modelglue&amp;gt; &lt;/code&gt;tag and before the first &lt;code&gt;&amp;lt;controller&amp;gt;&lt;/code&gt; tag&lt;/p&gt;
&lt;p&gt;then you can group the event handlers into multiple files to keep them organized in a logical way. &lt;/p&gt;
&lt;p&gt;example:&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;modelglue&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;include template=&amp;quot;/config/UserEvents.xml&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  &amp;lt;include template=&amp;quot;/config/AdminEvents.xml&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;controllers&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;!-- google_ad_section_end --&gt;
</description>
 <comments>http://www.evenamonkey.com/organizing_modelglue_events--2006--doug_sims#comment</comments>
 <category domain="http://www.evenamonkey.com/monkeyblog/coldfusion">coldfusion</category>
 <category domain="http://www.evenamonkey.com/monkeyblog/modelglue">modelglue</category>
 <pubDate>Tue, 18 Jul 2006 17:31:49 -0400</pubDate>
 <dc:creator>Doug Sims</dc:creator>
 <guid isPermaLink="false">39 at http://www.evenamonkey.com</guid>
</item>
<item>
 <title>Chaining ModelGlue Generic Commit  Events</title>
 <link>http://www.evenamonkey.com/chaining_modelglue_generic_commit_events--2006--doug_sims</link>
 <description>&lt;!-- google_ad_section_start --&gt;
&lt;p&gt;I have really been loving the generic ORM stuff that is part of ModelGlue 2.0. I had been doing way to much work to stuff the objects we needed into the viewstate.   Now I have been able to remove countless listeners and broadcasts I was using to get various objects when needed.&lt;br /&gt;
Now a generic read takes  care of that.&lt;/p&gt;
&lt;p&gt;The basic functionality of the generic events are documented at http://docs.model-glue.com so I wont get into how to use them, but one thing that isn&#039;t documented is how to handle updates to multiple unrelated objects in the same form post( event-handler) &lt;/p&gt;
&lt;p&gt;Here is how I am doing it, It works like a charm for quick prototyping,as far as I am concerned.&lt;/p&gt;
&lt;p&gt;Lets say I have 2 objects, Cinders and Ashes. I am collecting this data on the same form and I need to handle the validation and update the results. I need two generic commit message broadcasts&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;message name=&amp;quot;modelglue.GenericCommit&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;argument name=&amp;quot;object&amp;quot; value=&amp;quot;Cinder&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;argument name=&amp;quot;CinderId&amp;quot; value=&amp;quot;Cinder&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/message&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
and&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;message name=&amp;quot;modelglue.GenericCommit&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;argument name=&amp;quot;object&amp;quot; value=&amp;quot;Ashes&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;argument name=&amp;quot;AshesId&amp;quot; value=&amp;quot;Ashes&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/message&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;My form lives at an event called &quot;CindersAndAshes.form&quot; and submits   to an event called&lt;/p&gt;
&lt;!-- google_ad_section_end --&gt;
&lt;p&gt;&lt;a href=&quot;http://www.evenamonkey.com/chaining_modelglue_generic_commit_events--2006--doug_sims&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <comments>http://www.evenamonkey.com/chaining_modelglue_generic_commit_events--2006--doug_sims#comment</comments>
 <category domain="http://www.evenamonkey.com/monkeyblog/coldfusion">coldfusion</category>
 <category domain="http://www.evenamonkey.com/monkeyblog/generic_database_messages">generic database messages</category>
 <category domain="http://www.evenamonkey.com/monkeyblog/modelglue">modelglue</category>
 <pubDate>Fri, 14 Jul 2006 15:42:22 -0400</pubDate>
 <dc:creator>Doug Sims</dc:creator>
 <guid isPermaLink="false">38 at http://www.evenamonkey.com</guid>
</item>
</channel>
</rss>
