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

Recent Blog Posts by Ben Nadel

Building reMatchGroups() Using reFind() In Adobe ColdFusion 2018 And Lucee CFML

The other day, in my post about parsing strings like "5mb" into a number of bytes , I was griping about the fact that the ColdFusion language still doesn't have an reMatchGroups() function . To this, Adam Cameron mentioned that the reFind() function has had a "scope" arg... read more »

Code Kata: Parsing Strings Like "5mb" Into A Number Of Bytes In Lucee CFML

In yesterday's post about streaming an incremental ZIP file up to Amazon S3 in Lucee CFML , I had to wait until "chunks" were over 5mb (5 megabytes) in size before I could upload them. To do this, I literally calculated the number of bytes that equated to 5mb. Afterwards, I thought it wo... read more »

Generate And Incrementally Stream A ZIP Archive To Amazon S3 Using Multipart Uploads In Lucee CFML

Last week, I looked at using the ZipOutputStream Java class to generate and incrementally stream a Zip archive to the browser using Lucee CFML. In response to that, James Moberg and I were having a discussion about generating Zip archives asynchronously. This got me thinking about pushing t... read more »

Using CSS :target Pseudo-Class To Toggle Element Display

The other day, I was listening - I think - to the ShopTalk Show podcast when they mentioned the :target CSS pseudo-class . I had never heard of this CSS selector before; but, apparently, it allows you to target an element whose id attribute matches the URL fragment . This CSS selector is ... read more »

Working Code Podcast - Episode 006: Hopes For 2021

Oxford Dictionary included "doomscrolling" in their "word of the year" report for 2020; we're all feeling pandemic fatigue; many people still believe in wide-spread election fraud; the Georgia senate race was a nail-biter; and - oh yeah - we recorded this show the day after ... read more »

Array.Sort() Operator Has Trouble With Return Values Between Zero And One In Lucee CFML

As it is documented , the Array.sort() method (and arraySort() function), when given an operator to execute, are supposed to return the values -1 , 0 , and 1 when comparing two values within the collection. Documentation aside, the .sort() method is actually much more flexible than tha... read more »

Escaping The Build Trap: How Effective Product Management Creates Real Value By Melissa Perri

Last week, in the InVision Architecture Office Hours meeting, Shawn Hartsell recommended the book, Escaping the Build Trap: How Effective Product Management Creates Real Value by Melissa Perri . I'm not a Product Manager; but, the way Shawn talked about the book - touting "outcomes"... read more »

Using Both STORED And DEFLATED Compression Methods With ZipOutputStream In Lucee CFML

In yesterday's post about generating and incrementally streaming a Zip archive in Lucee CFML , I used the default compression method - DEFLATED - in the ZipOutputStream class. However, as I've discussed in the past, "deflating" images within a Zip archive can be a waste of CPU si... read more »

Generate And Incrementally Stream A ZIP Archive File On-The-Fly In Lucee CFML

The other day, in the InVision Architecture Office Hours meeting (which is, by far, my favorite meeting of the week), I was talking about how amazing it is that GitHub allows you to download a ZIP archive file of any repository, despite the fact that some repositories are many Gigabytes in siz... read more »

Using FrameworkOne (FW/1) Layouts To Strip Whitespace In Lucee CFML

At InVision , we use FrameworkOne (FW/1) as our ColdFusion / CFML web application framework. With FW/1, you can define a Controller, a collection of Views, and a Layout for a given feature-set. The Views get rendered and then "rolled up" into the Layout (optionally) at which point they... read more »

Working Code Podcast - Episode 005: Monoliths vs. Microservices

Monoliths are bad! Microservices are good! These are the "obvious" truths that many engineers hold close to heart. So, why is it that I've been slowly merging some of my Microservices back into my Monolith ? It turns out that a Monolith - like a Microservice - is a valid architectura... read more »

Generating Newline-Delimited JSON (NDJSON) Using JSON_OBJECT() In MySQL 5.7.32

After posting yesterday's exploration of position: sticky on the horizontal axis , Patrick Finegan - one of our Customer Success Managers at InVision - felt that it would make for a great conversation with one of our customers. As such, I had to generate a stand-alone version of the demo usi... read more »

Having Fun With The Horizontal Usage Of Position: Sticky In Angular 11.0.5

The CSS property of position: sticky is one of those new(ish) CSS features that can dramatically reduce the amount of JavaScript that you have to include in your application. position: sticky takes an element and "glues it" to the edge of the viewport as the user scrolls-across said e... read more »

Packaging A Password-Strength Module In Angular 11.0.5

I write a lot of Angular and AngularJS code. But, in the vast, vast majority of cases, I just extend the existing "application module", adding components, directives, and services to the same bag of uniquely-named dependency-injection (DI) tokens. This year, however, I really want to star... read more »

Working Code Podcast - Episode 004: Impostor Syndrome

Impostor Syndrome is a psychological pattern in which people doubt their skills, talents, and accomplishments. Most of us have felt something like this in our careers, whether it's a fleeting moment or a persistent fear that we're going to be discovered as frauds ( at any moment !). These feelings ... read more »

