<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel> <title>Ivan “CLOVIS” Canet</title><description>Software engineering, open source and computer security </description><link>https://ivan.canet.dev/</link><atom:link href="https://ivan.canet.dev/feed_rss_created.xml" rel="self" type="application/rss+xml" /> <managingEditor>Ivan “CLOVIS” Canet</managingEditor><docs>https://gitlab.com/clovis-ai/website</docs><language>en</language> <pubDate>Tue, 10 Mar 2026 19:41:24 -0000</pubDate> <lastBuildDate>Tue, 10 Mar 2026 19:41:24 -0000</lastBuildDate> <ttl>1440</ttl> <generator>MkDocs RSS plugin - v1.17.9</generator> <image> <url>None</url> <title>Ivan “CLOVIS” Canet</title> <link>https://ivan.canet.dev/</link> </image> <item> <title>Kotlin tricks: Mandatory varargs</title> <description>&lt;h1&gt;Kotlin tricks: Mandatory varargs&lt;/h1&gt; &lt;p&gt;Did you know there are a few different ways to make Kotlin varargs mandatory?&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2026/03/09/kotlin-mandatory-varargs.html</link> <pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2026/03/09/kotlin-mandatory-varargs.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2026/03/09/kotlin-mandatory-varargs.png" type="image/png" length="45057" /> </item> <item> <title>Gradle vocabulary: projects, builds, artifacts…</title> <description>&lt;h1&gt;Gradle vocabulary: projects, builds, artifacts…&lt;/h1&gt; &lt;p&gt;To understand discussions about Gradle, it&#39;s necessary to understand how things are named—and that can be quite confusing.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2026/03/02/gradle-vocabulary.html</link> <pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2026/03/02/gradle-vocabulary.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2026/03/02/gradle-vocabulary.png" type="image/png" length="55532" /> </item> <item> <title>What is the smallest number in Kotlin?</title> <description>&lt;h1&gt;What is the smallest number in Kotlin?&lt;/h1&gt; &lt;p&gt;We use floating-point numbers all the time: &lt;code&gt;Float&lt;/code&gt; and &lt;code&gt;Double&lt;/code&gt;. Both of these types have a few specific cases that you may not know about. Let&#39;s review them.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2025/11/10/ieee754.html</link> <pubDate>Mon, 10 Nov 2025 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2025/11/10/ieee754.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2025/11/10/ieee754.png" type="image/png" length="42540" /> </item> <item> <title>I tried context parameters, Kotlin&#39;s new multi-receiver extension functions</title> <description>&lt;h1&gt;I tried context parameters, Kotlin&#39;s new multi-receiver extension functions&lt;/h1&gt; &lt;p&gt;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.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2025/10/13/kotlin-context-parameters.html</link> <pubDate>Mon, 13 Oct 2025 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2025/10/13/kotlin-context-parameters.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2025/10/13/kotlin-context-parameters.png" type="image/png" length="47390" /> </item> <item> <title>Your first Gradle task in 2025</title> <description>&lt;h1&gt;Your first Gradle task in 2025&lt;/h1&gt; &lt;p&gt;Best practices in Gradle have changed quite a few times over the years, but the online tutorials are rarely updated. Let&#39;s review what is recommended as of Gradle 8, in 2025.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2025/08/18/gradle-1st-task.html</link> <pubDate>Mon, 18 Aug 2025 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2025/08/18/gradle-1st-task.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2025/08/18/gradle-1st-task.png" type="image/png" length="44865" /> </item> <item> <title>Docker misconception: should I use ENTRYPOINT or CMD?</title> <description>&lt;h1&gt;Docker misconception: should I use ENTRYPOINT or CMD?&lt;/h1&gt; &lt;p&gt;Docker offers two ways to control what is executed when a container starts, &lt;code&gt;ENTRYPOINT&lt;/code&gt; and &lt;code&gt;CMD&lt;/code&gt;. Often, they are confused and misused.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2025/06/30/docker-entrypoint-cmd.html</link> <pubDate>Mon, 30 Jun 2025 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2025/06/30/docker-entrypoint-cmd.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2025/06/30/docker-entrypoint-cmd.png" type="image/png" length="47454" /> </item> <item> <title>MongoDB documents are strange</title> <description>&lt;h1&gt;MongoDB documents are strange&lt;/h1&gt; &lt;p&gt;MongoDB stores all its information in its own binary format called BSON. Lately, I&#39;ve been writing my own implementation of BSON, and so I&#39;ve been studying its specification. Here are a few things I learned about BSON documents.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2025/06/23/bson-documents.html</link> <pubDate>Mon, 23 Jun 2025 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2025/06/23/bson-documents.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2025/06/23/bson-documents.png" type="image/png" length="49445" /> </item> <item> <title>Lifting Kotlin testing: Comparing JUnit, Kotlin-test, Kotest, Prepared and TestBalloon</title> <description>&lt;h1&gt;Lifting Kotlin testing: Comparing JUnit, Kotlin-test, Kotest, Prepared and TestBalloon&lt;/h1&gt; &lt;p&gt;Which Kotlin test framework should you use in 2025? Is there still room to innovate?&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2025/06/17/state-of-kotlin-tests.html</link> <pubDate>Tue, 17 Jun 2025 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2025/06/17/state-of-kotlin-tests.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2025/06/17/state-of-kotlin-tests.png" type="image/png" length="53734" /> </item> <item> <title>Back to basics: When sets break</title> <description>&lt;h1&gt;Back to basics: When sets break&lt;/h1&gt; &lt;p&gt;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&#39;s review what they are, and what happens when we break them.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2025/05/12/sets.html</link> <pubDate>Mon, 12 May 2025 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2025/05/12/sets.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2025/05/12/sets.png" type="image/png" length="44927" /> </item> <item> <title>Deep dive into Angular and Compose differences</title> <description>&lt;h1&gt;Deep dive into Angular and Compose differences&lt;/h1&gt; &lt;p&gt;Angular and Compose are both declarative UI frameworks and can both target the web ecosystem. Still, their approach is very different. Let&#39;s take a look at the similarities and the differences.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2025/02/10/angular-compose.html</link> <pubDate>Mon, 10 Feb 2025 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2025/02/10/angular-compose.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2025/02/10/angular-compose.png" type="image/png" length="48204" /> </item> <item> <title>What does it mean to be a better Java? (Part 3)</title> <description>&lt;h1&gt;What does it mean to be a better Java? (Part 3)&lt;/h1&gt; &lt;p&gt;This week, we explore software architecture: interfaces, classes, objects and inheritance. We grade Kotlin through Java&#39;s prism, and thus mainly focus on object-oriented design.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2024/12/16/better-java-3.html</link> <pubDate>Mon, 16 Dec 2024 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2024/12/16/better-java-3.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2024/12/16/better-java-3.png" type="image/png" length="52754" /> </item> <item> <title>What does it mean to be a better Java? (Part 2)</title> <description>&lt;h1&gt;What does it mean to be a better Java? (Part 2)&lt;/h1&gt; &lt;p&gt;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: &lt;code&gt;Object&lt;/code&gt;, &lt;code&gt;Any&lt;/code&gt; and &lt;code&gt;Comparable&lt;/code&gt;.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2024/12/09/better-java-2.html</link> <pubDate>Mon, 09 Dec 2024 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2024/12/09/better-java-2.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2024/12/09/better-java-2.png" type="image/png" length="52363" /> </item> <item> <title>What does it mean to be a better Java? (Part 1)</title> <description>&lt;h1&gt;What does it mean to be a better Java? (Part 1)&lt;/h1&gt; &lt;p&gt;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.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2024/12/02/better-java-1.html</link> <pubDate>Mon, 02 Dec 2024 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2024/12/02/better-java-1.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2024/12/02/better-java-1.png" type="image/png" length="51317" /> </item> <item> <title>Don&#39;t touch Throwable</title> <description>&lt;h1&gt;Don&#39;t touch Throwable&lt;/h1&gt; &lt;p&gt;&lt;code&gt;Throwable&lt;/code&gt; is the supertype of all things that can be thrown. It often appears in codebases as an upper bound for error handling. Here&#39;s why you shouldn&#39;t do it.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2024/10/07/flee-throwable.html</link> <pubDate>Mon, 07 Oct 2024 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2024/10/07/flee-throwable.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2024/10/07/flee-throwable.png" type="image/png" length="37095" /> </item> <item> <title>The vulnerability is by design</title> <description>&lt;h1&gt;The vulnerability is by design&lt;/h1&gt; &lt;p&gt;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.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2024/09/23/js-path-traversal.html</link> <pubDate>Mon, 23 Sep 2024 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2024/09/23/js-path-traversal.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2024/09/23/js-path-traversal.png" type="image/png" length="41660" /> </item> <item> <title>Typing the web: TypeScript &amp;amp; KotlinJS</title> <description>&lt;h1&gt;Typing the web: TypeScript &amp;amp; KotlinJS&lt;/h1&gt; &lt;p&gt;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.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2024/09/05/ts-kjs-types.html</link> <pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2024/09/05/ts-kjs-types.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2024/09/05/ts-kjs-types.png" type="image/png" length="51902" /> </item> <item> <title>GitLab over GitHub</title> <description>&lt;h1&gt;GitLab over GitHub&lt;/h1&gt; &lt;p&gt;Over the years, many people have asked me why I prefer using GitLab over GitHub. Although an exhaustive comparison wouldn&#39;t be possible in a single article, I&#39;d like to highlight a few points of interest.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2024/08/21/gitlab-vs-github.html</link> <pubDate>Wed, 21 Aug 2024 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2024/08/21/gitlab-vs-github.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2024/08/21/gitlab-vs-github.png" type="image/png" length="32971" /> </item> <item> <title>That time I broke KotlinX.Coroutines</title> <description>&lt;h1&gt;That time I broke KotlinX.Coroutines&lt;/h1&gt; &lt;p&gt;A story about contributing to open source, how the community finds bugs before they reach customers, and a weird edge case I didn&#39;t know about.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2024/08/05/that-time-i-broke-kotlinx-coroutines.html</link> <pubDate>Mon, 05 Aug 2024 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2024/08/05/that-time-i-broke-kotlinx-coroutines.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2024/08/05/that-time-i-broke-kotlinx-coroutines.png" type="image/png" length="44591" /> </item> <item> <title>What is really hexagonal architecture?</title> <description>&lt;h1&gt;What is really hexagonal architecture?&lt;/h1&gt; &lt;p&gt;Hexagonal architecture is one of the most popular software architectures at the moment. Let&#39;s dive into what it is, what it isn&#39;t, and how to know when a project isn&#39;t benefitting from it.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2024/08/01/hexagonal-architecture.html</link> <pubDate>Thu, 01 Aug 2024 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2024/08/01/hexagonal-architecture.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2024/08/01/hexagonal-architecture.png" type="image/png" length="49555" /> </item> <item> <title>Dependency Injection without a framework</title> <description>&lt;h1&gt;Dependency Injection without a framework&lt;/h1&gt; &lt;p&gt;Dependency Injection is more popular than ever. As with all popular things, the original idea is becoming more and more diluted down, to the point that discussing it is becoming difficult. Let&#39;s go back to the roots, and see what DI really is.&lt;/p&gt;</description> <link>https://ivan.canet.dev/blog/2024/07/15/di-without-frameworks.html</link> <pubDate>Mon, 15 Jul 2024 00:00:00 +0000</pubDate> <source url="https://ivan.canet.dev/feed_rss_created.xml">Ivan “CLOVIS” Canet</source><guid isPermaLink="true">https://ivan.canet.dev/blog/2024/07/15/di-without-frameworks.html</guid> <enclosure url="https://ivan.canet.dev/assets/images/social/blog/2024/07/15/di-without-frameworks.png" type="image/png" length="50435" /> </item> </channel> </rss>