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

Recent Blog Posts by Ben Nadel

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

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

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

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

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

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

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

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

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 »

Experimenting With Lazy Queries And Streaming CSV (Comma Separated Value) Data In Lucee CFML

CAUTION : I've never actually used "lazy" queries before. And, I've never used them outside of my development environment. As such, this is just me experimenting in public. Do not take anything in this post as a suggestion of best practices. There may also be factual errors in what I d... read more »

Celebrating The Power And Simplicity Of CSV (Comma Separated Value) Data In Lucee CFML

Yesterday, I learned that one of our clients at InVision uses our comment export feature as a critical part of their product development life-cycle. This feature takes comments from across an entire prototype and serves them up as a CSV (Comma Separated Value) file. It's amazing - and, frankly,... read more »

Calculating Derived Datasets Using Objects As Indexes In AngularJS 1.2.22

At InVision , when I retrieve data from the server, the payload that's returned contains all the necessary information for the view. But, it's not always in the necessary view-model format. As such, I have to generate some degree of client-side data based on the AJAX response. Lately, I've been ... read more »

Expected And Unexpected getBaseTagData() Behavior In Lucee CFML

In the implementation details of my ColdFusion custom tag DSL for HTML emails , I have to access the data exposed by ancestor custom tags. In some cases, the parent tag is dynamic; which means that I have to use the getBaseTagList() function in order to figure out the name of the ColdFusion cust... read more »

Working Code Podcast - Episode 019: Makefiles

Adam Tuttle first came into contact with makefiles (pronounced "make files") back in high school when compiling code. But, at the time, he didn't really understand what they were or how they worked - he was just a consumer. And, after high school, years went by in which he never gave ma... read more »

Using The URL As The Source Of Truth During Search In AngularJS 1.2.22

As of late, I've been building-out a number of Search-style pages at InVision in our legacy AngularJS platform. These search pages tend to include an open-ended keyword search in addition to several discrete filters that can be applied in parallel. As I've been wiring these pages together, I've b... read more »

Returning Search Filters Along With Search Results In Lucee CFML

At InVision , I'm building an experimental search page for a customer that has an abnormally large amount of data. And, as I've been working on this feature, I started using a technique that I've come to really like: returning the search filters (ie, the input parameters) alongside the search resu... read more »

Working Code Podcast - Episode 018: Feature Flags

For me and my team, few things have fundamentally changed the product development life-cycle as much as LaunchDarkly , a feature flag management platform. Feature flags allow software engineers to separate the "deployment" of code from the "releasing" of code. Which means saf... read more »

Using Array-Like Structs As Arrays In Lucee CFML

The other day, when I was working on unifying type casting errors in Lucee CFML , I spent some time digging around in the Lucee source code on GitHub looking for examples of casting error messages. As I was doing this, I came across a Java class called StructAsArray . This wrapper class appears... read more »

Experimenting With Try / Catch / Retry Semantics In Lucee CFML

The other day, when I was looking something up in the Lucee CFML documentation, I came across a page that outlined the CFRetry tag . This tag will jump the control flow back up to the CFTry ingress, re-running the volatile execution pathway. I'm not sure I've seen this tag before. And, I don't... read more »

Unifying Type Casting Exceptions For Cleaner Log Aggregation In Lucee CFML

At InVision , we use Loggly as our centralized log aggregation service. And, when I go to consume said logs, I am generally breaking them down by "Error Message". Most of the time, this is great. However, when a script kiddie starts barfing malicious data into my pages, it creates a ... read more »

Task Switching, Sensory Specific Satiety, And Staying Productive At Work

As a software engineer, one thing that I've never connected with is the idea that engineers only have "N" number of hours per day in which they can be productive. I believe this concept stems from a lack of strategy , not a lack of capacity . I am not going to argue that every hour of e... read more »

Working Code Podcast - Episode 017: Premature Optimization

This week, the crew talks about "premature optimization". As I explained it to my wife, this is when you "solve problems that you don't have yet" . But, what kind of problems are we talking about? Missing features? Missing methodologies? Missing performance characteristics? It ... read more »

Rethinking Error Type Schemas And Naming Conventions In My ColdFusion Application

Over the last few years, I've spent a lot of time thinking about error chaining , the difference between throwing errors and reporting errors , and a general set of DOs and DON'Ts for managing errors in an application . But, I've never put much thought into an error type schema or a naming con... read more »

A Peek Into The Interstitial Cost Of Microservices

As I've discussed recently, my team at InVision has been investing time in merging microservices back into our ColdFusion monolith . And, this week marks yet another successful subsumption of a Go microservice into our CFML juggernaut. What makes this example so interesting to me is that the t... read more »

Things I Regret: Returning Modified Data In API Response Payloads

When you work on the same web application for the better part of a decade, your architectural choices have plenty of time to learn you a lesson, showing you what works and what definitely does not work . And, one software architectural choice that has bitten me in the butt time and time again is t... read more »