Ben Nadel
On User Experience (UX) Design, JavaScript, ColdFusion, Node.js, Life, and Love.
Ben Nadel at Take 31 (New York, NY) with: Matt Moss
Ben Nadel at Take 31 (New York, NY) with: Matt Moss@matt8066 )

Recent Blog Posts by Ben Nadel

90% Of Design Is Picking Good Margins And Making Sure Things Line Up

Coming up on twenty years ago, I had an internship at a company in New York City called Kokopelli New Media. There, I had the opportunity to learn from some of the most amazing people like Glen Lipka , Ben Peters , and Ye Wang . It was there that I first learned about ColdFusion - the programmin... read more »

Leaders Are The People We Bleed With - Not The People We Bleed For

For the last few days, I've been obsessing over the ending of Braveheart - one of my favorite movies of all time. Now, I don't know how I got started in this direction; but, I've been thinking about the one line of dialogue that brings the Scotsmen into their final battle with the English. It's n... read more »

Designing Distributed Systems: Patterns And Paradigms For Scalable, Reliable Services By Brendan Burns

Over the weekend, I read Designin Distributed Systems: Patterns and Paradigms for Scalable, Reliable Services by Brendan Burns . I really enjoyed this book; although, I must admit it wasn't exactly what I expected. The description of the book barely mentions containers. And, while the patterns d... read more »

Outlining Text Selections Using The Window Selection API

Lately, I haven't been feeling terribly creative. Quite blocked, actually. And, as Ze Frank would recommend, I acknowledge that creativity is outside of my rational control . So, in order to get back to a good place, I need to just keep the machinery firing and hope that the creativity returns. So... read more »

The Daily Prime: Docker Experiment And A Source Of Daily Inspiration

Last month, I published a blog post on my journey from complete Docker noob to Docker novice running a Docker host on DigitalOcean with Nginx, Node.js, DataDog logs, DogStatsD, and free LetsEncrypt SSL certificates . That was a huge milestone for me; but, it was just the beginning of my Docker edu... read more »

Reporting StatsD Metrics From The Browser In Angular 5.2.9

Last week, I discovered that you could listen for IMG error events using event delegation (so to speak) if you attach your event-handler to the Capture phase of the event life-cycle. As someone who works on a SaaS (Software as a Service) product that is based heavily on client-side image renderin... read more »

Practical Monitoring: Effective Strategies For The Real World By Mike Julian

In my ongoing journey to better understanding monitoring and logging (my big hairy goal for 2018), I just read Practical Monitoring: Effective Strategies for the Real Work by Mike Julian . I really enjoyed this book. Not only does the author write with a friendly and welcoming tone, he strikes a... read more »

Tracking Image Error Events Using Event Delegation In JavaScript

At InVision, the primary asset is the Image. On the server-side, we know everything about these images: size, density, orientation, how long it takes to resize them, and whether or not they can even be thumbnailed properly. On the client-side, however, we don't do a lot of active tracking for image... read more »

Effective Monitoring And Alerting By Slawek Ligus

At work, we've fully embraced the concept of "measure everything." We've wrapped StatsD ( DogStatsD ) timing metrics around all external calls; we record the latency of all web requests; we monitor HTTP status code volumes in nginx; we use New Relic to observe CPU utilization and Garbage Collection... read more »

Using An AtomicLong With A Modulo Operation May Be Faster Than Using compareAndSet() For Thread-Safe Range-Based Counters

Last week, I looked at using Java's AtomicInteger class in order to loop over a range of numbers in a thread-safe manner without having to add any additional locking to the code. The core of the logic revolved around executing a while(true) loop that repeatedly invoked a .compareAndSet() method u... read more »

Using Multivariate Feature Flags In LaunchDarkly To Drive Operational Settings Like Minimum Log Level

After having used LaunchDarkly as our feature flag service provider for several years, I'm taking a fresh look at their documentation in order to see what new hawtness they offer above and beyond the traditional On / Off toggle. Yesterday, I looked at LaunchDarkly's ability to target users based o... read more »

Using LaunchDarkly To Target Personally Identifiable Information (PII) During Feature Flag Evaluation Without Leaking Sensitive Data

At InVision , we've been using LaunchDarkly as our feature flag service provider for the last few years; and, it has completed changed the way that our teams think about feature deployment. But, we've been using LaunchDarkly for so long that we've missed out on a lot of the new features they'v... read more »

Using Java's AtomicInteger To Loop Over A Range Of Numbers In ColdFusion

The other day, as part of my cuid for ColdFusion implementation , I had to create an internal counter that looped over a static range of numbers. Once the counter reached its upper-bound, it reset back to zero. Since this was operating in a multi-threaded environment, I decided to use Java's Atomi... read more »

Enterprise Integration Patterns: Designing, Building, And Deploying Messaging Solutions By Gregor Hohpe And Bobby Woolf

Over the weekend, I finally finished reading Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions by coauthors Gregor Hohpe and Bobby Woolf . I've been reading this 700-page tome since the beginning of February. And, while there were two chapters at the end t... read more »

Adding Slug Generation To cuid For ColdFusion

Yesterday, I released cuid for ColdFusion - a ColdFusion port of the cuid library. In my initial write-up, I omitted the "slug()" method because it felt only tangentially related to the concept of UUID generation. However, after a conversation with James Moberg , I decided to add slug generation... read more »

