• Build on latest Java, test through lowest Java

    In the past, when a new version of Java was released, I would add that version to our open source project’s CI builds. strategy: matrix: java-version: – 8 – 9 ⋮ – 17 + – 18 This ensures that each project can be built and its tests pass on every major version. But this makes…

    Read More

  • Report card: Java 19 and the end of Kotlin

    Three years ago I gave the talk “What’s new in Java 19: The end of Kotlin?” which forecasted what a future Java language would look like in September 2022 when Java 19 was released. Check your calendars, folks. It’s September 2022 right now and Java 19 was released today! As expected my predictions were not…

    Read More

  • Using jlink to cross-compile minimal JREs

    jlink is a JDK tool to create bespoke, minimal JREs for your applications. Let’s try it with a “Hello, world!” program: class Main { public static void main(String… args) { System.out.println(“Hello, world!”); } } My laptop is an M1 Mac and I have downloaded the Azul Zulu JDK 19 build for it. With the JDK…

    Read More

  • A Jetpack Compose by any other name

    I really like Jetpack Compose. Between work and personal stuff I have three projects which are each built on top of it. It’s great! So far my biggest problem is its name… but that requires some explaining. Welcome to one of the hills I’ll die on! What is Jetpack Compose? If you’re already familiar with…

    Read More

  • Integration verbosity and good layering

    One of my favorite non-features from building view binding is that it lacks integration with activities or fragments. If you use view binding with activities or fragments, however, this fact might be to your disdain. Every activity using view binding is forced to do something along the lines of: override fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState)…

    Read More

  • Cross-compiling static Rust binaries in Docker for Raspberry Pi

    Earlier this year I built a web-based garage door controller using Rust for the Raspberry Pi called Normally Closed. My deployment includes a Pi 3b and a Pi Zero which are ARMv7 and ARMv6 devices, respectively. I deploy services with Docker and wanted to continue using it here for simplicity. Getting all of this set…

    Read More

  • Case-insensitive filesystems considered harmful (to me)

    Having been burned by case-insensitive filesystem bugs one too many times, I long ago switched my development folder to a case-sensitive filesystem partition on my otherwise case-insensitive Mac. Unfortunately this can actually work against me as I interact with the computers of coworkers and service providers which use the default. Well I was burned again,…

    Read More