Skip to main content
Ben Nadel
On User Experience (UX) Design, JavaScript, ColdFusion, Node.js, Life, and Love.

Recent Blog Posts by Ben Nadel

Adobe ColdFusion 2018 Compatible Version Of My ColdFusion Custom Tag DSL For HTML Emails

Over the past couple of months, I've been working on a ColdFusion custom tag DSL (Domain Specific Language) for HTML emails . It's been a thrilling adventure; and, it's been tremendously satisfying to see this approach being applied for great good at InVision . That said, InVision runs on Lucee C... read more »


Using The LaunchDarkly REST API To Update Rule Configuration In Lucee CFML 5.3.7.47

I am not bashful about the fact that I love using LaunchDarkly for our feature flags at InVision . But, the vast majority of my experience revolves around their Java SDK which implements the rules engine consumer and the server-sent event streaming. I actually have very little experience wit... read more »


Working Code Podcast - Episode 026: Passwords

This week, the crew talks about passwords. Web applications store a great deal of sensitive information. But, there is something categorically different about storing passwords. Because - if compromised - a password from one application may grant a malicious actor access to another application.... read more »


Managing Lists Of IDs Using HTML FORM Posts In Lucee CFML 5.3.7.47

At InVision , I'm in the middle of building a custom feature for one of our clients. This feature lives outside of any SPA (Single-Page Application); and, uses "old school" form submission techniques to process the interactions. The techniques that I'm using are the same ones that I lear... read more »


Changing Function Argument Defaults At Runtime In Lucee CFML 5.3.7.47

In the vast, vast majority of cases, when I author a Function in ColdFusion that has default argument values, those values are static. Meaning, the argument falls-back to a hard-coded token like 0 or "" or false . The other day, however, when I was exploring the Password4j password ... read more »


Working Code Podcast - Episode 025: Breaking Up With Your Stack

There's no one reason that companies move away from or onto a technology stack. Sometimes a given technology is no longer actively updated; sometimes the pool of developers that uses a technology shrinks, making it hard to hire new engineers or find community support; sometimes people just li... read more »


The 14th Annual Regular Expression Day - June 1st 2021

For 14 years I've been trying to spread the joy - nay, the awesomeness - of Regular Expressions. And while my love of Regular Expressions continues to grow with each year, it turns out, so does the complexity and overhead of adulting . For the past few years, this day of reflection has snuck u... read more »


Migrating Password Hashing Algorithms In Lucee CFML 5.3.7.47

Over the weekend, I looked at using the Password4j password hashing library in Lucee CFML . One of the APIs that the Password4j library includes is the ability to update a hash with new hashing characteristics. This is actually something I've had to do in the past - migrating a system to a stron... read more »


Using Password4j And The BCrypt, SCrypt, And Argon2 Password Hashing Algorithms In Lucee CFML 5.3.7.47

At InVision , we use BCrypt to perform a one-way, cryptographic hash of user passwords. Which we've been doing for as long as I can remember. In a conversation the other day, however, I mentioned to Adam Tuttle that I thought there was now a more "modern" hashing algorithm; but, that... read more »


Including Tracing Headers In Nginx 1.18.0 Access Logs Using Custom Formatting

As I mentioned yesterday, we're trying to track down a mysterious logout issue at InVision . Part of this investigation involves trying to understand where an even more mysterious 502 Bad Gateway error is coming from. Due to the many layers of our network, it's proving difficult to figure out ... read more »


Using The "X-Amzn-Trace-Id" Header For Request Tracing Through Amazon's Load Balancers

At InVision , David Bainbridge and I have been working hard to figure out why some users are getting randomly logged-out of one of our client-side applications. Part of what makes this issue so challenging to debug is that there are many services that touch requests coming out of this applicat... read more »


Working Code Podcast - Episode 024: The Archetype Of An Effective Developer

We all love the Hollywood portrayal of the "brilliant programmer" who can step in and just crush it at a moment's notice. We've probably all fantasized about being that programmer . But, that's not how people work. And it's not how teams work. Highly effective developers don't just "... read more »


Using ColdFusion Custom Tags To Create An HTML Email DSL In Lucee CFML 5.3.7.47, Part XV

Rolling my ColdFusion custom tag DSL (Domain Specific Language) for HTML emails out at InVision for transactional emails has been fairly straightforward. The content of those emails are mostly static; and, the dynamic bits are highly predictable (just names and URLs). However, now that I want t... read more »


Working Code Podcast - Episode 023: Clean Code By Robert Martin (Part 2)

This week, the crew meets to finish their review of Clean Code: A Handbook of Agile Software Craftsmanship by Robert Martin (aka, "Uncle Bob"). This book is filled with so much thought-provoking information that it took us two episodes to get through it! And, while some of the practic... read more »


GetBaseTagData() Works Differently In Adobe ColdFusion 2018 And Lucee CFML 5.3.7.47

For a few weeks now, I've been slowly rolling out my ColdFusion custom tag DSL for HTML emails at InVision . And, it's been great! So, yesterday, I decided to start using it on my blog for the comment emails. However, InVision runs on Lucee CFML and my blog runs on Adobe ColdFusion 2018; and, it... read more »


