<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>I'm Romain, nice to meet you! on rlibaert</title><link>https://blog.rlibaert.dev/</link><description>Recent content in I'm Romain, nice to meet you! on rlibaert</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 10 May 2026 13:12:54 +0000</lastBuildDate><atom:link href="https://blog.rlibaert.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Agentic coding</title><link>https://blog.rlibaert.dev/posts/agentic-coding/</link><pubDate>Sun, 10 May 2026 13:12:54 +0000</pubDate><guid>https://blog.rlibaert.dev/posts/agentic-coding/</guid><description>&lt;p&gt;AI has definitely transformed a lot of industries and software development is not
spared. While this technology is still young and changing, some standards are now
emerging.&lt;/p&gt;
&lt;h2 id="agentic-code-editors"&gt;Agentic code editors&lt;/h2&gt;
&lt;p&gt;Most IDEs now make use of AI models, either directly or via extensions, to
provide powerful features and enhance the development experience. VSCode has
been the standard for a long time and is still extremely popular, but the rise
of AI helped changing the landscape. &lt;a href="https://cursor.sh/"&gt;Cursor&lt;/a&gt; is one of
those, but to me &lt;a href="https://zed.dev/"&gt;Zed&lt;/a&gt; is the most innovative (several IDEs
are VScode forks, this one is built from the ground up).&lt;/p&gt;</description></item><item><title>Containerized development on Fedora Silverblue</title><link>https://blog.rlibaert.dev/posts/containerized-development-silverblue/</link><pubDate>Sat, 15 Nov 2025 21:42:54 +0000</pubDate><guid>https://blog.rlibaert.dev/posts/containerized-development-silverblue/</guid><description>&lt;p&gt;After some time developing containerized applications, I made a habit of trying
to run everything in containers. The ability to sandbox applications allows me
to keep control over my system and makes me confident to try and discover new
software. In this post I show the tools I use to create disposable development
environments and to keep my system tidy.&lt;/p&gt;
&lt;h2 id="development-containers"&gt;Development Containers&lt;/h2&gt;
&lt;p&gt;Quoting the website, &lt;a href="https://containers.dev/"&gt;Development Containers&lt;/a&gt; &amp;ldquo;allows you to use a container as
a full-featured development environment&amp;rdquo;, bringing the benefits of containerization
to software development. Basically you can start using a development container
by adding to your project a &lt;code&gt;.devcontainer.json&lt;/code&gt; file as simple as:&lt;/p&gt;</description></item><item><title>Resume</title><link>https://blog.rlibaert.dev/resume/</link><pubDate>Sun, 29 Jun 2025 17:25:54 +0000</pubDate><guid>https://blog.rlibaert.dev/resume/</guid><description>&lt;p&gt;I have a decade of distilling software problems to their essence and offering simple &amp;amp; efficient solutions.&lt;/p&gt;
&lt;h2 id="skills"&gt;Skills&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Programming&lt;/strong&gt;: Golang, C/C++, VHDL, Git, GNU Make, Dockerfile, Design Patterns, Testing, Linting&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Containerization&lt;/strong&gt;: Docker, Podman, Nomad, Kubernetes, Dev Containers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observability&lt;/strong&gt;: Prometheus, VictoriaMetrics, Grafana, Loki&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Databases&lt;/strong&gt;: PostgreSQL, MariaDB, MongoDB, Redis, Timescale&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI / CD&lt;/strong&gt;: GitLab CI, GitHub Actions&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="experience"&gt;Experience&lt;/h2&gt;
&lt;h3 id="senior-back-end-engineer--radioking-nrj-group"&gt;Senior Back-End Engineer • RadioKing (NRJ Group)&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Since May 2022 • Remote, France&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developed and maintained Golang REST APIs running in a self-hosted Kubernetes cluster&lt;/li&gt;
&lt;li&gt;Implemented efficient audio processors in Go using FFmpeg’s libraries &amp;amp; Cgo&lt;/li&gt;
&lt;li&gt;Designed a custom Icecast-compatible ingestion network enhancing observability of critical events as well as security &amp;amp; reliability&lt;/li&gt;
&lt;li&gt;Architectured an Icecast-based CDN serving hundreds of webradios to 100k+ concurrent listeners&lt;/li&gt;
&lt;li&gt;Made audience tracking more reliable by processing asynchronously sessions metadata with FluentBit, providing a resilient &amp;amp; accurate source of insights to advertisers&lt;/li&gt;
&lt;li&gt;Provided relevant Prometheus metrics and Grafana dashboards, allowing our team to efficiently investigate issues in the stack and locate root causes&lt;/li&gt;
&lt;li&gt;Improved collaboration &amp;amp; progression on projects by being a source of proposals and promoting usage of recognized software design workflows (Domain-Driven Design, EventStorming)&lt;/li&gt;
&lt;li&gt;Mentored the team on various tools (Git, Docker, DevContainers) and development best practices&lt;/li&gt;
&lt;li&gt;Reduced build time by 20% and artifacts size by 50% on GitLab CI&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="system-engineer--stormshield"&gt;System Engineer • Stormshield&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;September 2019 - April 2022 • Villeneuve d’Ascq, France&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Advanced flag parsing in standard Go</title><link>https://blog.rlibaert.dev/posts/deep-dive-into-go-flag-package/</link><pubDate>Sat, 22 Mar 2025 21:42:54 +0000</pubDate><guid>https://blog.rlibaert.dev/posts/deep-dive-into-go-flag-package/</guid><description>&lt;p&gt;Over time, a plethora of libraries were developed to build complex CLI
applications; &lt;code&gt;spf13/cobra&lt;/code&gt; and &lt;code&gt;urfave/cli&lt;/code&gt; being probably the most used ones
(both have tens of thousands stars on GitHub). While they offer lots of features
out of the box, I often found them complex and overkill for my needs.&lt;/p&gt;
&lt;p&gt;In this post, we will have an overview of how Go&amp;rsquo;s &lt;code&gt;flag&lt;/code&gt; works and see some
advanced uses of it. We will then try to implement parsing of complex values
such as comma-separated arguments or slices.&lt;/p&gt;</description></item><item><title>Making sync package type strict using Go generics</title><link>https://blog.rlibaert.dev/posts/making-sync-package-type-strict-using-go-generics/</link><pubDate>Thu, 20 Mar 2025 17:20:54 +0000</pubDate><guid>https://blog.rlibaert.dev/posts/making-sync-package-type-strict-using-go-generics/</guid><description>&lt;p&gt;The &lt;code&gt;sync&lt;/code&gt; package from Go&amp;rsquo;s standard library provides primitives (&lt;code&gt;Mutex&lt;/code&gt;, &lt;code&gt;WaitGroup&lt;/code&gt;, &amp;hellip;) to help solving synchronization problems. This is an older package and some of the implementations could be different if the generic features were available then.&lt;/p&gt;
&lt;p&gt;Indeed, the &lt;code&gt;sync.Pool&lt;/code&gt; and &lt;code&gt;sync.Map&lt;/code&gt; facilitates concurrent usage for storing and retrieving data in different situations. Those features are pretty elementary and their functionality highly relies on the fact that they can be used with &lt;em&gt;&lt;code&gt;any&lt;/code&gt;&lt;/em&gt; type, which comes with a few drawbacks. Giving up the type strictness prevents the compiler to detect potential errors or requires type assertion code. The former implies extra attention when writing code and the latter reduces its simplicity and readability.&lt;/p&gt;</description></item><item><title>Must pattern in Go and a generics-based generalization</title><link>https://blog.rlibaert.dev/posts/must-pattern-in-go-and-a-generics-based-generalization/</link><pubDate>Tue, 18 Mar 2025 17:20:54 +0000</pubDate><guid>https://blog.rlibaert.dev/posts/must-pattern-in-go-and-a-generics-based-generalization/</guid><description>&lt;p&gt;There is a handy code pattern commonly found in Go codebases, known as Must pattern. To put it simply, for a given &lt;code&gt;Do&lt;/code&gt; function returning at least an error, the &lt;code&gt;MustDo&lt;/code&gt; function then omits returning the error, panicking instead. For instance:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// package regexp&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;expr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Regexp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;MustCompile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;expr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Regexp&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// package netip&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;ParseAddr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;MustParseAddr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Addr&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In contexts where errors are unlikely to happen, it is a nice way to still handle them while uncluttering the code. Of course this implies the application of the same good practices as when using &lt;code&gt;panic&lt;/code&gt;. Those functions are often used to create constant-like objects, such as regular expressions:&lt;/p&gt;</description></item></channel></rss>