[Looking for Charlie's main web site?]

Like the UGTV site? Vote for it at CFDJ Awards

My UGTV site has been nominated for "Best Web Site or Community" in CFDJ Reader's Choice Awards. If you've not yet voted, your vote would be appreciated. There are 8 other categories, and voting should take less than a minute.

The UGTV site is a directory of recorded UG presentations, now with 86 recordings from 65 presenters.

I do feel a little weird making an outright plea, but then if you didn't know that the awards were open for votes, or didn't know it listed a site you wanted to support then you may miss it.

Also, there are curiously a lot of non-CF sites and products listed in some of the categories. I suppose since it's a joint award contest for both the CFDJ and WebDDJ, we have to accept that. Again, though, if you want to support CF sites and products more strongly, you can make a difference.

I'm not sure how long voting is open, so please do take a moment now to vote if you can. Thanks, on behalf of the CF community.

CFFundamentals: Mimicking a form submission using CFHTTP

While developers who've used CFML for a long time will regard some topics as old hat, we have to remember that there are folks who either have come along recently or simply never used some feature. This is one of those topics, and since I answered it on a list, I offer it here.

I'd like to start doing that more often (reformatting some answer I give on some list, so that others may learn from it.) As in this case, I'll refer to such as CFFundamentals and create a category for them so that interested readers may find them more readily.

The problem

Someone wrote wanting to mimic (in CFML code) the submission of some data to a form that they saw happening within an Airborne Trackship (http://track.dhl-usa.com/TrackEmail.asp) page.

They saw that the form submitting to that allowed one to enter an email address and some tracking numbers to have a status email sent back to that address. Using "view source" in the browser, they observed that the form actually called a Javascript form which submitted the form to TrackEmail.asp?nav=TrackByEmail. Since this was on a page at http://track.dhl-usa.com/, they realized they'd need to submit to http://track.dhl-usa.com/TrackEmail.asp?nav=TrackByEmail.

They also noticed that the form had two input fields, txtTracknbrs and txtEmailAddress, so they tried to put together a CFHTTP request that tried to submit to the form using this URL:

http://track.dhl-usa.com/TrackEmail.asp?nav=TrackByEmail&txtTracknbrs=nnnnnnnnn&txtEmailAddress=someemail@address.com

It didn't work. They asked if anyone knew why.

My Response: He was close, but needed to understand a couple of points

Here's what I wrote:

I think your problem is in presuming that the Javascript method builds a request that looks like the one you tried in CFHTTP. I just reviewed the page, and I see that it's a form, with a METHOD=POST, and so your CFHTTP needs to send its info in the way a form post would. And that's NOT by passing the variables on the URL as you have. (One may argue that they can write CFML apps that accept either FORM or URL variables, but the page being called is an ASP page, so we can't make that presumption.)

With that, I changed your CFHTTP to the following and it worked (you should be getting an email soon, as it told me the request was accepted). Try it yourself:

<cfhttp url="http://track.dhl-usa.com/TrackEmail.asp" method="POST">
   <cfhttpparam type="URL" name="nav" value="TrackByEmail">
   <cfhttpparam type="FORMFIELD" name="txtTrackNbrs"
value="nnnnnnn">

   <cfhttpparam type="FORMFIELD" name="txtEmailAddress"
value="someemail@address.com">

</cfhttp>

<cfoutput>
#cfhttp.filecontent#
</cfoutput>

Note that it uses a TYPE="URL" for the nav query string value (as that WAS passed on the URL), but uses TYPE="FormField" for the form fields, since those are passed as form fields. You were right in getting the exact names of the form fields as used in the form fields of the form. That's critical as well.

I'll point out as well that when trying to mimic such forms in CFHTTP, it's also sometimes critical to send along any hidden form fields. There were two on that form, but I left them off and it seems to work. IF you found you needed to add them, just add them as more TYPE="FormField" values.

I should note as well that sometimes when trying to simulate a form submission, you will also need to send along any cookie values that might be being sent by your browser to the server. Those aren't shown in the form. You could use browser/server proxy tools (like the free Fiddler or Firebug tools) to detect what's being sent along.

Hope that may help other readers.

I'll add in this blog entry that regarding that last point, about using HTTP proxies to study the browser/server communication, I wrote about those previously in:

Alternatives HTTP debugging proxies, for debugging

Programmatically accessing allowed IP Addresses in Developer Edition (and understanding the limits)

Have you ever needed to know programmatically what IP addresses, besides localhost, ARE allowed to access your Developer Edition of ColdFusion? I'll show you how here.

The message above does show the allowed IP addresses, but what if you need that list programmatically for any reason? Since I couldn't find it discussed anywhere, and I discovered the feature today, I just figured I'd share it in case it helps anyone searching in the future.

Along the way, I also explain for any who need to know, both what the "allowed IPs" limits are and how they've changed in 5, 6, and 7, as well as how to reset the allowed IP addresses.

Background

Most folks know that the Developer Edition of ColdFusion is intended for just local (as opposed to production) development. But to be specific, it's limited not JUST to requests from your localhost but both localhost and 1 other IP address (in CFMX 6 or 6.1), or localhost and 2 other IP addresses in CFMX 7.

Once that limit is reached, if you or anyone else tries to access a CF page from an IP address other than localhost or that 1 (in 6/6.1, or 2 in 7) permitted to that point, the user will get a message:

A License Exception has been thrown.

You tried to access the developer edition from a disallowed IP (nnn.nnn.nnn.nnn). The developer edition can only be accessed from 127.0.0.1 and two additional IP addresses. The additional IP addresses are: yyy.yyy.yyy.yyy,zzz.zzz.zzz.zzz

Of course, in a real message the nnn, yyy, and zzz would be real numbers, and in CFMX 6/6.1 it would list only "one additional IP address".

But the key point for the purpose of this blog entry is that the end of the message lists the IP address(es) that have "gotten in", such that any requests from other IP addresses will fail to run and will get the error message.

So it's sometimes useful to know the list of allowed IP addresses, but what if you need to access it programmatically? And how do you reset it to allow other IP addresses to get in?

Accessing that List of Allowed IP Addresses Programmatically

If you have need to know the list of allowed IP address(es) programmatically for any reason, the following code using the undocumented and unsupported ServiceFactory will show it:

<cfobject action="CREATE" type="JAVA" class="coldfusion.server.ServiceFactory" name="ServiceFactory">

<cfoutput>#ServiceFactory.LicenseService.getAllowedIp()#</cfoutput>

Unfortunately, there is no equaivalent to this in CF Admin API (in CF 7 or 8).

Resetting the Allowed IP Address(es)

Finally, some have wondered how they can reset the list of permitted IP addresses. Just as in CF5 (where you could access the developer edition from any 1 IP address, either localhost or another), in CFMX 6.1 and 7 you just need to restart the server. That will clear the list of allowed addresses.

In CFMX 6.0, however, you needed to actually edit a license.properties file while the server was stopped (as I blogged about back in 2002. Thankfully, that was fixed in 6.1.

For more information on that, as well as for a documented reference of the localhost/localhost+1 licensing in CF 4.5/5/6.0/6.1, see http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_17832.

For documented reference to the localhost+2 support in CF 7, see the bottom of the table at http://www.adobe.com/products/coldfusion/productinfo/product_editions/#s2.

Of course, the error message itself also clearly explains it in CFMX 6 and 7.

Resources for Getting Started with CFEclipse

As CFML developers contemplate (or make the move to) CFEclipse, which is a CFML plug-in for the open source Eclipse editor, they will naturally have questions. Does it support the features I want? What does it add? How easy is it to make the transition?

I think most developers will find that it does what they want (tag insight, tag help, code snippets, and more), and it will do still more than they may expect. Still, it may trip some up at first as they make a transition. Changing editors is always a challenging proposition, just because we become so used to our current editor. Still, more and more developers are making the switch, and you may want to learn more about it.

Challenges Getting Started

A challenge is that there's not too much in the way of getting started docs at the CFEclipse site, http://www.cfeclipse.org/. But there are ample other resources out there to help with that.

Another challenge is that one has to get into using Eclipse itself. That can be a little daunting, but it need not be a show-stopper for you. The truth is that you really can ignore a lot of what other developers (like Java developers) would do with Eclipse, and you can focus on it just being a CFML editor. There are some quirks and differences.

Finally, the tool itself has evolved, so some of the things that may have annoyed early adopters have indeed been fixed, and more and more features have been added, thanks to Mark Drew, the project lead.

So with that introduction, I want to point out that there have been various resources (articles, resource pages, and more) put together on getting into CFEclipse, and I'd like to point to some of them here, as I've found no single page yet that does that.

CFEclipse Articles in the CFDJ

First, there have been some articles in the ColdFusion Developer's Journal:

CFEclipse: The Developer's IDE, Eclipse For ColdFusion, Aug 2005, by Simeon Bateman and Spike Milligan
http://coldfusion.sys-con.com/read/48235.htm

CFEclipse for ColdFusion Developers, Jan 2006, Rob Rohan
http://coldfusion.sys-con.com/read/167971.htm

Making the Switch to CFEclipse to Write ColdFusion Code, April 2006, by Jeff Houser
http://coldfusion.sys-con.com/read/206261.htm

Robert Blackburn's CFEclipse Article Series at FusionAuthority

Next, Robert Blackburn has done a series of articles on the FusionAuthority site:

Introducing: CFEclipse Features
http://www.fusionauthority.com/News/4610-Introducing-CFEclipse-Features.htm

CFEclipse CFExplained Part I
http://www.fusionauthority.com/Techniques/4599-CFEclipse-CFExplained-Part-I.htm

CFEclipse CFExplained Part II
http://www.fusionauthority.com/Techniques/4607-CFEclipse-CFExplained-Part-II.htm

Introducing: CFEclipse Features
http://www.fusionauthority.com/News/4610-Introducing-CFEclipse-Features.htm

CFEclipse Features: Task List
http://www.fusionauthority.com/Reviews/4619-CFEclipse-Features-Task-List.htm

CFEclipse Features: Code Folding
http://www.fusionauthority.com/Reviews/4631-CFEclipse-Features-Code-Folding.htm

CFEclipse Features: Tag Insight
http://www.fusionauthority.com/Reviews/4633-CFEclipse-Features-Tag-Insight.htm

CFEclipse Features: Local History
http://www.fusionauthority.com/Reviews/4648-CFEclipse-Features-Local-History.htm

I couldn't find any one page on the FA site (or on the web) with a link to all of Robert's articles, though some of them do show a progressively building list of links at the bottom pointing to the previous articles. I do think the list above is all that there have been so far, but I welcome hearing from anyone who knows otherwise.

I'll also point out some other CFEclipse articles that are on the FA site (thanks, Judith, for pointing them out in comments below):

CFEclipse: A Community Affair: An Interview with Simeon Bateman, Project Manager by Judith Dinowitz
http://www.fusionauthority.com/Community/4534-CFEclipse-A-Community-Affair.htm

Test-Driven Development with ColdFusion Part III: Integrate Your Tests into CFEclipse Using CFUnit-Ant by Robert Blackburn
http://www.fusionauthority.com/Techniques/4583-Test-Driven-Development-with-ColdFusion-Part-III.htm

Nathan Strutz CFEclipse Resource Page

Nathan Strutz has also created a CFEclipse Intro and Resource page (FAQ) at:

http://www.dopefly.com/projects/cfeclipse.cfm

Mark Drew's CFEclipse Videos

Finally, Mark Drew, who is leading the CFEclipse project now, has done a set of videos available as podcasts:

http://www.markdrew.co.uk/blog/index.cfm/2006/8/12/CFEclipse-Podcasts

Still more?

I'm sure there are still more resources, and perhaps some are better suited to helping folks get started with just understanding CFEclipse and Eclipse from the perspective of a CFML developer making the move from, say, Dreamweaver, CF Studio, HomeSite/HomeSite+, or something else.

I really look forward to hearing from others with more/better resources.

PS I should also point out that another motivation for getting into Eclipse as a CFML developer, if not also CFElipse itself, is that the FusionDebug CFML Interactive Debugger is built atop Eclipse. I've done a series of entries on the topic:

http://carehart.org/blog/client/index.cfm/fusiondebug/

Reloading CF web services programmatically, using the CF7 Admin API

I'm surprised to not see much out there about how to reload or refresh CF's cached WSDL proxy for calling a web service, at least programmatically using the new CF 7 Admin API. Perhaps it's because people have been tripped up, or simply haven't explored it. Either way, I'd like to offer here the code you need, and also point out some tips and traps.

Update for CF8: As an update to this entry from 2006, which is focused on CF7, I'll note that there was yet another approach that was added in CF8. Both still work and have their own value. More on the CF8 feature in my later blog entry. Still, the feature added in CF7 is important to understand, too, so please read on.

Introduction: Why You Would Want to

As background, someone reported having a problem calling a web service from CFML, and a solution suggested was that the person reload or refresh the web service using the CFMX Admin console (in the "Data & Services" > "Web Services" nav bar tab. There, you'll find any web services that have been called from CF (which is often a surprise to folks that they're tracked there). For each listed web service, there are 3 buttons and the middle one does a refresh (which means it goes and grabs the WSDL and builds a local java proxy stub, which is used when you then invoke the web service).

But one may then wonder how to do that programmatically, without having to open the Admin console. In CFMX 6.1, you could use the undocumented ServiceFactory, as I'll show below to those still using that. But since that's being deprecated, you really ought to learn the new CF7 approach.

The CF 7 Admin API Approach

As of CFMX 7, we are expected to use the new Admin API, a set of CFCs provided with CFMX 7, which offer a formal, secured API for accessing functionality otherwise offered in the Admin console.

So how would one do that to refresh a web service? Well, there is an extensions.cfc in the Admin API (a set of CFCs in the webroot's /CFIDE/adminapi/ directory), and it has a reloadWebService method that's just the trick. How did I know that? You can call the built-in CFC documentor by browsing the CFC directly:

http://<em>[servername]</em>/cfide/adminapi/extensions.cfc

Before you can call that, though, note that you do need to "login" to the Admin API by calling the login method of the administrator.cfc first. (Check out its docs to learn more.)

But to save you that effort, here's some code. (As always there are several ways to call a CFC and its methods (using CFINVOKE or CFOBJECT, or createObject either within CFSCRIPT or not), but here's at least one approach.):

<cfset createObject("component","cfide.adminapi.administrator").login("youradminpw")>
<cfset ws = createobject("component","CFIDE.adminapi.extensions")>
<cfset ws.reloadWebService(name="<em>webservicename</em>",path="<em>WSDLurl</em>")>

Note that you need to specify your own admin password in the first line, and in the last line you need to specify a web service name and its WSDL URL.

What's with this notion of passing in a web service "name"?

As you contemplate that code, you will certainly know what the WSDL URL is, since it's the same one you'd use in a CFINVOKE or CFOBJECT/createobject call of the web service itself. But what's the "name" requested here? Well, that can trip you up and it deserves further discussion, as it has several ramifications as I'll explain here.

The name is the name shown in the Admin console for the given web service. The trick/trap is that if you never open and change the Admin console entry for this web service, then the name will simply be the same value as the WSDL URL. But there's more to understand.

First, if you didn't know it, one can edit that "name" in the Admin console, and then one can even use that "name" as an alternative (or "alias") to the web service WSDL URL when invoking the web service from CFML. That's a whole separate subject which I've covered in user group talks in the past.

But assuming that no one has modified the web service name (or for reasons I'll explain in a moment, if you are not using such an alias name when you invoke the web service), then you can presume the name and WSDL URL to be the same. As an example, one could change the last line above to:

Getting Web Service Names Programmatically

Now may wonder, "can I get the web service name programmatically?" You can. But here's where it gets a little confusing. There is an available getwebservices method of the extensions.cfc. And according to the docs, you can either pass in the "name" of the webservice, or leave it off to get all web services. If we don't know the name, then we may think we'd want to use the latter approach. But I find that it doesn't quite work as straightforwardly as it seems.

First, I tried calling getwebservices() without a name:

<cfset createObject("component","cfide.adminapi.administrator").login("youradminpw")>
<cfset ws = createobject("component","CFIDE.adminapi.extensions")>
<cfdump var="#ws.getwebservices()#">

Sadly, it returned an empty dump as a result. Yet I had several web services listed in my admin console. Here's the thing: none had a name. I then renamed one of them (to "test"), and tried it again, and suddenly the call did return an array of structures (1, in my case) with the name and WSDL URL.

Hmm. So it seems instead that the getwebservices() ought perhaps instead be named getnamedwebservices(), since it only returns web services whose names have been changed (been given an alias).

Still, though, if I do pass in a name, as the docs suggest, then I do indeed get the same result:

<cfset createObject("component","cfide.adminapi.administrator").login("youradminpw")>
<cfset ws = createobject("component","CFIDE.adminapi.extensions")>
<cfdump var="#ws.getwebservices("test")#">

Now, you may wonder: "if I can't a listing unless I know the name, or can only get a list of 'all' of them if they are named, then how might I get the info for ones that have no name or whose name I don't know?"

Good question. And guess what I've found? A couple of important things.

First, I've found that you can also pass in the WSDL URL, even for a web service that's been renamed with an alias like "test", such that this works:

<cfset createObject("component","cfide.adminapi.administrator").login("youradminpw")>
<cfset ws = createobject("component","CFIDE.adminapi.extensions")>
<cfdump var="#ws.getwebservices("http://ws.invesbot.com/stockquotes.asmx?WSDL")#">

Again, that's not the web service name but the WSDL URL. And the resulting dump shows the name and that URL. So the API docs on this are a little misleading.

Be sure to refresh the "right" webservice: the one you'd really try calling

But perhaps a more important thing is that I found that you can have a web service entry for the SAME WSDL URL but with different names/aliases. Why is this important? Because you want to make sure you refresh whichever one you're using.

This goes back to my point above when I introduced the refreshWebService method: you need to give it the name as YOU call the web service, otherwise you'll be refreshing a different proxy stub and won't see the benefit you expect.

If you use the WSDL URL when you invoke the web service, then that will create a proxy stub with that "name", and therefore you want to use that as the "name" when you refresh it.

If you rename a web service in the Admin console, and then use that when you invoke the web service, then you want to use that as the "name" when you refresh it.

Refreshing Web Services Using the ServiceFactory

Since some folks reading this may not have moved to CF 7, let me show how you could do the same using CFMX 6/6.1 (or indeed 7, since it still works there). It's important to note, however, that using the ServiceFactory is not only not documented but it's also not supported. It has security problems (since there's no need to provide the admin password as you must in the Admin API). Also, it may eventually be obsoleted or otherwise restricted.

Still, since it's been documented by others in the past and is readily available on the web, I'll offer it here:

<cfobject action="CREATE" type="JAVA" class="coldfusion.server.ServiceFactory" name="ServiceFactory">
<cfset ServiceFactory.getXMLRPCService().refreshWebService("<em>webservicename</em>")>

Now, you'll notice that I've indicated that the value passed into the refreshWebService method is the webservicename. That's because it works just like the Admin API reloadWebService discussed at the top here. Be sure to specify the name as you would use it in the invocation of the web service (whether an alias or the full URL).

How to Confirm That Refreshing is Working

As you try these three approaches (Admin button, Admin API, and ServiceFactory), you will probably benefit greatly from being able to see for sure that the refresh/reload is updating the java proxy/stub class files. Where do you find them? They're stored in a "stubs" directory under your CFMX install directory, such as C:\CFusionMX\stubs or C:\CFusionMX7\stubs.

Then, under that, you will find directory names such as WS141836989, or a name that's the same as the alias/name you give to a web service in the Admin console. Inside those directories you will find other subdirectories, eventually finding some that hold the .class files representing the objects available in the web service. It's those .class files whose date/time stamp you want to see changing when you do a refresh/reload.

I'll note that there's no mapping or indication of that WSnnnn directory name, to know which one holds the web service you're interested in. I guess you just have to find the right one by looking for one whose class names map to the web service object you're calling. (If anyone knows a better connection, please do share it.)

Finally, I think it may be worth clarifying that when you do a refresh/reload of a web service using the approaches above, you need to have first made a call to that web service from CFML (or entered it manually in the admin console).

Hope all that's helpful.

Summary of Notes for Adobe Folks

Before I end, in case any Adobe folks are listening, here is a restatement (and expansion) of the couple of observations I made about wrong or undocumented functionality. This is for both the docs group and the engineers, since this is also about internal API documentation returned by the CFCs and their functionality:

  • getwebservices() only returns web services that have a name that was changed, whereas the API doc says it returns "all web services", so it either is working incorrectly or ought to be called getnamedwebservices instead
  • though not documented, getwebservices("wsdlurl") works also. The API docs say that it should only take a name (and I tested this against a web service where I had renamed it, so it was not getting it "by name")
  • if you do consider renaming the getwebservices() method to be called getnamedwebservices(), you might then also want to rename getwebservices(name) to getwebservice (singular), since it just gets one webservice
  • it would be nice to be able to refresh ALL webservices that use a given WSDL URL at once, perhaps by new method that accepts URL rather than name (and works for all occurrences of that URL in the cache, whether named with an alias or not)

Corrected version of my Sept CFDJ article available online

While it may seem old news, I want to point out that if you've received the print version of the September edition of the CFDJ (which came out in October), you may have seen my article on "FusionDebug Tips, Tricks, and Traps". Due to some glitches, the version printed was not the final, edited version I had offered.

I was able to arrange to get the corrected article posted in the electronic version of the article, free for you to read, on the CFDJ site. If you're interested in the topic and/or the article, please do check it out online.

Webcast: How to track views of your Breeze/Acrobat Connect recorded presentations

I'm happy to present my first webcast, a short audio/video presentation showing a screen recording with narration of how to solve a problem. I plan to do many of these in the future.

This first one is a 5 minute video showing how to solve the problem of tracking how many people have viewed a Breeze/Acrobat Connect recorded presentation.

I discussed the solution in a previous entry, but some had asked for more details. Rather than write them out, I used this as a chance to put together the webcast.

I'd like to point out that these webcasts themselves are not made as Breeze/Connect presentations, since I ultimately want to make them downloadable to ipods. I've made this and will make future ones using Camtasia Studio 4 from Techsmith. They've been so kind as to give me a demo license and I look forward to creating many more.

I'll welcome feedback from folks both in what you think of the approach, and its design, as well as any ideas for future webcasts you may like to see. Of course, I especially welcome feedback on the topic itself.

An alternative means of archiving your group's mailing list: Google Groups

Did you know that a Google Group can be created solely to be an online repository/archive for another existing, traditional mailing list? I just learned this today.

In an entry last week (see below), I pointed out how the mail-archive.com site offered a great repository for archiving and providing a search interface for any group's mailing list.

But this Google Group's feature may appeal to some as an alternative. For more, see the Google Group's technote, Can I use Google Groups to archive another mailing list?.

For more on the other alternative I proposed, including a discussion for why either of this is different from proposing that any individual create their own gmail account for reading mailing lists (an entirely different subject/solution), see Need a (safe) searchable archive for your mailing list? Get one for free!.

The mail-archive.com service does have one distinct advantage: it can be setup to hold previous messages sent to the list being archived. Google Groups cannot, for now, so it will only be able to start archiving once you set it up.

Hope this helps someone or some group with a mailing list that lacks its own archive/search/web interface features.

Alternative HTTP debugging proxies, for debugging

I've previously mentioned the value of using HTTP debugging proxies, which help you observe the communications out of your browser and back, which can be especially helpful debugging problems with Ajax and Flex/Flash apps as well as general-purpose web apps. Though I've pointed out a couple of my favorites (Fiddler and Firebug) before, here is a larger list. "To each his own", as they say.

Most are free, some are browser-specific, and I've tried to break the list up that way. These tools are also referred to as MITM, or Man In The Middle, proxies or http sniffers.

[Update: Since writing this in 2006, most modern browsers now provide this sort of client proxy/debugging functionality built-in. I wrote about them in a 2012 blog entry. Also, I long ago moved this list (and more such tools) above to a new location with far more updated info: a category in my CF411.com list of tools and resources for CFers.]

And there are still other ways to do the kind of communication analysis, including tcp trace tools and even a Sniffer and a tcpmon tool, both built into CFMX and useful for watching the http traffic going into CF. There's also the NetConnection Debugger for Flash and Flex. Still, I'm limiting this discussion just to HTTP debugging proxies. If folks know of still others, feel free to add them in the comments.

Free, General-purpose HTTP Debugging Proxies

Free, IE-only Proxies

Free, Firefox-only Proxies

Commercial Proxies

I'd like to point out as well that this list appears, along with other similar lists of tools related to CF, on an older site I still maintain: http://www.systemanage.com/cff/considering_products.cfm

Thinking of frying a turkey: YouTube shows why you need to be careful!

As we in America celebrate Thanksgiving, some may be tempted to try to deep fry a turkey, something which has grown in popularity. I've heard many warnings about the approach, and now thanks to Youtube you can see the serious Underwriters Labratories video showing how easily things can go very wrong.

But with care, it can work, as another video shows. The keys seem to be: don't use a frozen turkey, don't use too much oil, do it outside a safe distance from the house, oh, and maybe don't do it while drinking! :-)

Enjoy the holiday, everyone (and the peace on the lists for those outside the states).

CFUnited presentations audio recordings now available free to attendees

Here's great news: if you attended CFUnited and want to listen to the presentations, they're now available free. Check out http://www.teratech.com/cfunited06/ and use your login and password from the event. You can find the powerpoint presentations as well. Video is still available to be purchased separately, it seems.

Sadly, not all the presentations offer recordings, even if they offer video. My own talk, for instance, has no MP3 available, and when I view the video, the audio was really crappy, which is perhaps why no MP3 was made available. Still, I found that 32 of the 41 talks do have audio.

Using Atlas (MS Ajax Toolkit) with CF, and getting CF / Atlas example working

Have you wondered about using Microsoft's Atlas tookit with CF? You can. It helps, though, to recognize that the toolkit is composed of multiple parts, one of which is a purely client-side toolkit and which can certainly work with CF. There's even sample code to demonstrate it.

Before I point that out, let me clarify that Atlas has also been renamed recently and is now named in ways that recognize the different parts. The client portion is now called the Microsoft Ajax Library.

There's a demo zip showing CF/Atlas integration available at the blog of the MS Developer who presented it at CFunited, Brad Adams. As discussed in the blog and comments, just unzip the file into your web server root. Assuming you leave it named AtlasCF, you need not change the code--except for one thing.

If you have CF Debugging turned on, the app will fail to work (without any message). Of course, the debugging will cause his CFM page (called from the Atlas client) to send the big load of HTML debugging info at the bottom of its output--and his Atlas client obviously won't be expecting that.

The simple solution is to drop:

<CFSETTING ShowDebugOutput="no">

into the application.cfm.

Sadly, he's got comments turned off so I can't offer this there, though I have emailed him and hope he may update the blog entry.

Perhaps others out there are also doing CF/Atlas integration. If so, drop some comments here for others who may be interested to hear.

Need a (safe) searchable archive for your mailing list? Get one for free!

Is your group's mailing list run on a traditional list server? If so, do you have an available, searchable archive of past messages? If not, or if it doesn't work well, here's a free solution for your group.

mail-archive.com is a free service for archiving any mailing list. Once your list's archive is created, the service will receive and archive all future messages to the list, and offers a web-based interface for anyone to view the list messages (by date or thread) and of course search existing messages.

And yes, someone can even import past messages to stock the archive (http://www.mail-archive.com/faq.html#import). Cool! Better still, it protects the privacy of the list members by hiding or obfuscating their email addresses. They even make it possible to respond to the sender via the archive using a special server mechanism that avoids delivering the address to a spambot. See the info at http://www.mail-archive.com/faq.html#spam and skip to the 2nd paragraph for more. I note they even detect emails in signatures and remove those, replacing it with "[EMAIL PROTECTED]". Very nice. They even have a mechanism to permit a sender to a list to PREVENT their message being archived (by their including the header X-No-Archive: yes). Finally, I'll point out that other CF mailing lists already use it, including the venerable CF-talk list: http://www.mail-archive.com/index.php?autobahn=nolimit&hunt=fusion so a list organizer or list member can check out the interface before deciding whether to use it. If you're interested in doing this for your list, you may want to contact the person who runs it (though, technically, they don't mandate that you be the list owner to set it up). You may at least want to announce your intent on your list to avoid a bunch of members setting up duplicates. Feel free to point them to this very blog entry to learn more.

And on a related topic, if your group's mailing list is hosted on a "groups" site like google or yahoo groups, then you should already have archiving and searching of the list contents there.

If you have a group and don't yet have a list, you should consider those free "groups" services. It's a great way to bring a community together. I've written elsewhere about that. (Update: tipicalcharlie domain is no more, but page recovered using Archive.org.)

PS I do realize that Gmail could help me here, as an individual, but this is about solving the problem for all members of the list.

PPS I'd like to point out that I did previously write an entry on this same topic on another blog but wanted to reprise and update it here for those who may have missed it.

Switching among source windows in Eclipse/CFEclipse

Those who know me well know I'm a big fan of keyboard shortcuts. I could give a whole session on them (and perhaps someday will), so I want to share one that I learned and which is useful if using Eclipse, CFEclipse, or FusionDebug. While many know ctrl-tab will swap among windows in many programs, that doesn't work in Eclipse. Try ctrl-F6 instead, which will show a drop down list of open files and let you scroll forward through them. To go backwards in the list, use Shift-ctrl-f6. Cheers.

PS For other keyboard shortcuts I've shared, going beyond things related to CF, check out the category/tag on the topic at my other (older) blog, tipicalcharlie.com: http://www.tipicalcharlie.com/tags/?/keyboard%2Bshortcuts (domain gone, page recovered from Archive.org)

PPS The entry above on ctrl-f6 is just one more point to be made about looking at Eclipse as a whole when using either CFE or FD. Don't just focus on what those plug-ins add, but rather also on the built-in features of the Eclipse interface which may help you with day-to-day functionality.

Update: Since writing this in 2006, note the several comments below where people offered still more. And of course since then CFBuilder has come out, and with its built-in Aptana offers still more of them. Indeed, in a talk I did on hidden gems, I list other shortcuts for switching windows.

Looking for great (free) web site design templates? check out oswd.org

Most of us CF/web app developers aren't particularly skilled at site design/layout/CSS, etc. If you're creating a new site for yourself or clients, how would you like to know about a repository of over 1,600 free, well-designed, CSS-based, XHTML-compliant web site designs? Check out http://www.oswd.org/, a 5-year old repository of just that. Indeed, if you like the design of my site (carehart.org), I got it there, as mentioned at the bottom of my site's front page. Just thought others might not yet have heard about the resource. Enjoy!

oswd logo

My latest 2 CFDJ articles

Check out the 2 latest articles I've done in the CFDJ (you can read them online for free): one is on FusionDebug Tips and tricks, and the latest is on using the nifty (free) LogParser tool with CF.

Sys-con has been working hard to catch up on late delivery of the magazine, as well as to bolster the content with topics that will appeal to a wider CFML audience. I'm glad to be a part of that effort after being quite absent myself for must of the past 3 years. (See the more than 50 other CFDJ articles I've done in the past 7 years.)

Good news: the CFDJ site search feature is functioning once again

For those who, like me, often refer to past articles in the CFDJ magazine's online site, I'm delighted today to notice that the search bar (top of all pages) is now working again. It's been disabled for a couple of years.

Don't know if others have blogged about that (as I just mentioned, I'm in Europe this week and next, so not connected too often or too well while traveling).

It turns out that they've enabled the Google Site Search feature, which while not an internal search engine is at least much better than nothing at all. It found the things I was looking for, and though I've long used the Google site search feature to get around this there (and at other sites), many don't know how to use it, so it's certainly a step in the right direction.

I understand after talking with them that they are indeed looking to get the real CFML-based search to work again, and I may even help them with that now that I'm on my own. Anyway, in the meantime, enjoy.

On my European swing for 2 weeks of speaking at CFUGs, classes, and Conference

As I alluded to a couple of weeks ago, I'm now in the midst of a two week swing through Europe speaking at user groups and the CFDevCon conference, as well as teaching a couple of day-long classes. See the links below for more info. But here's where I'll be. If you're in the area, please come by and say hello:

Mon Oct 30, Zurich, CF User Group
Thurs Nov 2, Munich, CF User Group
Fri Nov 3, Munich, Day-long class on FusionDebug and FusionReactor
Mon Nov 6, Rome, Rome Adobe User Group
Thurs Nov 9, London, CFDevCon
Fri Nov 10, London, Day-long class on FusionDebug and FusionReactor

More info:

"Interested in a day of training on FusionDebug and FusionReactor? Join me in Europe"
http://carehart.org/blog/client/index.cfm/2006/10/11/presenting_all_day_fd_fr_class_in_europe

"Considering the London CF DevCon? It just got better: Ben Forta will be speaking"
http://carehart.org/blog/client/index.cfm/2006/10/16/ben_at_devcon

"More benefits for those who come to my FusionDebug/FusionReactor class the day after London CFDevCon"
http://carehart.org/blog/client/index.cfm/2006/10/18/london_training_offer

Adobe acquires Serious Magic (nifty video software)

Adobe has acquired the company Serious Magic, makers of some nifty video software (particularly Visual Communicator). While this news is making the rounds on the Non-CF feeds at MXNA and FullAsAGoog, I don't see it mentioned yet in the CF feeds. No, it's not a CF-specific product, but it may appeal to some in the CF Community who like to create video content. You can read the press release for more.

I've been a Serious Magic customer for a couple of years, though I've never gotten around to using my VC license. :-) It's really interesting, allowing you to create compelling "tv-like" videos using green screen technology (to have your video appear within or atop an interesting background) and teleprompting to ease reading of scripts. (Since I've never given speeches or read on screen from scripts, I'll admit that's not suited me.)

But if you haven't seen what the tool can do, check out the product page which has a nice few-minute long embedded video (that starts within a few moments of viewing the page) in which the author has used the tool to demonstrate itself.

I wish I'd gotten around to using it, as now with the Adobe acquisition I expect to see a lot more use of the tool. "I coulda been a contender!" :-) Enjoy.

Are you recording CFUG meetings? Check out this tip to track how many visits you get

If you're a CFUG manager who may be taking advantage of the really nice offer from Adobe for us to use Connect to broadcast and/or record user group meetings, here's a nice tip for being able to track how many people have viewed the recording.

It turns out you can move a "Recorded Meeting" to the "Content Area" of your Connect account, so that Connect will treat the recorded version as "Content". Once you move it, you will now have access to the report section for the "content" (including the count of users who accessed the recorded version).

(Thanks to "Alain" on the Connect forums for sharing that answer when I asked about the challenge.)

Once you move it, you may wonder where to find it in the Connect Admin interface. You generally work in the "meetings" area, but you'll see a link in the top navbar next to that saying "content". That's where the recorded meeting is moved. Any URL for the recording remains the same.

What's more the count reflects all views since you recorded it, not just since you moved it.

One gotcha to watch out for: be sure to check the permissions on the recording, as the move could change the permissions. (Update 11/07: there was a time when I observed that the permissions would change, but recently I observe that I no longer need to do that.) Check "set permissions" while looking at the list of meetings at Content>My Content.

For more on the notion of user group managers using Connect, see the links below.

More Entries

BlogCFC was created by Raymond Camden. This blog is running version 5.005. (Want to validate the html in this page?)

Carehart Logo

Managed Hosting Services provided by
Managed Dedicated Hosting