cuid For ColdFusion - Collision-Resistant IDs Optimized For Horizontal Scaling And Performance

At InVision , we've decided to use Eric Elliott 's cuid library when it comes to generating UUIDs (universally unique IDs) in our upcoming microservice-based, highly distributed version of the platform. The cuid library provides collision-resistant IDs that are optimized for horizontal scaling ... read more »

Obtaining A Wildcard SSL Certificate From LetsEncrypt Using The DNS Challenge

Yesterday, I shared my journey of going from total noob to mostly noob with a Docker host running nginx, Node.js, and DataDog on a DigitalOcean droplet . As part of that journey, I was using the LetsEncrypt Docker container to obtain an SSL certificate for my Express.js site. Right after I posted ... read more »

From Noob To Docker On DigitalOcean With Nginx, Node.js, DataDog Logs, DogStatsD, And LetsEncrypt SSL Certificates

Historically, when I've deployed code to the internet, it's either been a ColdFusion website running in managed hosting; or, it's been a static file that I've deployed to GitHub Pages. This is really all that I know how to do. And, this dearth of knowledge has started to hinder my creative outlet. ... read more »

Bug When Passing Nested-Struct Data Into CFThread In ColdFusion 10

I know that Adobe ColdFusion 10 is no longer supported by Adobe. But, yesterday, I ran into a rather strange bug involving unreachable struct-data passed into a CFThread context; and, given the fact that other people out there may still be running ColdFusion 10, I figured it would be worth sharing.... read more »

Using No-Op Transitions To Prevent Animation During The Initial Render Of ngFor In Angular 5.2.6

When Angular 2 first came out, the Animations module didn't block nested transitions (like it did in AngularJS 1.2). So, we had to jump through a bunch of hoops to try and have animation "state" drive the blocking. As of Angular 4.2, however, the revamped Animations module will block nested anima... read more »

Animating Modal Windows While Blocking Intra-Modal Transitions In Angular 5.2.6

The other week, I finally released a demo that I had been working on for several months: recreating the InVision App user interface (UI) using Angular 5 . When I embarked on that demo, I had hoped to include animations; but, by the time I was done, it had gone on for so long that I had to defer an... read more »

Creating A Poor Man's Exponential Backoff And Retry Algorithm In Legacy Code Using ColdFusion

The other day, I was attempting to implement a backoff and retry algorithm around a remote API call that was failing intermittently due to network connection errors. Normally, I would try to find some sort of abstraction that encapsulated the backoff and retry logic . But, I was working in legacy ... read more »

The User Experience (UX) Of The Rogue Fitness Shipping Map

Two years ago, I purchased a beautiful, black-zinc Ohio Power Bar barbell from Rogue Fitness in Columbus Ohio. And, like most fitness equipment, the Ohio Power Bar is large and heavy - about 86-inches long and 45-pounds in this case. So, you can imagine that shipping such an item would require mo... read more »

The Practice Of Empathy And The Avoidance Of "It Depends" As An Answer

It's been almost a decade since I've ranted against the use of, "It Depends", as an answer to any question. And, in the last 10-years, my feelings about "It Depends" haven't really changed; but, to be honest, I haven't given it much more thought. The other day, however, while listening to episod... read more »

Using The Anchor Tag href And download Attributes To Force A File Download

The other day, I happend across an article titled, "5 HTML5 Features you need to know" by Adnane Belmadiaf . In that article Adnane mentions the "download" attribute of the HTML Anchor tag. I'd never heard of this feature before; but, apparently, the "download" attribute tells the browser to downl... read more »

The User Experience (UX) Of Image-Oriented Lists On Apple TV

When I'm not rewriting the entire InVision App UI in Angular 5 or noodling on the proper deployment boundaries for feature flags , I'm watching movies. Specifically, I'm watching movies on my Apple TV in the bedroom. For the most part, I consume movies and shows on Netflix. But, the other day, I... read more »

Experiment: Recreating The InVision App User Interface With The Angular 5 Router

Sometimes, it's hard to see where the rough-edges in a framework exist until you actually try to do something non-trivial with said framework. This is true for all frameworks, including Angular. Maybe especially Angular, since this framework provides an end-to-end solution for application developme... read more »

Using Position Absolute Inside A Scrolling Overflow Container

CAUTION : This is primarily a "note to self". The other week, I tried to use absolute positioning inside a container that had "overflow: auto" enabled. And, somewhat to my surprise, the absolutely-positioned elements were rendered relative to the overflow "viewport," not to the "natural bounding ... read more »

Creating A Dynamic Favicon Service In Angular 5.2.4

A little while ago, GitHub added a feature to their Pull Request (PR) pages in which the browser's favicon would reflect the state of the PR (pending, failed, approved, etc.). This way, you could use other browser tabs and still maintain some sense of how your PR was progressing. I think this is a ... read more »

Restoring And Resetting The Scroll Position On Navigation With A Polyfill In Angular 5.2.3

In a "normal" web application, with a full round-trip request-response life-cycle, restoring and resetting the scroll position of the page is simple: the browser's native functionality just handles it for you. But, in a Single-Page Application (SPA), were pages are rendered with DOM (Document Objec... read more »