Ben Nadel
On User Experience (UX) Design, JavaScript, ColdFusion, Node.js, Life, and Love.
Ben Nadel at cf.Objective() 2014 (Bloomington, MN) with: Joel Hill
Ben Nadel at cf.Objective() 2014 (Bloomington, MN) with: Joel Hill@Jiggidyuo )

Recent Blog Posts by Ben Nadel

On The Code Smell Of Asynchronous Middleware In Redux

CAUTION : This post is 100% subjective . To start off, I like the idea of Redux. And, of one-way data flows. I like that Redux provides a predictable state management system. And, I even like the idea of having middleware so that I can perform cross-cutting concerns like logging actions and capt... read more »


Sanity Check: Shared Style URLs And Emulated Encapsulation Attributes In Angular 6.1.10

A year ago, I performed a sanity check to confirm that shared style URLs were only compiled once in an Angular application . And, now that I've been digging into the mechanics of emulated encapsulation attributes , the question of shared style URLs has popped back into my mind. Specifically, I wa... read more »


Emulated Encapsulation Host And Content Attributes Are Calculated Once Per Component Type In Angular 6.1.10

Yesterday, while experimenting with recursive components in Angular 6.1.10 , I was briefly confused by the fact that recursive nesting of a single component required a little bit of CSS chicanery in order to prevent CSS styling from bleeding down into descendant nodes. Recursion tends to mess your... read more »


Playing With Recursive Components In Angular 6.1.10

This past week, I started noodling on how to use recursion in an Angular application. And, instead of reaching directly for a component-based solution, I first took at look at implementing recursive views using the Ng-Template directive . Ng-Template is fairly flexible; and, it allows for a recurs... read more »


Playing With Recursive Ng-Template References In Angular 6.1.10

Yesterday, I started to think about recursive Angular layouts for the first time. And, as someone who has bought into the "everything is a component" point-of-view, my natural instinct was to reach for recursive components. But then, I remembered that Ng-Templates allow for some very dynamic rende... read more »


Updating InVision Router Experiment To Use Lazy Loading Feature Modules In Angular 6.1.9

Earlier this year, I embarked on an exciting adventure in trying to recreate the InVision app user interface (UI) with the new Angular 5 router . It took me several months to get it done, taking many tangents along the way to solve intermediary Angular problems. But, I have to say that I was very ... read more »


ProvidedIn FeatureModule Is A Confusing Concept For Me In Angular 6.1.9

CAUTION : I don't really have a good grasp on Angular Modules. Or, on how modules related to the dependency-injector hierarchy, as is clearly demonstrated in this blog post. This post is really just for my own codification and an attempt to build a better mental model. Feel free to ignore. TL;DR... read more »


It Doesn't Have To Be Crazy At Work By Jason Fried And David Heinemeier Hansson

I'm a long-time fan of the project-management system, Basecamp . But, more so, I'm a fan of the strongly-opinionated and often controversial co-founders, Jason Fried and David Heinemeier Hansson (DHH) . I've read and quite enjoyed their two earlier books, Remote and Rework. So, when I saw last ... read more »


Playing With RegExp Named Capture Groups In Node 10

A couple of weeks ago, at the NYC Node.js Meetup, Franziska Hinkelmann went over the exciting new features of Node 10, which had just recently entered Long Term Support (LTS). Of the features that she listed, the one that really caught my ear was the addition of "named capture groups" in the Regu... read more »


The Transformative Power Of Love

A few months ago, I watched the movie, Eight Grade , which was a challenging but rewarding peek into the final weeks of middle-school for an introverted and somewhat awkward young woman. Of all the memorable scenes, the one that has stuck with me the most is a phone exchange in which a high-school... read more »


Preloading Lazy-Loaded Feature Modules In Angular 6.1.9

In the last couple of days, I've started to dig into the lazy-loading of feature modules in Angular 6 . With lazy-loading, segments of the code-base get loaded on-demand as the user navigates to the relevant areas of the application. The Angular router, however, provides a configuration that can p... read more »


Showing A Loading Indicator For Lazy-Loaded Route Modules In Angular 6.1.7

Now that I've been able to get the lazy loading of routes to work in Angular 6.1.7 with Ahead of Time (AoT) compiling and Webpack 4 , I wanted to think about how to steward the user through a lazy-loaded application. Especially when that user is on a slower network connection and the lazy-loading ... read more »


Microservices Patterns: With Examples In Java By Chris Richardson

I first became familiar with Chris Richardson through his online resource, Microservices.io . Which, to be honest, provides an overwhelming amount of information - information that I've deferred consuming because I didn't really know how to approach it; especially with my lack of microservices e... read more »


Using Commons IP Math To Check If An IP Address Exists In An IPv4 Or IPv6 CIDR Range In ColdFusion

Last week, I discovered that ColdFusion's underlying Java resources expose a Jakarta Commons Net utility called SubnetUtils. This SubnetUtils class makes it super simple to see if a given IP address exists within a given IPv4 CIDR range . Unfortunately, SubnetUtils has no support for IPv6. As such... read more »


Experimenting With Lazy Loaded Modules, Ahead Of Time (AoT) Compiling, And Webpack 4 In Angular 6.1.7

Now that I've finally upgraded my Angular research and development (R&D) workflow to use Ahead of Time (AoT) compiling , I figured it was time to tackle another one of my white whales: lazy loading modules in a route-based Angular application. For a long time, other developers have told me tha... read more »