Using The Elvis / Null Coalescing Operator To Loop Past Array Boundaries In Lucee CFML 5.3.7.47

The Elvis / null coalescing operator ( ?: ) in Lucee CFML allows us to evaluate expressions that have fallback values if the left operand results in a null / undefined value. It's a powerful operator; and, can even replace the safe-navigation operator under certain circumstances. One place that I... read more »


Pro Tip: Using The say Voice Synthesis Command After A Long-Running Task

This is a pro-tip that I picked up from Aaron Lerch - using the say voice synthesis command after a long-running command-line task. Often times, at work, I'll have to run some sort of compilation process that can take anywhere from a few seconds to a few minutes. And, in order to maximize my pr... read more »


Using The CSS Function calc() Inside The LESS CSS Preprocessor

This is a note-to-self . I've several times wanted to use the CSS function, calc() , inside of my LESS CSS preprocessor. However, when I went to use it, I didn't get the expected value. calc() appears to conflict with a built-in function inside of LESS. As such, if you want to use the CSS funct... read more »


Working Code Podcast - Episode 022: Clean Code By Robert Martin

This week, the crew talks about Clean Code: A Handbook of Agile Software Craftsmanship by Robert Martin (aka, "Uncle Bob"). Recommended to us by friend-of-the-show Adam Cameron , this book outlines a series of "best practices" that programmers can use in order to create app... read more »


Creating Page-Breaks In CFDocument Without Using CFDocumentItem In Lucee CFML 5.3.7.47

The other day, I was experimenting with the SrcFile attribute on the CFDocument tag as a means to pre-generate the HTML source for a PDF. Normally, when generating a PDF, I would just inline the CFML code inside the CFDocument tag-body; and, I'd use the CFDocumentItem tag with type="... read more »


CFSaveContent Trim And Append Attributes In Lucee CFML 5.3.7.47

The other day on the Lucee Dev forum, I proposed that we add a file attribute to the CFSaveContent tag in Lucee CFML. And, as I was writing that proposal, I pulled up the docs page for the CFSaveContent tag; which is when I was surprised to see that Lucee actually offers two additional att... read more »


Collecting HTML Class Name Attributes In Template Rendering In Lucee CFML 5.3.7.47

The other day, I was updating a CFML template to include some conditional CSS class names in an ordered list. And, by the time I was done, the CFML looked a hot mess with several ternary operators all being interpolated into one class="" attribute. And, as I sat there, wallowing in the ... read more »


Using Both SrcFile And CFDocumentItem In The Same CFDocument Tag In Lucee CFML 5.3.7.47

At InVision , we generate a surprising number of PDF documents. For the most part, the CFDocument tag in Lucee CFML just works . But, sometimes, PDF generation eats-up all the RAM and an OOM (Out of Memory) error is thrown. As such, I'm always on the lookout for ways to tweak the PDF generation... read more »


Validating And Documenting Complex Object Structures With CFParam In Lucee CFML 5.3.7.47

At InVision , we generate our transactional emails by including a CFML template into a <CFSaveContent> buffer; and then, using that buffer as the body attribute of a CFMail tag. And, since the definition of that template feels somewhat "far away" from the context in which it ... read more »


Working Code Podcast - Episode 021: Listener Questions

This week, the crew responds to questions shared by our wonderful, wonderful audience! Nathan Strutz - who called the Working Code Hotline - shares his exciting journey into feature flags; Ryan Mueller wants to compare and contrast Kanban and Scrum style project management; and, LD2 covers the ... read more »


Setting Global, Default Tag Attributes With "this.tag" In Lucee CFML 5.3.7.47

In Lucee CFML, you can assign global, default tag attributes using the this.tag object in the Application.cfc ColdFusion component. I've never actually used this before; and, I've seen the technique mentioned both with and without the cf -prefix. As such, I wasn't sure what the official ap... read more »


Using ColdFusion Custom Tags To Create An HTML Email DSL In Lucee CFML 5.3.7.47, Part XIV

After months of incrementally building-out my ColdFusion custom tag DSL (Domain Specific Language) for HTML emails , I've started to apply this technique to the transactional emails at InVision ! I'm totes excited about this, not only because I think it will bring a pleasant unity to the look-and... read more »


Modernizing My CSV (Comma Separated Value) Parser In Lucee CFML 5.3.7.47

In the past week, I've written a few posts about generating CSV (Comma Separated Value) data in ColdFusion , including some experimentation with "lazy" queries and streaming CSV files in Lucee CFML . Just coincidentally, Adam Cameron asked me about a very old post that I wrote for ... read more »


GetTickCount() Precision Argument In Lucee CFML 5.3.7.47

The other day, while looking through some Lucee CFML documentation, I came across an example that used the built-in getTickCount() function with an argument . I've been using getTickCount() since the beginning of time and I never once noticed that it accepted an argument (at least in the Lucee... read more »


Working Code Podcast - Episode 020: Carol Needs A Consult

At Carol's company, Support emails are sorted, labeled, and processed using a manual - and very expensive - workflow that won't be able to scale with the increasing demand. As such, Carol is looking to build a robust auto-reply system on Amazon Web Services (AWS) using machine learning (ML). At l... read more »