Wednesday, December 8, 2010

OpenCF Summit: What It Is, and What It Isn't (via OpenCF Summit)

Several people emailed me today about the latest episode of the CFHour podcast, in which the hosts spend a good chunk of time at the end of the show talking about OpenCF Summit and open source in general.
Although in my opinion a great deal of what was said on the podcast was quite ill informed, which I suppose isn’t surprising given that they didn’t contact us to get any information about OpenCF Summit, it did get me thinking that we need to do a better job of sharing with everyone what’s behind OpenCF Summit, the focus of the event, and the goals we have for OpenCF Summit participants.
Please consider this to be the beginning of the discussion. If something needs additional clarification, or if you have any ideas at all about what you think we could doing better, we absolutely appreciate any feedback you can give us.
We are relying on you to help us make OpenCF Summit the event you want it to be, and the event that the CFML community needs it to be.

OpenCF Summit is …

1. Focused on educating CFML developers about free software and open source.

Even though
free software and open source have been major forces in the software industry for over 25 years, as a general rule we still see a lot of misunderstanding and misinformation about these topics in the CFML community. This was the #1 reason for creating OpenCF Summit that came up in our early discussions about the event.
The people involved with OpenCF Summit are extremely passionate about free and open source software so we want to do everything we can to help people understand these topics better, and these are big enough and important enough topics that in our opinion they can’t be adequately covered at existing CFML events.
We want OpenCF Summit participants to see the tremendous personal and professional benefits of being involved with free software projects. We want participants to inspire each other to take the plunge and contribute to open source projects. And we also want participants to learn about the business aspects of open source from people who live in this world every day.
To help reach these goals we’re planning on having a volunteer table staffed by the
Free Software Foundation to talk to attendees about free software, and we’ll have presentations about the various philosophies behind free software and open source, and free software licenses, from people who know these topics inside and out.
And of course Mura, Railo, and aw2.0 will have a lot to say about open source as it relates to business.
We cover this topic in more detail below, but it’s important to understand that OpenCF Summit is not focused exclusively on the open source CFML engines. The CFML community as a whole will benefit from being better informed about, and increasing its participation in, free software and open source, regardless of anyone’s CFML engine of preference.
2. A place to gather with fellow CFML developers and discuss the important issues facing our community.
Above All, OpenCF Summit is a CFML Conference
Regardless of the name of the event or its specific focus, at the end of the day OpenCF Summit is a CFML conference.
If you’ve been to other CFML conferences you know that not only are CFML developers some of the smartest, nicest, and most giving people you’ll ever meet, they also know how to have a damn good time. OpenCF Summit will be no exception on any of these points, and I’m already looking forward to all the great conversations I’m going to have with all of you at the event.
In addition, we feel in-person settings are the best venue for facilitating open discussions of issues and helping us all work together to solve them. Mailing lists, Twitter, IM, blogs, and the like are great, but they’re simply no substitute for getting together face-to-face with people that share your interests and passions.
I always return home from events like cf.Objective() and BFusion with my brain overflowing with ideas and inspiration. We can’t get too much of this in the CFML community.
Challenges Can Only Be Overcome When You Face Them Directly
The people involved with planning OpenCF Summit have been doing CFML development for many, many years. I personally have been doing CFML for about 14 years now, and like many of you we’ve seen the ebbs and flows in the CFML world.
We see the technology we love get slighted, passed over, even derided, and we all want to do what we can to help both defend CFML as well as grow its popularity.
Let’s be honest: CFML is currently facing some of the greatest challenges it’s ever faced. Ignoring them won’t make them go away, and if we start turning against each other, we really are in trouble.  Finger pointing, he said / she said, and accusations of broken promises are wasted time that could be better spent doing positive things for the community.
New applications, language features, and general innovation are what will attract new developers to the CFML community.  Drawn out brawls over who’s “right” will do nothing but drive people away.

The good news is that even with these increasing challenges, we’re also in the best position we’ve ever been to overcome them. With open source, our collective brain power, and the fantastic technology that is CFML there’s nothing we can’t overcome. We simply have to focus on the collective goals that benefit us all instead of dwelling on our minor differences.

3. A place where you can learn from, get hands-on help from, and code alongside your favorite CFML developers.
Face-to-Face Time is Worth a $1000/hr
Obviously at this point we don’t know who all will be attending (if you haven’t registered yet, why not do it now!), but given what we do already know about who will be at OpenCF Summit, and given the fact that registration tops out at about 120 people, you’ll have plenty of opportunities to pull people aside and ask those questions you’ve always wanted to ask but maybe didn’t have time to write up in an email or a blog comment. And nothing beats sitting down with someone in person, cracking open those laptops, and sticking with the issue until you really understand it.
Help Desk: Sometimes a Second Mind Does the Trick
We’re also planning a volunteer help desk that will be running throughout the event so people can get help with their toughest programming or configuration problems, so if you want to offer your help in your area of expertise, consider yourself recruited! Don’t think you have to be some uber guru in order to be the person that saves the day for a fellow developer; we all have our own areas of expertise, and we want to foster sharing as much as possible at OpenCF Summit.
Hackfest: Work on an Application That Will Help a Charity / Public Service Organization
Finally, we’re planning a hackfest that will be going on throughout the event, the end result of which will be an application that will be donated to a worthy charity or public service organization in the Dallas area. This is your opportunity to write code with people you may never work with in a “day job,” and writing an application together is one of the best way for programmers to learn from one another.
4. A place where you can have a direct voice in shaping the future of CFML.
Have you ever wanted to sit down in person with the people behind OpenBD, Railo, or your favorite open source CFML project? Or maybe you have an idea for a new feature in the CFML engines that you simply can’t explain well without literally showing someone what you mean.
At OpenCF Summit, you can. Of course all open source projects have mailing lists, but there’s simply no substitute for having face-to-face back and forth when it comes to brainstorming on all the cool stuff you’d like to see CFML be able to do in the future. You’ll be talking directly to the developers on the open source engines and other open source projects, so your voice will absolutely be heard.

OpenCF Summit isn’t ...

