<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
	<channel>
	<title>FusionGrokker</title>
	<link>http://fusiongrokker.com/</link>
	<description>A blog about ColdFusion, Rich Internet Applications, and life as a developer.</description>
	<generator>Mango 1.3.1</generator>
	
	 
      <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/NerdFusion" type="application/rss+xml" /><item>
         <title>Flex &amp; ColdFusion position in the Philadelphia Area</title>
         <description>&lt;p&gt;A recruiter contacted me to ask if I knew anyone looking for ColdFusion and Flex work in the Philadelphia area. Unfortunately, I don't. If I did, I would probably steal them to fill an open position in my department. But in hopes that someone out there looking for work in the Philadelphia suburbs might fit, I offered to post the information here.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Flex/ColdFusion Developer needed for a 3 week project in Malvern PA.&lt;/p&gt;
&lt;p&gt;Please contact Jacky Barry, &lt;a href="mailto:j.barry@thebossgroup.com"&gt;j.barry@thebossgroup.com&lt;/a&gt; or 610-668-3456&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It sounds like freelancers and moonlighters might be able to take it on, but I'm not sure if it requires working on-site or during normal business hours.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NerdFusion/~4/dOBKm6pfe_k" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/NerdFusion/~3/dOBKm6pfe_k/flex-coldfusion-position-in-the-philadelphia-area</link>
         <guid isPermaLink="false">http://fusiongrokker.com/post/flex-coldfusion-position-in-the-philadelphia-area</guid>
         <category>Jobs</category>
         <pubDate>Fri, 26 Jun 2009 14:58:22 GMT</pubDate>
      <feedburner:origLink>http://fusiongrokker.com/post/flex-coldfusion-position-in-the-philadelphia-area</feedburner:origLink></item> 
      <item>
         <title>I'm calling it: CF9 and Bolt to be released together, and by&amp;#8230;</title>
         <description>&lt;p&gt;If you listen closely to &lt;a href="http://www.cfconversations.com/index.cfm/2009/6/8/CFConversations-33-Interview-22--Adam-Lehman-and-Terry-Ryan-of-Adobe"&gt;CFConversations Episode 33&lt;/a&gt;, you'll hear &lt;a href="http://www.terrenceryan.com/"&gt;Terry Ryan&lt;/a&gt; and &lt;a href="http://adrocknaphobia.com/"&gt;Adam Lehman&lt;/a&gt; explain why Adobe's official product names and release dates are kept secret for so long &amp;#8212; hence the use of code names like Scorpio, Centaur, Bolt, Catalyst, etc.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"Basically, if we say the name of the product it has to go on our reports, and because we're not selling it yet you get zero's on the report and so that causes all sorts of problems. There are very legal reasons for doing it&amp;#8230;" &amp;#8212; Terry&lt;/p&gt;
&lt;p&gt;"Then there's copyright and trademarks. If we were to (hypothetically!) come out a year ago and say, "it's called &lt;em&gt;ColdFusion 9&lt;/em&gt;", but then took more than a year to release it someone could actually steal that trademark. Traditionally, when we go to public beta is when the official names come out." &amp;#8212; Adam&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That said, Adobe has been publicly announcing (&lt;a href="http://twitter.com/ladobe/status/2216921653"&gt;CF&lt;/a&gt;, &lt;a href="http://twitter.com/ladobe/status/2216933082"&gt;Bolt&lt;/a&gt;) that the name of the next version of ColdFusion is (big surprise) &lt;strong&gt;ColdFusion 9&lt;/strong&gt;, and the name for the IDE (that we currently refer to as Bolt) is &lt;strong&gt;ColdFusion Builder&lt;/strong&gt;. I guess we can expect an announcement for public beta any time now, right?&lt;/p&gt;
&lt;p&gt;When you put two and two together, you can infer that they will be released more or less hand in hand. It wouldn't make much sense for them to be released a week or two apart, splitting the hype; it makes much more sense to combine them and have one big party. That isn't much of a surprise. Some of the features announced for Centaur &amp;#8212; ColdFusion 9 &amp;#8212; pretty much require IDE integration. (And some of them &lt;a href="/post/proxy-tags-for-coldfusion-functionality-in-flex"&gt;don't, but are still pretty badass&lt;/a&gt;!)&lt;/p&gt;
&lt;p&gt;But the big take away from these announcements is that we can expect ColdFusion 9 and ColdFusion Builder to be available for purchase &lt;strong&gt;no later than June of 2010&lt;/strong&gt;. &lt;em&gt;The clock is ticking.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Oh, but there's that big &lt;a href="http://max.adobe.com/"&gt;Adobe MAX&lt;/a&gt; conference in October, too. &lt;em&gt;I wonder what they'll be talking about&amp;#8230;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NerdFusion/~4/Gnbb3VShumw" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/NerdFusion/~3/Gnbb3VShumw/i-m-calling-it-cf9-and-bolt-to-be-released-together-and-by</link>
         <guid isPermaLink="false">http://fusiongrokker.com/post/i-m-calling-it-cf9-and-bolt-to-be-released-together-and-by</guid>
         <category>Adobe</category><category>ColdFusion</category>
         <pubDate>Thu, 18 Jun 2009 11:00:00 GMT</pubDate>
      <feedburner:origLink>http://fusiongrokker.com/post/i-m-calling-it-cf9-and-bolt-to-be-released-together-and-by</feedburner:origLink></item> 
      <item>
         <title>"Proxy Tags" for ColdFusion functionality in Flex</title>
         <description>&lt;p&gt;Personally, I'm pretty excited about this. Peter Elst &lt;a href="http://www.peterelst.com/blog/2009/06/11/sneak-peek-of-proxy-tags-in-coldfusion-9/"&gt;posted a video from AdobeTV&lt;/a&gt; of Ryan Stewart demoing a feature that &lt;em&gt;might&lt;/em&gt; be in the next version of ColdFusion. As a matter of fact, here's the comment I left on Peter's post:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Holy @%^&amp;amp;*@#%%^&amp;amp;%@##$%.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So what's this cool new feature? It's actually something being developed by the ColdFusion team, not the Flex team. Essentially, what it boils down to is that by adding a line of configuration code pointing to your ColdFusion server, and setting up a user account on that CF server that has this new remote access enabled, you can access some core ColdFusion functionality from your Flex application without writing a single line of ColdFusion code.&lt;/p&gt;
&lt;p&gt;In his example, Ryan uploaded a PDF file, and used CFPDF remotely from his Flex application to access the meta-information about that PDF from Flex &amp;#8212; all without writing any CFML. (I'm guessing that the upload itself required a few lines of CFML, but that wasn't what was being demoed.)&lt;/p&gt;
&lt;p&gt;It sounded like Ryan said that access can be restricted per-user to specific tags, so it should be highly configurable.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="/assets/content//cfproxytags.png" alt="" width="342" height="292" /&gt;&lt;/p&gt;
&lt;p&gt;I paused the video at about 2:10, and it looks like these tags are already supported: &lt;strong&gt;CFChart, &lt;/strong&gt;&lt;strong&gt;CF&lt;/strong&gt;&lt;strong&gt;Document, &lt;/strong&gt;&lt;strong&gt;CF&lt;/strong&gt;&lt;strong&gt;Image, &lt;/strong&gt;&lt;strong&gt;CF&lt;/strong&gt;&lt;strong&gt;LDAP, &lt;/strong&gt;&lt;strong&gt;CF&lt;/strong&gt;&lt;strong&gt;Mail, &lt;/strong&gt;&lt;strong&gt;CF&lt;/strong&gt;&lt;strong&gt;PDF, &lt;/strong&gt;and &lt;strong&gt;CF&lt;/strong&gt;&lt;strong&gt;POP&lt;/strong&gt;. This list has the potential to grow between now and release, too. I would bet they only have code-hinting enabled for features that are already functional, and I'm sure they're hard at work finding and implementing other great tags. I wouldn't be surprised to see &lt;strong&gt;CFExchange&lt;/strong&gt;, &lt;strong&gt;CFDBInfo&lt;/strong&gt;, and a few other tags added to that list. (How cool would it be to have a Flex app to administer MySQL in the same manner as phpMyAdmin?)&lt;/p&gt;
&lt;p&gt;Ryan says that this feature "&lt;em&gt;may&lt;/em&gt; be in ColdFusion 9, code named 'Centaur'." Let's be real about this: When has Adobe ever demoed a feature or product that wasn't all but guaranteed to be released? They are too careful to do something like that. So this may change form a little bit, but I fully expect it to be included, in some way, shape, or form.&lt;/p&gt;
&lt;p&gt;When it comes down to it, this isn't incredibly ground-breaking, because &lt;strong&gt;you can already accomplish all of this by writing some server side code&lt;/strong&gt;. But what's happening here is that the ColdFusion engineering team is doing what they do best: making tedious or complex things easy.&lt;/p&gt;
&lt;p&gt;Most of all, it made me realize that we need to start thinking more about the status quo in our applications. How many flex applications do you have that require a username and password that get handed off to be handled by your hand-written server-side LDAP authentication code? You can do that automatically as the application loads, and the user doesn't even have to think about signing in, but still gets their personalized interface. You can do that today, but with these new "Proxy Tags" it would require less code.&lt;/p&gt;
&lt;p&gt;I think ColdFusion 9 is poised to be a game changing release. Are you ready?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NerdFusion/~4/SZpg7GN8eU8" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/NerdFusion/~3/SZpg7GN8eU8/proxy-tags-for-coldfusion-functionality-in-flex</link>
         <guid isPermaLink="false">http://fusiongrokker.com/post/proxy-tags-for-coldfusion-functionality-in-flex</guid>
         <category>ColdFusion</category><category>Flex</category>
         <pubDate>Fri, 12 Jun 2009 18:26:03 GMT</pubDate>
      <feedburner:origLink>http://fusiongrokker.com/post/proxy-tags-for-coldfusion-functionality-in-flex</feedburner:origLink></item> 
      <item>
         <title>Philly Area ColdFusion Developers: Happy Hour!</title>
         <description>&lt;p&gt;The developers at my office, &lt;a href="http://technology.wharton.upenn.edu/whartoncomputing/"&gt;Wharton Computing&lt;/a&gt;, get together monthly to remind ourselves that we are all normal (well, &lt;em&gt;mostly normal&lt;/em&gt;) people with interests and hobbies outside of work, and to relax a little bit; and we're extending the invitation to the entire PhillyCFUG group.&lt;/p&gt;
