[Looking for Charlie's main web site?]

Like the UGTV site? Vote for it at CFDJ Awards

Note: This blog post is from 2006. Some content may be outdated--though not necessarily. Same with links and subsequent comments from myself or others. Corrections are welcome, in the comments. And I may revise the content as necessary.
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

Note: This blog post is from 2006. Some content may be outdated--though not necessarily. Same with links and subsequent comments from myself or others. Corrections are welcome, in the comments. And I may revise the content as necessary.
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:


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"

   <cfhttpparam type="FORMFIELD" name="txtEmailAddress"



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)

Note: This blog post is from 2006. Some content may be outdated--though not necessarily. Same with links and subsequent comments from myself or others. Corrections are welcome, in the comments. And I may revise the content as necessary.
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.


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 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">


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

Note: This blog post is from 2006. Some content may be outdated--though not necessarily. Same with links and subsequent comments from myself or others. Corrections are welcome, in the comments. And I may revise the content as necessary.
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

CFEclipse for ColdFusion Developers, Jan 2006, Rob Rohan

Making the Switch to CFEclipse to Write ColdFusion Code, April 2006, by Jeff Houser

Robert Blackburn's CFEclipse Article Series at FusionAuthority

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

Introducing: CFEclipse Features

CFEclipse CFExplained Part I

CFEclipse CFExplained Part II

Introducing: CFEclipse Features

CFEclipse Features: Task List

CFEclipse Features: Code Folding

CFEclipse Features: Tag Insight

CFEclipse Features: Local History

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

Test-Driven Development with ColdFusion Part III: Integrate Your Tests into CFEclipse Using CFUnit-Ant by Robert Blackburn

Nathan Strutz CFEclipse Resource Page

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


Mark Drew's CFEclipse Videos

Finally, Mark Drew, who is leading the CFEclipse project now, has done a set of videos available as 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:


Reloading CF web services programmatically, using the CF7 Admin API

Note: This blog post is from 2006. Some content may be outdated--though not necessarily. Same with links and subsequent comments from myself or others. Corrections are welcome, in the comments. And I may revise the content as necessary.
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:


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

Note: This blog post is from 2006. Some content may be outdated--though not necessarily. Same with links and subsequent comments from myself or others. Corrections are welcome, in the comments. And I may revise the content as necessary.
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

Note: This blog post is from 2006. Some content may be outdated--though not necessarily. Same with links and subsequent comments from myself or others. Corrections are welcome, in the comments. And I may revise the content as necessary.
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

Note: This blog post is from 2006. Some content may be outdated--though not necessarily. Same with links and subsequent comments from myself or others. Corrections are welcome, in the comments. And I may revise the content as necessary.
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

Note: This blog post is from 2006. Some content may be outdated--though not necessarily. Same with links and subsequent comments from myself or others. Corrections are welcome, in the comments. And I may revise the content as necessary.
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!

Note: This blog post is from 2006. Some content may be outdated--though not necessarily. Same with links and subsequent comments from myself or others. Corrections are welcome, in the comments. And I may revise the content as necessary.
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).

More Entries

Copyright ©2021 Charlie Arehart
Carehart Logo
BlogCFC was created by Raymond Camden. This blog is running version 5.005.
(Want to validate the html in this page?)

Managed Hosting Services provided by
Managed Dedicated Hosting