The Happiest Platform on Earth: What the Cloud Can Learn from Disney World

We can add a little magic to our cloud platforms by learning from the techniques Disney’s Imagineers use.

»
Author's profile picture Joe Kutner

Meet Developers Where They Are

The key to removing the friction in a developer experience is meeting developers where they are, which we can do by following just a few rules as we design our software tools.

»
Author's profile picture Joe Kutner

Write a Good Dockerfile in 0 Steps

If you already have the Pack CLI installed, you can create a Docker image for any Java, Node.js, Python, or Ruby app (without a Dockerfile) by running:

»
Author's profile picture Joe Kutner

Write a Good Dockerfile in 19 'Easy' Steps

(update: also see my post on Writing a Good Dockerfile in 0 Steps)

»
Author's profile picture Joe Kutner

My Rules for Writing Well

I’ve learned the hard way that writing is… hard. But anyone can become a great writer by following a few rules.

»
Author's profile picture Joe Kutner

Programming Minecraft with Python in Docker

In this post, you’ll learn how to use Python to program a Minecraft server running in a Docker container.

»
Author's profile picture Joe Kutner

Using Your Heroku Buildpacks with the Pack CLI

You can’t teach an old dog new tricks, but you can wrap it in an API compatibility layer. In this post, you’ll learn how to use older versions of Heroku Buildpacks with the Pack CLI by wrapping them in a Cloud Native Buildpack shim that’s as easy as:

»
Author's profile picture Joe Kutner

Building Spring Boot Docker Images with Heroku Buildpacks

Spring Boot 2.3.0 introduced a new feature you can use to package your app into a Docker image with Cloud Native Buildpacks (CNB). In this post, you’ll learn how to use this mechanism with Heroku buildpacks to create an image you can run on any cloud platform.

»
Author's profile picture Joe Kutner

Using AdoptOpenJDK, Corretto, Zulu, and Graal on Heroku

Choosing a Java runtime to install has become… interesting. Simon Ritter of Azul and Matt Raible of Okta have done great write-ups on how to select the right JDK, and in this post you’ll learn how to use a few of those options on Heroku.

»
Author's profile picture Joe Kutner

Mystery Memory Leaks and JNI

Java libraries that invoke native code (i.e. code written in C/C++ and compiled for a specific platform) via the Java Native Interface (JNI) can allocate memory that is nearly invisible to standard JVM monitoring tools. This creates the potential for very mysterious memory leaks because JNI does not automatically garbage collect or track the non-JVM memory resources allocated on the native side.

»
Author's profile picture Joe Kutner

Update Your Java Dependencies Early and Often

Did you know version 2.8.8 of Jackson Databind (a popular JSON library) has a deserialization vulnerability that can be used to execute any code or command on your system? If you’re using this version you need to update your app immediately.

»
Author's profile picture Joe Kutner

Draining Servlet Requests

Restarts happen, but your users shouldn’t notice them. Every user request should run to completion before the server processing them shuts itself down. This is known as draining requests, and it’s described in the Disposability principle of the 12-factor app. At a high level, here’s what should happen:

»
Author's profile picture Joe Kutner

Oh the Places Your Java Memory Goes

Java heap memory does not make up 100-percent of a JVM process’s memory allocation. There are many categories of non-heap memory in a JVM process that often account for more RAM than the heap when they are summed up. It’s possible to set your maximum heap size to 512 MB, -Xmx512m, and have your process consume more than 1 gigabyte of RAM in total.

»
Author's profile picture Joe Kutner

Deploying Kotlin on Heroku with Ktor

Kotlin reminds me of a young Harry Potter. It’s fresh, full of zeal, and has the support of a great institution. Harry had Hogworts, but Kotlin has the entire JVM ecosystem to nurture its growth.

»
Author's profile picture Joe Kutner

Locking Dependency Versions in Gradle

The ./gradlew build command should produce the exact same output each time you run it–even when you run it on someone else’s computer. But the use of dependency version ranges in Gradle makes it possible for ./gradlew build to resolve different versions of dependencies during each execution, which makes the output of your builds unpredictable.

»
Author's profile picture Joe Kutner