Archive for the ‘Web Development’ Category

I was trying to use QueryAddColumn() today to add an additional column to a single-row array I’m working with. The 4th parameter to QueryAddColumn is an array of values to add to the query – 1 element in the array for each row in the query. Since my query only has on row in it, I thought this would be a good place to use ColdFusion 8’s new inline array syntax.

<cfset QueryAddColumn(qryFoo,
                     "newColName",
                     "varchar",
                     ["my additional value"])>

But this throws an unhelpful “Missing argument name” error:

Missing argument name. When using named parameters to a function, every parameter must have a name.

It took me a while to figure out it just didn’t like using the new array syntax inside the function. Doing it this way worked fine:

<cfset myArray = ["my additional value"]>
<cfset QueryAddColumn(qryFoo,"newColName","varchar",myArray)>

But having to do it that way kind of defeats the point, it doesn’t use any less lines than the old CF7 syntax:

<cfset myArray[0] = "my additional value">
<cfset QueryAddColumn(qryFoo,"newColName","varchar",myArray)>

And it means I have to “var” the myArray variable at the top of my function now. Hopefully Adobe will get this straightened out at some point.

One of the projects I’ve been working on recently requires the ability to receive faxes and place them into a customer’s account. At first we looked at using optical character recognition to scan out the customer’s ID from the cover sheet, but this route was looking expensive and time consuming, and we weren’t sure we would be able to reliably read the customer IDs, since faxes are sometimes hard to read even with the human eye. We are providing a pre-filled out cover sheet, so the customer ID would be printed, not hand written, but I think it would still be difficult to read.

Just around this time I saw Jim Rising‘s post on cf-talk saying that if you need to do this kind of thing, you really should be looking at using a 2D barcode instead of trying to OCR a number. So I did. He mentioned Java4Less, a company that sells reasonably priced (~$100) java libraries for reading and writing barcodes, including data matrix barcodes. A datamatrix barcode is a 2D barcode that can encode more data in less space than a traditional barcode. Its also much more durable, and can be read even when faxed several times. They look like this:

datamatrix barcode example

Continue reading ‘CFC for generating and reading 2D barcodes in ColdFusion’ »

Tonight I published an update to my Craigslist Spam Buttons greasemonkey script. (If you don’t know what this is about, see my earlier post). I’ve had some feedback on the script, and I was able to incorporate those requests. Now the [spam] buttons are displayed at the front of item link. And when you click on the link, a request is made in the background to mark the item as spam. You no longer have to jump to the flag-spam page, then click the continue browsing button to get back to where you were. Instead the [spam] button changes to a red check mark to indicate that it has been marked.

This is more difficult than you would think, you can’t just do a simple AJAX request because your browser will only make requests to the same site you are on. In this case you are browsing on yourcity.craigslist.org, but the flag-spam page is on flag.craigslist.org.

The greasemonkey extension does provide a built in method to make http calls to external sites, but that would break my Opera compatibility. So instead I load the flag-spam page as the src of a JavaScript-created image object.

It was fun to figure out, I really enjoy programming in JavaScript.

You can get the script from userscripts.org. Here is a screen shot:

Craigslist spam buttons, v1.1

I encountered a problem (or should I say an “opportunity”) where I needed to do some rounding in a query-of-a-query. This is normally very easy to do in most RDBMS, as there is usually some type of Round() function you can use. In my case I needed to round a percentage I was calculating in the Q of a Q down to only 1 decimal place. And I didn’t even really need to round it – I would be ok with simply truncating. Turns out this is a little difficult to do in a query of a query. There are no round() functions, no ceiling() or floor(), and no string manipulation functions. Here is what I came up with:
Continue reading ‘Rounding values in a Query of a Query’ »

A few months ago I decided to go on a book binge and acquired a stack of books about two feet tall. It includes classics such as The Pragmatic Progammer and Practices of an Agile Developer, as well as some on Java, Asterisk, Extreme Programming, Linux Firewalls, and a NASCAR book thrown in for good measure.

I’ve gotten through a couple, and will be posting reviews of a few of them. This week I finished Apache Security, from O’Reilly. I found this book while browsing the programming section of Borders (the programming section of my local Borders is amazing!), and I’ve found it to be a real gem.
Continue reading ‘Book Review – Apache Security’ »

A few weeks ago I had to interface to Authorize.net’s recurring billing API. This is a new API they released early this year. Prior to this, if you wanted a recurring billing subscription setup, you had to log into their site and set it up manually.

When I went to begin coding I searched high and low for an existing custom tag or cfc, but did not find any. So now that mine is complete, I’ve posted it on RiaForge.

ColdFusion CFC for Authorize.net recurring billing API

There is a README file in the zip archive that has fairly detailed instructions, but here are the basics:
Continue reading ‘Authorize.net recurring billing API CFC’ »

Or – Resolving the ColdFusion Content is not allowed in prolog Error.

If you’ve tried to consume web services with ColdFusion, you may have run into this issue when attempting to use the returned XML. I’ve seen this crop up when simply pulling in an RSS feed as well. Often there are some strange characters at the beginning of the XML response. We can see the problem if we use Firefox to browse to the Authorize.net web service:

Firefox BOM error
Continue reading ‘Cleaning up those funny characters on an XML web service result’ »

We had a need to do a case sensitive SQL comparison this week. As part of a login process a user is prompted for an answer to their security question. Now I really don’t think forcing users to enter their employer’s name in the exact case does anything to keep out hackers, but the client wanted it done this way.

Of course we could pull the values into ColdFusion and do a case sensitive comparison with Compare(). But the code was already setup to do the comparison at the SQL level, which is usually a better idea anyway if it can be done.

There are several ways to tell MS SQL to do a case sensitive comparison. Continue reading ‘Case sensitive comparisons in SQL’ »

When building an application that uses an Application.cfc file, many times the OnApplicationStart() method is used to initialize Application scope variables.

Since this method is only called once until the next server restart, its safe to set your Application variables here without using cflock tags. A common implementation may look like this:

<cffunction name="onApplicationStart" returntype="boolean">
	<cfset Application.dsn = "myDSN">
	</cfset><cfset Application.smtpserver = "localhost">
</cfset></cffunction>

But what happens when you need to change one of those variables? For example if you change the Application.smtpserver value to “newhost.com”, and save the file, Application.smtpserver will still be set to localhost. Restarting the ColdFusion server will force the OnApplicationStart() method to be called again, thus loading in your new value, but that is a little drastic.
Continue reading ‘Providing feedback when forcing a refresh of the Application scope’ »

Tonight I gave an “Intro to ColdFusion” presentation at the Omaha Dynamic Language Users Group. As promised, here are the links from my Resources slides. The full presentation is also available: Open Office (1194Kb), PDF (560Kb)