&lt;p&gt;It's a great opportunity to blow off a little steam, get to know your peers, and if you're into that sort of thing, do some networking. (You know, we do have a couple of open positions. &lt;a href="http://jobs.hr.upenn.edu"&gt;You can search&lt;/a&gt; in the Org "Wharton Computing and Instructional Technology")&lt;/p&gt;
&lt;p&gt;This month we're meeting &lt;strong&gt;TOMORROW&lt;/strong&gt; &amp;#8212; June 4th &amp;#8212; at 4:00 pm, at Slainté, on the corner of 30th and Market &amp;#8212; the opposite corner from 30th Street Station. Typically we're there until at least 6:00, but the bar has a great atmosphere and I've personally stayed at one of our happy hours until around 9:30, just hanging out talking about geeky stuff with a bunch of people, before retreating to the suburbs.&lt;/p&gt;
&lt;p&gt;It's a great time, and we hope you'll come join us.&lt;/p&gt;
&lt;p&gt;See you there!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NerdFusion/~4/WRlG5pujCY0" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/NerdFusion/~3/WRlG5pujCY0/philly-area-coldfusion-developers-happy-hour</link>
         <guid isPermaLink="false">http://fusiongrokker.com/post/philly-area-coldfusion-developers-happy-hour</guid>
         <category>CFUG</category><category>ColdFusion</category><category>Philadelphia</category>
         <pubDate>Wed, 03 Jun 2009 14:45:55 GMT</pubDate>
      <feedburner:origLink>http://fusiongrokker.com/post/philly-area-coldfusion-developers-happy-hour</feedburner:origLink></item> 
      <item>
         <title>What Twitter Clients Actually Need</title>
         <description>&lt;p&gt;I'm a big fan of Twitter clients that allow grouping your followee's into groups. &lt;a href="http://www.tweetdeck.com/"&gt;Tweetdeck&lt;/a&gt; was probably one of the first to do this, and it was a big step forward. Lately, I've been using &lt;a href="http://nambu.com/"&gt;Nambu&lt;/a&gt; and &lt;a href="http://desktop.seesmic.com/"&gt;Seesmic Desktop&lt;/a&gt; on the desktop (which I feel are about on par with &amp;#8212; or slightly better than &amp;#8212; Tweetdeck feature-wise, but more importantly: &lt;em&gt;not ugly&lt;/em&gt;), and &lt;a href="http://nambu.com/"&gt;Nambu&lt;/a&gt; and &lt;a href="http://brightkite.com"&gt;BrightKite&lt;/a&gt; on my iPhone. BrightKite's auto-post to twitter and built-in image posting (and hosting) makes sites like &lt;a href="http://twitpic.com/"&gt;TwitPic&lt;/a&gt; and &lt;a href="http://posterous.com/"&gt;Posterous&lt;/a&gt; seem very kludgy, and I'm happy to be done with them.&lt;/p&gt;
&lt;p&gt;It always seems like the latest &amp;amp; greatest twitter client comes along and makes switching seem worth it, so we all switch. That's great. But now, with the advent of grouping, we've run into a problem. Every time I switch clients, I need to re-enter all of my groups, and so far, nobody has found a way to make doing that quick and easy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tweetdeck&lt;/strong&gt; was probably the best and fastest way for creating groups from scratch, with a long list of checkboxes for everyone you follow. That can get a little bit cumbersome when you follow several hundred people, but worse: the list doesn't seem to update often, and it's not really known when that cache updates, or how to force an update, if you even can.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nambu&lt;/strong&gt; has a nice dialog for creating and editing groups &amp;#8212; when it doesn't cause the client to crash &amp;#8212; but it's about this big &amp;#8212;&amp;gt; &amp;lt;&amp;#8212; (tiny!) and that makes going through a list of 200+ people a royal pain in the ass.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Seesmic Desktop&lt;/strong&gt; requires you to see the person's tweet in order to add them to a group. You can search for the person's username, but that counts as an API request, so you're limited to a certain number of those per hour, and you share that request pool with updates, so it isn't ideal. And trying to find a single tweet in the "Home" column &amp;#8212; which shows several hundred of them &amp;#8212; is like trying to find a needle in a hay stack. Worse yet, some people just don't tweet that often, so not only do you have to find that needle, you have to be searching while it's still in the haystack. I like the interface for adding users to groups after the group is already established, but this is far from ideal for creating new groups.&lt;/p&gt;
&lt;p&gt;Something I wish all clients had, and I've voiced this on many occasions in the various feedback forums the clients have, is a special group that shows tweets by people that you don't have assigned to any groups. That would make any of these interfaces much more usable, in my opinion, since it's the catch-all bin for anyone that slips through the cracks.&lt;/p&gt;
&lt;p&gt;I used a great web-based client, &lt;a href="http://www.bennadel.com/projects/kinky-twits.htm"&gt;KinkyTwits&lt;/a&gt;, that basically accomplished this by allowing you to set an option so that users from groups were not displayed in the Home list. Actually I &lt;em&gt;really loved&lt;/em&gt; this client, but it still has some bugs that are show-stoppers. I hear Ben has been thinking about updating it or rewriting it altogether, but haven't seen anything about it in a while.&lt;/p&gt;
&lt;p&gt;As much as I would love to see that feature get implemented and become popular, that's not my biggest concern. Switching clients is a hassle. Any time I switch, it takes at least a few hours to get my groups set back up. This is not a unique problem. Think about RSS and having to switch RSS reader applications for one reason or another. Any RSS reader worth its salt can read and write OPML files, which are the standard format for sharing a list of RSS/ATOM feeds.&lt;/p&gt;
&lt;p&gt;We need that. We need some sort of standard to develop for storing groups of twitter names. It's really rather simple, and could be represented very easily in XML. If clients started supporting the import and export of these files, trying a new client out could be so much simpler.&lt;/p&gt;
&lt;p&gt;Here's just a sample of what I have in mind:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;?xml version=&lt;span class='cc_value'&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt; encoding=&lt;span class='cc_value'&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;?&amp;gt;&lt;br /&gt;&amp;lt;groups&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;group id=&lt;span class='cc_value'&gt;&amp;quot;{GUID}&amp;quot;&lt;/span&gt; name=&lt;span class='cc_value'&gt;&amp;quot;ColdFusion Celebrities&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&amp;lt;follow user=&lt;span class='cc_value'&gt;&amp;quot;ColdFusion&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&amp;lt;follow user=&lt;span class='cc_value'&gt;&amp;quot;BenForta&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&amp;lt;follow user=&lt;span class='cc_value'&gt;&amp;quot;CFJediMaster&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&amp;lt;follow user=&lt;span class='cc_value'&gt;&amp;quot;Adrocknaphobia&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/group&amp;gt;&lt;br /&gt;&amp;lt;/groups&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;There are so many different ways to skin this cat, but I hope that someone, somewhere, starts this trend, and it catches on. I think it's desperately needed, considering how often a better twitter client surfaces that makes switching worthwhile.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NerdFusion/~4/caLH_ude1bA" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/NerdFusion/~3/caLH_ude1bA/what-twitter-clients-actually-need</link>
         <guid isPermaLink="false">http://fusiongrokker.com/post/what-twitter-clients-actually-need</guid>
         <category>Twitter</category>
         <pubDate>Thu, 28 May 2009 13:22:46 GMT</pubDate>
      <feedburner:origLink>http://fusiongrokker.com/post/what-twitter-clients-actually-need</feedburner:origLink></item> 
      <item>
         <title>Come see Mark Drew at the next Philly CFUG Meeting!</title>
         <description>&lt;p&gt;I just wanted to remind you of the upcoming Philly CFUG meeting, this Thursday, 5/28 from 6:00-7:30.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://markdrew.co.uk/blog/"&gt;Mark Drew&lt;/a&gt; will be presenting on the &lt;a href="http://coldspringframework.org/"&gt;ColdSpring framework&lt;/a&gt; (used for &lt;a href="http://en.wikipedia.org/wiki/Inversion_of_control"&gt;Inversion of Control&lt;/a&gt;, specifically &lt;a href="http://en.wikipedia.org/wiki/Dependency_Injection"&gt;Dependency Injection&lt;/a&gt;, as well as &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;Aspect Oriented Programming&lt;/a&gt;). If you're at all interested in Object-Oriented Programming in ColdFusion, or have been thinking about learning ColdSpring, I highly recommend this presentation. Mark makes it easy to get started, and shows just how powerful ColdSpring can be.&lt;/p&gt;