Inclusive Components: Accessible Web Interfaces, Piece By Piece By Heydon Pickering

Historically, my mental model for "accessible" websites could be summed up as follows: "use semantic HTML and don't remove form control outlines." I always knew this mental model was lacking detail; but, I didn't realized just how sub-par it actually was until I read Inclusiv... read more »

Making Snow Animations In Angular 11.0.5

Way back in the day, when I was a developer at Koko Interactive, we used to send out Macromedia-Flash-based Christmas cards . These cards often had some sort of snow-flake animations in which lots of little dots danced their way down the screen using ActionScript and timeline sprites. As a fun cod... read more »

The User Experience (UX) Of My Microwave's "Add 30-Seconds" Button

Over Christmas break, I needed to thaw-out some Ben & Jerry's Chocolate Fudge Brownie ice cream. And, since waiting a few minutes for it to warm-up on the kitchen counter is entirely unacceptable , I popped it in the microwave for 10-seconds. I did this by hitting the Add 30-Seconds button , ... read more »

Having Fun With The SpeechSynthesis API In Angular 11.0.5

Happy New Year to all of you beautiful people! The other day while recording the Working Code podcast , my co-host Carol Hamilton mentioned a website called , which provides a feature for synthesizing speech from text. Upon looking at the source of that page, it appears to be ... read more »

IntersectionObserver API Performance: Many vs. Shared In Angular 11.0.5

Just before Christmas, I started to experiment with using NgSwitch and the IntersectionObserver API to defer template bindings in Angular. The hope being that I could reduce digest complexity which may lead to better performance when dealing with very large data-sets. In that experiment, each... read more »

Working Code Podcast - Episode 003: Burnout, Mental Exhaustion, And How To Be Productive When Life Sucks

The tech industry often heralds long hours as a badge of honor: the grind; the side-hustle; working weekends; showing your team that you're putting in the time. But, this toxic culture can quickly lead to mental exhaustion and burnout. This, in turn, leads to poor quality of work, panic attacks, re... read more »

The SublimeText 3 Extended Find Results Tab Is A "Living Document"

I'm a huge SublimeText 3 fan . From its blazing fast fuzzy-text file matching to its multi-cursor / multi-selection support , it never fails to disappoint. Which is why I use it all day, every day. Among the features that I leverage often is the extended Find-and-Replace. And, one thing that ... read more »

Using COUNT(), COUNT(column), And COUNT(expression) Variations To Extract Row Metadata In MySQL 5.7.32

Yesterday, I was working with fellow InVisioneer , Josh Siok , to transform some MySQL data-tables into a common format. As we did this, we were using the COUNT() aggregation function to gather metadata about the records that we were transforming. COUNT() - and the other aggregation functions... read more »

One Unhappy User Is A Tragedy; One Thousand Unhappy Users Is A Statistic

At InVision , we often talk about the importance of Compassion: compassion for each other; and, compassion for our users. And while I absolutely love this about our company, compassion isn't something that comes naturally. Compassion is a muscle - one that requires regular exercise and incurs ... read more »

Working Code Podcast - Episode 002: Working From Home

On Episode 002 of the Working Code podcast , Ben and the crew talk about what it's like to work from home. Some of us have been working from home for years; others have been thrust into working from home due to the COVID-19 pandemic. In some ways, working from home is the best thing since sliced... read more »

Working Code Podcast - Episode 001: Adam's Secret Shame

Adam and the crew talk about what it's like to be long-lived ColdFusion developers; and, the odd shame that we sometimes feel over our language choices, despite the success that we've all experienced in our respective jobs. Listen to Episode 001 , with: Adam Tuttle → Website , Twitter ... read more »

Working Code Podcast - Episode 000: Hello, World!

For the last decade, I've been devouring podcasts like a boss! On commutes, walking the dog, doing chores, working out in the gym - if I'm not writing code, I'm listening to podcasts (often times about writing code). And in all this time, I've just been a consumer. But, no more! Adam Tuttle has d... read more »

Using IntersectionObserver And NgSwitch To Defer Template Bindings In Angular 11.0.5

Showing a really long list of data is usually not that great for the user experience (UX); and, it's usually not that great for the performance of the web page. But, sometimes you don't have a choice. And, in those cases, I often try to find ways to squeeze as much performance as possible out of ... read more »

Attempting To Inject My echo.log() CSS-Styled Logger As A Chrome Extension

Last week, I had fun creating a Chalk-inspired echo library that allows for CSS-formatted console logging . It leverages the %c string interpolation feature of the Console API in order to apply simple styles to a given log message. To make this echo library even more usable, I wanted to ... read more »

Why I've Been Merging Microservices Back Into The Monolith At InVision

If you follow me on Twitter, you may notice that every now (1) and (2) then (3) I post a celebratory tweet about merging one of our microservices back into the monolith at InVision . My tweets are usually accompanied by a Thanos GIF in which Thanos is returning the last Infinity Stone to t... read more »