Mobile example links

One thing I neglected to do was give link to examples in my presentation at ColdFusion Summit 2016. Below are links to some examples and the mobile documentation.

Tournament Scorecard Pro app:

Sample application built by me:

Blog series by Brad Wood:

Adobe Documentation:

CF2016 API Manager post install

Just a quick note about the new API Manager now available for ColdFusion 2016. At the end of the installer you are presented with some information and links to get things going. However, that information is not written to a log file anywhere and is very difficult to find. Below is the output from the end of the install. This was taken from an install that used all the defaults on a Mac. You might need to adjust for your specific install.

view plain print about
3API Manager has been successfully installed at: /Applications/ColdFusion2016APIManager.
5Start Data Store and Analytics Server before starting the API Manager using '' at /Applications/ColdFusion2016APIManager/bin/
7Data Store can be started from /Applications/ColdFusion2016APIManager/database/datastore using the command 'redis-server'.
9Analytics Server can be started from /Applications/ColdFusion2016APIManager/database/analytics/bin using the command 'elasticsearch'.
11You can access the API Manager administrator portal at http://localhost:9000/admin/
12You can access the API Manager Publisher/Subscriber portal at http://localhost:9000/portal/

Think Different

Holy cow! I haven't blogged about anything in a very long time. I intend to do something about that starting with this post.

A little while back a colleague asked me to look at some code. He was curious if I thought there was a better way to write it. The only thing I knew about the code was that it worked.

Before you ask. I can't share any of the code. Just let it go.

The code was designed to look for a known string pattern inside a user entered string. The original code was looking for very specific patterns. Also, it had some logic in it that would allow for some of the checking to be bypassed under certain conditions. Like it was explained to me, the code worked and did what was expected of it.

After about 30 minutes I had whipped up, what I felt, was a better way to write the code. My code had about a quarter of the lines and was more efficient. It would check for an infinite number of patterns and conditions. I ended up expanding on it and delivered a couple different ways to make it better. Each one expanding on the previous. Also, I felt my code was better constructed as solve the intent now and still work years from now without alteration.

This is where I feel that experience came into play. I had to write something like this before I was able to pull on that experience when writing it. Not only that, but just my overall time in the field has allowed me more overall exposure to things so my thought processes are just different when presented with a problem.

But, at the end of the day the code is not even the main part if this. All it does is provide context for the main point I want to make.

I think that all of us should strive to be better and "Think Different". What I mean by that is to always look for a better way. Don't continuously rely on how you have always done something. Expand your knowledge and find opportunities to do you what you do, just do it differently, do it better.

Failure is an option, but don't let it deter you. Not every attempt to make things better will work out they way you wish. When trying to find better ways you will more than likely find more ways not do do something. For example, it took Edison over 1,000 tries to invent the lightbulb. He kept striving to find a better way or a different way to accomplish his end goal.

When trying to make it better don't be afraid to reach out and ask for help. With today's technology we are all connected to a vast network of people that have probably already done that. The large majority of them are usually more than willing to help and offer their expertise. There is a large wealth of knowledge and support out there, but if you don't use it you are only handcuffing yourself.

The new year is quickly approaching. Try and spend part, if not all, of 2016 trying to "Think Different".

My Son the Blackbelt

I don't think I have ever used my blog for personal stuff. So if you will indulge me just this once.

Yesterday my son, Bryce, tested and received his 1st Degree Blackbelt in Taekwondo. He started just before he turned 4 and is now 8. Some might say it is a little young but if you knew the dedication and training he has done you would know different.

So, congrats to my son, may this be just the start of your journey.

CFSummit - Ask a speaker

The CFSummit is just a round the corner. Well, a long slow bending corner maybe. The speakers are hard at working trying to bring the best possible content they can to the conference.

The conference organizers have been doing a tremendous job putting everything together. The Trillo board has been used to organize the sessions and session info with great success.

Just recently the board has been updated to allow for public comments on sessions. This will allow you to ask the speaker questions before the conference. You can even suggest they talk about a subject that interests you.

Till next time...


ColdFusion 10 websocket security issue fixed

Updater 11 for ColdFusion 10 has been released today. This updater fixes a number of issues. You can read all about the fixes here, ColdFusion 10 Update 11.

Most importantly, is the fix that will prevent websockets from invoking non-remote methods in components.

There is also a hotfix release for ColdFusion 9 to correct a security issue.

If you are running ColdFusion 9 or 10 I strongly suggest that you apply this patch.

Till next time,


Have a say in the content for the ColdFusion Summit

Help decide on what the content for the Official Adobe ColdFusion Summit this year October 24, 25 in Las Vegas. You can get all the details and how you can help here...

On a side note.. the site pretty slick use of

Till next time,


Registration open for ColdFusion Summit 2013

In case you missed the announcement at cf.Objective(), there is a new ColdFusion conference coming later this year. This one is being put on by Adobe and will be held in Las Vegas, NV on October 23-24 2013.

Event registration is now open and you can register here. The coolest part of the registration is that it includes a license for ColdFusion Builder. Also, if you register now, the registration cost is less than the cost of Builder. So, it is like getting builder at a discount and then attending a conference for free.

Till next time,


Slides from cf.Objective() 2013

Slides from my 2 cf.Objective() presentations can be found here... You will not only find my sides but slides from other presenters there as well.

The file names for my slides start with "dferguson_".

The slides from the presentation I did for Ray Camden will be posted by him (if he posts them).

Till next time...


Combining query results using QofQ

I have a process that processes an xml document. For each node in the xml a stored proc is called to update data. What I wanted to do was combine all the results into a single query return. I did some digging and found an old blog post - Ben Nadel that showed how to do it. However, that post was a bit old so I figured there must be a better way by now.

I asked a friend and he suggested to try using query of queries with a union to combine them. This seemed intriguing but there was an issue with this. The code I was working with was all in cfscript. I remembered that dealing with queries of queries in cfscript is, well, challenging. I dug up a ColdFusion Cookbook entry on using QofQ in cfscript.

Using this I was able to fashion together a function to combine two queries into one. I am not sure how will this would work if the queries had different columns. Now, instead of dealing with about 100 independent queries, I can deal with just one.

view plain print about
1private any function combineQuery(qA, qB)
2 {
3 var qry1Result = arguments.qA;
4 var qry2Result = arguments.qB;
5 var qoqResult = '';
7 // create new query object
8 var qoq = new Query();
10 // set attribute of new query object to be a query result with arbortrary name
12 qoq.setAttributes(QoQsrcTableA = qry1Result);
13 qoq.setAttributes(QoQsrcTableB = qry2Result);
15 // use previously set attribute as table name for QoQ andset dbtype = query
16 qoqResult = qoq.execute(sql="select * from QoQsrcTableA union select * from QoQsrcTableB", dbtype="query");
18 // return result
19 return qoqResult.getResult();
21 }

Till next time...


More Entries