Ben Nadel
On User Experience (UX) Design, JavaScript, ColdFusion, Node.js, Life, and Love.
Ben Nadel at cf.Objective() 2009 (Minneapolis, MN) with: Eric Stevens
Ben Nadel at cf.Objective() 2009 (Minneapolis, MN) with: Eric Stevens

Recent Blog Posts by Ben Nadel

Remote Work Increases Intimacy And Amplifies A Shared Sense Of Humanity

Last week, I was invited by Scott Gellman (COO and CFO) to give a talk at Kurtosys about the journey of InVision . Of the many topics discussed, one that I thought would be worth re-sharing is my perspective on remote work . InVision has been an all-remote company since day one. We are now on... read more »

Building A Simple Redis Key Scanner Using Lucee CFML And Jedis

The other day at work , I noticed that our production Redis instance was holding steady, on balance, at about 7GB of memory usage and 14M keys. Anything "holding steady" in Redis makes me suspicious, especially over the course of several months, as I would expect the Redis resource consu... read more »

Thought Experiment: Splitting A Single Data Table Up Into High-Writes And High-Reads For Better Performance In MySQL

CAUTION : This post is just me thinking out-loud about an interesting MySQL database performance problem that I have faced at work. At InVision , we store a date/time stamp that represents the last request that each user makes to the application. We used to use this data-point to indicate "... read more »

Playing With Lists And Blocking Pop Operations In Redis And Lucee

I have a really embarrassing confession to make: until just recently, I thought that the Redis List data-type worked like the ColdFusion List data-type. Which is to say, I assumed that it was just an abstraction over simple, delimited string values. This wasn't based on anything that I read -... read more »

CFQueryParam "Fails Silently" With Empty Lists And IN Clauses In Lucee

About a year ago, we converted our production app from Adobe ColdFusion to Lucee CFML. The conversion itself took several months (depending on how hard you squint); and, since the conversion, we've occasionally stumbled over a few inconsistencies between Adobe ColdFusion and Lucee CFML. Yesterday, ... read more »

Proof-Of-Concept: InVision Breadboarding In Angular 9.0.0-next.9

Two months ago, I read Shape Up: Stop Running in Circles and Ship Work That Matters by Ryan Singer . This is the latest book from Basecamp; and, like their other books , it's filled with wonderfully thought-provoking concepts and perspectives. One idea that I really loved was the concept of "... read more »

Experiment: Using A Feature Flag To Conditionally Render Routable Components In Angular 9.0.0-next.8

As I've mentioned before, I love using feature flags . They have truly revolutionized the way that me and my team deploy changes to production. That said, on the front-end of our application, I've only used feature flags to enable or disable portions of an existing User Interface (UI) - typica... read more »

Tracking Page Request Metrics With Framework One (FW/1) And Lucee CFML

At work, we use StatsD to record page request metrics in our Lucee CFML and Framework One (FW/1) application. One of the great features of FW/1 is that it favors convention over configuration. This makes it simple in terms of getting started with the happy path; but, when it comes to recording re... read more »

JavaLoader Needs Access To Internal ColdFusion Java Components In ColdFusion 2018

This past week, I updated my blog from ColdFusion 10 to ColdFusion 2018. ColdFusion is generally backwards compatible; so I figured this would be a seamless transition. However, I ended up running into an issue with JavaLoader , which I wanted to share because my Google searches for the related er... read more »

Using CSS Overscroll-Behavior To Prevent Scrolling Of Parent Containers From Within Overflow Containers

In the past, I've looked at how the scroll-wheel seems to randomly stop working in an overflow container . This phenomena is related to a browser feature called scroll chaining ; and, it can be overcome if you prevent the wheel event's default behavior . Of course, tapping into the wheel and... read more »

Using An Immediately Invoked Function Expression (IIFE) And CachedWithin To Easily Cache Steps In A Procedural Script In Lucee

As I've demonstrated before, the cachedWithin function memoization feature can be applied to Closures in Lucee I've also demonstrated that Immediately Invoked Function Expressions (IIFE) work In Lucee . These two features can be combined to easily cache steps in a procedural script w... read more »

Discriminated Unions Don't Seem To Work In Angular 9.0.0-next.5 When fullTemplateTypeCheck Is Enabled

As part of the latest version of Angular 9.0.0-next.5 and its CLI (Command-Line Interface), the tsconfig.json file now contains a compile option called, fullTemplateTypeCheck . This feature uses TypeScript to validate the Angular expression bindings in your component templates. And, from what I ... read more »

Creating An Incrementing Input Directive Inspired By Chrome Dev Tools In Angular 9.0.0-next.5

The Chrome Dev Tools are amazing. Fact! One of the features that makes the Chrome Dev Tools so enjoyable is that you can increment and decrement embedded values - like 7px - using the Up/Down Arrows on your keyboard. This keyboard-based incrementation is also a common feature of design tools li... read more »

Locating LaunchDarkly Feature Flag References In Your Application Code In Lucee

At InVision , we've been using - and loving - LaunchDarkly feature flags for the last 3-years. Feature flags have completely changed the way that we approach application development. But, it's not all roses and unicorns. Feature flags also introduce a new type of technical debt which, left unc... read more »