1. We aren’t focused solely on open source CFML engines.
OpenCF Summit is extremely appreciative of the support we’re receiving from all of our our generous sponsors, two of whom are Railo and aw2.0 (which for those of you who don’t know is the company behind Open BlueDragon).
Because the major development in open source CFML in the last two years is the availability of open source CFML engines on which to run all the great open source CFML applications, educating participants about Railo and Open BlueDragon will be an important part of the conference.
But this certainly isn’t the only focus, so if people have that impression we haven’t done a good job of explaining OpenCF Summit. As stated above, the major focus if we had to choose only one is educating people about free and open source software as a philosophy, as a way to license software, as a great career move, and as the powerful underpinnings of business.
2. We aren’t anti-Adobe or in any way exclusionary.
Everyone (yes, everyone!) is welcome to attend OpenCF Summit. We have an open topic suggestion and call for proposals application (which incidentally we shared with cf.Objective()) that lets you see suggestions and proposals immediately as they’re submitted, and lets you vote for and comment on the topics submitted as well. Anyone can submit any topic they like.
People who want to learn more about free software and open source should attend OpenCF Summit regardless of their CFML engine of choice. Even if you take the CFML engines out of the picture, free and open source software is vital to the future of CFML. If we as a community can build killer open source applications that just happen to be in CFML that’s a powerful way to spread CFML outside the community.
We also encourage people who are skeptical about the open source CFML engines and the role they play in the future of CFML to attend. We want to hear your opinions and learn from your perspectives because it will only make the CFML community stronger as a whole.

“The Future of CFML”: A Clarification

A Little Backstory
What seemed to irk one of the hosts of the CFHour podcast the most is a BOF we have on the OpenCF Summit schedule entitled “The Future of CFML.” This is a joint BOF with OpenBD and Railo in which, as the title indicates, the topic will be the future of CFML as a language and platform.
We intend this to be a session in which OpenCF Summit participants can voice their opinions about anything and everything related to the future of CFML, from language syntax, features, and functionality to higher-level topics like  where CFML is going in relation to cloud computing and other trends in the web development world.
I agree that there’s a missing player here. Let me be completely honest and open about why Adobe is not currently on the schedule.
We’ve had a lot of discussions about the role Adobe might or might not play in OpenCF Summit as we’ve been planning the event. I hope it’s no surprise to anyone that given the focus of the event it didn’t make sense for us to approach Adobe to be a sponsor of OpenCF Summit.
Also, based on a hallway discussion a couple of OpenCF Summit steering committee members had with an Adobe employee at cf.Objective() 2010, it was our assumption--right or wrong--that if we did approach Adobe about sponsorship they would likely decline.
I trust even our critics will be able to see the logic behind our line of thinking on this. Even if you don’t agree with the logic (which could well be flawed), please don’t drum up a conspiracy where there isn’t one.
We Failed to Address This at the Right Time
Where we failed, and I personally take responsibility for this, is once Adobe wasn’t in our minds as a potential sponsor of OpenCF Summit, considering other ways to approach them and see how they might want to participate fell by the wayside.
It’s something that was in the back of my mind but with all the other details related to planning the conference, it didn’t get addressed in a timely fashion. Please bear in mind that this is the first year for OpenCF Summit so some details--large and small--do slip through the cracks.
We see now how this might appear deliberately exclusionary. That was never our intent, and for that we apologize.
We Welcome Adobe to Participate
We welcome Adobe to participate in OpenCF Summit if they’re willing.
While we haven’t yet thought through specifically what “participation” would mean (and we’re very interested to hear Adobe’s thoughts on how this might work), this is our open invitation to representatives from Adobe to participate in OpenCF Summit.
Rest assured that we will also be contacting folks from Adobe directly in the event they don’t read this rather lengthy blog post. ;-)
I for one think it would be unbelievably beneficial to have the people behind the three CFML engines all in the same place at the same time, not only so they could talk openly about some of the issues all the engines are facing, but also so OpenCF Summit attendees can interact with representatives from all three engines in person, simultaneously.

Hope That Helps!

This post covers a lot of issues that we should have addressed quite some time ago, so we hope it helps people understand the reasoning behind the creation of OpenCF Summit and our goals for the event.
If you have comments feel free to add them to this post, or if it’s something you’d rather discuss with us directly, email and we’ll be more than happy to have a conversation with you.
Hope to see you all at OpenCF Summit in February! Go register now and help us out by telling a friend to do the same!

Friday, November 5, 2010

Alice - Dancing Under the Gallows


I watched that a few weeks ago when the view count was under a thousand. It is a very moving story. I think the main point of the clip is not about being a holocaust survivor -- it's about her warmth and humanity that is expressed through her music. I wish there were more people like Alice in the world.  People like this replanish my faith in humanity.

Sunday, October 17, 2010

Dear The CW: GRADE F - Video Player User Experience

My wife and I do not subscribe to cable.  We subscribe to Netflix and use the instant play a few times a week for "catalog" shows.  For current shows, we use Hulu.  However for my wife's Gossip Girl obcession Hulu sends you to CW network website.  The CW offers recent episodes with commercials cut into the normal broadcast commercial breaks.  This is normal and expected for "free" content and I'm not bothered by it.

My first impressions of the CW network's video player is that is a step up from Netflix because the CW uses Flash instead of Silverlight that Netflix uses (yeah, it's the web developer in me).  The honeymoon lasted all of 20 minutes because their player user experience is down right frustrating.

The player has all the normal features you see at Hulu and Netflix: full screen, pause ability and chapter navigation.  It fails in most areas which I'll get into later.  The first question I ask of the CW about their video player is: Why do you bother offering video online at all?

The user experience is horrible not to mention the bugs it has.  Let's get into the user experience before the bugs:

  • Duirng commercial breaks, you cannot pause the video, exit full screen or change/mute the volumn.  FAIL: I can understand not letting people not watch the commercials, but to hold a computer hostage by not allowing pause or muting is horrible.

  • When the player actually works long enough to finish an episode, the behavior is to play the previous episode in the season instead of the next available episode. FAIL: Why would the default behavior to play episode 2 if you just finished episode 3?  I just watched episode 2 before finishing episode 3!

  • When you start an episode, a series of commercials plays.  During this period you cannot put the player into full screen mode. FAIL: Why do I have to wait to put the video into full screen until the actual show starts?

  • If you stop an episode or experience a player bug where you have to restart an episode in the middle, you cannot do that easily because you have watch the commercial breaks that ensued before the section you want.  FAIL: So if the player fails in the fourth act, you have watch the initial commercial series, click to the fourth act, watch break #1, notice that now the player decided to start in the second act, click to the fourth act, watch break #2, notice that now the player decided to start in the third act, click on the fourth act, watch break #3 and then the fourth act starts.  Hopefully the player didn't mess up with a "bug" during all of this and you have to restart the process again.

