Adam Tuttle

ColdFusion 11 Member Functions: Where They Got It Wrong

One of the things that Adobe put into ColdFusion 11 that I actually like (*coughs in the general direction of cfclient*) is member functions.

With them, this perfectly functional —if a bit inside out— line of code:

dateTimeFormat( dateAdd( 'd', -5, now() ), 'yyyy-mm-dd' );

... can be rewritten as the much more readable:

now().add( 'd', -5 ).dateTimeFormat( 'yyyy-mm-dd' );

At a glance, I personally enjoy reading the latter one more than the former. It's easier to read left-to right rather than unpacking sets of parenthesis mentally.

But there's still one problem here: .dateTimeFormat() Why not just .format()? Probably because they support all three non-member-function variants: someDate.dateFormat(), someDate.timeFormat() and someDate.dateTimeFormat().

Maybe this doesn't sound completely crazy to you. Fair enough. What if I tell you that, aside from List functions (which get a pass because lists aren't actually a type, they're just strings with some extra parsing rules implied) these three member functions are the only member functions that include their type prefix? Here's the list of all new member functions so you can check for yourself. Now do you think it's an anomaly that's worth looking at?

How can we fix this? By realizing that we don't need all three. The new dateTimeFormat() function added in CF11 uses slightly modified masking from its dateFormat and timeFormat predecessors to allow it to do everything they can do, only better. And since dateTimeFormat() is new in CF11 (just like member functions), it makes a good amount of sense to rip this band-aid off now, while we still can. If we wait any longer, someDate.dateFormat() is going to end up in a lot of existing codebases, and we'll never be rid of it, because of backwards compatibility.

As Scott Stroz is fond of saying, "If only the meeting had lasted 5 more minutes..."

Some have called for deprecation of the dateFormat and timeFormat member functions. I disagree, but also think it's better than nothing. My opinion is that member functions are still new enough that it's ok to say, "Sorry, we screwed this up. Let's fix it before we make it any worse."

This has been logged as a bug: 3940802. Your votes and comments would be appreciated.

Published 2015-02-16 @ 05:07 in ColdFusion

My Thoughts on James Harvey's Apology

