RSSAmplifier

Blog

Writings

lknuth.devRSS feed ↗21 posts

Latest posts

Webfont and Performance

A few days ago I ran the PageSpeed Insights tool on my Blog and got a lower score than I expected. Especially in the “Performance” category, where I scored below 90%. Obviously, I can’t let that stand. The biggest contributor to the low score was a “Cumulative Layout Shift”. So what is that, and how do I get rid of it? Layout and shifts A layout shift happens when the…

Persistent storage is for cowards

About a year ago, I rebuild my home server. It still runs on Kubernetes, but I moved away from traditional tooling associated with it. The goal was simplicity; and I made some opinionated choices to achieve it. For example, I deploy everything using Terraform with the Kubernetes provider - no more YAML! For hardware, I just have a single Raspberry Pi 4. There is no external storage attached to it,…

Java in the Browser

Like most aspiring software engineers, I wanted to program games. Back in 2012 I had been learning to program for two years. I was basically a senior developer. Java was the only programming language that I knew. And because I fancied myself a capable engineer, I wanted to build the game engine myself, from scratch. So I stole somebody else’s game - I read through the (excellent) PAC-MAN…

On the production Database

Eventually, you’ll connect to the production instance of your relational database. Perhaps just to check something. Or to make a small change manually.

Website Remaster

When I set up this version of the website I opted for a ready to use theme instead of making my own. Then, some time ago, I started simplifying everything I could about my setup. I value when things are easy to understand, maintain and extend. The new year was a great excuse to redo the perfectly good website in Tailwind CSS. It’s everywhere in web development now, and I wanted to get more…

Three Levels of Git Aliases

Chapter 2.7 of the Git Book is called “Git Aliases”. Tucked away in it is probably the most powerful built-in feature to customize git to your own liking. Aliases allow you to define a shorthand for a git sub-command - including its options - that you commonly type in your workflow. We’ll illustrate three increasingly powerful levels of customization enabled by aliases using a…

Zero to EPUB

I like Low Tech Magazine. Not only is their website solar-powered and only available when the weather is good, they provide an interesting viewpoint on technology as a whole. Recently, they created a thematic collection of articles called “How to Build a Low-tech Internet?” . It’s sold as a hard-copy book, but not as an EPUB. Since I’m almost exclusively reading my books…

Design a Technical Interview

Last year, the company I work for was looking to hire a Backend Engineer. We wanted somebody who was a senior or on their way to becoming one. The Backend Squad was tasked with designing an interview to help decide who to hire based on technical merit. Above all, we wanted our interview to favor candidates that are good fits. Now, after working with our new hire for about 11 months, we know that…

Work in an efficient team

Some years ago I worked in a team of software developers which I still consider the most productive team I have ever been a part of. We built a large system for our internal users with a dozen product team members and had a turnaround time from idea to implementation of about three weeks. This is how we did it.

Delightfully Boring

When I joined 7Mind a year ago, I was hired partially to help migrate the existing system away from micro-services towards a new monolithic Elixir application. This decision was made before I had joined, but having worked in a company that went very all-in on micro-services before, I welcomed it. In this article we’ll look at the value that micro-services bring to an organization and how at…

Dangerously Typed

At work, I’m currently building a new Node.js Application. I opted to use Node, because the application is highly parallel and while I could have built it in Java, Node already does all the hard things that come with building multithreaded Applications. For my language of choice, I looked to TypeScript , because it adds some compile-time type-safety to JavaScript. For the most part,…

TTS and Usability

There are limited yet very legit use-cases for Text to Speech engines in your application. An example for such a case is an application that has focus and is doing its thing, but doesn’t require physical interaction with the device. These applications might still want to update the user regularly, without touching or looking at the device. An example of such an application is a Navigation…

Generating Qrcodes With Zxing

When it comes to reading QR-codes, most Android applications use the ZXing library . It’s capabilities and ease of use when reading QR-Codes is already known, but ZXing can also generate QR-Codes. Sadly, a lack of documentation makes it pretty hard to dive into this topic, so this article aims to provide a simple starting point.

Making GNOME Shell Extensions

Getting into GNOME Shell extension development is hard and involves a lot of source-code reading. This post collects resources that helped me get into it as well as general advice. It aims to be a jump-off point, rather than a guide.

Audio Visual Environment

I’m a highly audio-visual human being. I like to listen to music anywhere I go, at any given time, largely for the sake of being entertained, but also because I can’t (and don’t want to) listen to other people talking. I live in the city and don’t own a car myself, so I’m taking the train or bus almost everywhere. But in this article, I want to focus on “coding…

Working unbuffered Streams

When working with I/O in Java, you can normally choose from a variety of Stream and Reader or Writer classes to handle all the “dirty” work for you. But what happens under the hood? And why is this stuff so error-prone?

UDP Multicast on Android

I started working on a small inventory system, that keeps track of all the things I buy. To enter new items quickly into the system, I needed a barcode-scanner to scan new articles, transfer them to my computer and allow me to (for example) paste them into a focused input-field. I wrote a small Android application, that uses zxing to scan the barcodes and a simple multicasted UDP network…

Android targeting system

I recently started supporting API Level 9 in my current project, which brought a problem with the ActionBar along. I had used it extensively in development (which was targeting post-Honeycomb devices), but it’s only available on API Level 11 and later. Long story short, I started using ActionBarSherlock to get the ActionBar working on all devices and discovered an interesting fact about the…

Saying more than nothing

As I was reading around on StackOverflow, digging through other peoples source code, I spotted multiple methods returning null in a variety of circumstances. I also found rather imaginative ways to handle null-values. Although there is nothing wrong with null , the concept of null-pointers seems to be somewhat misunderstood. Let’s change that. What are null-pointers? Wikipedia has the…

Rules of Immutability

In a perfect world, every value container (an object that only holds multiple fields of data and defines methods for access) is immutable. Immutability should always be a design-goal, especially, when creating a library or API. In this article, I’m going to explain what immutable objects are, why they are cool and what stumbling blocks you should watch out for.

Catching Practice

I recently answered a question on StackOverflow, asking if catching an Error would be reasonable in a particular case. The original question and my answer can be found here , however I felt that my answer could be extended with a more general discussion of the implications and additional examples.