For unkown reasons, the video player behaves badly:

  • Sometimes the episode just ends in the middle (from 1 -39 minutes) and it stops and just starts playing the previous episode as if the episode ended.  This usually happens 1-2 times per episode.

  • Sometimes during the commercial breaks, it plays the same series of commercials two, three or four times.  So you end up with 6-9 minutes of commercials.  If I was an advertiser on the CW online video network, I'd be upset for all the additional times I'm paying for these plays.

  • Sometimes the player just hangs.  No message that "your internet connection slows" or anything.  We have solid 6MB internet connection and it plays HD from Netflix and Hulu just fine.  Getting back to where you were is just a PITA as I outlined above.

Ultimately, the CW does not care if people can actually watch content from their network.  Dare I say all they care is repeated watching of commercials to get money from advertises. Bottom line is their player sucks.

User Experience


Tuesday, September 21, 2010

Unit Testing Custom Tags with MXUnit


We love MXUnit at work and at Mach-II to unit test our components and to do integration testing.  In Mach-II Simplicity (1.8), a big feature was our form and view custom tag libraries.  These features made developing the UI (view) layer of your application easier and less prone to error.  Why would you write this kind of form with manual data binding:

<form method="post" encType="multipart/form-data" action="#BuildUrl('processUser')#">
        <h4>First Name</h4>
        <p><input id="firstName" value="#event.getArg('user').getFirstName()#" type="text" name="firstName"/></p>
        <h4>Last Name</h4>
        <p><input id="lastName" value="#event.getArg('user').getLastName()#" type="text" name="lastName"/></p>
        <p><input type="submit" value="Save Changes" /></p>

When you could just write this and have auto binding:

<cfimport prefix="form" taglib="/MachII/customtags/form" />
<form:form actionEvent="processUser" bind="user">
        <h4>First Name</h4>
        <p><form:input path="firstName" /></p>
        <h4>Last Name</h4>
        <p><form:input path="lastName" /></p>
        <p><form:button value="Save Changes" /></p>

Our First Pass Testing Solution and Failures

What this brings up is that a lot of complex logic is now inside of custom tags*.  How do you test custom tags?  For the most part, a lot of the logic in custom tags should be about output and not data manipulation.  MXUnit makes it easy to compare data if the results are simple values, structs, arrays, queries, etc.  However, the output from a custom tag is not just a simple string like "abc123" but more a complex string with nesting of tags and relationships between tags (for example a "select" and "option").

When we first started down this path of testing our custom tag libraries, we started by doing straight up text comparisons:

<form:form actionEvent="something" bind="${event.user}">
            <cfsavecontent variable="output"><form:input path="firstName" /></cfsavecontent>
<cfset assertTrue(output EQ '<input id="firstName" value="#event.getArg('user').getFirstName()#" type="text" name="firstName"/>') />

This was simple but lead to an easy break down down the line.  There were two sticking points:

1) Our custom tag library has a "tag writer" relies a lot on looping over a struct of tag attributes .  As we all know in CFML, we cannot rely on the order of iteration of a struct.  So while assertion works on OpendBD it sometime failed on ACF8 because we were relying on the custom tag to ouput the tag attributes in the same order as our assertion string.  In all reality, the browser does not care about the order of the tag attributes and neither should our unit test.  The flexibility of the unit test was strongly coupled to string as a whole; not the individual parts.

2) It is hard to test relationships such as <select> and <option> tags in straigh string comparison.

2) Maintaining the unit tests becomes painful because of the first and second point.

These limitations were all deal breaker after just a week of trying to get tests to run all the time.  So on to find another solution that is less coupled to the straight string comparisons.

Our Second Pass Testing Solution and Failures

Ok, let's test individual parts like the value of an attribute using RegEx or Find() built-in functions:

<form:form actionEvent="something" bind="${event.user}">
            <cfsavecontent variable="output"><form:input path="firstName" /></cfsavecontent>