When Is A Change A Breaking Change For An API

As InVision continues its efforts to decompose the monolith into a distributed system, it has given me lots of opportunity to think about "breaking changes." A "breaking change" is any change that requires the consumer of an API to make lockstep changes in order for the consuming code to continue... read more »


Checking To See If An IP v4 Address Is In A CIDR Range Using ColdFusion And SubnetUtils

At work, I need to build a feature that allows an IP address to be validated against a CIDR (Classless Inter-Domain Routing) range. CIDR - as I just learned - is range notation that defines a High and Low IP address by identifying how many bits in a given IP address are "locked down" and how many a... read more »


JavaScript Demos Using Webpack 4 With Angular 6.1.7 And Ahead Of Time (AoT) Compiling

As you may know, I collect most of my JavaScript demos in a single GitHub repository (JavaScript Demos) . And, for the last year or so, I've been compiling my subset of Angular demos with Webpack 3 . These Webpack compilations have been using the ts-loader plugin to transpile and concatenate file... read more »


Testing For Future Data-Types With isFuture() And isEmptyFuture() In ColdFusion 2018

ColdFusion 2018 introduced us to the concept of Futures. Futures, like Promises, provide hooks into the eventual resolution of data. Unfortunately, ColdFusion 2018 doesn't seem to have any "decision functions" geared towards Future detection. Luckily, the isInstanceOf() function provides us with an... read more »


Passing A Timeout To .get() Will Not Override An Existing Future Timeout In ColdFusion 2018

CAUTION : This is just a note to self; building my mental model around Futures in ColdFusion 2018. This is just a quick post to document a behavior of .get() on a Future in ColdFusion 2018. Calling .get() will cause the page to block and wait for the Future to be resolved. And, as part of that ca... read more »


Saving A Future In An Intermediary Variable Breaks Error Handling In ColdFusion 2018

A couple of days ago, I stumbled upon a "bug" in ColdFusion 2018 in which passing a Future though a proxy method breaks the error handling on that Future . Well, this morning, I ran in to a related bug that is even more befuddling. It turns out, if you save a Future into an intermediary variable b... read more »


EXPERIMENT: Creating A Promise-Inspired Future Constructor In ColdFusion 2018

To be honest, when I saw that ColdFusion 2018 had "Futures", my first reaction was something like, "Awesome, we now have Promises in ColdFusion!" As I've dug into the feature, however, I've come to realize that ColdFusion Futures and JavaScript Promises have very little in common. At best, they bot... read more »


Mysterious Error Handling Behavior With Proxied Futures In ColdFusion 2018

As I've been digging into the new Future functionality in ColdFusion 2018, I've stumbled over a number of caveats. But, this morning, I've run into something that I can't seem to make heads-or-tails of. From what I think I can demonstrate, the error handling capabilities in a Future chain appear to... read more »


The .error() Method Cannot Catch Future Task Timeout Errors In ColdFusion 2018

Earlier this morning, I demonstrated that providing a Timeout value to a Future method will change the Future callback from an asynchronous call into a blocking, synchronous call in ColdFusion 2018 . Now, I don't know if this is a related "issue"; but, it appears that the .error() method cannot ca... read more »


Providing A Timeout To A Future Method Changes It To A Synchronous Blocking Call In ColdFusion 2018

As a quick follow-up to my previous post on Future Timeouts in ColdFusion 2018 , I just realized that timeouts have a very curious side-effect: they turn asynchronous callbacks into blocking, synchronous calls. This appears to apply to both the runAsync() method as well as any chained .then() or .... read more »


Timeouts Only Apply To Last Future Thread, Not The Preceding Future Chain In ColdFusion 2018

When I first read the Future documentation in ColdFusion 2018, it was very tempting to think that everything was asynchronous. But, as I demonstrated yesterday, the .then() and .error() Future methods are blocking, synchronous calls in the parent context . That was a bummer of a discovery. And, it... read more »


Errors Thrown In Future Threads Don't Report Complete Details In ColdFusion 2018

Earlier today, I took my first look at the Future data-type and the associated runAsync() method in ColdFusion 2018. In that post, I talked about the confusing behavior of the .then() and .error() methods which appear to be blocking calls on the parent thread . Another point of confusion and frict... read more »


The Future Methods .then() And .error() Are Blocking In ColdFusion 2018

The other day, I read that a new version of ColdFusion has been release: ColdFusion 2018. And, while perusing the "What's New" list , I happened to see that asynchronous programming with "Futures" was one of the newly-introduced features. I've never used Futures in Java before; though, I have used... read more »


MySQL 5.7 InnoDB AUTO_INCREMENT Counters Get Reset After MySQL Service Restart

The other day, while writing some "archiving" logic in a data-driven ColdFusion application, I started getting errors that I didn't quite understand. As I was moving records from an "active" table to an "archive" table, the database started throwing "Duplicate entry for key 'PRIMARY'" constraint vi... read more »


Defining Dynamic AJAX-Driven Service Providers Using APP_INITIALIZER In Angular 6.1.4

On the latest Adventures In Angular podcast , Dave Bush discusses his blog post about storing Angular configuration data outside of the compiled application files. By separating the application logic from the configuration data, it makes your compiled application portable across your various env... read more »