Ben Nadel
On User Experience (UX) Design, JavaScript, ColdFusion, Node.js, Life, and Love.
Ben Nadel at Scotch On The Rock (SOTR) 2010 (London) with: Michael Offner-Streit and Tanja Stadelmann and Gert Franz and Pierre Olivier Chassay and Paul Klinkenberg and Marcos Placona
Ben Nadel at Scotch On The Rock (SOTR) 2010 (London) with: Michael Offner-Streit , Tanja Stadelmann , Gert Franz@gert_railo ) , Pierre Olivier Chassay , Paul Klinkenberg@frinky ) , and Marcos Placona@marcos_placona )

Recent Blog Posts by Ben Nadel

Confusion Over this.mappings And expandPath() Not Working In Lucee CFML

So, I've spent the last 3-hours this morning trying to understanding why my this.mappings configuration in my Application.cfc ColdFusion component "wasn't working" in Lucee CFML After much trial-and-error and many Google searches, it seems that the evaluation of the read more »

Superficial Performance Comparison Between ColdFusion Query-of-Queries (QoQ) And Array Functions In Lucee CFML

CAUTION : You should always take a controlled performance comparison with a grain of salt . These were not done in a production environment; they were not done under load; and the performance at small scale for either approach is significantly fast. Worrying about your choice here is not merit... read more »

Replacing ColdFusion Query-of-Query (QoQ) INNER JOIN And LEFT OUTER JOIN With Array Functions In Lucee CFML

Earlier this week, I took a look through the InVision codebase, pulled-out several ColdFusion Query-of-Query (QoQ) examples, and then demonstrated how those query-of-queries could be re-implemented using Array functions in Lucee CFML . I wanted provide a quick follow-up post about re-implementin... read more »

Safe Navigation Operator Works In Comparison Expression Even When NULL In Lucee CFML

While there is a version of the Lucee CFML syntax that treats null as a first-class citizen, null has, historically, been a tricky value to work with in the ColdFusion world. As such, my instinct is always to treat a potentially null value with kid-gloves. That said, I discovered this morning... read more »

Replacing ColdFusion Query-Of-Queries (QoQ) With Array Functions In Lucee CFML

Last week, on the Modernize Or Die ColdFusion Podcast , Gavin Pickin and Brad Wood reminded us that ColdFusion is not a query engine . And that - despite the simplicity of the ColdFusion Query-of-Queries (QoQ) - there are much more performant ways to achieve the same results. There's no doubt... read more »

Serializing A MySQL RecordSet As A Set Of INSERT Statements Using Lucee CFML

This past week at InVision , some data was accidentally deleted from one of our MySQL databases. In order to get the data back, our Data Services team had to restore one of the backups. And then, I had to write a ColdFusion script that would transfer a slice of the data from the restored-databas... read more »

Adding A TTL To All Persistent Keys In Redis Using LaunchDarkly Feature Flags And Lucee CFML

The other week, I created a Redis key scanner using Jedis and Lucee CFML . I did this because I saw that one of our production Redis databases seemed to have a steady number of keys (about 14M); and, I wanted to see if they were all supposed to be there. By using the key scanner, I discov... read more »

Delaying Loading Indicators Using CSS Animations In Angular 9.0.0-next.14

I don't really know much about React. And, I certainly know nothing about the upcoming "Suspense" feature. But, from what I've heard various people say on various podcasts, it seems that one of the features provided by Suspense is the ability to delay the rendering of "Loading Indi... read more »

Creating An Interactive JSON Explorer Using CSS Grid In Angular 9.0.0-next.14

At work , I spend a lot of time combing through Logs . Which means, I spend a lot of time looking at JSON (JavaScript Object Notation) payloads . Some of these payloads are rather large, which is why I do things like create Loggly bookmarklets for better Log rendering . Partly as a fun Code Kat... read more »

Loading And Using Remote Feature Flags In Angular 9.0.0-next.12

The other day, I wrote about using feature flags to conditionally render routable components in Angular 9 . After that post, it occurred to me that I've talked a lot about how much we love feature flags here at InVision ; but, I've never really looked at how we get feature flags into an Angular... read more »

Using RegEx To Filter Keys With Redis Key Scanner In Lucee CFML And Jedis

Earlier this week, I wrote about Redis Key Scanner , which is a small Lucee CFML app that allows me to safely and efficiently iterate over the key-space of a Redis database such that I can get a sense of what keys exist, how long they will be persisted (ie, what is their Time To Live), and where t... read more »

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 »