<cfset assertTrue(Find("value="farrell"', output)) />
<!--- More assertions --->

This works, but it is still extremely clumsy having to check for each attribute and we still cannot check the parent child relationships of tags like <select> and <option>.

Our Third Pass Testing Solution and Ultimate Successful Approach

How do you solve this predicament? We "sort of" solved problem #1, but #2 and #3 are still unsolved in my book.  Let's think about what the custom tag is outputting.  Hmm...our custom tag library output XHTML compliant code and there are many tools available to use to leverage XML .  So for all of you who think XML is bad, wrong and decitful -- it's time to eat your words. Luckily for us, MXUnit has a built-in assertion called assertXPath() that fits this use case perfect.

I know you're tired of me jabbering about how we got here so you'll want to see some code right?  Bare in mind that the Mach-II custom tags do some interaction with what is happening in a Mach-II request so we had fun setting up a fake request so the object required by the tag are in memory.  For the sake of brevity, I'm going to leave that setup code out of my examples however you can always see them in the Mach-II SVN repository (the joys of open source) if you want to learn more.

Let's look at testing a simple text input:

<cffunction name="testInput" access="public" returntype="void" output="false"
    hint="Test basic 'input' tag.">

    <cfset var output = "" />
    <cfset var xml = "" />
    <cfset var node = "" />
    <cfset var bean = CreateObject("component", "MachII.tests.dummy.User").init() />
    <cfset var event = variables.appManager.getRequestManager().getRequestHandler().getEventContext().getCurrentEvent() />

    <!--- Add data to the the bean and set to the event so we can do binding --->
    <cfset bean.setFavoriteColor("red") />
    <cfset bean.setLastName("Farrell") />
    <cfset event.setArg("user", bean) />

    <cfsavecontent variable="output">
            <form:form actionEvent="something" bind="${event.user}">
                <form:input path="favoriteColor" />
                <form:input path="lastName" />

    <cfset xml = XmlParse(output) />
    <cfset debug(output) />

    <cfset node = assertXPath('/root/form/input[@type="text" and @value="red" and @id="favoriteColor"]', xml) />
    <cfset node = assertXPath('/root/form/input[@type="text" and @value="Farrell" and @id="lastName"]', xml) />

All XML documents require a "root" node of some sort.  In HTML, it's the <html> tag so in our unit test we just used <root> so XMLParse() wouldn't choke on the code.  We also want to check that the "id" attribute and the "value" attributes are what is expected and we can easily do that in our XPath assertion string.

Ok, so that's a simple example.  What about something more complex?  Let's look at how we test our <form:radiogroup> tag.  This tag takes a collection (lists, struct, array, array of structs or queries) and turns them into a group of radio buttons based off a template:

<cffunction name="testRadiogroupWithQueries" access="public" returntype="void" output="false"
    hint="Test basic 'radiogroup' tag.">

    <cfset var output = "" />
    <cfset var xml = "" />
    <cfset var node = "" />
    <cfset var bean = CreateObject("component", "MachII.tests.dummy.User").init() />
    <cfset var event = variables.appManager.getRequestManager().getRequestHandler().getEventContext().getCurrentEvent() />
    <cfset var colors = QueryNew("v,l") />

    <!--- Add data to the the bean and set to the event so we can do binding --->
    <cfset bean.setFavoriteColor("red") />
    <cfset event.setArg("user", bean) />

    <!--- Test with simple array --->
    <cfset QueryAddRow(colors) />
    <cfset QuerySetCell(colors, "v", "red") />
    <cfset QuerySetCell(colors, "l", "Big Red") />
    <cfset QueryAddRow(colors) />
    <cfset QuerySetCell(colors, "v", "green") />
    <cfset QuerySetCell(colors, "l", "Giant Green") />
    <cfset QueryAddRow(colors) />
    <cfset QuerySetCell(colors, "v", "brown") />
    <cfset QuerySetCell(colors, "l", "Bad Brown") />

    <cfsavecontent variable="output">
            <form:form actionEvent="something" bind="${event.user}">
                <form:radiogroup path="favoriteColor" items="#colors#" labelCol="l" valueCol="v">
                    <label for="${}">${} <span>${output.label}</span></label>

    <cfset xml = XmlParse(output) />
    <cfset debug(node) />
    <cfset debug(output) />

    <cfset node = assertXPath('/root/form/label/input[@type="radio" and @value="red" and @id="favoriteColor_red" and @checked="checked"]', xml) />
    <cfset node = assertXPath('/root/form/label/input[@type="radio" and @value="green" and @id="favoriteColor_green"]', xml) />
    <cfset node = assertXPath('/root/form/label/input[@type="radio" and @value="brown" and @id="favoriteColor_brown"]', xml) />
    <cfset node = assertXPath('/root/form/label[@for="favoriteColor_red"]/span', xml, "Big Red") />
    <cfset node = assertXPath('/root/form/label[@for="favoriteColor_green"]/span', xml, "Giant Green") />
    <cfset node = assertXPath('/root/form/label[@for="favoriteColor_brown"]/span', xml, "Bad Brown") />

As you can see, we setup some test data and pass that to the "items" attribute of the <form:radiogroup> custom tag.  The tag doesn't know which columns to use for the value or for the label so we indicate that.  Let's take a closer look at the template that is being used:

<label for="${}"><span>${output.label}</span> ${}</label>

This template is interated over (i.e. looped over) for each item in the query.  We use a simple placeholder syntax of ${} to indicate where the radio and label are outputted (other computed attributes like the "id" are also available).  Our assertations in this case not only test for tags heirarchy and tag attributes, but the inner text of tags.  In this case, we need to test that the value of "${output.label}" that is displayed is correct (not the actual <label> tag).  We wrapped a <span> around it so we can easily find it with our XPath assertion.  Also, when testing for the "${output.label}" we need to make sure we're grabbing the right one so the XPath searches that the <span> is inside of a <label> with the correct "for" attribute.

In Closing

Testing custom tags with MXUnit is easy if you figure out the right plan of attack and after three iterations to our testing strategy -- we found one that works.  I'd be happy to hear if people have suggestions on improving how custom tag output can be tested with MXUnit, however at this point I think this solution is rather slick and leverages XML/XPath without the need for any custom assertions to be written in MXUnit.

Now no code should go un-tested including custom tags.  This is especially true in something like Mach-II which is a community asset and having unit tests makes the software a better product.  So now go forth and unit test your custom tag libraries!

* Sidebar: For performance, we used straight up custom tags with a "UDF"-like function library instead of having custom tags call CFCs.  Our basic testing at the time showed that CFCs were 10-15 times slower than the custom tag with "UDF"-like function library (included via a cfinclude).

Thursday, September 16, 2010

YAF - Yet Another Framework: Giftware Versus Open Source

With the seasons changing and Fall fast approaching, it must be time for yet another framework (YAF) to show signs in the CFML world.  I'll give credit for this post to a tweet from Matthew Reinbold:

Playing with new ColdFusion framework that still is in stealth mode. Do programmers need another MVC/ORM set of scaffolding? Let's find out.

Before I take issue with having another framework pop up in the CFML world and why I feel that it is possibly detrimental to our small sect of programmers, I want take issue -- moreover -- more notice to the word "stealth" in the tweet.  What bothers me there is a big difference between developing a framework for internal / personal use versus public consumption.  If I was developing an internal "framework" for my personal use, having input from possible users of my "framework" really would not matter.  I would be using it for my own needs; Programmer Paul doesn't need to put his own two cents on how feature Z should work.  On the flip side, developing a framework for public consumption in a vacuum (i.e. "stealth" mode) is less than beneficial to all parties that possibly would use the framework.  Therefore if Programmer Paul had interest in what I was doing, his knowledge can only make the "framework" better.  This means that public interaction, even if it's just one person, is beneficial.  You can't pay somebody enough to give you bold and honest views on stuff.  This begs the question: How do you make somebody care?

Developing transparently is key to building an user base.  Without transparency in a project, you cannot call yourself an open-source project.  I've found out in that most developers consider the main tenant of open source is that the code is freely available (i.e. the "license").  Giving users the software for free where the software is developed in a vacuum and there is limited means or encouragement to contribute back to the project is merely giftware*. Open source is much more than the license; it's about philosophy on how software should be developed and a community that rallies behind it.

The big different, other than transparency in developing software in the open, is that interested parties will help you develop new features if you let them be "shareholders" of the project.  As with anything in life, nobody cannot care about everything.  Humans weren't designed to function that way.  We make hundreds of decisions everyday on what we spend our time on, what is important to us and what we do so we are happy individuals.  This is no different in open source software.  Consider this situation:

If Developer Dave uses Project Perfect and finds a Big Bug, what encourages Developer Dave to contribute his fix back to the Perfect Project instead of just working the next Alluring Application that will make millions when it hits the world?

The answer to this is: nothing.  Unless you are financially tied to open source to make a living, most developers don't count themselves shareholders in the project because they don't own it.  Whereas if the project  helps you succeed at your job, there is a reason to become involved in some of these projects.  This is where being transparent, making people's opinions count and accepting (acceptable / valid) contributions into a project makes everybody in your user base a potential shareholder and champion of your project.  Making this conversion of your user base to shareholders is something that needs to be cultivated from the start of the project.  It's nearly impossible to make conversions when your project starts in "stealth" mode because it sets the "tone" of the project from the start.  Transparency is the biggest reason in my book why 99% of all CFML "open source" projects are just giftware and will always be one-man operations.  Giftware is just viewed by "Developer Dave" as a free tool where open source is more -- it's a community of like minded folks using the tool.  All in all, the side effect is a better software.

Therefore if you make philosophy and transparency #1 on your list, will you see your project succeed (provided it's a good tool too).  Otherwise, you'll just be YAF that gets forgotten in 6 months time.

* I want to attribute the term "giftware" to by good friend Matt Woodward.  I heard it applied by him first so I can't take credit on the term.

Tuesday, September 7, 2010

Last call for BFusion/BFlex 2010 Registration - Best & Cheapest Conference Around - 9/11/-9/12 Bloomington IN

BFusion/BFlex 2010
Hands-on training for developers and designers from industry leaders coming to IU. You will not find a more effective and cost-effective professional development opportunity.
Want to learn more about ColdFusion and Adobe Flex? What about cross-platform AIR applications? Already handy with Illustrator and Photoshop and want to quickly turn your work into Rich Internet Applications? Whether you are a curious beginner or an advanced developer, BFusion (a full day of ColdFusion training) and BFlex (a full day of Flash Platform development) have something for you:

  • What: Hands-on training from the experts in ColdFusion, Flex, AIR, Catalyst, and other technologies

  • When: September 11 and 12 (Saturday and Sunday)

  • Where: IU Bloomington

  • Cost: $30 for one day, or $45 for both days (price includes lunch)

Designers: BFlex also includes an all-day session for you (no programming necessary), Flash Catalyst - From Design to Rich Internet Applications without Coding.

For more information about the sessions, speakers, and registration,  please see:

See this post from one of our speakers Matt Woodward, Principle It Specialist of the US Senate, about his take on this year’s event:

The event is also listed on Facebook and LinkedIn. Please share it with friends and colleagues.

On Facebook:!/event.php?eid=108657742524082
On LinkedIn:

Thursday, August 26, 2010

Technical Debt: If You Can't Handle Change, It's Time To Change Careers

Change happens every moment. Right now things have changed just from the second before. This means all things in life are fleeting. Not changing is like trying to hold on to the present as it becomes the past. Why should we hold on to the past? We should not. Nobody has every succeeded at this and you should not think that you're special enough to think you will be the first.

Change is good. It should not have negative thoughts connected with it. Change will happen whether we like it or not.  We might as well learn something new so we can adapt to change in ways that do not cause us suffering.  The scariness of change can be counteracted with learning. Learning something will lessen any suffering that occurs from change.  In the terms of IT, you'll live a happier IT existence because you will not accumulate massive amounts of "technical debt" by not changing and therfore not learning.  Doing things in the "tried and true" methods don't always mean you're doing it right.

So take the plunge and make a nice down payment on the change that inevitably comes. Learn something new every day.  Or if you want a different explanation in clearer wording: How can you be in IT if you don't want to learn new stuff? If you don't want to learn, you're in the wrong business.

Wednesday, August 11, 2010

CFML Function - createDatetimeFromHttpTimeString()

Working with HTTP time strings should be easier to CFML / ColdFusion,
but there is no built-in function that will create a CFML date/time from
a UTC HTTP time string. So here is the UDF that can help you work with
HTTP time string in native CFML date/time functions. I didn't check first, but I really couldn't check it out of professional
courtesy because I was writing this function for open source project and
I didn't want to deal with attribution / license stuff (yes, I'm lazy).

<cffunction name="createDatetimeFromHttpTimeString" access="public" returntype="date" output="false"
    hint="Creates an UTC datetime from an HTTP time string.">
    <cfargument name="httpTimeString" type="string" required="true"
        hint="An HTTP time string in the format of '11 Aug 2010 17:58:48 GMT'." />

    <cfset var rawArray = ListToArray(ListLast(arguments.httpTimeString, ","), " ") />
    <cfset var rawTimePart = ListToArray(rawArray[4], ":") />
    <cfreturn CreateDatetime(rawArray[3], DateFormat("#rawArray[2]#/1/2000", "m"), rawArray[1], rawTimePart[1], rawTimePart[2], rawTimePart[3]) />


Thursday, August 5, 2010 Domains Are Going Away Soon...

Where did you get those URLs? The domains are going
away soon (because no one in the Fusebox community was interested in
taking them on - and they expire in two weeks).

via (a comment by Sean Corfield)

This is in reference the domain being used by the what appears to be the "defunct" FuseNG project that forked from the Fusebox project. While these aren't the main domains, this prompted me to look at the status of the main Fusebox project.

I was surprised to learn that the last stable release for Fusebox was in March 2008 (version 5.5.1). Has it really been that long? It will be 2.5 years ago in just about a month or so without a release is stunning. Time flies.  Also, I quickly checked the Fusebox Trac site. Only one new ticket other than spam tickets has been filed or commented on in the past 6 months and that one ticket is just a question on syntax (it should have been sent to a list).  What is the state of Fusebox these days? Is TeraTech really "driving Fusebox forward and you can expect to see major improvements to the web site and the documentation in due course"? I don't see evidence of it on the site.

What really saddens me is the state of the CFML community. Have people not learned to pitch in and help their open source projects? Clearly not because there is still the glut of new one-man projects that never leave the ground or barely hover. CFML community members need to band to together instead of re-inventing the wheel. They need to learn to contribute (which I'd say that 99.9% of them do not) and realize that there is only a handful of people contributing to their open source project of choice. You don't have to pay for software with money; you can pay with your time, talent and expertise. Contributing does not always mean code but help on lists, documentation, sample applications, etc. There are so many things to do on open source project other than the next generation of code.

This is a call to arms! If you use open source, donate some time back to it or you might sadly find yourself with a defunct project and no maintainer there to help you. The great news is you can save yourself by contributing your time now. I urge all CFMLers to donate just 30 minutes a week to ONE project of your choice (if you don't know what to do, contact the maintainers -- I'm sure they have a laundry list of things to do). Just 2 hours a month would change the state of affairs in the CFML community and propel our language forward.

Monday, August 2, 2010

CounterMarch Systems Blog: Mach-II is (still) awesome

Mach-II rocks. It is one of the more "mature" surviving ColdFusion application frameworks, and as such doesn't get nearly the amount of buzz that the new (interesting, different, creative, awesome-in-their-own-way) frameworks get. If you're looking at frameworks, I encourage you to take a look at the amazingly capable Mach-II - we've had fantastic success with it!

Things I really, really like about Mach-II:

Backwards compatibility

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

Coldspring integration

<include file="./mach-ii_coldspringProperty.xml" />

and in your listeners:

<cfcomponent name="mpListener" extends="MachII.framework.Listener"


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

Faster Fixes

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


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

The Team

The people who created and have since improved and evolved Mach-II are some of the smartest folks who are or have been involved in the ColdFusion community. Look at this list. Not only have they created something awesome, but they're incredibly responsive on the wiki, development Google group, and framework users Google group. They use this framework at their day jobs so you know that each release has been painstakingly designed, implemented, tested, re-tested, piloted and then released. Plus, they're open to new ideas (even if you personally have no idea how to make them happen!). Code is great, but the people are the best.

The View Loader

This is where some of those "convention-based" concepts have crept in to Mach-II much to the benefit of the users. Back in the "bad old days" your mach-ii.xml file would contain a block that looked sorta like this, except far longer:

      <page-view name="showWelcome"       page="views/showWelcome.cfm" />
      <page-view name="showHome"       page="views/home.cfm" />
      <page-view name="baseTemplate"       page="views/baseTemplate2010.cfm" />
      <page-view name="blankTemplate"    page="views/blankTemplate.cfm" />
      <page-view name="welcomeLanding"    page="views/welcome_landing.cfm" />
      <page-view name="showSendPassword"    page="views/showSendPassword.cfm" />
      <page-view name="showAppHelp"       page="views/showAppHelp.cfm" />
   (and so on)

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

   <!-- This would load all views with the pattern of "/views/**/*.cfm" which is the most basic and common pattern -->
<view-loader type="MachII.framework.viewLoaders.PatternViewLoader" />

So, so simple. Love this line of the config file more than any other.

Better apps, faster.

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

Try Mach-II. Need help? Talk to the team on the list. Build great things.

This exactly what Team Mach-II likes to hear. Thanks for the shout out Steve!

Saturday, July 24, 2010

CFML Advisory Committee -- My Thoughts

As for the narrative of what happened to the demise of the committee, it isn't worth my time to comment on it.  It is what it was and I have nothing if any real interest to add to what has already been said by Adam, Matt and Sean.  My resignation letter clearly explains my resignation:

In his blog post, Adam alludes to some inside knowledge on my life and the demands on my time.  Adam has absolutely no understanding or knowledge of my daily life and demands. It is rather imprudent and extremely rude to make assumptions and presume some alternate agenda.  This is the issue I take with Adam's post.  Straight from my resignation letter: "it has become increasingly difficult for me to contribute sufficiently to the CFML specification process".  I spent a lot of time over a period of a couple months debating my resignation.  In the end, I felt I did not have the time to serve the CFML community in a manner that did justice to the committee as a CFML *community* representative.

Thursday, June 17, 2010

Peter Landgren enjoys the sights and sounds of Cleveland as director of Baldwin-Wallace College's Conservatory of Music: My Cleveland |

Is it possible for a musician to make a living in Cleveland?

I'd like to broaden the question and say that it's more possible now than in previous decades to make a living in music anywhere in the country. A musician, however, has to be more than a good player or teacher. They must have an entrepreneurial spirit and serve as an advocate for their art.

Music is one of the easiest art forms to give away for free. B-W teaches all college students how to be contributing citizens in today's world, and in the conservatory, we not only teach students to be intelligent and sensitive performers, but we also guide music students on how to create their own unique career in music.

Mr. Landgren (fondly named PL by his students) is my former horn teacher of three years in college (Johns Hopkins in Baltimore). As a music major at a great conservatory, I spent a lot of time each week preparing for my lesson with PL. It was really exciting to see this piece in the newspaper about Big P's new adventures at BW (I was known as Little P in college). Take a moment to go read the whole article which is very interesting insight on the music "mecca" in Cleveland.

Top Five Tips for Evaluating Employee Performance (via GreatBizTools Blog)

Investing Time in Employees Puts Money in the Bank

The following situation represents an age-old challenge facing many managers when it comes to helping employees improve their job performance:

I work in an organization that doesn’t use a standard performance management system. Managers are given some general guidelines, which are a bit confusing, but everyone seems to be using a different approach. Employees tend to get feedback only when they do something wrong. What is the best way to evaluate my employees and provide feedback regarding their performance?

Our team at work has been blogging some great information on HR questions and advice. Be sure to follow the link to read the entire article!

Tuesday, June 8, 2010

OpenBD (CFML) on Google App Engine - Live Meeting June 8th, 2010 at 7pm ET

Just wanted to quickly blog that Matt Woodward and I are presenting on OpenBD on Google App Engine tonight at the Mid-Michigan CFUG at 7pm ET (about 30 minutes from the time of this posting).

Where:  (Enter as guest)

When: June 8th, 2010 - 7pm ET


If you want to take advantage of the power of cloud computing but want to focus on applications instead of server infrastructure, you owe it to yourself to check out Google App Engine. Google App Engine lets you deploy applications to Google's infrastructure with the push of a button, and the best part is that for many applications it's entirely free of cost.

In this presentation we'll discuss both the benefits and downsides of living in the cloud, outline how Google App Engine differs from other cloud solutions, and demonstrate how to build and deploy a simple CFML application to Google App Engine using Open BlueDragon, which is the only CFML engine compatible with Google App Engine.

If you're interested in running your CFML applications in the cloud come get in on the ground floor, because with a few simple tips and tricks, it's all clear skies.

Tuesday, June 1, 2010

Unofficial CF bug database mirror setup = wake up Adobe

This website is an live unoffical mirror of the Adobe ColdFusion Bug Database created by Elliott Sprehn.

I was created because the Flex based UI that was provided by Adobe is a real pain to use, specifically lots of text is not selectable, the Bug Areas dropdown is a mile long with no scrollbar, and it won't work on something like an iPhone.

This website is not affiliated with or owned by Adobe, Inc.

There is definitely something wrong with the idiotic bug database for ColdFusion at Adobe. The Flex interface is horrible. It's meant as no offense to the developers of the Flex interface but the user experience is painful at best. I can't even use it on my netbook because the there is no way to resize boxes or popups to maximize the lower resolution. Then there is mobile access (iPhone / Blackberry).

I understand the intentions of Elliot are good, but having to mirror the bug database should be a wake up call to Adobe to fix their issues. However, I don't believe it's totally the Flex interface. I would guess it's the out-dated issue tracking software they use.

Flame away at me if you want - it won't do any good...

Friday, May 28, 2010

Is a Pure Meritocracy Possible in Open Source?

I've been asking myself this question a lot lately.  Before we continue this discussion, let's look at how Meritocracy is defined (as by Wikipedia):
Meritocracy is a system of a government or other organization wherein appointments are made and responsibilities assigned to individuals based upon demonstrated talent and ability (merit). In a meritocracy, society rewards those who show talent and competence as demonstrated by past actions or by competition. Evaluation systems, such as formal education, are closely linked to notions of meritocracy.
Some open source projects like the Apache claim to be a meritocracy where contributors gain "status" by their merits usually through contributions (code, documentation, mailing lists, tutorials, etc.).  Some people say that the Apache Project is more egalitarian than meritocracy however I'm not writing this to lobby either case.

In the terms of the projects I'm involved with, the biggest for me is the Mach-II Project.  A lot of people on Team Mach-II were asked to be on the team because of pure merit.  Flashback to 2005 when I started with Mach-II and apply merit to me, I would never be selected -- I was too green.  I would say we try to run Mach-II as a meritocracy as much as possible, but I definitely believe there is a bit of benevolent dictatorship in the mix as well.

In the end, not every decision can be made by committee. At least a "good" decision made.  Some of the problems with committees are while they take account of a bunch of different view points they are terribly slow to move and sometimes produce less than desirable results.  Then introduce politics (especially when financial implications of multiple parties are involved) and things typically grind to a halt.  Committees only work when all parties involved want the same result.  I have little patience to be part of committees / processes that are jaded that progress can be made despite have multiple parties with different financial interests.

This is one of the reasons why committees by company / association appointment in open source just don't work.  Money will nearly always triumph over pure idealistic concerns even when "doing the right thing" would be better.  Does this mean that humans are just greedy by nature? I'm glad I don't have to answer that question (it's been a funny premise on the Simpsons before as well).

People appointed by merit (and not company / employer association) typically share a common goal.  However, who is to break a stalemate?  This why most "meritocracies" still have some person in the "dictatorship" role.  In regards to Mach-II, I definitely play this role.  In the Rails project, DHH still plays the role of the dictator when needed.

So yes, I believe meritocracies can exists, but in certain situations somebody has to play the role of "dictator" / "president" / etc.  However meritocracies need transparency to function properly.  Transparency will be a subject for a future blog post.

Thursday, May 27, 2010

Do you know if this is a Honey Locust Tree?

We're located in Minneapolis, MN and the photos were taken today (May27).  Based on my limited knowledge of trees and my searching on the interwebs, I've come to the weak conclusion that we have Honey Locust Tree in our backyard.  Are you a tree expert or know more than I do? Then comment on the type of tree we have.  And if I know you, I owe you beer / drink the next time I see you.

Edit 6/3/2010:

According to my friend Adrian (see comments for links), this is a black locust tree due the size of the seed pods.

Wednesday, May 26, 2010

A Contrabass French Horn (Video)

OMG! I nearly shit myself seeing a Contrabass French Horn playing an excerpt from Ein Heldenleben.

Monday, May 24, 2010

The Feud: Debian-Ubuntu Relationship (via Mailing Lists)

On Fri, Apr 30, 2010 at 10:32:09AM +0200, Stefano Zacchiroli wrote:

>   I've been invited to give a talk at the forthcoming Ubuntu Developer
> Summit, on May 13th in Brussels. I've accepted, since I'd like to take
> the chance of the talk to present to the Ubuntu (and Canonical) people
> how we feel about the state of the Debian-Ubuntu relationship. I'm
> therefore seeking your feedback on the topic, in order to present our
> views rather than mine only.

So, I'm now back and with some feedback to share. I'll first post (in
this mail) a summary of the replies I got to this "poll" and later on a
more general summary of what I did at UDS.


I got about 50 feedback mails in a bit less than 2 weeks, which I
consider a fair amount of feedback. In case people are interested in
giving more feedback, by all means go ahead and mail me. The more, the
better. Obviously, the summary I report below is limited to the
feedback mails I got thus far.

Success stories

I got quite an amount of "submissions" for the success stories category
(frankly, more than I expected).

The most appreciated collaboration paradigm between Debian and Ubuntu
seems to be "mixed teams", where people from both distros work together
using some $VCS. I got report about a dozen such teams, of varying sizes
from a handful of packages to several hundreds. An interesting and
appreciated trend is that such teams usually lead to a direct
involvement in Debian by Ubuntu people: first as DMs, then as DDs, and
in some cases also to greater involvement such as becoming members of
our core teams (e.g.: ftp-master).

Other reported success stories are in the development of some core tools
such as dpkg and d-i where, starting from Ubuntu-specific needs, generic
technical solutions have been developed, benefiting not only Debian and
Ubuntu, but all possible Debian derivatives.

People also appreciate bug filing from Ubuntu [1] (especially if with
patches [2]) in the context of large changes such as the default gcc

Interestingly enough, even for parts of the two distros that are
packaged independently (e.g. GNOME), some Debian people have now more
trust in Ubuntu patches than in the past and that entails a more
fruitful exchange or cherry pick of patches.




Now to what people don't currently like in the Debian-Ubuntu

I won't spare much mail space to discuss episodes that concern
individuals. In fact, one such episode (i.e. the "python affair", see
#573745) has been reported by several people, and details can be found
in the tech-ctte bug log.

Beside that, people don't like when Canonical does not behave as a good
upstream, e.g. when they are not reactive to Debian developers as their
downstream distributors. More generally, people would like to see
efforts in packaging Canonical software---when is not Ubuntu
specific---into Debian directly.

Similarly, people don't like when Ubuntu does not behave as a proper
downstream. In particular, there seems to be a desire to have more
triaging of Launchpad bug and then forwarding to the Debian BTW when
they apply to Debian too (no surprise here: it is the most "traditional"
complain Debian had wrt Ubuntu).

Several people do care about the status of their Debian packages in the
Ubuntu distribution. As a consequence, those people find annoying when
those packages degrade in quality due to reasons not under their control
(e.g. they are synced in bad moments, patched inappropriately, etc.);
that seems to mostly affect the Ubuntu universe.


The last category of feedback sought in the poll was "requests".

A recurrent request is to give more credit to Debian. Coming from the
tradition of free software, people have no problem with the fact that
Ubuntu benefits from Debian work, but they feel that the mantra "give
credit where credit is due" should be better respected. All in all,
people don't like the equation "GNU/Linux = Ubuntu" which is slowly
getting through.

Another recurrent request is to push the culture of "do changes in
Debian first". That would mean discussing changes in Debian first; then,
*if* an agreement can be reached (which is not necessarily the case, of
course), people would like to see those changes implemented in Debian
first; from there, they will naturally flow to Ubuntu.

Then, I've also collected tons of technical requests related to how
Debian people can more easily interact with the Ubuntu infrastructure
(most notably with Launchpad) in "their" way, i.e. via mail, via the
Debian BTS, etc. In that category---that I won't detail to avoid abusing
your patience---there is stuff like: an opt-in service to be notified of
Launchpad bugs, Ubuntu accepting uploads from our keyring, Ubuntu having
something like patch-tracker.d.o to better split patches, etc.

While on the above I've noticed no real convergence, it seems that in
general those Debian people which care about their packages in Ubuntu,
would like to have a contact point where to drop sync requests. It seems
that using the suggested way to do that (don't ask me what it is :))
does not really work, as they get lost in the noise or similar.

Ok, for the first time I've seen -- a real account of the feud going on why some people are hating Canoncial (the makers of Ubuntu). Lately, I see 140 character posts on Twitter or that is just "complaining" without any real concrete reasons. If this is the reason, then there is something you complain about. However, denting/tweeting is not a good format.

Wednesday, May 19, 2010

Alien Arena - Fix audio/sound on Ubuntu

Just recently started playing Alien Arena for fun (free) on Ubuntu which is Quake II or Unreal Tournament.  AA is available for Windows, Linux and FreeBSD.  However, I found that after upgrading to Ubuntu Lucid 10 that the audio no longer functioned.  Open up Synaptic Package Manager and see if "libopenal1" is installed.  Installing the Open Audio Library packaged fixed the issue for me.  See you on AA.

Friday, May 14, 2010

Google Me - The Documentary Film

My wife and I just watched Google Me - a film by Jim Killen and stars seven guys named Jim Killeen.  Jim travels the global to meet other Jim Killeen's and find out about their life.  He only meets people get can find on Google.  An interesting concept.  And for your viewing pleasure, you can watch on Hulu:

[hulu id=lW9PLkpIgIv-wobKxeB18w width=500]


Tuesday, May 11, 2010

Google screws Scroogle (via The Register)

Scroogle, the privacy-friendly Google scraper, has been crippled by changes to one of the dominant search engine's interface pages.

The unheralded alterations to yesterday could mean Scroogle has to be "permanently retired", its operator Daniel Brandt wrote.

As a full-time user of Scroogle for years, I was saddened to see Scroogle crippled yesterday. Google has not way of doing private searches. I don't agree with Google's chief executive Eric Schmidt regarding privacy: "If you have something that you don't want anyone to know, maybe you shouldn't be doing it in the first place."

There is a difference between wanted to hide your search because you're doing "evil" or just not wanting to share with another company about what you search for. It's not that I search for anything terrible, but in end I think my searches should be my own if I wish. I especially see this as important since more and more of our lives are being "put" online forever without our direct consent.

Looking for CFML / ColdFusion jobs in MN, CA, DC or Scotland? Here are some great places to start...

Seems to be there are a great influx of CFML / ColdFusion jobs available.  I've been asked by three people I know to ask around and I thought I would just post on my blog.  A lot of these jobs are looking for CFML framework experience.

AW2.0 - Scotland, UK

Located in the town of Dumfries, go join Alan Williamson and Andy Wu in the next generation of CFML using the latest cloud computing technologies.  I've personally interacted with both Alan and Andy online and I've found them to be extremely smart individuals.   Looks like they offering a bounty so if you are interested and I know you -- let me pass your resume on for you. Ideally, candidates would be local to the UK - but who knows?  Maybe a move across the pond is in store for you!

We are looking for the following roles:

Our recent hires are quoted as saying: "best job I have ever had"

By the way, if you are happy in your current role but you know someone who could fit the bill, then please pass their resume to us, and if we end up hiring them, we'll give you £500 bounty for your trouble!

CTIA - The Wireless Association - Washington, D.C.

A friend of mine, Ted Hovis asked me to pass this along with you.  Look for a fast paced job in the heart of D.C.?  Then go take a peek at CTIA job posting.  CFML framework experience (like Mach-II) a PLUS!

CTIA-The Wireless Association is seeking an experienced Senior Web Developer / Architect.  This individual will be responsible for planning, coordinating and maintaining the functionality and performance of CTIA's multiple web properties.

The person's duties are to: ensure the timely delivery of new applications and releases from a development to production environment, site monitoring, traffic and performance analysis. Assistance with general site related technical management and system / security considerations, as well as dealing with partner and consultant relationships, as well as with the technical evaluation and direction setting of web enterprise-related efforts.

Jobs2Web - Minnesota

My fellow TCCFUG member, Kevin Penny asked me to post about this job.  Job2Web offers employers a recruiting platform and is one of the fastest growing startups in Minnesota.  Kevin is always talking about all the neat stuff they having been using from JMS to Solr.  CFML frameworks experience such as Mach-II or Fusebox is a big PLUS however they are looking for somebody with Java experience.  Check out the Production Support Developer job posting.

Jobs2Web helps employers maximize their interactive recruiting strategy using our recruitment marketing platform. The Jobs2Web platform helps major employers to attract, capture, and communicate with quality talent all while measuring recruiting effectiveness using our patent-pending solutions which dramatically reduce dependency on expensive and less effective sourcing mediums.

Working within our company will put you close to our award winning technology that combines the best of recruiting and marketing solutions including Search Engine Marketing (SEO), SEM (Pay-Per-Click), Social Networks and Social Media Marketing, and Email Marketing.

The Production Support Developer ensures the stability, reliability, and performance of the Jobs2Web Recruitment Marketing Platform and associated applications through rapid resolution of production issues. - California

Ever noticed that places like (owned by use CFML?  I just did and then found out that is hiring for both Sr. Web Programmer and Jr. Developer.  Both list CFML frameworks as required experience. is the 3rd largest e-tailer in the Home Improvement space.  We are profitable, rapidly growing, $200M/ year online retailer.  Our mission is to triple our business in the nest 3 years.  We are expanding our Software Development team to drive this growth strategy.