<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-36397205</id><updated>2010-04-28T11:02:48.177-05:00</updated><title type='text'>Bartram's Bits</title><subtitle type='html'></subtitle><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/index.cfm'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://edbartram.com/blog/atom.xml'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-36397205.post-4393769976312071008</id><published>2010-04-28T10:58:00.002-05:00</published><updated>2010-04-28T11:02:48.193-05:00</updated><title type='text'>Thanks Alagad!</title><content type='html'>Alagad recently had a contest tied to cf.Objective to win one of their fine backpacks and I have been honored as one of the three winners.  Congratulations also goes out to Steve Withington and Wil Genovese, winners of the other two backpacks.  Details can be found here: &lt;a href="http://www.alagad.com/blog/post.cfm/backpack-contest-we-have-winners"&gt;Backpack Contest - We Have Winners!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-4393769976312071008?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/4393769976312071008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=4393769976312071008' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/4393769976312071008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/4393769976312071008'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2010/04/thanks-alagad.cfm' title='Thanks Alagad!'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-4299706627368729064</id><published>2009-12-26T17:09:00.012-06:00</published><updated>2009-12-26T17:36:19.773-06:00</updated><title type='text'>Creating a Twitter Background Image for all Resolutions</title><content type='html'>Twitter doesn't give much space in the profile section, but I've seen a few people who have used the background image to provide more details about themselves.  I decided to create a new background image for my Twitter account, &lt;a href="http://twitter.com/edbartram"&gt;http://twitter.com/edbartram&lt;/a&gt;, in the same vein.  &lt;br /&gt;&lt;br /&gt;Creating a simple background image was easy, I fired up GIMP and created a new image 1600x1200.  Next, I needed to know where to put the text, so I did some experimentation and came up with a template to handle multiple resolutions.  &lt;br /&gt;&lt;br /&gt;I created guides horizontally at 10, 110, 240, 895, and 1015 pixels. This provided 6 columns: &lt;ul&gt;&lt;br /&gt;&lt;li&gt;a margin&lt;/li&gt;&lt;br /&gt;&lt;li&gt;an area for detailed text&lt;/li&gt;&lt;br /&gt;&lt;li&gt;a column for a vertical url&lt;/li&gt;&lt;br /&gt;&lt;li&gt;an space where Twitter will display its content&lt;/li&gt;&lt;br /&gt;&lt;li&gt;another column for to repeat the vertical url&lt;/li&gt;&lt;br /&gt;&lt;li&gt;and a final column the expands off to the sunset&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;I also created a vertical guide at 75 pixels which split the graphic into 2 rows:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;one for the Twitter header&lt;/li&gt;&lt;br /&gt;&lt;li&gt;the other for the content area.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="/blog/2009/12/Guides.jpg" width="611" height="540" border="0" alt="Guides"&gt;&lt;br /&gt;&lt;br /&gt;Because Twitter centers its content in the browser page, it moves around when used with different resolutions.  The guide values that I used above allowed me to create a Twitter background that displayed gracefully at the most common resolutions:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;800x600 - Twitter is optimized for 800x600 so the background image barely displays more than a few pixels.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;1024x768 - The detail column displays to the left of the the Twitter content whcih conceals the 1st url column, but leaves the 2nd url column to display on the right.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;1280x1024 - The detail column and the 1st url column displays to the left of the Twitter content which conceals the 2nd URL column.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;1440x900 - Looks just like 1280x1024 with a little more padding between the 1st URL and the Twitter content.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-4299706627368729064?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/4299706627368729064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=4299706627368729064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/4299706627368729064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/4299706627368729064'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2009/12/creating-twitter-background-image-for.cfm' title='Creating a Twitter Background Image for all Resolutions'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-904559035526596847</id><published>2009-11-13T10:55:00.003-06:00</published><updated>2009-11-13T10:58:58.116-06:00</updated><title type='text'>My Notes from Google Search Appliance Seminar</title><content type='html'>&lt;p&gt;On Thursday, November 12, 2009 I attended a seminar at Google's Chicago office given by Bob Segal of Fig Leaf Software on the Google Search Appliance (GSA).  The following are my notes from that two hour presentation:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;The GSA returns search results according to the user's security.  This means that the GSA can index secured content and only include it in search results if the user performing the search has access rights to the secured content.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Websites used as examples in the presentation:&lt;br /&gt;&lt;a href="http://www.heritage.org/"&gt;http://www.heritage.org/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.muschealth.com/"&gt;http://www.muschealth.com/&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Mozzilla Firefox has a plugin called URL Params that Bob used frequently in the demonstration.  It presents all variables in the URL scope in an easy to view form rather than editting the query string in the address bar.  &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1290"&gt;https://addons.mozilla.org/en-US/firefox/addon/1290&lt;/a&gt;&lt;br /&gt;After installing I found that it also supports editting form fields as well, but there is an extra step required to install the plug-in to make it function as a Sidebar: &lt;a href="chrome://urlparams/content/lib/addpanel.xul"&gt;chrome://urlparams/content/lib/addpanel.xul&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Search results can be categorized using both collections and meta data.  The example shown was a column on the right hand side of the page showing number of results found in each category of the site allowing the user to narrow their search focus.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The term Universal Login was used and my understanding of the definition is that it is "using the same credentials across multiple authentication systems."  This means the user still needs to login to each system, but they are using the same username and password rather than a different shema for each.  Not quite Single SignOn, but a good workaround for disparate systems.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Great resource for learning how to use and support a GSA: &lt;a href="http://www.learngsa.com/"&gt;http://www.learngsa.com/&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Status and Reports &gt; Crawl Diagnostics has a URL Status drop-down which can be used to limit the view to 404 Errors, Robot Exclusions, etc...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You can view search results in XML format by removing the proxystylesheet parameter.  I tested this and you need to remove the variable completely, just setting it to a blank value yields a 500 server error.&lt;ul&gt;&lt;br /&gt; &lt;li&gt;You can add meta data to be displayed in the XML by setting &amp;getfields=*&lt;/li&gt;&lt;br /&gt; &lt;li&gt;When searching you can limit the results to only include searching specific meta data fields:&lt;br /&gt; inmeta:author=[specific name]&lt;br /&gt; inmeta:author~[partial name]&lt;br /&gt; inmeta:title&lt;br /&gt; inmeta:site&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Three URL parameters select what you are searching, how it looks, and how the results are modified:&lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;client:&lt;/b&gt; This is your Front End excluding the Output Format section and controls your how your results are modified such as keywords, filtering, exclusions, etc.&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;proxystylesheet:&lt;/b&gt; this is the Output Format section of your Front End and controls the page's design&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;site:&lt;/b&gt; this is your collection name&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Next, Dictionaries were discussed.  This is where you can set up synonyms to guide the user to industry specific terms.  The example used was the term "port".  It means different things to the shipping industry, wine makers, and computer hardware builders.  I believe this is the Query Expansion item under the Serving section for GSA 5.2.0.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In Serving &gt; Front Ends &gt; Output Format &gt; Page Layout Helper &gt; Global Attributes there's a setting Enable ASR / Enable Advanced Search Reporting.  I never researched what this meant, but it sounded like a good thing, so I clicked it.  The presenter talked about Self Learning Scoring which is where the GSA learns which links are better results based on which links people click on in search results.  This is ASR, Advanced Search Reporting.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GSA Unification is for connecting mutliple GSAs together and is available in version 6.x for the newer GSA machines, but not the 1001.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Search Dates are controlled by document dates.  The presenter recommended that we select meta, provide a custom meta field and modify our pages to include that meta field and control what date we want the content to use.  The demo looked like there was a dropdown in 6.x, but in 5.2.0, there are two sections on the Serving &gt; Result Biasing config page.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The GSA is case sensitive for its crawls (I'm assuming because it is running on a *nix platform), so the same document could be returned several times in the results depending on how it is called.  For example, MyDocument.doc and mydocument.doc are two different results.  Now that I'm thinking about it more though I'm not sure if this means the document has to exist with two different cased names or if it is simply linked with two differently cased names.  I was under the impression that it would be indexed multiple times if there were multiple links with different variations of case.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Another useful link was given: &lt;a href="http://gigz.com/google.htm"&gt;http://gigz.com/google.htm&lt;/a&gt;&lt;br /&gt;Bonus: the homepage contains useful links for a variety of other technologies that I'm interested in!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;And finally, I was excited to hear ColdFusion mentioned in the presentation!  w00t!&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Links from notes:&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.heritage.org/"&gt;http://www.heritage.org/&lt;/a&gt; - example of basic search using GSA&lt;br /&gt;&lt;a href="http://www.muschealth.com/"&gt;http://www.muschealth.com/&lt;/a&gt; - example of a search integrated into the website using GSA&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1290"&gt;https://addons.mozilla.org/en-US/firefox/addon/1290&lt;/a&gt; - URL Params Firefox Plug-in&lt;br /&gt;&lt;a href="chrome://urlparams/content/lib/addpanel.xul"&gt;chrome://urlparams/content/lib/addpanel.xul&lt;/a&gt; - Enables URL Params in Firefox as a Sidebar&lt;br /&gt;&lt;a href="http://www.learngsa.com/"&gt;http://www.learngsa.com/&lt;/a&gt; - Learning site for the Google Search Appliance&lt;br /&gt;&lt;a href="http://gigz.com/google.htm"&gt;http://gigz.com/google.htm&lt;/a&gt; - Collection of useful links for the Google Search Appliance&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This training is still available in Dallas at the time of writing this entry.  You can register at &lt;a href="http://www.figleaf.com/Training/GoogleSeminar.cfm"&gt;http://www.figleaf.com/Training/GoogleSeminar.cfm&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-904559035526596847?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/904559035526596847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=904559035526596847' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/904559035526596847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/904559035526596847'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2009/11/my-notes-from-google-search-appliance.cfm' title='My Notes from Google Search Appliance Seminar'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-4498621772349593467</id><published>2009-05-20T15:02:00.013-05:00</published><updated>2009-05-20T15:47:52.702-05:00</updated><title type='text'>Multiple Instances in ColdFusion 7</title><content type='html'>I've always been aware that you could create multiple instances in ColdFusion, but I always thought it would be some complicated arcane process.  So up until recently, I never felt compelled to attempt it.  In reality I found it to be rather easy and have successfully created multiple instances in ColdFusion 7.0 using both Apache 2.0 and IIS 6.0 webservers (Yes, I know, there are newer versions out there, but we can't all be cutting edge).  In my research, I noticed that while the documentation available on the internet was sufficient, it was a little sparse.  So I hope by sharing my notes that I will help someone else as well.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;ColdFusion&lt;/h2&gt;&lt;b&gt;Create showInstance.cfm in a new web folder:&lt;/b&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;cfobject action="create" type="java" class="jrunx.kernel.JRun" name="jr"&amp;gt;&lt;br /&gt;&amp;lt;cfset servername = jr.getServerName()&amp;gt;&lt;br /&gt;&amp;lt;cfoutput&amp;gt;JRun Server Name: #servername#&amp;lt;/cfoutput&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;Create instance in cfadmin&lt;/b&gt;&lt;ul&gt;&lt;li&gt;Enterprise Manager &amp;gt; Instance Manager&lt;/li&gt;&lt;li&gt;Add New Instance&lt;/li&gt;&lt;li&gt;Server Name: whatever you want to call the instance&lt;/li&gt;&lt;li&gt;Server Directory: let CFadmin handle this&lt;/li&gt;&lt;li&gt;Create From EAR/WAR: leave blank&lt;/li&gt;&lt;li&gt;check Create Windows Service&lt;/li&gt;&lt;li&gt;check Auto Restart Service&lt;/li&gt;&lt;li&gt;Submit&lt;/li&gt;&lt;li&gt;Wait...&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Edit JRun4/servers/________/SERVER-INF/jrun.xml&lt;/b&gt;&lt;ul&gt;&lt;li&gt;search for JRunProxyService&lt;/li&gt;&lt;li&gt;change deactivated from true to false&lt;/li&gt;&lt;li&gt;note port&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;APACHE Web Server&lt;/h2&gt;&lt;b&gt;Edit httpd.conf&lt;/b&gt;&lt;pre&gt;&lt;code&gt;add virtual mapping &lt;br /&gt;JRunConfig Serverstore "C:/JRun4/lib/wsconfig/1/jrunserver.store"&lt;br /&gt;JRunConfig Bootstrap 127.0.0.1:_____ *port goes here&lt;br /&gt;JRunConfig Apialloc false&lt;/pre&gt;&lt;/code&gt;&lt;b&gt;Web Server Configuration Tool&lt;/b&gt;&lt;ul&gt;&lt;li&gt;Add&lt;/li&gt;&lt;li&gt;JRun Host: localhost&lt;/li&gt;&lt;li&gt;JRun Server: select instance created in CFadmin&lt;/li&gt;&lt;li&gt;Web Server: select Apache&lt;/li&gt;&lt;li&gt;Configuration Directory: browse to where httpd.conf is located&lt;/li&gt;&lt;li&gt;check Configure web server for ColdFusion MX applications&lt;/li&gt;&lt;li&gt;OK&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Apache Service Monitor&lt;/b&gt;&lt;ul&gt;&lt;li&gt;Stop Apache&lt;/li&gt;&lt;li&gt;Start Apache&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;IIS Web Server&lt;/h2&gt;&lt;b&gt;Create web site&lt;/b&gt;&lt;ul&gt;&lt;li&gt;Run Internet Information Services (IIS) Manager&lt;/li&gt;&lt;li&gt;Expand local computer&lt;/li&gt;&lt;li&gt;Right click on Web Sites and select New &amp;gt; Web Site&lt;/li&gt;&lt;li&gt;Next&lt;/li&gt;&lt;li&gt;Description: type name of new website&lt;/li&gt;&lt;li&gt;Enter the IP address to use for this Web site: (All Unassigned)&lt;/li&gt;&lt;li&gt;TCP port this Web site should use: 80&lt;/li&gt;&lt;li&gt;Host header for this Web site: same as recorded in DNS or hosts file&lt;/li&gt;&lt;li&gt;Next&lt;/li&gt;&lt;li&gt;Path: Browse to the folder you created above&lt;/li&gt;&lt;li&gt;Next&lt;/li&gt;&lt;li&gt;Next&lt;/li&gt;&lt;li&gt;Finish&lt;/li&gt;&lt;li&gt;Right click your new site and select New &gt; Virtual Directory&lt;/li&gt;&lt;li&gt;Next&lt;/li&gt;&lt;li&gt;Alias: CFIDE&lt;/li&gt;&lt;li&gt;Path: Browse to wherever your CFIDE folder is, for example: c:\inetpub\wwwroot\CFIDE\&lt;/li&gt;&lt;li&gt;Next&lt;/li&gt;&lt;li&gt;Next&lt;/li&gt;&lt;li&gt;Finish&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Web Server Configuration Tool&lt;/b&gt;&lt;ul&gt;&lt;li&gt;Add&lt;/li&gt;&lt;li&gt;JRun Host: localhost&lt;/li&gt;&lt;li&gt;JRun Server: select instance created in CFadmin&lt;/li&gt;&lt;li&gt;Web Server: select Internet Information Server (IIS)&lt;/li&gt;&lt;li&gt;IIS Web Site: select the site you created above&lt;/li&gt;&lt;li&gt;check Configure web server for ColdFusion MX applications&lt;/li&gt;&lt;li&gt;OK&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Test your new instance&lt;/h2&gt;Open your browser to new site and verify that it is running the new instance with showInstance.cfm&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-4498621772349593467?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/4498621772349593467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=4498621772349593467' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/4498621772349593467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/4498621772349593467'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2009/05/multiple-instances-in-coldfusion-7.cfm' title='Multiple Instances in ColdFusion 7'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-6537633123439996731</id><published>2009-03-24T15:39:00.004-05:00</published><updated>2009-03-24T16:00:03.800-05:00</updated><title type='text'>Converting Model-Glue Docs to HTML</title><content type='html'>I saw Ray Camden's &lt;a href="http://www.coldfusionjedi.com/index.cfm/2009/3/13/Friday-Puzzler--Helping-the-ModelGlue-Team"&gt;Friday Puzzler - Helping the Model-Glue Team&lt;/a&gt; from March 13th today and noticed a solution had not been posted yet.  I gave it some thought and had visions of recursive CFCs parsing out each HTML tag using Regular Expressions initially.  But then I realized the task wasn't to create a tool to parse the HTML out of any webpage, but to parse the HTML out of these specific webpages.&lt;br /&gt;&lt;br /&gt;Digging into the source code of these pages generated by RoboHelp, I began to see a structure and a set of rules that appeared to be followed on each page.  I discovered the navigation tree was comprised of 19 webpages each representing a folder with links to the other folders and the documents contained within itself.  My initial code looped through each of these files and stripped out anything above &amp;lt;body&amp;gt; and below &amp;lt;/body&amp;gt; using the FindNoCase() function.  Next, I added code to loop through the resulting HTML looking for links.  Again, the code kept to rules, so I was able to parse out the links to folders by looking for target="_self".  Any links that didn't refer to "_self" were the documents we were looking to "scrape" the content from.  At this point I cheated a little; I now had a list of all the documents and the folder structure that they were stored in, so I manually created the folders mirroring the structure on the website.  I figured this was ok, as I was creating a one-time process, not a reusable application.  Finally, getting back to coding, I looped through each document stripping out anything above &amp;lt;h1 and below the &amp;lt;script beneath the content.&lt;br /&gt;&lt;br /&gt;I appologize that the Blogger template I'm using doesn't handle code very well.  You can download the code as well as all the docs in the link below:&lt;br /&gt;&lt;br /&gt;&lt;a href="/docs.model-glue.com.zip"&gt;Download docs.model-glue.com.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;!--- I manually reproduced the folder structure of the Model-Glue docs on my local harddrive ---&amp;gt;&lt;br /&gt;&amp;lt;cfset pathRemote = "http://docs.model-glue.com/whgdata/"&amp;gt;&lt;br /&gt;&amp;lt;cfset pathLocal = "c:/docs.model-glue.com/whgdata/"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--- The navigation tree for the docs in RoboHelp is comprised of 19 html files ---&amp;gt;&lt;br /&gt;&amp;lt;cfloop index="ptrTree" from="0" to="18"&amp;gt;&lt;br /&gt; &amp;lt;cfset fileName="whlstt#ptrTree#.htm"&amp;gt;&lt;br /&gt; &amp;lt;cfset fileRemote="#pathRemote##fileName#"&amp;gt;&lt;br /&gt; &amp;lt;cfset fileLocal="#pathLocal##fileName#"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!--- Call up each of the 19 html files that make up the navigation tree and loop through finding each document ---&amp;gt;&lt;br /&gt; &amp;lt;cfhttp url="#fileRemote#" method="get" resolveurl="yes" throwonerror="yes"&amp;gt;&amp;lt;/cfhttp&amp;gt;&lt;br /&gt; &amp;lt;cfif cfhttp.statusCode is "200 OK"&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;cfoutput&amp;gt;#fileName#&amp;lt;/cfoutput&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;cfflush&amp;gt;&lt;br /&gt;  &amp;lt;cfset treeHTML=cfhttp.FileContent&amp;gt;&lt;br /&gt;  &amp;lt;cfset ptrLink=1&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!--- Loop through each link it the navigation tree looking for links to documents ---&amp;gt;&lt;br /&gt;  &amp;lt;cfloop condition="ptrLink lt len(treeHTML)"&amp;gt;&lt;br /&gt;   &amp;lt;cfset startLink=FindNoCase("&amp;lt;a href=",treeHTML,ptrLink)&amp;gt;&lt;br /&gt;   &amp;lt;cfif startLink gt 0&amp;gt;&lt;br /&gt;    &amp;lt;cfset endLink=FindNoCase("&amp;lt;/a&amp;gt;",treeHTML,startLink)+3&amp;gt;&lt;br /&gt;    &amp;lt;cfset tmpLink=mid(treeHTML,startLink,endLink-startLink+1)&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;!--- Found a link to a document, so parse out the url and link title ---&amp;gt;&lt;br /&gt;    &amp;lt;cfif Not(FindNoCase("_self",tmpLink))&amp;gt;&lt;br /&gt;     &amp;lt;cfset startURL=FindNoCase("http://",tmpLink)&amp;gt;&lt;br /&gt;     &amp;lt;cfset endURL=FindNoCase(".htm",tmpLink,startURL)&amp;gt;&lt;br /&gt;     &amp;lt;cfset startImg=FindNoCase("&amp;lt;img",tmpLink,endURL)&amp;gt;&lt;br /&gt;     &amp;lt;cfset startTitle=FindNoCase("&amp;gt;",tmpLink,startImg)+1&amp;gt;&lt;br /&gt;     &amp;lt;cfset endTitle=FindNoCase("&amp;lt;/a&amp;gt;",tmpLink,startTitle)&amp;gt;&lt;br /&gt;     &amp;lt;cfset pageURL=mid(tmpLink,startURL,endURL-startURL+4)&amp;gt;&lt;br /&gt;     &amp;lt;cfset pageTitle=mid(tmpLink,startTitle,endTitle-startTitle)&amp;gt;&lt;br /&gt;     &amp;lt;cfoutput&amp;gt;&amp;lt;a href="#pageURL#"&amp;gt;#pageTitle#&amp;lt;/a&amp;gt;&amp;lt;/cfoutput&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;cfflush&amp;gt;&lt;br /&gt;&lt;br /&gt;     &amp;lt;!--- Call up the document and parse out just the HTML throwing out the extra code ---&amp;gt;&lt;br /&gt;     &amp;lt;cfhttp url="#pageURL#" method="get" resolveurl="yes" throwonerror="yes"&amp;gt;&amp;lt;/cfhttp&amp;gt;&lt;br /&gt;     &amp;lt;cfif cfhttp.statusCode is "200 OK"&amp;gt;&lt;br /&gt;      &amp;lt;cfset pageHTML=cfhttp.FileContent&amp;gt;&lt;br /&gt;      &amp;lt;cfset startContent=FindNoCase("&amp;lt;h1",pageHTML)&amp;gt;&lt;br /&gt;      &amp;lt;cfset endContent=FindNoCase("&amp;lt;script type=",pageHTML,startContent)&amp;gt;&lt;br /&gt;      &amp;lt;cfset pageContent=Mid(pageHTML,startContent,endContent-startContent)&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;!--- Write out the content HTML using the same folder structure ---&amp;gt;&lt;br /&gt;      &amp;lt;cfset pageLocal=Replace(Replace(Replace(pageURL,'/whgdata/../','/'),':80',''),"http://","c:\")&amp;gt;&lt;br /&gt;      &amp;lt;cffile action="write" file="#pageLocal#" output="#pageContent#"&amp;gt;&lt;br /&gt;     &amp;lt;cfelse&amp;gt;&lt;br /&gt;      &amp;lt;cfdump var="#cfhttp#"&amp;gt;&lt;br /&gt;      &amp;lt;cfabort&amp;gt;&lt;br /&gt;     &amp;lt;/cfif&amp;gt;&lt;br /&gt;    &amp;lt;/cfif&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;!--- Update the ptr used for looping ---&amp;gt;&lt;br /&gt;    &amp;lt;cfif endLink gt 0&amp;gt;&lt;br /&gt;     &amp;lt;cfset ptrLink=endLink+1&amp;gt;&lt;br /&gt;    &amp;lt;cfelse&amp;gt;&lt;br /&gt;     &amp;lt;cfset ptrLink=len(treeHTML)+1&amp;gt;&lt;br /&gt;    &amp;lt;/cfif&amp;gt;&lt;br /&gt;   &amp;lt;cfelse&amp;gt;&lt;br /&gt;    &amp;lt;cfset ptrLink=len(treeHTML)+1&amp;gt;&lt;br /&gt;   &amp;lt;/cfif&amp;gt;&lt;br /&gt;  &amp;lt;/cfloop&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!--- Parse out just HTML in the Navigation Tree file throwing out the extra code ---&amp;gt;&lt;br /&gt;  &amp;lt;cfset startHTML=FindNoCase("&amp;lt;body",treeHTML)&amp;gt;&lt;br /&gt;  &amp;lt;cfset endHTML=FindNoCase("&amp;lt;/body&amp;gt;",treeHTML,startHTML)&amp;gt;&lt;br /&gt;  &amp;lt;cfset fileHTML=mid(treeHTML,startHTML,endHTML)&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!--- Write out the Navigation Tree file ---&amp;gt;&lt;br /&gt;  &amp;lt;cffile action="write" file="#fileLocal#" output="#fileHTML#"&amp;gt;&lt;br /&gt; &amp;lt;cfelse&amp;gt;&lt;br /&gt;  &amp;lt;cfdump var="#cfhttp#"&amp;gt;&lt;br /&gt;  &amp;lt;cfabort&amp;gt;&lt;br /&gt; &amp;lt;/cfif&amp;gt;&lt;br /&gt; &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/cfloop&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&amp;lt;h1&amp;gt;Done!&amp;lt;/h1&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-6537633123439996731?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/6537633123439996731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=6537633123439996731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/6537633123439996731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/6537633123439996731'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2009/03/converting-model-glue-docs-to-html.cfm' title='Converting Model-Glue Docs to HTML'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-2110675021862327132</id><published>2009-03-16T20:56:00.007-05:00</published><updated>2009-03-16T21:19:01.530-05:00</updated><title type='text'>jQuery DatePicker w/Multiple Date Fields</title><content type='html'>I needed a replacement Datepicker tool for a legacy application so I headed over to &lt;a href="http://jquery.com/"&gt;jQuery.com&lt;/a&gt; to see what all the excitement was about.  I ran through a couple tuturials starting with &lt;a href="http://docs.jquery.com/Tutorials:How_jQuery_Works"&gt;How jQuery Works&lt;/a&gt; by John Resig where I learned about the ready event, basic syntax, and chainability.  Next, I jumped over to the &lt;a href="http://jqueryui.com/download"&gt;jQuery UI Download&lt;/a&gt; section to grab a copy of the Datepicker widget.&lt;br /&gt;&lt;br /&gt;I needed to be able to have several datepicker tools on the same page, so I used the .filter() to apply the widget to all input fields with a class of datepicker.  I also wanted to give the user the ability to quickly pick from other months and even years, so I set changeMonth and changeYear to true.  And finally, the users of my legacy app are expecting a calendar icon to click, so I duplicated that functionality with buttonImage and buttonImageOnly.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://edbartram.com/demo/multipledates.htm"&gt;Demonstration&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt; &amp;lt;!-- jQuery JS Includes --&amp;gt;&lt;br /&gt; &amp;lt;script type="text/javascript" src="jquery/jquery-1.3.2.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt; &amp;lt;script type="text/javascript" src="jquery/ui/ui.core.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt; &amp;lt;script type="text/javascript" src="jquery/ui/ui.datepicker.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- jQuery CSS Includes --&amp;gt;&lt;br /&gt; &amp;lt;link type="text/css" href="jquery/themes/base/ui.core.css" rel="stylesheet" /&amp;gt;&lt;br /&gt; &amp;lt;link type="text/css" href="jquery/themes/base/ui.datepicker.css" rel="stylesheet" /&amp;gt;&lt;br /&gt; &amp;lt;link type="text/css" href="jquery/themes/base/ui.theme.css" rel="stylesheet" /&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- Setup Datepicker --&amp;gt;&lt;br /&gt; &amp;lt;script type="text/javascript"&amp;gt;&amp;lt;!--&lt;br /&gt;  $(function() {&lt;br /&gt;   $('input').filter('.datepicker').datepicker({&lt;br /&gt;    changeMonth: true,&lt;br /&gt;    changeYear: true,&lt;br /&gt;    showOn: 'button',&lt;br /&gt;    buttonImage: 'jquery/images/calendar.gif',&lt;br /&gt;    buttonImageOnly: true&lt;br /&gt;   });&lt;br /&gt;  });&lt;br /&gt; --&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Each input field needs a unique id, but all need to be datepicker --&amp;gt;&lt;br /&gt; &amp;lt;p&amp;gt;Date 1: &amp;lt;input id="one" class="datepicker" type="text" readonly="true"&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt; &amp;lt;p&amp;gt;Date 2: &amp;lt;input id="two" class="datepicker" type="text" readonly="true"&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt; &amp;lt;p&amp;gt;Date 3: &amp;lt;input id="three" class="datepicker" type="text" readonly="true"&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-2110675021862327132?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/2110675021862327132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=2110675021862327132' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/2110675021862327132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/2110675021862327132'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2009/03/jquery-datepicker-wmultiple-date-fields.cfm' title='jQuery DatePicker w/Multiple Date Fields'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-8520145484321767815</id><published>2008-11-18T10:36:00.006-06:00</published><updated>2008-11-18T16:05:56.959-06:00</updated><title type='text'>Missing MAX 2008?</title><content type='html'>Are you missing Adobe's MAX 2008 conference this year?  I know I was.  But then I decided that I didn't need to.  Even though I wasn't there physically, I could still be inspired from it and learn a few things.  There are a lot of generous people out there who are sharing their experience and willing to bring us less fortunate souls along for the trip.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Blogs&lt;/b&gt; - Follow your favorite bloggers along for the ride as they document the key notes, presentations, birds of a feather events, and other activities they attend.  Not sure who went?  Try starting with a RSS Aggragator to read what is happening now.  Two that I am aware of are:&lt;br /&gt; &lt;a href="http://www.fullasagoog.com/index.cfm"&gt;Full As a Goog&lt;/a&gt;&lt;br /&gt; &lt;a href="http://feeds.adobe.com/"&gt;Adobe Feeds (nee MXNA)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Podcasts&lt;/b&gt; - Listen to some of the more vocal members of the community via a Podcast.  I know two that appear to be recording daily and publishing immediately:&lt;br /&gt;  &lt;a href="http://www.cfconversations.com/"&gt;CFConversations&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://www.theflexshow.com/blog/"&gt;The Flex Show&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Adobe Labs&lt;/b&gt; - Adobe is releasing all sorts of new technologies at this year's conference such as Cocomo, Pixel Bender, Gumbo, and Flash Player 10.  Unfortunately they haven't updated their RSS since September (what's up with that?), so you'll have to visit the site for the latest:&lt;br /&gt; &lt;a href="http://labs.adobe.com/"&gt;Adobe Labs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2008 MAX Awards&lt;/b&gt; - Looking for inspiration from other developers' and designers' projects?  The Max Awards are always filled with some truly amazing projects.  Check out this year's finalists at:&lt;br /&gt; &lt;a href="http://max.adobe.com/na/experience/#?s=5&amp;p=0"&gt;2008 MAX Awards&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Presentations&lt;/b&gt; - The core of MAX are the presentations.  While no one is releasing anything (yet) from this conference, many of the speakers featured there have been kind enough to make available recordings of past presentations.  And Charlie Arehart has built the mother of all libraries housing them at:&lt;br /&gt; &lt;a href="http://www.carehart.org/ugtv/"&gt;UGTV&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Socialize&lt;/b&gt; - You can even follow along with the great social opportunities the conference provides with tools like:&lt;br /&gt; &lt;a href="http://twitter.com"&gt;Twitter&lt;/a&gt;&lt;br /&gt; &lt;a href="http://flickr.com"&gt;Flickr&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Have a great conference and maybe we'll see each other at the next one!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE&lt;/b&gt; on 11/18/2008 at 16:04 CST&lt;br /&gt;Adobe has given us yet another way to Socialize, &lt;a href="http://groups.adobe.com"&gt;Adobe Groups&lt;/a&gt;! View &lt;a href="http://groups.adobe.com/people/8a705421e7/profile"&gt;My Profile&lt;/a&gt; and add me to your network.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-8520145484321767815?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/8520145484321767815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=8520145484321767815' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/8520145484321767815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/8520145484321767815'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2008/11/missing-max-2008.cfm' title='Missing MAX 2008?'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-2105872898595049084</id><published>2008-09-30T10:56:00.007-05:00</published><updated>2008-09-30T11:15:50.375-05:00</updated><title type='text'>Radio Buttons Require onclick in Lower Case for Flash Forms</title><content type='html'>When I originally started working with ColdFusion in 2000, I wrote all of my tags in upper case, both CFML and HTML.  I don't believe I was the only one to do this, I think I carried this technique over from an old HTML standard.  Anyways, times have changed and I've attempted to keep up.  For instance, when typing Javascript event handlers such as onClick, I try to use the appropriate case making the C upper and the rest lower.&lt;br /&gt;&lt;br /&gt;Recently I've been updating a Flash Form application that I wrote last year.  It is a form for accepting donations for several charities on behalf of my employer.  Originally we only accepted payroll deductions to be processed one time or over 26 pay periods.  This meant that I had a pair of radio buttons both named Payments, one had a value of 26 and one had a value of 1.&lt;br /&gt;&lt;br /&gt;This year we wanted to add check processing which, of course, would only be a single payment.  So I added another pair of radio buttons with the intent that if the radio button for check were clicked it would set the number of payments to 1 and disable the original pair of radio buttons.&lt;br /&gt;&lt;br /&gt;I spent hours trying to get this to work right, banging my head against my desk.  No matter what I tried nothing worked.  I tried onClick, onSelect, onChange on the new radio buttons.  I tried binding the old radio buttons.  I tried a text box with conditional logic to tie these radio buttons together.  I searched and scoured the internet and found nothing.&lt;br /&gt;&lt;br /&gt;Finally I made what I originally considered a typo, a mistake; I didn't capitalize the C in onClick.  It worked!  &lt;span style="font-weight:bold;"&gt;In ColdFusion 7 (maybe this is fixed in 8), the ActionScript onclick event for Radio buttons must be in lower case for Flash Forms.&lt;/span&gt;  I created a button and used the traditional casing for onClick and that worked fine.&lt;br /&gt;&lt;br /&gt;The following is the code that &lt;a href="/blog-assets/cf/radioonclick.cfm"&gt;demonstrates&lt;/a&gt; what I've found:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;cfform format="Flash"&amp;gt;&lt;br /&gt; &amp;lt;cfformgroup type="panel" label="Testing"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;cfformitem name="mesg" type="html"&amp;gt;Select Donation Method:&amp;lt;/cfformitem&amp;gt;&lt;br /&gt;  &amp;lt;cfinput type="radio" name="paymethod" label="Payroll Deduction" value="payroll" onclick="Payments.enabled = true;" checked="1"&amp;gt;&lt;br /&gt;  &amp;lt;cfinput type="radio" name="paymethod" label="Pay by Check" value="check" onclick="Payments.enabled = false; Payments.selectedData = 1;"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;cfformitem name="mesg" type="html"&amp;gt;Select Number of Payments:&amp;lt;/cfformitem&amp;gt;&lt;br /&gt;  &amp;lt;cfinput type="radio" name="Payments" label="Per Pay Period (26)" value="26" checked="1"&amp;gt;&lt;br /&gt;  &amp;lt;cfinput type="radio" name="Payments" label="Single Pay Period (1)" value="1"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;cfinput name="bSubmit" type="button" value="Click Me!" onClick="alert('Click!')"&amp;gt;&lt;br /&gt; &amp;lt;/cfformgroup&amp;gt;&lt;br /&gt;&amp;lt;/cfform&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-2105872898595049084?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/2105872898595049084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=2105872898595049084' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/2105872898595049084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/2105872898595049084'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2008/09/radio-buttons-require-onclick-in-lower.cfm' title='Radio Buttons Require onclick in Lower Case for Flash Forms'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-1279333116935045590</id><published>2008-05-13T19:11:00.004-05:00</published><updated>2008-05-13T19:17:46.432-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='ColdFusion'/><title type='text'>Blogger Labels in CF Part 2</title><content type='html'>A few days ago I posted a simple solution for listing Blogger Labels in a classic template using ColdFusion.  I wasn't happy with just listing the Labels though, I wanted to know how many entries were in each Label.  The code that follows is my solution:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;cfscript&amp;gt;&lt;br /&gt; // Returns number of blog entries in a Blogger Label file&lt;br /&gt; function CountLabels(param) {&lt;br /&gt;  ct = 0;&lt;br /&gt;  ptr = FindNoCase('&amp;lt;div class="post"&amp;gt;', param) + 1;&lt;br /&gt;  while (ptr gt 1) {&lt;br /&gt;   ct = ct + 1;&lt;br /&gt;   ptr = FindNoCase('&amp;lt;div class="post"&amp;gt;', param, ptr) + 1;&lt;br /&gt;  }&lt;br /&gt;  return ct;&lt;br /&gt; }&lt;br /&gt;&amp;lt;/cfscript&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--- This is the first time running, so we need to create the structures in the application scope ---&amp;gt;&lt;br /&gt;&amp;lt;cfif Not(StructKeyExists(application, "structLabels"))&amp;gt;&lt;br /&gt; &amp;lt;cfset application.structLabels = StructNew()&amp;gt;&lt;br /&gt; &amp;lt;cfset application.structEntries = StructNew()&amp;gt;&lt;br /&gt;&amp;lt;/cfif&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--- Get a directory listing of the Labels folder ---&amp;gt;&lt;br /&gt;&amp;lt;cfset pathLabels = "#getDirectoryFromPath(getBaseTemplatePath())#labels\"&amp;gt;&lt;br /&gt;&amp;lt;cfdirectory name="dirLabels" action="list" directory="#pathLabels#" sort="name asc"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;cfloop query="dirLabels"&amp;gt;&lt;br /&gt; &amp;lt;!--- This is the first time running, so we need to count the number of entries for this Label ---&amp;gt;&lt;br /&gt; &amp;lt;cfif Not(StructKeyExists(application.structLabels, dirLabels.name))&amp;gt;&lt;br /&gt;  &amp;lt;cffile action="read" file="#pathLabels#\#dirLabels.name#" variable="fileLabel"&amp;gt;&lt;br /&gt;  &amp;lt;cfset ctLabel = CountLabels(fileLabel)&amp;gt;&lt;br /&gt;  &amp;lt;cfset StructInsert(application.structLabels, dirLabels.name, dirLabels.dateLastModified)&amp;gt;&lt;br /&gt;  &amp;lt;cfset StructInsert(application.structEntries, dirLabels.name, ctLabel)&amp;gt;&lt;br /&gt; &amp;lt;!--- The Labels file was updated, so we need to recount the number of entries for this Label ---&amp;gt;&lt;br /&gt; &amp;lt;cfelseif StructFind(application.structLabels, dirLabels.name) neq dirLabels.dateLastModified&amp;gt;&lt;br /&gt;  &amp;lt;cffile action="read" file="#pathLabels#\#dirLabels.name#" variable="fileLabel"&amp;gt;&lt;br /&gt;  &amp;lt;cfset ctLabel = CountLabels(fileLabel)&amp;gt;&lt;br /&gt;  &amp;lt;cfset StructUpdate(application.structLabels, dirLabels.name, dirLabels.dateLastModified)&amp;gt;&lt;br /&gt;  &amp;lt;cfset StructUpdate(application.structEntries, dirLabels.name, ctLabel)&amp;gt;&lt;br /&gt; &amp;lt;/cfif&amp;gt;&lt;br /&gt;&amp;lt;/cfloop&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt; &amp;lt;cfloop collection="#application.structEntries#" item="key"&amp;gt;&lt;br /&gt;  &amp;lt;!--- If there are entries in a Label file, then list it as a link with the total number of entries ---&amp;gt;&lt;br /&gt;  &amp;lt;cfif StructFind(application.structEntries,key)&amp;gt;&lt;br /&gt;   &amp;lt;li&amp;gt;&amp;lt;cfoutput&amp;gt;&amp;lt;a href="/blog/labels/#key#"&amp;gt;#ListFirst(key,".")#&amp;lt;/a&amp;gt; (#StructFind(application.structEntries,key)#)&amp;lt;/cfoutput&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;  &amp;lt;/cfif&amp;gt;&lt;br /&gt; &amp;lt;/cfloop&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-1279333116935045590?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/1279333116935045590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=1279333116935045590' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/1279333116935045590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/1279333116935045590'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2008/05/blogger-labels-in-cf-part-2.cfm' title='Blogger Labels in CF Part 2'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-3425678044393338407</id><published>2008-05-10T10:23:00.007-05:00</published><updated>2008-05-12T08:59:10.908-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='ColdFusion'/><title type='text'>Labels in Blogger Classic Template using ColdFusion</title><content type='html'>Blogger finally got its act together a while back and introduced Labels as a way of tagging or creating categories for blogs.  However, they only  half-way implemented it for Classic Templates.  Each posting lists the Labels that have been assigned to it, and a folder called Labels stores a file listing all the entries for each Label exists.  BUT, Blogger doesn't have a $BlogLabel$ tag to display the list of Labels in the navigation column.  What's a ColdFusion developer to do?  Roll his own!&lt;code&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;cfset pathLabels = "#getDirectoryFromPath(getBaseTemplatePath())#labels\"&amp;gt;&lt;br /&gt;&amp;lt;cfdirectory name="dirLabels" action="list" directory="#pathLabels#" sort="name asc"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt; &amp;lt;cfoutput query="dirLabels"&amp;gt;&lt;br /&gt;  &amp;lt;cffile action="read" file="#pathLabels#\#dirLabels.name#" variable="fileLabel"&amp;gt;&lt;br /&gt;  &amp;lt;li&amp;gt;&amp;lt;a href="/blog/labels/#dirLabels.name#"&amp;gt;#ListFirst(dirLabels.name,".")#&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt; &amp;lt;/cfoutput&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;First, I build the path to the labels folder using ColdFusion functions enabling the code to run in both my development and live environments.  Next, the CFDIRECTORY tag returns a list of the files in the Labels folder in a query structure.  Looping through the file names using CFOUTPUT tag, I assemble each list element as a link.  With the ListFirst function I can treat the filename as a list with the period as the separator and return the filename without an extension giving me the name of the Label.&lt;br /&gt;&lt;br /&gt;I store the following code in /blog-cf/labels.cfm and in my Blogger template, I use the following code to call it:&lt;code&gt;&lt;pre&gt;&lt;br /&gt; &amp;lt;h2 class="sidebar-title"&amp;gt;Labels&amp;lt;/h2&amp;gt;&lt;br /&gt; &amp;lt;cfinclude template="/blog-cf/labels.cfm"&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-3425678044393338407?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/3425678044393338407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=3425678044393338407' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/3425678044393338407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/3425678044393338407'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2008/05/labels-in-blogger-classic-template.cfm' title='Labels in Blogger Classic Template using ColdFusion'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-8007769876300881459</id><published>2008-02-08T12:00:00.003-06:00</published><updated>2008-05-10T10:59:49.233-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Why I'm dumping my Yahoo email</title><content type='html'>I've had my Yahoo email account for about 10 years, but am now abandoning it.  Why?  To simplify my browser experience.&lt;br /&gt;&lt;br /&gt;My laptop is always on, connected to the internet, and with my email open in Firefox.  The problem is I have several email accounts across several web-based email clients, most of which are using AJAX.  AJAX, in my experience, is a pig for resources and sometimes locks up the browser.  Don't get me wrong, I love the idea of AJAX.  I like content on my webpages updating without me clicking refresh.  But it can quickly consume a lot of memory slowing me down, it can cause the browser to become unresponsive when it is waiting to fetch content from a page, it's even locked up and caused my browser to crash.  I've learned it's best to be very selective about which AJAX sites to keep open.&lt;br /&gt;&lt;br /&gt;I tried switching to Yahoo Classic, but frankly it should be called Yahoo Clunky when compared side-by-side with Google Mail.  I've grown quite comfortable with Google Mail in the past few years since I've been using it.  Most importantly, it allows me to maintain almost all of my email addresses in one place.  I say almost all, the exception is my Yahoo mail which doesn't provide forwarding like Google Mail does.  Like I said, I want to manage all of my email accounts from 1 place, so Yahoo Mail is getting the boot.&lt;br /&gt;&lt;br /&gt;I'll still keep an eye on my Yahoo Mail for the next few weeks, but I've sent out the email announcing my "new" email address and it has been removed from my homepages in Firefox.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-8007769876300881459?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/8007769876300881459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=8007769876300881459' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/8007769876300881459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/8007769876300881459'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2008/02/why-im-dumping-my-yahoo-email.cfm' title='Why I&apos;m dumping my Yahoo email'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-24827196051779859</id><published>2008-02-06T12:00:00.004-06:00</published><updated>2008-05-10T11:00:20.199-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Welcome to the Internet</title><content type='html'>I registered EdBartram.com recently to establish a (semi) professional site for myself.  Last weekend I started working with a template to get the ball rolling.  I didn't want to publish my email address because I knew I'd get spammed pretty quickly, so I built a contact form in ColdFusion.  Four days later I receive a single email from the form containing a whole bunch of links in what appears to be Russian, in other words spam.  Mind you, I'm still building the website, I haven't submitted it to any search engines.  As far as I knew the site was completely off the radar.  Just to prove it while writing this entry, I went to Google and ran a quick search on my domain.  My site is listed!  How and when did that happen?  I checked Google's cached version, it says it was retrieved on the day after I put up the template!&lt;br /&gt;&lt;br /&gt;Wow, that's quite a welcome to the Internet for my new site!  It is on Google day 2 and received its first spam on Day 5!  I can't wait to see what is next...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-24827196051779859?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/24827196051779859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=24827196051779859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/24827196051779859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/24827196051779859'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2008/02/welcome-to-internet.cfm' title='Welcome to the Internet'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-338229550299305435</id><published>2007-05-29T09:22:00.001-05:00</published><updated>2008-05-10T07:41:57.968-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ColdFusion'/><title type='text'>Submit CFCALENDAR onchange</title><content type='html'>I'm building an application that needs a calendar picker tool and I decided to check out the CFCALENDAR form control.  It turns out that since it is a flash component, the onchange event uses ActionScript rather than JavaScript.  This proved a bit frustrating for me since I knew zero ActionScript going into this and I was initially unable to find any help online.   I eventually came across a page, &lt;a href="http://www.actionscript.org/resources/articles/102/1/Passing-Variables-Around---Flash-to-HTML-and-Back/Page1.html"&gt;Passing Variables Around - Flash to HTML and Back&lt;/a&gt; that talked about how to emulate a METHOD="GET" submit in ActionScript.  I then learned about how AS names fields and some basic date functions and came up with the following code:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;cfparam name="TestDate" default="#Now()#"&amp;gt;&lt;br /&gt;&amp;lt;cfoutput&amp;gt;#TestDate#&amp;lt;/cfoutput&amp;gt;&lt;br /&gt;&amp;lt;cfform name="TestForm" id="TestForm" action="cfcalendar.cfm"&amp;gt;&lt;br /&gt; &amp;lt;cfcalendar name="TestDate" selecteddate="#DateFormat(TestDate,'mm/dd/yyyy')#"&lt;br /&gt;   onchange="getURL('cfcalendar.cfm?TestDate=' + (TestDate.selectedDate.getMonth()+1) + '/' +&lt;br /&gt;     TestDate.selectedDate.getDate() + '/' + TestDate.selectedDate.getFullYear());"&amp;gt;&lt;br /&gt;&amp;lt;/cfform&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;The key was to reference the field name selectedDate rather than TestDate, otherwise you keep passing the original date.  I then needed to reassemble the date into a format that ColdFusion would understand using the getMonth, getDate, and getFullYear functions.  Also I needed to add one to the result of getMonth since ActionScript starts counting months at 0 instead of 1.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-338229550299305435?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/338229550299305435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=338229550299305435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/338229550299305435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/338229550299305435'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2007/05/submit-cfcalendar-onchange.cfm' title='Submit CFCALENDAR onchange'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-8421472128867423400</id><published>2007-05-16T10:06:00.002-05:00</published><updated>2008-05-10T07:42:20.513-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ColdFusion'/><title type='text'>Development Directory Structure</title><content type='html'>While &lt;a href="http://bartramsbits.blogspot.com/2007/05/subversion-and-tortoisesvn.html"&gt;implementing version control&lt;/a&gt;, I changed several things in my development environment.  One of those things is the directory structure.  I did some reading online, especially &lt;a href="http://livedocs.adobe.com/wtg/public/coding_standards/structure.html"&gt;ColdFusion MX Coding Guidelines - Structure: Application, Component, Tag etc&lt;/a&gt; (scroll down to the Directory Structure For Applications section).  Most of what everybody else talked about referred back to this guide.  The big question that I had as a developer was; how to handle multiple sites?  The apparent consensus is to place each application in wwwroot whose parent is cfmxroot.  Each application has its own webroot where the .cfm files go and other non-web folders.  The overall development environment then has folders for supporting files within the cfmxroot.  The following is the expanded structure including some folders which I probably won't use, but are there if I need them:&lt;br /&gt;&lt;pre&gt;C:\cfmxroot&lt;br /&gt;config&lt;br /&gt;extensions&lt;br /&gt;  components&lt;br /&gt;  customtags&lt;br /&gt;  includes&lt;br /&gt;wwwroot&lt;br /&gt;  &lt;i&gt;appname&lt;/i&gt;&lt;br /&gt;  db&lt;br /&gt;  extensions&lt;br /&gt;    components&lt;br /&gt;    customtags&lt;br /&gt;    includes&lt;br /&gt;  webroot&lt;br /&gt;    images&lt;br /&gt;    shared&lt;br /&gt;      css&lt;br /&gt;      documents&lt;br /&gt;      images&lt;br /&gt;      js&lt;br /&gt;      services&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-8421472128867423400?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/8421472128867423400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=8421472128867423400' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/8421472128867423400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/8421472128867423400'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2007/05/development-directory-structure.cfm' title='Development Directory Structure'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-237849079645438997</id><published>2007-05-16T09:37:00.002-05:00</published><updated>2008-05-10T10:57:17.949-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Version Control'/><title type='text'>Implementing Subversion w/ TortoiseSVN</title><content type='html'>I've known of the benefits of version control especially Subversion for a while now, but for whatever reasons, I hadn't made "the leap" until now.  I bookmarked the series &lt;a href="http://www.trajiklyhip.com/blog/index.cfm/2007/3/12/Configuring-a-Development-Environment-with-Apache-Subversion-TortoiseSVN-and-Subclipse"&gt;Configuring a Development Environment with Apache, Subversion, TortoiseSVN, and Subclipse&lt;/a&gt; most recently, but like many of my bookmarks it sat unread for a while.  What is different is that Monday evening I began reading it and implementing it as I went along.  I've read and worked through Parts 1-3 augmented with &lt;a href="http://www.acidlabs.org/extras/acme/"&gt;The ACME Guide&lt;/a&gt; and am now using a repository with one of my current projects.  While the articles are great and were able to get me up and running, I have found I have a need for a quick reference while I am still getting comfortable with the process. &lt;br /&gt;&lt;br /&gt;goto &lt;b&gt;C:\svnrepos&lt;/b&gt;&lt;br /&gt;create a new folder&lt;br /&gt;right click on the new folder and select &lt;b&gt;TortoiseSVN&amp;gt;create repository here&lt;/b&gt;&lt;br /&gt;slect &lt;b&gt;Native filesystem (FSFS)&lt;/b&gt;&lt;br /&gt;right click on th new folder and select &lt;b&gt;ToroiseSVN&amp;gt;Repo-browser&lt;/b&gt;&lt;br /&gt;change URL to &lt;b&gt;http://localhost/svn/&lt;/b&gt;new folder name&lt;br /&gt;right click and select Create Folder&lt;br /&gt;New name: &lt;b&gt;trunk&lt;/b&gt;&lt;br /&gt;Log: &lt;b&gt;Create trunk folder&lt;/b&gt;&lt;br /&gt;right click and select &lt;b&gt;Create Folder&lt;/b&gt;&lt;br /&gt;New name: &lt;b&gt;branches&lt;/b&gt;&lt;br /&gt;Log: &lt;b&gt;Create branches folder&lt;/b&gt;&lt;br /&gt;right click and select Create Folder&lt;br /&gt;New name: &lt;b&gt;tags&lt;/b&gt;&lt;br /&gt;Log: &lt;b&gt;Create tags folder&lt;/b&gt;&lt;br /&gt;goto directory of code to import&lt;br /&gt;right click and select &lt;b&gt;TortoiseSVN&amp;gt;Import&lt;/b&gt;&lt;br /&gt;URL of repository, select newly created repository and add &lt;b&gt;/trunk&lt;/b&gt;&lt;br /&gt;in development environment create new folder&lt;br /&gt;right click new folder and select &lt;b&gt;SVN Checkout...&lt;/b&gt;&lt;br /&gt;accept defaults and click &lt;b&gt;OK&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To commit changes to the repository, right click and select &lt;b&gt;SVN Commit...&lt;/b&gt;&lt;br /&gt;To update from the repository, right click and select &lt;b&gt;SVN Update...&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Disclaimer - This entry is not recommended as a how-to article, rather it simply documents my current process.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-237849079645438997?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/237849079645438997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=237849079645438997' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/237849079645438997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/237849079645438997'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2007/05/subversion-and-tortoisesvn.cfm' title='Implementing Subversion w/ TortoiseSVN'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-3532940055765651437</id><published>2007-05-10T14:15:00.001-05:00</published><updated>2008-05-10T07:39:47.638-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ColdFusion'/><title type='text'>New in CFMX 6&amp;7: What did you miss?</title><content type='html'>At lunch today I attended Charlie Arehart's CFUnited preview presentation, &lt;a href="http://experts.acrobat.com/p39079193/"&gt;New in CFMX 6&amp;amp;7: What did you miss?&lt;/a&gt; online a la the &lt;a href="http://coldfusion.meetup.com/17/"&gt;ColdFusion Meetup Group&lt;/a&gt;.  It looks like I'm really going to miss out by not attending this conference!  Charlie has provided a loooooong list of both major features of CFMX 6 &amp;amp; 7 as well as not so major enhancements in CFMX 6 (no list for 7).  Being only 30 minutes he was not able to go into detail on any of these items, but he sure wetted my appetite and gave me a lot to research.  He started with an example of an enhancement that came out way back in ColdFusion 4.01 that is not widely known: &lt;span style="font-style: italic;"&gt;ListQualify()&lt;/span&gt;, for example, can convert a list such as "red,blue,green" to 'red','blue','green' for use with a SQL clause WHERE IN(...)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ColdFusion MX 6 Major Features&lt;/span&gt;&lt;br /&gt;ColdFusion Components (CFCs)&lt;br /&gt;Web Services&lt;br /&gt;Flash Remoting&lt;br /&gt;XML&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ColdFusion MX 7 Major Features&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Great User Experience&lt;/span&gt;&lt;br /&gt;- Printable Web Content&lt;br /&gt;- Structured Business Reports&lt;br /&gt;- Flash Forms and Controls&lt;br /&gt;- XML Forms&lt;br /&gt;- New CFCHART engine&lt;br /&gt;- Ready-to-use chart styles&lt;br /&gt;- Improved text searching capabilities&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Rapid Development&lt;/span&gt;&lt;br /&gt;- Dreamweaver extensions&lt;br /&gt;- Improved form validation&lt;br /&gt;- Parameter validation&lt;br /&gt;- Strong encryption&lt;br /&gt;- Integrated NT Domain authentication&lt;br /&gt;- Improved XML functionality&lt;br /&gt;- In-memory Query Metadata support&lt;br /&gt;- Debugging improvements&lt;br /&gt;- Cross-site Scripting attack prevention&lt;br /&gt;- Application event traps&lt;br /&gt;- Enhanced Web Services support&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Flexible Deployment&lt;br /&gt;&lt;/span&gt;- Enterprise Manager&lt;br /&gt;- EAR/WAR deployment&lt;br /&gt;- Sourceless deployment&lt;br /&gt;- Administrator API&lt;br /&gt;- License Usage Scanner&lt;br /&gt;&lt;span style="font-style: italic;"&gt;New Classes of Application Development&lt;br /&gt;&lt;/span&gt;- SMS Gateway&lt;br /&gt;- Lotus Sametime Gateway&lt;br /&gt;- XMPP Gateway&lt;br /&gt;- File System Gateway&lt;br /&gt;- CFML Aynchronous Gateway&lt;br /&gt;- Extensible Gateway Architecture&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;More than just the "major" features: Other big CFMX 6 enhancements&lt;br /&gt;&lt;/span&gt;Build tag-based UDFs with CFFUNCTION&lt;br /&gt;Enable user authentication and autorization with CFLOGIN&lt;br /&gt;Implement Developer Resource Controls with Sandbox/Resource Security&lt;br /&gt;Dynamic charting with CFCHART&lt;br /&gt;Improved debugging and tracing with CFTRACE&lt;br /&gt;Internationalization of your applications&lt;br /&gt;Several Regular Expression (RE) support changes&lt;br /&gt;CFTHROW can now throw an object&lt;br /&gt;CFLOG now always writes thread, date, and time&lt;br /&gt;CFHTTP reading text file in as query, new FirstRowAsHeaders attribute&lt;br /&gt;Verity K2 Server Improvements&lt;br /&gt;New commenting flexibility&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Still more CFMX 6 enhancements&lt;br /&gt;&lt;/span&gt;- Dreamweaver MX&lt;br /&gt;- Database connectivity&lt;br /&gt;- Query of Query enhancements&lt;br /&gt;- Several CFLDAP changes&lt;br /&gt;- CFMAIL spooling option changes&lt;br /&gt;- Sort order in ListSort, ArraySort&lt;br /&gt;- Date processing functions have short, medium, long formats&lt;br /&gt;- Localization functions now follow Java standard rules&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Some CFMX 6 hidden gems&lt;br /&gt;&lt;/span&gt;- CFLOCATION fixed to properly set cookies&lt;br /&gt;- Compilation/PreCompilation of CF Templates&lt;br /&gt;- Extensibility of Built-in Web Server&lt;br /&gt;- CFIMPORT of CF Custom Tags&lt;br /&gt;- Sever-side Redirect forwarding&lt;br /&gt;- CFMX Tag Updater for CF Studio AKA HomeSite Plus&lt;br /&gt;- CFSETTING RequestTimeOut&lt;br /&gt;- Optional UUID for CFTOKEN&lt;br /&gt;- UrlSessionFormat() Function&lt;br /&gt;- Exception Handling in CFSCRIPT&lt;br /&gt;- Evaluation within expressions&lt;br /&gt;- New variable scopes available as structures&lt;br /&gt;- Appending arrays to one another&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Resources for learning more&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.adobe.com/products/coldfusion/productinfo/upgrade/"&gt;ColdFusion MX 7 Upgrade Guide&lt;/a&gt;&lt;br /&gt;&lt;a href="http://download.macromedia.com/pub/documentation/en/coldfusion/mx7/cfmx7_migrating.pdf"&gt;CF7 Migration Guide&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.adobe.com/products/coldfusion/whitepapers/evalguide_frameset.html"&gt;CF 7 Evaluator's Guide&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.adobe.com/products/coldfusion/productinfo/product_editions/cf_feature_matrix.pdf"&gt;Edition Comparison Matrix (5,6,7)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-3532940055765651437?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/3532940055765651437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=3532940055765651437' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/3532940055765651437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/3532940055765651437'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2007/05/new-in-cfmx-6-what-did-you-miss.cfm' title='New in CFMX 6&amp;7: What did you miss?'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36397205.post-145937777924035142</id><published>2007-05-10T10:46:00.002-05:00</published><updated>2008-05-10T07:38:13.811-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ColdFusion'/><title type='text'>ColdFusion 8 Preview</title><content type='html'>&lt;a href="http://www.forta.com/blog/index.cfm/2007/5/8/Next-Up-Are-Indianapolis-And-Kansas-City"&gt;Ben Forta&lt;/a&gt; came to the &lt;a href="http://www.cccfug.org/cccfug/cccfug.cfm"&gt;cccfug&lt;/a&gt; on May 7 as part of his Scorpio User Group Tour to present a sneak peak of ColdFusion 8.  The gathering was quite crowded and very enthusiastic.  Ben spoke for 2.5 hours on the following key items grouped into 3 categories:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Developers Section&lt;/span&gt;&lt;br /&gt;CFIMAGE&lt;br /&gt;AJAX&lt;br /&gt;FckEditor&lt;br /&gt;Yahoo Calendar Control&lt;br /&gt;CFWINDOW&lt;br /&gt;CFFORM binds&lt;br /&gt;low level CFFILE handling&lt;br /&gt;CFTHREAD&lt;br /&gt;CFDOCUMENT enhancements&lt;br /&gt;Reporting enhancements&lt;br /&gt;CFC Interfaces&lt;br /&gt;Argument collections - use a structure to pass default settings to any cf tag&lt;br /&gt;Implicit Array &amp;amp; Structure creation&lt;br /&gt;Javascript operators in CFSCRIPT&lt;br /&gt;Eclipse Debugger&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Integration Section&lt;/span&gt;&lt;br /&gt;CFOBJECT invokes .NET Assemblies within the CLR&lt;br /&gt;* ColdFusion can talk to ColdFusion, Java, and .NET Objects all at once&lt;br /&gt;MS Echange - full client control&lt;br /&gt;CFPRESENTATION creates Adobe Connect Breezos&lt;br /&gt;Flash Media Server Gateway&lt;br /&gt;CFFEED - Atom and RSS&lt;br /&gt;CFPDF - PDF manipulation&lt;br /&gt;CFPDFFORM - populate and extract data in PDF forms&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Management and Administration&lt;/span&gt;&lt;br /&gt;Server Monitoring API and Flex front-end&lt;br /&gt;User-based Admin &amp;amp; RDS&lt;br /&gt;Per application settings&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36397205-145937777924035142?l=edbartram.com%2Fblog%2Findex.cfm' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/145937777924035142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36397205&amp;postID=145937777924035142' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/145937777924035142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36397205/posts/default/145937777924035142'/><link rel='alternate' type='text/html' href='http://edbartram.com/blog/2007/05/coldfusion-8-preview.cfm' title='ColdFusion 8 Preview'/><author><name>Ed Bartram</name><uri>http://www.blogger.com/profile/08256415113290993890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='06376320811069687013'/></author><thr:total>2</thr:total></entry></feed>