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

Recent Blog Posts by Ben Nadel

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

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 VoiceChanger.io , 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 »


Looking For Database Performance Bottlenecks And Optimizations Using The Sys Schema In MySQL 5.7

Over the last few weeks, I've been looking into feature enhancements that come with our upgrade to MySQL 5.7 at InVision . The two marquee features that really jumped out at me were the JSON column type support and the virtual indexed columns . However, one more feature that I wanted to explo... read more »


Styling console.log() Output With A Chalk-Inspired Formatter Using JavaScript Proxies

Yesterday, I had a lot of fun using CSS to style my console.log() output in Chrome and Firefox. And while I haven't done much programming with Node.js in a while, yesterday's experiment made me nostalgic for Chalk - an npm package that provides string styling for the terminal . One of the ... read more »


Styling console.log() Output Formatting With CSS

I use console.log() all day, every day. But, I almost always forget that you can use CSS to style the formatting of the console output. As such, I wanted to sit down and write out some console.log() styling examples in an attempt to hammer this information into my caveman brain. Also, it's h... read more »


Using Java's Concurrent Queues For Asynchronous Processing In Lucee CFML 5.3.7.47

I'm utterly fascinated with asynchronous processing . But, I also know that there's always a healthy tension between complexity and performance, stability, and availability . Which is why I'm constantly noodling on different ways to perform asynchronous processing ( such as with Task threads ... read more »


Recursive / Nested CFThreads Can Get Around CFSetting RequestTimeout In Lucee CFML 5.3.7.47

A couple of months, I demonstrated that the request timeout of the parent page also affects the execution of CFThread tags in that same request in Lucee CFML . To get around that, within that post, we were using the CFSetting tag to override the requestTimeout value from within the async... read more »


Experimenting With "Tail Recursion" Using CFThread In Lucee CFML 5.3.7.47

In a recursive algorithm, "tail recursion" is when the very last call in the recursive algorithm is the recursive call of the same function. Developers generally care about "tail recursion" because it can be optimized by the runtime / compiler (depending on your runtime / compil... read more »


Exploring Type-Coercion And Value Comparisons In A JSON Column In MySQL 5.7.32

Generally speaking, SQL is pretty lenient when it comes to simple types and value comparisons. Meaning, from a SQL execution standpoint, 1 and "1" are equal because the SQL engine will coerce the values as needed (much like ColdFusion). However, document databases like MongoDB are muc... read more »


Experimenting With Virtual Indexed Columns In MySQL 5.7.32 And Lucee CFML 5.3.7.47

As I mentioned in an earlier post , InVision is upgrading some of its MySQL servers to 5.7.32 (for Long-Term Support, LTS). This upgrade brings with it some excited features like the JSON column type . It also unlocks the ability to add virtual columns to a table which can be derived from e... read more »


Atomically Incrementing JSON Column Values In MySQL 5.7.32 And Lucee CFML 5.3.7.47

In the last few days, I've started to look at the JSON column type that I can now leverage in MySQL 5.7.32 . It's pretty cool that MySQL now allows for JSON (JavaScript Object Notation) structures; but, the offering in MySQL 5.7.x isn't as robust as it is in more specialized databases like Mon... read more »