&lt;p&gt;The meeting is at &lt;a href="http://www.wharton.upenn.edu/campus/philadelphia/visiting.cfm"&gt;Wharton's Jon M. Huntsman Hall&lt;/a&gt;, room F90, conveniently located near the 37th Street trolley stop, and rumor has it there will be punch and pie.&lt;/p&gt;
&lt;p&gt;You can find more information on the &lt;a href="http://groups.adobe.com/posts/207f11e801"&gt;Philly CFUG site on Adobe Groups&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See you there!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NerdFusion/~4/SLKn7Td6ieo" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/NerdFusion/~3/SLKn7Td6ieo/come-see-mark-drew-at-the-next-philly-cfug-meeting</link>
         <guid isPermaLink="false">http://fusiongrokker.com/post/come-see-mark-drew-at-the-next-philly-cfug-meeting</guid>
         <category>CFUG</category><category>ColdFusion</category><category>Philadelphia</category>
         <pubDate>Tue, 26 May 2009 14:49:37 GMT</pubDate>
      <feedburner:origLink>http://fusiongrokker.com/post/come-see-mark-drew-at-the-next-philly-cfug-meeting</feedburner:origLink></item> 
      <item>
         <title>Debug or Bust</title>
         <description>&lt;p&gt;"At this point, I attempted to binary search the thread contents in the same manner as before, hoping to find something in there that caused the error. No luck. In fact, things only got weirder. I would comment out random blocks here and there &amp;#8211; all the queries, all custom tag calls, etc. &amp;#8211; and sometimes it would work, sometimes it wouldn't. I thought maybe I had been awake too long and called it a night, hoping that I could see something new with fresh eyes in the morning."&lt;/p&gt;
&lt;p&gt;From my article, &lt;a href="http://www.fusionauthority.com/techniques/4776-debug-or-bust.htm"&gt;Debug or Bust&lt;/a&gt;, now available on the &lt;a href="http://www.fusionauthority.com/"&gt;FusionAuthority&lt;/a&gt; website.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NerdFusion/~4/6N-xDmR7kI8" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/NerdFusion/~3/6N-xDmR7kI8/debug-or-bust</link>
         <guid isPermaLink="false">http://fusiongrokker.com/post/debug-or-bust</guid>
         <category>ColdFusion</category>
         <pubDate>Tue, 19 May 2009 13:46:35 GMT</pubDate>
      <feedburner:origLink>http://fusiongrokker.com/post/debug-or-bust</feedburner:origLink></item> 
      <item>
         <title>Now Soliciting Your Subversion Horror Stories And Worst Practices</title>
         <description>&lt;p&gt;I'm giving a presentation at the end of the month on Subversion for my office. It's going to be recorded and I'll be sure to post the video here for anyone interested in watching.&lt;/p&gt;
&lt;p&gt;Here's where I need your help: What are some of the craziest, dumbest, most ridiculous things you've ever seen done in Subversion (or some other version control system, as long as the scenario would still apply)?&lt;/p&gt;
&lt;p&gt;Anything is fair game. Awful commit comments? Terrible branching or merging practices? I want to hear about it all, and I welcome your comments!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NerdFusion/~4/lNYY24tmR-w" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/NerdFusion/~3/lNYY24tmR-w/now-soliciting-your-subversion-horror-stories-and-worst-practices</link>
         <guid isPermaLink="false">http://fusiongrokker.com/post/now-soliciting-your-subversion-horror-stories-and-worst-practices</guid>
         <category>Subversion</category><category>Best Practices</category>
         <pubDate>Mon, 11 May 2009 20:25:51 GMT</pubDate>
      <feedburner:origLink>http://fusiongrokker.com/post/now-soliciting-your-subversion-horror-stories-and-worst-practices</feedburner:origLink></item> 
      <item>
         <title>How To Make A Trillion Dollars (or more)</title>
         <description>&lt;p&gt;Last week, Ray released &lt;a href="http://www.coldfusionjedi.com/index.cfm/2009/4/22/GameOne-Released"&gt;a game&lt;/a&gt; he wrote using ColdFusion, BlazeDS, Flex, and AIR. It's a simple yet addictive stock trading game, where each player starts with a million dollars and has 11 different made-up stocks to choose from. &lt;/p&gt;