Anchor Tags Can Contain Block-Level Elements As Of HTML5

The world of web development moves quickly; and, it is often be hard for me to keep my mental model in alignment with the current trends and standards. Today, I learned that one of my internal rules was critically out of date . As of HTML5 - which was released years ago - it is OK to wrap block-... read more »

Calculating Various Time-Deltas Between Two Dates In Angular 9.0.0-next.4

At work, I write a lot of Root Cause Analysis (RCA) documents (see Incident Commander ). And, at the very top of each RCA document, I have to include the duration of the Incident in terms of hours and minutes. This means that I have to take two Date/Time-stamps - Start and End - and perform math... read more »

Considering Index Design And Database Uniqueness Constraints With Soft-Deletes In MySQL 5.6.37

As I mentioned in an earlier post about index design with a nullable DateTime column , I'm building a small scheduling app at work using MySql 5.6.37. The requirements for this scheduling app have been "unfolding" (aka, scope creep) as the project has continued. And, one of the newly-r... read more »

Trying To Find My Preferred Format For Method Annotations In Lucee

One of the many differences between Adobe ColdFusion (ACF) and Lucee CFML is that Lucee won't alter the runtime behavior of the ColdFusion code based on JavaDoc-style annotations. As such, for method annotations to be applied, they have to be in the actual method declaration following the argumen... read more »

REST And GraphQL Are Not Your Only Choices When Building An HTTP API

I don't believe that the web development community is having an honest discussion about GraphQL. This is because, GraphQL is almost exclusively presented as an alternative to REST (Representational State Transfer). And, while GraphQL may remove points-of-friction found in REST, the dishonesty is ... read more »

Solutions Don't Have To Work For Everyone

I used to believe that when I added a new feature to a web application, said feature had to help all users . But, as I've grown older - and I've had to operate under greater constraints at work - I've come to embrace the idea that solutions don't have to work for everyone . A solution that adds... read more »

Shape Up: Stop Running In Circles And Ship Work That Matters By Ryan Singer

I've been a long-time fan of the good people over at Basecamp (formerly 37 Signals). Their books, like It Doesn't Have To Be Crazy At Work , have a knack for cutting through industry mythology; and, their designs are clear and effective. I've even fantasized about pulling some of their user exper... read more »

Calculating A Consistent Cache-Friendly Expiration Date For Signed-URLs In Lucee

Yesterday, I shared the results of a performance experiment in which I started caching cryptographically signed-URLs in Redis using Lucee . The signed-URLs in the experiment where for a CDN (Content Delivery Network) that pulled-through from Amazon S3. And, after posting yesterday, I wasn... read more »

Performance Case Study: Caching Cryptographically Signed-URLs In Redis In Lucee

A month ago, I shared the results of my attempt to improve request performance with parallel data-access in Lucee . The main take-away from that experiment was that parallelization is not a silver bullet for data-access. Especially when the cost of spawning asynchronous threads in Lucee... read more »

The Magic Of Thinking Small: Embracing Limitations As A Strength

I work on a very small team. It's me and three other full-stack developers. And while we are a cohesive unit, the four of us tend to work on completely separate initiatives. In some ways, the size of our team is very limiting. But, this limitation has also proven to be a tremendous benefit as it p... read more »

Upgrading A Built-In Function To A First-Class Citizen In Lucee

For as long as I can remember, ColdFusion has supported the idea of User Defined Functions (UDFs) as First-Class Citizens. Meaning, User Defined Functions can be referenced and passed-around just like any other object in the ColdFusion landscape. The same, however, has never been true of Built-In F... read more »

Installing User Defined Functions (UDF) As An Extension For Built-In Functions (BIF) In Lucee

With Adobe ColdFusion, I've always had a fascination with the idea of being able to extend the set of native (or built-in) Functions that are available in the request context. A decade ago , I played around with hacking User Defined Functions (UDFs) into the "hidden scope" of the PageCo... read more »

Playing With The Zip Virtual File System (VFS) In Lucee

The other day, I was talking to fellow InVisioneer, Shawn Grigson , about how weirdly excited I am that Lucee has compress() and extract() functions. I don't know why; but, I just love how easy it is to create and consume Zip archive files. In response, Shawn reminded me that Lucee also supp... read more »

Unexpected Variable Assignment Using Function LocalMode Modern With Nested Closures In Lucee

Last week, I took a look at how the Function localmode feature in Lucee makes it safer to dynamically render CFML templates . In response to that post, John Pansewicz told me that he ran into an issue using localmode with nested Functions (for which he filed a ticket ). It's one of those si... read more »

Using Function LocalMode To Render Templates During Static Site Generation In Lucee

The other day, I took a look at using the Function localmode to more-safely render templates in Lucee . The reason that localmode makes rendering templates more safe is that any unscoped variable assignment , performed during the CFML template evaluation, is applied to the local scope , no... read more »

Using Function LocalMode Modern To More-Safely Render ColdFusion Templates In Lucee

Historically, when you set an unscoped, non- var 'ed variable inside a ColdFusion Function, the variable is applied to the variables scope (except for when that assignment is inside a CFThread tag ). In Lucee CFML, however, we can use the Function directive - localmode - to change this behav... read more »