In my last entry I detailed all of the evidence we could amass for the systematic and repeated plagiarism of James Harvey, aka WebDevSourcerer before he erased his existence from the internet. (We still have archive.org and the google cache, but I think we've built a pretty solid case against him already, why spend more effort?)

I knew at the time that Dave and Scott, the hosts of the CFHour podcast were also trying to reach out to him and get his side of the story. (How journalistic!) I never expected him to respond, given his track record of silently pulling down content instead of apologizing to those he was stealing from.

But he did.

As you may have heard on the most recent episode, if you've listened to it yet, he sent them back a response and attached an apology. He specifically said they could "disperse it as [they] see fit," and Scott sent me a copy for my use here. I'll reproduce the apology letter in full, and then comment on each section below.

To those out there on the internet, calling me a plagarist, I say this:

I am most sincerely sorry.

I meant no disrespect, nor did I intend (or have it interpreted) that I was taking credit for items I had posted. I was using a very well assembled reference, and appending to it, however that wasn't ever mentioned, nor does it need to be any further as the offending post was removed and purged.

I meant only repsect and admiration of my community peers, not trying to take credit for thier works in any way. Yes, perhaps I had "written" I had developed or written certain codes, as I've done similiar projects, and often do get them mixed up.

I am trying to get the exposure out about ColdFusion, and how dynamic and powerful a development language it is, and I can appreciate everyone's views about that. That's it isn't as "dead" as others would like to think, and assist in making it a prevelant language again.

Of that I am guilty, and I am sorry, with all my soul, about that.

Yes, perhaps I should have made it exceedingly clear in my writting that I was not the source of the reference, but merely a messenger and trying to get the exposure for the language back out there.

For a long time, I hadn't seen what other communities were saying about the coldfusion one, until now.

I'm sorry for promoting a fantastic language, I'm sorry for not citing my sources properly or clearly, and I'm most sorry that you all aren't happy with getting your work admired and respected by another peer.

-James Harvey


Ok... so first of all... I guess... I appreciate that he acknowledged he was in the wrong and (sort of) apologized. But let's look at what each individual section is actually saying, and see if that mounts to a successful apology.

To those out there on the internet, calling me a plagarist, I say this:

I am most sincerely sorry.

A decent start, I suppose.

I meant no disrespect, nor did I intend (or have it interpreted) that I was taking credit for items I had posted.

I find this disingenuous given that he literally said "This is a ColdFusion Component the Ol'Sourcerer wrote some time back" (that is a verbatim quote) in his blog post taking credit for Nathan's pagination CFC, and had a git commit that removed Nathan's copyright info. I think he very much meant to take credit for it.

I was using a very well assembled reference, and appending to it, however that wasn't ever mentioned, nor does it need to be any further as the offending post was removed and purged.

That you kept meticulous records of what you stole and from whom does not excuse the stealing. And he referred to it as if it were a single offending post to make it seem like we're blowing things out of proportion when at least 4 were identified and documented (screen shots still available), and he took down his entire website, Twitter account, and GitHub account to scrub any more offending content before it could be found. Shady? Shady.

I meant only repsect and admiration of my community peers, not trying to take credit for thier works in any way. Yes, perhaps I had "written" I had developed or written certain codes, as I've done similiar projects, and often do get them mixed up.

More disingenuous hand waving, in my opinion. I use jQuery a lot, and I write a lot of my own JavaScript, including modules and micro-libraries, but I never forget that I didn't write jQuery. Even if you forget...somehow... If you don't remove the copyright text, you'll have that to remind you.

Respect and admiration manifests as "check out this awesome code that Nathan wrote" not "The Ol' Sourcerer is at it again."

I am trying to get the exposure out about ColdFusion, and how dynamic and powerful a development language it is, and I can appreciate everyone's views about that. That's it isn't as "dead" as others would like to think, and assist in making it a prevelant language again.

Whether or not he's right about CF's abilities and perception (and if you want to think highly enough of him to believe him capable of such manipulation, this could be seen as attempting to garner support by claiming altruism for the platform, something most CF community members would respect), that does not excuse stealing in any way, shape, or form. Altruism or no.

Of that I am guilty, and I am sorry, with all my soul, about that.

I think I mostly believe this. If I were him I'd be losing a lot of sleep over this. If future would-be employers Google him, there's a chance his past could cost him a lot in the future. As well it should.

Yes, perhaps I should have made it exceedingly clear in my writting that I was not the source of the reference, but merely a messenger and trying to get the exposure for the language back out there.

And doing so properly would have taken less effort than what he did. A paragraph or two and a link is a heck of a lot easier to write than copying the code, reformatting it, and removing the copyright information. He systematically stole, and tried to hide the evidence.

If his intention was to shine a spotlight on available great content, he did a terrible job, and temporarily made himself look marginally better in the process. Which is more likely: that he did extra work to achieve a worse result and accidentally propped up his own reputation in the process, or that he did exactly what he was trying to do?

For a long time, I hadn't seen what other communities were saying,about the coldfusion one, until now.

What does that even mean? I could speculate about this, but I'll just let it go for now.

I'm sorry for promoting a fantastic language, I'm sorry for not citing my sources properly or clearly, and I'm most sorry that you all aren't happy with getting your work admired and respected by another peer.

Nobody once criticized his admiration of CF. And I'd bet a beer (redeemable at dev.Objective() next May) that I speak for everyone that blogs about CFML or shares code when I say: We love the admiration and respect of peers. That's not why we blog and share code, but it does give us a warm, happy feeling.

Maybe he was promoting CF... great? But in what reality does stealing count as respect and admiration?

Sorry James. I'm not impressed by your "apology." You admitted wrongdoing but barely took responsibility. Still pretty unprofessional, in my book.

Published 2015-01-30 @ 01:00 in Meta

Do Not Hire: James Harvey "WebDevSourcerer"

If you see this man, do not hire him. He is of low moral character and not to be trusted.

I've taken this above photo of James Harvey from his own About Me page (google cache), and copied it to my own server, without his permission, on the off chance that he takes it down or renames it to try and remove it from this entry. He's already proven he's capable of worse.

Indeed, before I could even finish writing this entry he seems to have taken his whole website offline.


Over the last few days, a few of us have discovered and begun investigating what seemed to be recurring plagiarism of authors and works in the ColdFusion community. It all started with Adam Cameron noticing someone stealing his CFScript documentation and claiming it to be his own work (google cache).

When prodded about it, James Harvey, who also goes by WebDevSourcerer on Twitter and on Github, simply removed the offending blog post without so much as a, "Sorry about that!"

Of course we're still digging!

So far, Sean Corfield has found two more instances: One in which he claims that he wrote (google cache) some code that Nathan Strutz posted. Since I expect he'll take that down too, here's a screenshot for posterity: (click for full size)

And the second instance that Sean has found so far is one where he is claiming a stack overflow answer by Tony Petruzzi to be his own (google cache). Screenshot for posterity: (click for full size)

As I've started writing this, it looks like Kev McCabe has found another instance, where James has ripped off (google cache) content from Ray Camden. Again, screenshot for posterity: (click for full size)

And that's where I'm going to stop. ...For now? For the canonical list of things that we know James Harvey has plagiarized, check Adam Cameron's similar blog entry: Public service announcement: James Harvey / @webdevsourcerer is a systematic plagiariser

Why am I so riled up about this? Because I have spent almost 8 years creating free (not always great, but always honest!) content for the ColdFusion community. I would be absolutely sick if I found any of my content on his website with his name on it. (And believe me, James: I'm on the hunt.) And these are my friends he's been ripping off. I know I've had beers (or other non-alcoholic bevvie's in Nathan's case) with 3 of the 4 victims mentioned so far and I'm about half sure on the 4th.

Furthermore, in this industry without your integrity you're nothing. James Harvey? You're nothing, buddy. I hope all of our announcements about your abhorrent behavior outrank every other page about you on Google, and every potential employer you ever apply to Googles you. I hope your self-aggrandizing behavior was worth it, because it might turn out to have been career suicide.


To anyone else that happens to be named James Harvey and be unfortunate enough to work in the IT industry, I feel sorry for you. But this must not stand. That's a big part of why I've included his photograph. At least you can have facial comparison on your side...

Published 2015-01-25 @ 04:33 in Meta

Save Elvis! er, I mean ?:

Today was an interesting day.

I got an alert from the Adobe Bug Tracker, as I often do, to let me know that there was a change to one of the bugs I created / voted for / commented on. I clicked through to see what bug it was and what was new. It was a new comment on this beauty (CF11u3 broke the ?: operator) from everyone's favorite CFML curmudgeon (I think?), Adam Cameron. He asked what the status was for releasing the fix.

"A valid question!" I thought to myself, considering the bug was marked fixed on December 22nd, 2014. What gives, Adobe? Where's the fix? So I tweeted it, too. I believe strongly that the prescribed methods of communication should be used, until you start getting ignored or otherwise let down. Then, if the cause is just, it's time for a small dose of public shaming:

A few tweets were had back and forth between myself, Elishia, and Anit, with the end result being that the fix is scheduled for the next regularly scheduled update. Sounds great, right? Except updates are quarterly. Who wants to wait 3 months for a regression to be fixed? Is that even reasonable for a commercial platform? I don't think so, personally. Here's what I wrote in a comment on the bug, following that conversation:

I've already stated this elsewhere but just to put it on the record: I think that waiting for a quarterly update to fix a regression Adobe caused is terrible.

You say, "If you need a fix sooner, please contact our support team to request a private fix for this."

This implies that you have or can fairly easily create an update that fixes the issue. Why not just release that as update 4 and push all of the other non-update3-regressions back to update 5 on its normal schedule?

Further, "If you need a fix" can be rewritten as, "If you're using this feature" and I can assure you that either people have rolled back to update 2 or removed the feature from their code, because having syntax errors in your code is not just something you can leave be while you wait 3 months for a fix.

Either one is a losing proposition: There were things that are very nice to have included in Update 3 (many, many things, if my memory is correct. And if so, good and thank you for the update!) so rolling back to Update 2 denies us of useful features and bug fixes JUST like staying on Update 3 would deny us of this feature.

And lest you think I'm just being a jerk-nose for the sake of jerk-nosing...

Alas, that was the last they seem to have to say on the matter. Unacceptable, in my opinion. They did, however, offer to provide a "private fix" (their words) for anyone that asked.

For my part, while I do want it fixed, I don't consider myself special. I don't have a support contract — aside, you know, from the fact that CF11 was just released and is still in core support. So I'm not requesting a "private fix." But that doesn't mean you shouldn't.

In fact, I had the idea that we should more or less flood them with (legitimate) requests for the "private fix" in hopes that, if we can get enough, it will be easier for them just to go ahead and release an out-of-band patch. Also known as "doing the right thing."

So I made a form for you. Just click on over here, enter your name and email address, and submit the form. They'll be emailed, and you and I will be copied. (I keep a copy for posterity. Don't want any funny business with fudged numbers...)

Please feel free to share the link, and please only use the form once. It does not make any attempt to prevent duplicate submissions, and in my estimation they'll do more harm than good, so let's just keep things on the up and up, ok?

Published 2015-01-21 @ 04:34 in ColdFusion