&lt;p&gt;Since Ray &lt;a href="http://www.coldfusionjedi.com/index.cfm/2009/4/26/Code-and-Design-of-Gameone"&gt;released the source&lt;/a&gt; of the game earlier this week, we can now look into the specifics of how it works. Some of this was common knowledge before the source was released, but it doesn't make much sense to describe it all separately, so I'm just combining it. The stock prices change every other minute, and are affected by two random factors: whether to raise or lower the price, and by how much. There is a 60% chance the price will go up, and a 40% chance it will go down; but the price stays between a pre-defined maximum and minimum per-stock. Some have much higher margins than others.&lt;/p&gt;
&lt;p&gt;Before the source was released, some people quickly realized there was more going on than met the eye (quite literally&amp;#8230; the interface was a little &lt;em&gt;too&lt;/em&gt; simple, but hey&amp;#8230; it was just a proof of concept, what do you want?), and asked for a feed that provided a snapshot of the current prices. Ray obliged and provided &lt;a href="http://gameone.coldfusionjedi.com/feed.cfm"&gt;this RSS feed&lt;/a&gt;, and &lt;a href="http://gameone.coldfusionjedi.com"&gt;this page&lt;/a&gt; that shows peoples current cash holdings (note that it does &lt;strong&gt;not &lt;/strong&gt;include any amount invested in stocks &amp;#8212; initial or current value.)&lt;/p&gt;
&lt;p&gt;As you might expect, having a feed of the current data leads to tracking the history of the data, which leads to inferring what the maximum and minimum values are, which leads to developing strategies for the best times to buy and sell. We now also know that with a 60% chance to increase in price, if already maxxed out, there's a good chance that a stock will stay maxxed out for a few consecutive periods, leaving plenty of opportunity to check in and sell for the best possible profit.&lt;/p&gt;
&lt;p&gt;I certainly won't claim to be one of the first to figure these things out, but I also didn't let the information pass me by. &lt;a href="http://twitter.com/BillieBlaze"&gt;Billie Blaze&lt;/a&gt; created &lt;a href="http://dev.socialcloudz.com/dev/gameone_chart.cfm"&gt;a chart to show the values of all stocks for the last hour&lt;/a&gt;, and &lt;a href="http://dev.socialcloudz.com/dev/gameone_tracking.cfm"&gt;a tool to help you track what price you paid for your stocks&lt;/a&gt;, and based on the number of shares you purchased, the percentage and dollar-value increase or decrease in your investment in real-time. Similarly, &lt;a href="http://www.thecomputerwizards.org/gameone/"&gt;this high/low tracker&lt;/a&gt; was developed. Personally, I started to believe Ray's comments that he might be tweaking the max/min values, and since the high/low tracker's developer (Sid) wasn't online at the time, I duplicated his work, &lt;a href="/apps/highlow/"&gt;with some changes of my own&lt;/a&gt;. Pretty soon, my desktop at home looked like this:&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="/assets/content/ss-gameone.png" target="_blank"&gt;&lt;img src="/assets/content/ss-gameone-thumb.png" alt="Screenshot Thumbnail (click for full size)" width="400" height="243" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Armed with these tools, it's pretty easy to decide which stocks to invest in, and when to buy and sell. Personally, I focused my long-term efforts on "Grouple" and to a lesser extent, "Yamoo;" but when I was sitting around waiting for prices to change and had cash to spare, I would invest in anything that had bottomed out, because it can only go up, and there's money to be made. As you make more money, it becomes easier and easier to make more and more per investment.&lt;/p&gt;
&lt;p&gt;Knowing that the Grouple minimum is $80, and the maximum is $280, you stand to earn $200 profit per-share owned, if you make a "perfect" investment (buy at absolute min, sell at absolute max). If this was your first investment, and you had $1 million to spend, that would get you 12,500 shares, for a total profit of $2.5 million. You can see how, once you start getting into the hundred-million-dollar to billion-dollar bankroll range, it is easy to make millions of dollars in profit when a stock goes up by 3 or 4 dollars. When it goes up by hundreds of dollars, you're making hundreds of millions.&lt;/p&gt;
&lt;p&gt;If this wasn't easy enough for you &amp;#8212; after all&amp;#8230; it does require some level of patience and the willingness to spend some level of time at the computer waiting for the random numbers to swing in your favor &amp;#8212; how do you think you might take it to the next level? For me &amp;#8212; and I know I'm not alone in this &amp;#8212; the next logical step was SMS alerts. And with &lt;a href="http://en.wikipedia.org/wiki/List_of_carriers_providing_Email_or_Web_to_SMS"&gt;most major cell phone providers offering an email to SMS gateway&lt;/a&gt;, it couldn't be easier.&lt;/p&gt;
&lt;p&gt;Since I already had a scheduled job running to track the history of the prices, it was pretty simple to watch for some threshhold values and fire off an email when they were crossed. My original code was pretty simple, and I ended up getting about 100 SMS messages the first day I had it running. That was enough motivation to improve it, so what I'm about to share with you is the best I've done so far as far as these alerts go.&lt;/p&gt;
&lt;p&gt;First, let's setup some configuration points.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;span class='cc_cftag'&gt;&amp;lt;cffunction name=&lt;span class='cc_value'&gt;&amp;quot;onApplicationStart&amp;quot;&lt;/span&gt; returnType=&lt;span class='cc_value'&gt;&amp;quot;boolean&amp;quot;&lt;/span&gt; output=&lt;span class='cc_value'&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset var s = &lt;span class='cc_value'&gt;&amp;quot;&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset application.dsn = &lt;span class='cc_value'&gt;&amp;quot;gameonetracker&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset application.feedURL = &lt;span class='cc_value'&gt;&amp;quot;http://gameone.coldfusionjedi.com/feed.cfm&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset application.alertTimeRange = structNew() /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset application.alertTimeRange.begin = 9 /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset application.alertTimeRange.end = 22 /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset application.alertTimeRange.duration = 30 /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset application.blinkRange = 0.1 /&amp;gt;&lt;/span&gt;&lt;span class='comment'&gt;&amp;lt;!---blink at 10%---&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset application.alertStocks = &lt;span class='cc_value'&gt;&amp;quot;grouple,yamoo&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset application.alertTimestamps = structNew() /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfloop list=&lt;span class='cc_value'&gt;&amp;quot;#application.alertStocks#&amp;quot;&lt;/span&gt; index=&lt;span class='cc_value'&gt;&amp;quot;s&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfparam name=&lt;span class='cc_value'&gt;&amp;quot;application.alertTimestamps[s]&amp;quot;&lt;/span&gt; default=&lt;span class='cc_value'&gt;&amp;quot;#structNew()#&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfparam name=&lt;span class='cc_value'&gt;&amp;quot;application.alertTimestamps[s]['buy']&amp;quot;&lt;/span&gt; default=&lt;span class='cc_value'&gt;&amp;quot;#dateAdd('n', -45, now())#&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfparam name=&lt;span class='cc_value'&gt;&amp;quot;application.alertTimestamps[s]['sell']&amp;quot;&lt;/span&gt; default=&lt;span class='cc_value'&gt;&amp;quot;#dateAdd('n', -45, now())#&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfparam name=&lt;span class='cc_value'&gt;&amp;quot;application.alertTimestamps[s]['lastAlert']&amp;quot;&lt;/span&gt; default=&lt;span class='cc_value'&gt;&amp;quot;sell&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;/cfloop&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfreturn true&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;/cffunction&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now, while we're tracking the feed data, check for potential alerts, and send them if necessary:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;span class='cc_cftag'&gt;&amp;lt;cffeed source=&lt;span class='cc_value'&gt;&amp;quot;#application.feedURL#&amp;quot;&lt;/span&gt; query=&lt;span class='cc_value'&gt;&amp;quot;variables.data&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='cc_cftag'&gt;&amp;lt;cfset timestamp = now() /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='cc_cftag'&gt;&amp;lt;cfloop query=&lt;span class='cc_value'&gt;&amp;quot;variables.data&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfquery name=&lt;span class='cc_value'&gt;&amp;quot;putData&amp;quot;&lt;/span&gt; datasource=&lt;span class='cc_value'&gt;&amp;quot;#application.dsn#&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;/cfquery&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset stockname = variables.data.title /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset stockprice = variables.data.content /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset variables.oneHrAgo = dateAdd(&lt;span class='cc_value'&gt;&amp;quot;h&amp;quot;&lt;/span&gt;, -2, now()) /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfquery name=&lt;span class='cc_value'&gt;&amp;quot;qMaxMin&amp;quot;&lt;/span&gt; datasource=&lt;span class='cc_value'&gt;&amp;quot;#application.dsn#&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select max(stockprice) as themax, min(stockprice) as themin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from tblPrices&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;where stockname = &lt;span class='cc_cftag'&gt;&amp;lt;cfqueryparam cfsqltype=&lt;span class='cc_value'&gt;&amp;quot;cf_sql_varchar&amp;quot;&lt;/span&gt; value=&lt;span class='cc_value'&gt;&amp;quot;#variables.data.title#&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;/cfquery&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset max = qMaxMin.theMax /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset min = qMaxMin.theMin /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset buffer = (max - min) * application.blinkRange /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset minAlert = min + buffer /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset maxAlert = max - buffer /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='comment'&gt;&amp;lt;!---sms alerts!---&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfloop list=&lt;span class='cc_value'&gt;&amp;quot;#application.alertStocks#&amp;quot;&lt;/span&gt; index=&lt;span class='cc_value'&gt;&amp;quot;s&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfif s eq stockname&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfparam name=&lt;span class='cc_value'&gt;&amp;quot;application.alertTimestamps[s]['lastAlert']&amp;quot;&lt;/span&gt; default=&lt;span class='cc_value'&gt;&amp;quot;sell&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfif stockprice gt maxAlert and application.alertTimestamps[s]['lastAlert'] eq &lt;span class='cc_value'&gt;&amp;quot;buy&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfif hour(now()) gt application.alertTimeRange.begin and hour(now()) lt application.alertTimeRange.end&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfif dateDiff('n', application.alertTimestamps[s]['sell'], now()) gt application.alertTimeRange.duration&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfmail from=&lt;span class='cc_value'&gt;&amp;quot;you@yourdomain.com&amp;quot;&lt;/span&gt; to=&lt;span class='cc_value'&gt;&amp;quot;#application.notifyEmail#&amp;quot;&lt;/span&gt; subject=&lt;span class='cc_value'&gt;&amp;quot;SELL - #stockname# - SELL&amp;quot;&lt;/span&gt; type=&lt;span class='cc_value'&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class='cc_cftag'&gt;&amp;lt;cfoutput&amp;gt;&lt;/span&gt;#stockprice#&lt;span class='cc_cftag'&gt;&amp;lt;/cfoutput&amp;gt;&lt;/span&gt;&lt;span class='cc_cftag'&gt;&amp;lt;/cfmail&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset application.alertTimestamps[s]['sell'] = now() /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset application.alertTimestamps[s]['lastAlert']=&lt;span class='cc_value'&gt;&amp;quot;sell&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;/cfif&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;/cfif&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfelseif stockprice lt minAlert and application.alertTimestamps[s]['lastAlert'] eq &lt;span class='cc_value'&gt;&amp;quot;sell&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfif hour(now()) gt application.alertTimeRange.begin and hour(now()) lt application.alertTimeRange.end&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfif dateDiff('n', application.alertTimestamps[s]['buy'], now()) gt application.alertTimeRange.duration&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfmail from=&lt;span class='cc_value'&gt;&amp;quot;you@yourdomain.com&amp;quot;&lt;/span&gt; to=&lt;span class='cc_value'&gt;&amp;quot;#application.notifyEmail#&amp;quot;&lt;/span&gt; subject=&lt;span class='cc_value'&gt;&amp;quot;BUY - #stockname# - BUY&amp;quot;&lt;/span&gt; type=&lt;span class='cc_value'&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class='cc_cftag'&gt;&amp;lt;cfoutput&amp;gt;&lt;/span&gt;#stockprice#&lt;span class='cc_cftag'&gt;&amp;lt;/cfoutput&amp;gt;&lt;/span&gt;&lt;span class='cc_cftag'&gt;&amp;lt;/cfmail&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset application.alertTimestamps[s]['buy'] = now() /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset application.alertTimestamps[s]['lastAlert']=&lt;span class='cc_value'&gt;&amp;quot;buy&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;/cfif&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;/cfif&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;/cfif&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfbreak/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;/cfif&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;/cfloop&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class='cc_cftag'&gt;&amp;lt;/cfloop&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Looking at this code now, I can see some obvious efficiency improvements to be made &amp;#8212; less database hits and things like that, but it's fast enough and not causing any errors so I'm not going to worry about it right now.&lt;/p&gt;
&lt;p&gt;First we grab the current prices, and loop over each one. For each stock, set some easy reference points to the name and current price, use a poorly named variable ("oneHrAgo") to store a timestamp indicating what the time was &lt;em&gt;two&lt;/em&gt; hours ago (Can you guess how much time my tracker originally used?), and grab the lifetime max and min values for the current stock from the database. From there, I calculate what the range for my threshhold will be. I decided to go with 10% (application.blinkRange) of the difference between the max and min values. So set the alert threshholds, and start checking to see if we need to send any alerts.&lt;/p&gt;
&lt;p&gt;Loop over stocks we care enough to alert over (application.alertStocks). If the current time is within alertable limits (for me, 9am&amp;#8212;10pm), continue. For each, if the current stock from the feed is being watched, and if the stock price has crossed a threshhold, and the current alert would be opposite of what the last alert was (buy when last was sell, sell when last was buy), and it's been more than 30 minutes since the last alert was sent about this stock, then send the alert, and update the timestamp and type of the last alert to the current values.&lt;/p&gt;
&lt;p&gt;With these rules in place, the SMS alerts have gone down to just 5-6 per day. I think I may shorten the duration or take it out altogether, because the alert-type toggle works well enough to keep from getting 20 SELL alerts in a row for the same stock when it never went down into buyable range.&lt;/p&gt;
&lt;p&gt;I still haven't crossed the trillion-dollar threshhold, but I'm pretty satisfied having made it all the way up to 2nd place overall at one point, and still holding strong at 4th. When I do hit a trillion, I'll probably call that good enough and throw in the towel. This has been a really fun exercise in gaming the system within legal limits.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NerdFusion/~4/-ohMRwaXCwk" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/NerdFusion/~3/-ohMRwaXCwk/how-to-make-a-trillion-dollars-or-more</link>
         <guid isPermaLink="false">http://fusiongrokker.com/post/how-to-make-a-trillion-dollars-or-more</guid>
         <category>ColdFusion</category>
         <pubDate>Fri, 01 May 2009 12:00:00 GMT</pubDate>
      <feedburner:origLink>http://fusiongrokker.com/post/how-to-make-a-trillion-dollars-or-more</feedburner:origLink></item> 
      <item>
         <title>Chrome/Safari Gotcha: Nameless Form Fields</title>
         <description>&lt;p&gt;In ColdFusion, you can loop over the keys in a structure without knowing what the key names are, by using either this syntax:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;span class='cc_cftag'&gt;&amp;lt;cfloop collection=&lt;span class='cc_value'&gt;&amp;quot;#myStruct#&amp;quot;&lt;/span&gt; item=&lt;span class='cc_value'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfset foo = myStruct[key] /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class='cc_cftag'&gt;&amp;lt;/cfloop&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Or this syntax:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;span class='cc_cftag'&gt;&amp;lt;cfscript&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var key in myStruct){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foo = myStruct[key];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span class='cc_cftag'&gt;&amp;lt;/cfscript&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This is useful when you need to loop over a form with dynamically created fields &amp;#8212; like editing N person records at a time.&lt;/p&gt;
&lt;p&gt;I recently found out that in Webkit &amp;#8212; and thus Safari and Google Chrome &amp;#8212; form fields without a name attribute are included in a form post, just without a name. &lt;em&gt;Odd, right?&lt;/em&gt; I know. I've used nameless form fields in the past, like a select box that's only used for UI functionality, tied to JavaScript. In IE and Firefox, the field is ignored and not posted with the form. In Chrome and Safari, though? Included! Let's look at an example form.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;span class='cc_normaltag'&gt;&lt;span class='cc_formtag'&gt;&amp;lt;form action=&lt;span class='cc_value'&gt;&amp;quot;&amp;quot;&lt;/span&gt; method=&lt;span class='cc_value'&gt;&amp;quot;post&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&lt;span class='cc_formtag'&gt;&amp;lt;select id=&lt;span class='cc_value'&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&lt;span class='cc_formtag'&gt;&amp;lt;option value=&lt;span class='cc_value'&gt;&amp;quot;foobar&amp;quot;&lt;/span&gt; selected=&lt;span class='cc_value'&gt;&amp;quot;selected&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Foobar&lt;span class='cc_normaltag'&gt;&lt;span class='cc_formtag'&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&lt;span class='cc_formtag'&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&lt;span class='cc_formtag'&gt;&amp;lt;input type=&lt;span class='cc_value'&gt;&amp;quot;submit&amp;quot;&lt;/span&gt; name=&lt;span class='cc_value'&gt;&amp;quot;submitBtn&amp;quot;&lt;/span&gt; value=&lt;span class='cc_value'&gt;&amp;quot;Submit&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class='cc_normaltag'&gt;&lt;span class='cc_formtag'&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='cc_cftag'&gt;&amp;lt;cfif structKeyExists(form, &lt;span class='cc_value'&gt;&amp;quot;submitBtn&amp;quot;&lt;/span&gt;)&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfdump var=&lt;span class='cc_value'&gt;&amp;quot;#form#&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class='cc_cftag'&gt;&amp;lt;/cfif&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This page will submit to itself, and if the form was submitted, dump the form scope. In Firefox, we see what you might expect:&lt;/p&gt;
&lt;p&gt;&lt;img src="/assets/content/noname_ff.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;But in Chrome or Safari, you'll notice a small difference:&lt;/p&gt;
&lt;p&gt;&lt;img src="/assets/content/noname_chrome.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The extra table row shows that there is another key in the structure; but as we can see it doesn't have a key name. I'm not sure why the value isn't displaying, because it's there. I'm guessing it's got something to do with the null key name. (I'm filing this whole thing under odd but true.)&lt;/p&gt;
&lt;p&gt;So if you attempt to loop over each key and output it, depending on your method, you'll run into an error. I'm personally a fan of the &lt;tt&gt;structName[keyName]&lt;/tt&gt; notation, so when I first tried this, no error was thrown, and my output was:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;span class='cc_cftag'&gt;&amp;lt;cfif structKeyExists(form, &lt;span class='cc_value'&gt;&amp;quot;submitBtn&amp;quot;&lt;/span&gt;)&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfloop collection=&lt;span class='cc_value'&gt;&amp;quot;#form#&amp;quot;&lt;/span&gt; item=&lt;span class='cc_value'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfoutput&amp;gt;&lt;/span&gt;#key#=#form[key]#&lt;span class='cc_cftag'&gt;&amp;lt;/cfoutput&amp;gt;&lt;/span&gt;&lt;span class='cc_normaltag'&gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;/cfloop&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class='cc_cftag'&gt;&amp;lt;/cfif&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;=foobar&lt;br /&gt;SUBMITBTN=Submit&lt;br /&gt;FIELDNAMES=SUBMITBTN&lt;/pre&gt;
&lt;p&gt;I know that not having a key name can cause problems though. Let's try outputting each value using &lt;tt&gt;evaluate&lt;/tt&gt; instead of &lt;tt&gt;structName[keyName]&lt;/tt&gt; notation.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;span class='cc_cftag'&gt;&amp;lt;cfif structKeyExists(form, &lt;span class='cc_value'&gt;&amp;quot;submitBtn&amp;quot;&lt;/span&gt;)&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfloop collection=&lt;span class='cc_value'&gt;&amp;quot;#form#&amp;quot;&lt;/span&gt; item=&lt;span class='cc_value'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfoutput&amp;gt;&lt;/span&gt;#key#=#evaluate(&lt;span class='cc_value'&gt;&amp;quot;form.&amp;quot;&lt;/span&gt; &amp;amp; key)#&lt;span class='cc_cftag'&gt;&amp;lt;/cfoutput&amp;gt;&lt;/span&gt;&lt;span class='cc_normaltag'&gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;/cfloop&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class='cc_cftag'&gt;&amp;lt;/cfif&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/assets/content/noname_err.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Now, I'm always saying there's &lt;em&gt;&lt;strong&gt;almost never&lt;/strong&gt;&lt;/em&gt; a good excuse for using &lt;tt&gt;evaluate&lt;/tt&gt; because there's almost always a more efficient way around it. For that reason, I can't think of what you might be doing that would put you in this situation&amp;#8230; but it's still best that you're aware of the potential issue.&lt;/p&gt;
&lt;p&gt;My advice would be to either try to put the nameless form fields outside of a form (which would be considered malformed XHTML), or to just give it a name and ignore it in your processing. The real lesson here is not to ever rely on browser quirks, because they may not exist in your favor forever.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NerdFusion/~4/f-XvlJgBBF0" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/NerdFusion/~3/f-XvlJgBBF0/chrome-safari-gotcha-nameless-form-fields</link>
         <guid isPermaLink="false">http://fusiongrokker.com/post/chrome-safari-gotcha-nameless-form-fields</guid>
         <category>Best Practices</category><category>ColdFusion</category>
         <pubDate>Wed, 29 Apr 2009 15:45:19 GMT</pubDate>
      <feedburner:origLink>http://fusiongrokker.com/post/chrome-safari-gotcha-nameless-form-fields</feedburner:origLink></item> 
      <item>
         <title>Scribe 1.1.2</title>
         <description>&lt;p&gt;Just a minor update for Scribe today. I've added support for the use of &lt;tt&gt;{authorEmail}&lt;/tt&gt; as a variable in the "from" email address field on the settings page. If you enter &lt;tt&gt;{authorEmail}&lt;/tt&gt;, the subscription emails will appear to be sent from the post author's email address.&lt;/p&gt;
&lt;p&gt;I welcome any and all feature requests. :)&lt;/p&gt;
&lt;dl class="plugin-data"&gt;
&lt;dt&gt;Plugin:&lt;/dt&gt;
&lt;dd&gt;Scribe&lt;/dd&gt;
&lt;dt&gt;Version:&lt;/dt&gt;
&lt;dd&gt;1.1.2&lt;/dd&gt;
&lt;dt&gt;Requires:&lt;/dt&gt;
&lt;dd&gt;Mango Blog 1.3+&lt;/dd&gt;
&lt;dt class="install"&gt;Auto-install URL:&lt;/dt&gt;
&lt;dd class="install"&gt;&lt;a href="/get/Scribe"&gt;http://fusiongrokker.com/get/Scribe&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;img src="http://feeds.feedburner.com/~r/NerdFusion/~4/kmcUcISJGpc" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/NerdFusion/~3/kmcUcISJGpc/scribe-1-1-2</link>
         <guid isPermaLink="false">http://fusiongrokker.com/post/scribe-1-1-2</guid>
         <category>My projects</category><category>Mango</category>
         <pubDate>Wed, 22 Apr 2009 14:15:47 GMT</pubDate>
      <feedburner:origLink>http://fusiongrokker.com/post/scribe-1-1-2</feedburner:origLink></item> 
      <item>
         <title>Scribe 1.1</title>
         <description>&lt;p&gt;As I mentioned when I &lt;a href="/post/scribe-email-subscriptions-for-mango"&gt;originally announced the plugin&lt;/a&gt;, I've been working on some updates for Scribe, enough to call it 1.1. Here's what's changed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for double opt-in user validation requirement, as a new setting on the settings page.&lt;/li&gt;
&lt;li&gt;Subscriber management, export, and import has been added to the settings page.&lt;/li&gt;
&lt;li&gt;Prompt the blog administrator to visit the settings page upon activation, to configure.&lt;/li&gt;
&lt;li&gt;Minor bug fixes:
&lt;ul&gt;
&lt;li&gt;Fixed display for custom event (Non-pod display wasn't displaying anything! Whoops!)&lt;/li&gt;
&lt;li&gt;Fixed bug: Blog default "from" email address was always used instead of user-specified override.&lt;/li&gt;
&lt;li&gt;Fixed bug: Unsubscribe worked across all blogs in the same database; is now blog-specific.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Fixed bug: Signup pod wouldn't work on child pages (ie: /archives/&amp;#8230;) because a relative path led to a 404. This has been switched to an absolute path that should work no matter where the pod is displayed.&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;dl class="plugin-data"&gt;
&lt;dt&gt;Plugin:&lt;/dt&gt;
&lt;dd&gt;Scribe&lt;/dd&gt;
&lt;dt&gt;Version:&lt;/dt&gt;
&lt;dd&gt;1.1&lt;/dd&gt;
&lt;dt&gt;Requires:&lt;/dt&gt;
&lt;dd&gt;Mango Blog 1.3+&lt;/dd&gt;
&lt;dt class="install"&gt;Auto-install URL:&lt;/dt&gt;
&lt;dd class="install"&gt;&lt;a href="/get/Scribe"&gt;http://fusiongrokker.com/get/Scribe&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;img src="http://feeds.feedburner.com/~r/NerdFusion/~4/wG5oVGgcw88" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/NerdFusion/~3/wG5oVGgcw88/scribe-1-1</link>
         <guid isPermaLink="false">http://fusiongrokker.com/post/scribe-1-1</guid>
         <category>My projects</category><category>Mango</category>
         <pubDate>Thu, 16 Apr 2009 18:36:47 GMT</pubDate>
      <feedburner:origLink>http://fusiongrokker.com/post/scribe-1-1</feedburner:origLink></item> 
      <item>
         <title>Related Entries 1.1</title>
         <description>&lt;p&gt;I've updated my Related Entries Mango Plugin to version 1.1, which just adds Railo support. I could've sworn I had already done this, but apparently not&amp;#8230; since &lt;a href="http://www.deliciouscoding.com/"&gt;Dave&lt;/a&gt; let me know today that it wouldn't work for him and it turned out to be a Railo incompatibility. If you're not running on Railo, then there's no reason to upgrade other than to stay at the current version. And I doubt you were already running it unmodified on Railo, because it wouldn't have worked, so&amp;#8230;&lt;/p&gt;
&lt;dl class="plugin-data"&gt;
&lt;dt&gt;Plugin:&lt;/dt&gt;
&lt;dd&gt;Related Entries&lt;/dd&gt;
&lt;dt&gt;Version:&lt;/dt&gt;
&lt;dd&gt;1.1&lt;/dd&gt;
&lt;dt&gt;Requires:&lt;/dt&gt;
&lt;dd&gt;Mango Blog 1.3+&lt;/dd&gt;
&lt;dt class="install"&gt;Auto-install URL:&lt;/dt&gt;
&lt;dd class="install"&gt;&lt;a href="/get/RelatedEntries"&gt;http://fusiongrokker.com/get/RelatedEntries&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;img src="http://feeds.feedburner.com/~r/NerdFusion/~4/wvDaU-tlNUw" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/NerdFusion/~3/wvDaU-tlNUw/related-entries-1-1</link>
         <guid isPermaLink="false">http://fusiongrokker.com/post/related-entries-1-1</guid>
         <category>My projects</category><category>Mango</category>
         <pubDate>Thu, 16 Apr 2009 17:55:06 GMT</pubDate>
      <feedburner:origLink>http://fusiongrokker.com/post/related-entries-1-1</feedburner:origLink></item> 
      <item>
         <title>Scribe: Email subscriptions for Mango</title>
         <description>&lt;p&gt;Have you been waiting for Email subscriptions to be available in Mango blog? Well, wait no longer!&lt;/p&gt;
&lt;dl class="plugin-data"&gt;
&lt;dt&gt;Plugin version:&lt;/dt&gt;
&lt;dd&gt;1.0&lt;/dd&gt;
&lt;dt&gt;Last Updated:&lt;/dt&gt;
&lt;dd&gt;2009-04-08&lt;/dd&gt;
&lt;dt&gt;Requires:&lt;/dt&gt;
&lt;dd&gt;Mango Blog 1.3+, CFSchedule (if sandboxed)&lt;/dd&gt;
&lt;dt class="install"&gt;Auto-install URL:&lt;/dt&gt;
&lt;dd class="install"&gt;&lt;a href="/get/Scribe"&gt;http://fusiongrokker.com/get/Scribe&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;&lt;strong&gt;Scribe&lt;/strong&gt; does more than just send out some emails when you make a new post:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ColdFusion Scheduled tasks are used to make sure emails don't go out before your post is published. Emails are only sent when a new post is published or when a draft becomes published; never when updating an existing published post or when a post is reverted from published status to draft status. (Caveat: published -&amp;gt; draft -&amp;gt; published will trigger a repeat email.)&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;The email messages sent to your readers are customizable with templating on the settings page.&lt;/li&gt;
&lt;li&gt;Optionally use a custom email address for the FROM address. Defaults to the blog-default email address.&lt;/li&gt;
&lt;li&gt;There is an unsubscribe link in every email &amp;#8212; if you include it on your template; included by default.&lt;/li&gt;
&lt;li&gt;The subscribe pod is available for pod-enabled themes, but for users without a pod-enabled theme, a custom event ("scribe-pod") is also available.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also already have some plans for a 1.1 release, in the near future:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Subscription management in admin &amp;#8211; view and edit the list of subscribers&lt;/li&gt;
&lt;li&gt;Optional double-opt-in (require link-click from validation email before subscription is active)&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/NerdFusion/~4/Y9aGdQuId4A" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/NerdFusion/~3/Y9aGdQuId4A/scribe-email-subscriptions-for-mango</link>
         <guid isPermaLink="false">http://fusiongrokker.com/post/scribe-email-subscriptions-for-mango</guid>
         <category>My projects</category><category>Mango</category>
         <pubDate>Fri, 10 Apr 2009 12:00:45 GMT</pubDate>
      <feedburner:origLink>http://fusiongrokker.com/post/scribe-email-subscriptions-for-mango</feedburner:origLink></item> 
      <item>
         <title>Flex Multi-file upload</title>
         <description>&lt;p&gt;&lt;img style="max-width: 100%" title="Screenshot of Flex Multi File Upload" src="http://fusiongrokker.com/assets/content/FlexFileUpload.png" alt="Screenshot of Flex Multi File Upload" /&gt;&lt;/p&gt;
&lt;p&gt;As part of a project &lt;a href="http://www.wharton.upenn.edu/learning/"&gt;where I work&lt;/a&gt;, I had the opportunity to refactor and open-source a Flex application that is used as a multi-file upload tool. This beats the pants off of N &lt;tt&gt;&amp;lt;input type="file" /&amp;gt;&lt;/tt&gt; fields. It works somewhat like the flash upload you might be used to on Flickr. You can use it with ColdFusion, PHP, Ruby, or any other server-side language that can accept file uploads.&lt;/p&gt;
&lt;p&gt;&amp;#8230; and it can be yours for the low, low price of &lt;em&gt;free!&lt;/em&gt; You can include it in any application to make uploading multiple files easier and more usable.&lt;/p&gt;
&lt;p&gt;Using it requires 2 separate templates: one to display the Flex widget, and another to accept the incoming files, just as if they were posted from a standard web form (it is posted to once per file). Since most people are somewhat familiar with traditional file upload, let's start there.&lt;/p&gt;
&lt;h3&gt;Accepting uploaded files&lt;/h3&gt;
&lt;p&gt;Here's some sample code in CFML that handles the posts from the Flex application. It is exactly the same as what you would use with a traditional form-based file upload, with the exception that flash uploads everything with the mime type "application/octet-stream," so we can't use that to determine the uploaded file type and instead have to rely on the file extension.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&amp;lt;!---&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Flex Multi-File Upload Server Side File Handler&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;===============================================&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;This file is where the upload action from the Flex Multi-File Upload&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;UI points. This is the server side half of the upload process.&lt;br /&gt;---&amp;gt;&lt;br /&gt;&lt;span class='cc_cftag'&gt;&amp;lt;cftry&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!---&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Flash uploads all files with a binary mime type&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;span class='cc_value'&gt;&amp;quot;application/ocet-stream&amp;quot;&lt;/span&gt;), so we can't set cffile to accept &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;specfic mime types. The workaround is to check file type after&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;it arrives on the server and if it is not desireable, delete it.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;---&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cffile action=&lt;span class='cc_value'&gt;&amp;quot;upload&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filefield=&lt;span class='cc_value'&gt;&amp;quot;filedata&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;destination=&lt;span class='cc_value'&gt;&amp;quot;#application.xmlUploadDest#&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nameconflict=&lt;span class='cc_value'&gt;&amp;quot;makeunique&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;accept=&lt;span class='cc_value'&gt;&amp;quot;application/octet-stream&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='comment'&gt;&amp;lt;!--- If the file extension isn't allowed, delete it ---&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfif not listFindNoCase(acceptedFileExtensions,File.ServerFileExt)&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cffile&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;action=&lt;span class='cc_value'&gt;&amp;quot;delete&amp;quot;&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file=&lt;span class='cc_value'&gt;&amp;quot;#application.xmlUploadDest#/#File.ServerFile#&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;/cfif&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfcatch type=&lt;span class='cc_value'&gt;&amp;quot;any&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='comment'&gt;&amp;lt;!--- bubble up errors to onError in Application.cfc ---&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;cfthrow object=&lt;span class='cc_value'&gt;&amp;quot;#cfcatch#&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_cftag'&gt;&amp;lt;/cfcatch&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class='cc_cftag'&gt;&amp;lt;/cftry&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It's pretty straight-forward. A file is uploaded by the Flash player, very similar to posting a form with an &lt;tt&gt;&amp;lt;input type="file" name="filedata" /&amp;gt;&lt;/tt&gt;. The server will see the request almost exactly as if a form was submitted with a file upload &amp;#8212; the form field name for the file is "filedata", that is hard coded. The script above is hit once per file being uploaded. The script saves the file to its final destination, and if there are any errors they bubble up to the onError method in Application.cfc.&lt;/p&gt;
&lt;p&gt;The error bubbling is important, because the flash player won't display issues to the user, and it won't let you &amp;#8212; the developer &amp;#8212; know if there are problems. By throwing an error, you can catch it and email or otherwise log the issue so that you have some information to help you resolve whatever the problem may be.&lt;/p&gt;
&lt;p&gt;See? I told you it was simple.&lt;/p&gt;
&lt;h3&gt;Embedding the Flex Widget&lt;/h3&gt;
&lt;p&gt;Next up, we need to put that Flex widget in your web application, and configure it to look and run as you need it to. There are a few parameters you can specify in order to change its appearance and behaviour:&lt;/p&gt;
&lt;p&gt;
&lt;table border="1" cellspacing="0" cellpadding="3"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
      &lt;th&gt;Required&lt;/th&gt;
      &lt;th&gt;Default&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;uploadDest&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;The URL for the script that accepts each uploaded file (the one we discussed above).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fileTypeFilter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;A semicolon-delimited list of file types to show in the browse dialog. (Eg. "*.xml; *.pdf; *.doc")&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fileTypeFilterName&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;A string that describes what filters are being applied. Often, this also includes the filters. (Eg. "Documents (*.xml, *.pdf, *.doc)")&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;sessionParams&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;probably ;)&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;This semi-optional parameter is only required for Alternative Browser support. If you are working in a closed environment and IE will be mandated, you can ignore it. It is used to work around a &lt;a href="http://bugs.adobe.com/jira/browse/FP-201"&gt;Flash file upload bug&lt;/a&gt;. I'll discuss the details of what you should include here further below.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;title&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;"File Upload"&lt;/td&gt;
