RSSAmplifier

Blog

Ivan “CLOVIS” Canet

Software engineering, open source and computer security

ivan.canet.devRSS feed ↗20 posts

Latest posts

Kotlin tricks: Non-exhaustive enums

Kotlin tricks: Non-exhaustive enums Enums are an exhaustive set of values. But what if you suspect you may want to add new entries in the future?

Don't measure elapsed time by subtracting timestamps

Don't measure elapsed time by subtracting timestamps The most common way of measuring elapsed time is flawed.

In which order should Kotlin parameters be declared?

In which order should Kotlin parameters be declared? There are so many kinds of parameters! Is there an order in which they should be declared?

Arrow: Error handling without flatMap

Arrow: Error handling without flatMap The Arrow library is quite poorly known. As Kotlin 2.4.0 is around the corner, bringing stable context parameters, it is time to brush a few misconceptions.

Kotlin tricks: Mandatory varargs

Kotlin tricks: Mandatory varargs Did you know there are a few different ways to make Kotlin varargs mandatory?

Gradle vocabulary: projects, builds, artifacts…

Gradle vocabulary: projects, builds, artifacts… To understand discussions about Gradle, it's necessary to understand how things are named—and that can be quite confusing.

What is the smallest number in Kotlin?

What is the smallest number in Kotlin? We use floating-point numbers all the time: Float and Double . Both of these types have a few specific cases that you may not know about. Let's review them.

I tried context parameters, Kotlin's new multi-receiver extension functions

I tried context parameters, Kotlin's new multi-receiver extension functions Kotlin is getting a new concept that will widen the possibility of extension functions. The feature is still experimental in the latest Kotlin version, which makes it the perfect time to try them out.

Your first Gradle task in 2025

Your first Gradle task in 2025 Best practices in Gradle have changed quite a few times over the years, but the online tutorials are rarely updated. Let's review what is recommended as of Gradle 8, in 2025.

Docker misconception: should I use ENTRYPOINT or CMD?

Docker misconception: should I use ENTRYPOINT or CMD? Docker offers two ways to control what is executed when a container starts, ENTRYPOINT and CMD . Often, they are confused and misused.

MongoDB documents are strange

MongoDB documents are strange MongoDB stores all its information in its own binary format called BSON. Lately, I've been writing my own implementation of BSON, and so I've been studying its specification. Here are a few things I learned about BSON documents.

Lifting Kotlin testing: Comparing JUnit, Kotlin-test, Kotest, Prepared and TestBalloon

Lifting Kotlin testing: Comparing JUnit, Kotlin-test, Kotest, Prepared and TestBalloon Which Kotlin test framework should you use in 2025? Is there still room to innovate?

Back to basics: When sets break

Back to basics: When sets break Sets are one of the most basic data structures of modern programming. Unlike arrays, sets require the data to confirm to a few invariants. Let's review what they are, and what happens when we break them.

Deep dive into Angular and Compose differences

Deep dive into Angular and Compose differences Angular and Compose are both declarative UI frameworks and can both target the web ecosystem. Still, their approach is very different. Let's take a look at the similarities and the differences.

What does it mean to be a better Java? (Part 3)

What does it mean to be a better Java? (Part 3) This week, we explore software architecture: interfaces, classes, objects and inheritance. We grade Kotlin through Java's prism, and thus mainly focus on object-oriented design.

What does it mean to be a better Java? (Part 2)

What does it mean to be a better Java? (Part 2) Last week, we studied ways in which Kotlin improves upon Java when it comes to creating and destroying objects, eliminating Java pitfalls and footguns. This week, we discuss the common supertypes: Object , Any and Comparable .

What does it mean to be a better Java? (Part 1)

What does it mean to be a better Java? (Part 1) In the old days, programming languages would come and go. In the modern age, languages remain for decades as platforms on top of which new ecosystems are born, never to be dethroned. Java is the venerable sage of the server-side world—but new languages still attempt to take it on.

Don't touch Throwable

Don't touch Throwable Throwable is the supertype of all things that can be thrown. It often appears in codebases as an upper bound for error handling. Here's why you shouldn't do it.

The vulnerability is by design

The vulnerability is by design We should all strive to write code that is harder—if not impossible—to exploit. Sometimes, however, the vulnerability comes from places we thought we could trust.

Typing the web: TypeScript & KotlinJS

Typing the web: TypeScript & KotlinJS When I talk about KotlinJS, people often ask me “Why not just TypeScript?”. This article compares the type system and standard libraries to understand how different the languages are.