&lt;td&gt;Displayed at the top of the panel. In the screenshot above, this was set to "SABRE File Upload".&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;uploadCompleteMessage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;"Upload Complete"&lt;/td&gt;
&lt;td&gt;A string to display on the progress bar once upload is complete.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;maxSize&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;2048&lt;/td&gt;
&lt;td&gt;Max file size that Flash will let the user upload. Specify in kilobytes. (Default of 2048 = 2mb)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;callback&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;The name of a JavaScript function defined (or included) on the page that includes the Flex application. This function will be run when the upload is complete, and gives you the ability to have your application be aware of when files have been uploaded.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;How do you set these values when including a Flash/Flex widget on your page? Via &lt;strong&gt;FlashVars&lt;/strong&gt;. They look and act a lot like a standard URL, so even if you've never heard of them before, you're already half way there. FlashVars look like this: &lt;tt&gt;foo=bar&amp;now=then&lt;/tt&gt;. See? &lt;em&gt;Familiar!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You'll want to use JavaScript to embed the flash player on the page, like so:&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;span class='cc_cftag'&gt;&amp;lt;cfscript&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;variables.flashvars = &lt;span class='cc_value'&gt;&amp;quot;uploadDest=#urlEncodedFormat(expandPath('uploadedFiles/'))#&amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;variables.flashvars &amp;amp;= &lt;span class='cc_value'&gt;&amp;quot;&amp;amp;title=SABRE%20File%20Upload&amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;variables.flashvars &amp;amp;= &lt;span class='cc_value'&gt;&amp;quot;&amp;amp;fileTypeFilter=#urlEncodedFormat('*.xml')#&amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;variables.flashvars &amp;amp;= &lt;span class='cc_value'&gt;&amp;quot;&amp;amp;fileTypeFilterName=#urlEncodedFormat('XML Documents (*.xml)')#&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;span class='cc_comment'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//... and so on, for other flashvars&lt;/span&gt;&lt;br /&gt;&lt;span class='cc_cftag'&gt;&amp;lt;/cfscript&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class='cc_normaltag'&gt;&lt;span class='cc_cftag'&gt;&amp;lt;script src=&lt;span class='cc_value'&gt;&amp;quot;AC_OETags.js&amp;quot;&lt;/span&gt; language=&lt;span class='cc_value'&gt;&amp;quot;javascript&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class='cc_normaltag'&gt;&lt;span class='cc_cftag'&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class='cc_normaltag'&gt;&lt;span class='cc_cftag'&gt;&amp;lt;script type=&lt;span class='cc_value'&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;AC_FL_RunContent(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_value'&gt;&amp;quot;src&amp;quot;&lt;/span&gt;, &lt;span class='cc_value'&gt;&amp;quot;FlexFileUpload&amp;quot;&lt;/span&gt;, &lt;span class='cc_comment'&gt; //path to SWF without &lt;span class='cc_value'&gt;&amp;quot;.swf&amp;quot;&lt;/span&gt; -- in this case, it's in the same directory&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_value'&gt;&amp;quot;width&amp;quot;&lt;/span&gt;, &lt;span class='cc_value'&gt;&amp;quot;660&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_value'&gt;&amp;quot;height&amp;quot;&lt;/span&gt;, &lt;span class='cc_value'&gt;&amp;quot;350&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_value'&gt;&amp;quot;align&amp;quot;&lt;/span&gt;, &lt;span class='cc_value'&gt;&amp;quot;middle&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_value'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;, &lt;span class='cc_value'&gt;&amp;quot;FlexFileUpload&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_value'&gt;&amp;quot;quality&amp;quot;&lt;/span&gt;, &lt;span class='cc_value'&gt;&amp;quot;high&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_value'&gt;&amp;quot;bgcolor&amp;quot;&lt;/span&gt;, &lt;span class='cc_value'&gt;&amp;quot;##ffffff&amp;quot;&lt;/span&gt;,   &lt;span class='cc_comment'&gt; //enter the bg color of your page so it will match while loading&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_value'&gt;&amp;quot;name&amp;quot;&lt;/span&gt;, &lt;span class='cc_value'&gt;&amp;quot;FlexFileUpload&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_value'&gt;&amp;quot;flashvars&amp;quot;&lt;/span&gt;,'#variables.flashVars#',&lt;span class='cc_comment'&gt; //this is where flashvar values are sent to the flash player&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_value'&gt;&amp;quot;allowScriptAccess&amp;quot;&lt;/span&gt;,&lt;span class='cc_value'&gt;&amp;quot;sameDomain&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_value'&gt;&amp;quot;type&amp;quot;&lt;/span&gt;, &lt;span class='cc_value'&gt;&amp;quot;application/x-shockwave-flash&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_value'&gt;&amp;quot;pluginspage&amp;quot;&lt;/span&gt;, &lt;span class='cc_value'&gt;&amp;quot;http://www.adobe.com/go/getflashplayer&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&lt;span class='cc_normaltag'&gt;&lt;span class='cc_cftag'&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class='cc_normaltag'&gt;&amp;lt;noscript&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&amp;lt;object classid=&lt;span class='cc_value'&gt;&amp;quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;id=&lt;span class='cc_value'&gt;&amp;quot;FlexFileUpload&amp;quot;&lt;/span&gt; width=&lt;span class='cc_value'&gt;&amp;quot;100%&amp;quot;&lt;/span&gt; height=&lt;span class='cc_value'&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;codebase=&lt;span class='cc_value'&gt;&amp;quot;http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&amp;lt;param name=&lt;span class='cc_value'&gt;&amp;quot;movie&amp;quot;&lt;/span&gt; value=&lt;span class='cc_value'&gt;&amp;quot;FlexFileUpload.swf&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&amp;lt;param name=&lt;span class='cc_value'&gt;&amp;quot;FlashVars&amp;quot;&lt;/span&gt; value=&lt;span class='cc_value'&gt;&amp;quot;#variables.flashVars#&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&amp;lt;param name=&lt;span class='cc_value'&gt;&amp;quot;quality&amp;quot;&lt;/span&gt; value=&lt;span class='cc_value'&gt;&amp;quot;high&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&amp;lt;param name=&lt;span class='cc_value'&gt;&amp;quot;bgcolor&amp;quot;&lt;/span&gt; value=&lt;span class='cc_value'&gt;&amp;quot;##869ca7&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&amp;lt;param name=&lt;span class='cc_value'&gt;&amp;quot;allowScriptAccess&amp;quot;&lt;/span&gt; value=&lt;span class='cc_value'&gt;&amp;quot;sameDomain&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&amp;lt;embed src=&lt;span class='cc_value'&gt;&amp;quot;FlexFileUpload.swf&amp;quot;&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FlashVars=&lt;span class='cc_value'&gt;&amp;quot;#variables.flashVars#&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;quality=&lt;span class='cc_value'&gt;&amp;quot;high&amp;quot;&lt;/span&gt; bgcolor=&lt;span class='cc_value'&gt;&amp;quot;##ffffff&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;width=&lt;span class='cc_value'&gt;&amp;quot;660&amp;quot;&lt;/span&gt; height=&lt;span class='cc_value'&gt;&amp;quot;350&amp;quot;&lt;/span&gt; name=&lt;span class='cc_value'&gt;&amp;quot;FlexFileUpload&amp;quot;&lt;/span&gt; align=&lt;span class='cc_value'&gt;&amp;quot;middle&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;play=&lt;span class='cc_value'&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loop=&lt;span class='cc_value'&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;quality=&lt;span class='cc_value'&gt;&amp;quot;high&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;allowScriptAccess=&lt;span class='cc_value'&gt;&amp;quot;sameDomain&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type=&lt;span class='cc_value'&gt;&amp;quot;application/x-shockwave-flash&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pluginspage=&lt;span class='cc_value'&gt;&amp;quot;http://www.adobe.com/go/getflashplayer&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&amp;lt;/embed&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='cc_normaltag'&gt;&amp;lt;/object&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class='cc_normaltag'&gt;&amp;lt;/noscript&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;There may be better ways of embedding the Flash/Flex widget on the page, but I'm still new to this. Feel free to enlighten me with cleaner, more elegant code.&lt;/p&gt;
&lt;h3&gt;Alternative Browser Support&lt;/h3&gt;
&lt;p&gt;As I mentioned in the table above, there is &lt;a href="http://bugs.adobe.com/jira/browse/FP-201"&gt;a bug in recent versions&lt;/a&gt; of the Flash player that prevents file uploads from working out of the box in Alternative (Non-IE) browsers. I could go into more detail of why, but unless you want to hear about Network Stacks (in which case, email me), I'll spare you.&lt;/p&gt;
&lt;p&gt;The short version of the story is that the Flash player doesn't maintain your existing website session, so if an authenticated session is required to access the template that accepts the uploaded file(s), the web server refuses access, and thus uploads won't work. To get around this, you have to include some extra URL parameters when uploading the file so that the client's local machine will include certain cookies in the request, which will tell the web server to tie this request to your existing session, and allow the files to be uploaded.&lt;/p&gt;
&lt;p&gt;In order for the flash player to include those URL parameters, you have to tell it what they are. (They differ per server technology. In ColdFusion with J2EE sessions enabled, it's &lt;tt&gt;jsessionid&lt;/tt&gt;. In ColdFusion without J2EE sessions enabled, you need &lt;tt&gt;CFID&lt;/tt&gt; and &lt;tt&gt;CFToken&lt;/tt&gt;.) So for example, in SABRE &amp;#8212; the application that I've refactored this widget out of &amp;#8212; here are my flashvars. Pay special attention to &lt;tt&gt;variables.sessionParams&lt;/tt&gt;. That is what we're using to work around the Flash upload bug.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;span class='cc_cftag'&gt;&amp;lt;cfscript&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;variables.uploadDest = urlEncodedFormat(&lt;span class='cc_value'&gt;&amp;quot;https://domain.com/path/to/upload_bulk_xml.cfm&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;variables.fileTypeFilter = urlEncodedFormat(&lt;span class='cc_value'&gt;&amp;quot;*.xml&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;variables.fileTypeFilterName = urlEncodedFormat(&lt;span class='cc_value'&gt;&amp;quot;XML Files (*.xml)&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;variables.uploadCompleteMessage = urlEncodedFormat(&lt;span class='cc_value'&gt;&amp;quot;Upload complete!&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;variables.sessionParams = &lt;span class='cc_value'&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (structKeyExists(session, &lt;span class='cc_value'&gt;&amp;quot;sessionid&amp;quot;&lt;/span&gt;)){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;variables.sessionParams = urlEncodedFormat(&lt;span class='cc_value'&gt;&amp;quot;jsessionid=#session.sessionid#&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;variables.flashvars = &lt;span class='cc_value'&gt;&amp;quot;fileTypeFilter=#variables.fileTypeFilter#&amp;amp;fileTypeFilterName=#variables.fileTypeFilterName#&amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;variables.flashvars &amp;amp;= &lt;span class='cc_value'&gt;&amp;quot;&amp;amp;adminUploadDestination=#variables.uploadDest#&amp;amp;uploadCompleteMessage=#variables.uploadCompleteMessage#&amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;variables.flashvars &amp;amp;= &lt;span class='cc_value'&gt;&amp;quot;&amp;amp;callback=uploadComplete&amp;amp;title=SABRE File Upload&amp;amp;sessionParams=#variables.sessionParams#&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;span class='cc_cftag'&gt;&amp;lt;/cfscript&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Licensing&lt;/h3&gt;
&lt;p&gt;Now, I'm no expert on licensing, and generally I release my open source stuff under the Apache License. However, this application is heavily based on some code written by "Ryan Favro and New Media Team Inc." (no url provided). Their code was released under GPLv2, which I believe requires that modifications such as this one also be released under the same license. As such, this application and all supporting files are released under the GNU General Purpose License (GPL) version 2. You can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.&lt;/p&gt;
&lt;h3&gt;Download&lt;/h3&gt;
&lt;p&gt;The zip contains a working example that you can put on a ColdFusion server to see in action. You can also &lt;a href="http://fusiongrokker.com/demo/FlexMultiFileUpload/index.cfm"&gt;try a demo&lt;/a&gt;. Of course, all uploaded files will be automatically and immediately deleted, because you can't trust the internet &amp;#8212; so don't get any ideas.&lt;/p&gt;
&lt;p&gt;The example also shows how to use the JavaScript callback on upload completion, if you want to use that to automate further action in your application.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://multifileupload.riaforge.org/"&gt;Download the project at RIAForge&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NerdFusion/~4/AhfCD_GfPLg" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/NerdFusion/~3/AhfCD_GfPLg/flex-multi-file-upload</link>
         <guid isPermaLink="false">http://fusiongrokker.com/post/flex-multi-file-upload</guid>
         <category>My projects</category><category>Flex</category>
         <pubDate>Wed, 08 Apr 2009 17:00:00 GMT</pubDate>
      <feedburner:origLink>http://fusiongrokker.com/post/flex-multi-file-upload</feedburner:origLink></item> 
   </channel>
</rss>
