From a JAR to a full-fledged MacOS app
A couple of years ago, I developed a small Kotlin GUI to help me rename my files in batch. I actually created it with different JVM …

Technologist focusing on cloud-native technologies, DevOps, CI/CD pipelines, and system observability. His focus revolves around creating technical content, delivering talks, and engaging with developer communities to promote the adoption of modern software practices. With a strong background in software, he has worked extensively with the JVM, applying his expertise across various industries. In addition to his technical work, he is the author of several books and regularly shares insights through his blog and open-source contributions.

A couple of years ago, I developed a small Kotlin GUI to help me rename my files in batch. I actually created it with different JVM …

Though I used Spring transactions a lot via the @Transactional annotation, I never opened thought about looking at their implementation.

When I first started attending conferences, I diligently tried to write down notes and publish them. It forced me to actively listen to the …

I recently developed a new workflow, and it prompted me to write this post. Feel free to add your own.

In this post, we describe the default of two of the most common Git commands. I hope it sheds some light on them.

Operators of OpenTelemetry can't treat services as black boxes. They must consider the underlying stack and framework, and learn how to …

You may know I'm a big fan of OpenTelemetry. I recently finished developing a master class for the YOW! conference at the end of the year. …

With destructuring, pattern matching is a huge help to developers who want to write readable and maintainable code.

Let's migrate ad hoc test code to rely on OpenRewrite's provided classes.

The exhaustive description of common patterns is a huge asset for beginning writers and can help even seasoned ones.

I've been eying OpenRewrite for some time, but I haven't had time to play with it... yet.

I continue to take care of my Home Assistant. This week, I replaced my original setup with Cloudflare Tunnel. This is the 6th post in the My …

I recently acquired Netatmo smart radiator valves to manage my rooms' temperature remotely.

Recently, my good friend Richard Fichtner advised using the mvn dependency:analyze command to get rid of declared but unused dependencies.

I've been a big fan of Mutation Testing since I discovered PIT. As I dive deeper into Rust, I wanted to check the state of mutation testing …

I wrote previously about libs for error management in Rust. This week, I want to write about the try block, an experimental feature.

The ideal size of your Kubernetes clusters is a day 0 question and demands a definite answer. You find one giant cluster on one end of the …

Like a couple of innovative technologies, different people have different viewpoints on where WebAssembly fits the technology landscape. …

In this post, we'll lay the ground for a simple app's unit- and integration-testing, leveraging Testcontainers in the local environment.

In this article, we'll achieved several milestones toward the end-to-end testing goal.
This week's article is the third and final in my series about running tests on Kubernetes for each pull request.

This review is about DuckDB in Action by JoMark Needham, Michael Hunger, and Michael Simons from Manning.

DevPod is a nice tool around your toolbelt that allows your development team(s) to share the same machine configuration without hassle.

In my previous company, I developed a batch job that tracked metrics across social media, such as Twitter, LinkedIn, Mastodon, Bluesky, …

The problem of some Kubernetes objects: they are cluster-wide and lock all teams working on the same cluster to use the same version.

Configure the Adaptive Lighting integration to our Home Assistant and benefit from different intensities based on the time of the day.

For the first article of 2025, I'm continuing my retrospective series!

Learn about the model objects available in Home Assistant. After that, migrate from the proprietary Philips Hue automation to Home …

I have many different "smart" devices at home and no centralized system to manage them all. Plus, I'm concerned about privacy and am an …
Learn how to start your Langchain4j journey in several incremental steps.

In previous weeks, I've analyzed several libraries and frameworks that augment the client with AJAX capabilities.

The beauty of Vaadin lies in its simplicity - you only write backend code.
In the two previous articles, I described Vue and Alpine. We configured Spring Boot to return JSON. With HTMX, we configured it to return …

Alpine is very similar to Vue, with the notable difference of the lack of templating; components are only available via a price. All other …

In this article, I take my first steps in augmenting an SSR app with Vue.

Understanding the shared steps in the project setup is crucial before delving into the specifics of each client-augmenting technology.

My journey in programming began over two decades ago, a time when JavaScript was a far cry from its current state, and developers were …

I'm continuing my journey on getting more familiar with HTTP APIs by reading related RFCs.

DRY is an important principle in software development. In this article, you learn how to apply it to Apache APISIX configuration.

A simple implementation of the Idempotency-Key header specification on Apache APISIX via a plugin.

Practical alternatives to writing a custom plugin, offering solutions you can quickly implement in your projects.

Let's compare three different ways to do OpenTelemtry Tracing: Java agent v1, Java agent v2, and Micrometer Tracing.

Lots of service providers offer a free tier of their service. The idea is to let you kick their service's tires freely. If you need to go …

In this post, we implement rate limiting with Apache APISIX. We set the rate limit on a route and moved it to individual consumers. Then we …

If no cookie is set, randomly forward the request to one of the upstreams, if a cookie has been set, forward the request to the correct …

Here I describe using the proxy-rewrite plugin with a path variable. You can reuse the same technique with multiple variables.

Let's implement a watermarking feature with the help of imgproxy. The more I think about it, the more I think they make a match made in …

Displaying images on your website makes for an interesting problem: on one side, you want to make them publicly available; on the other, you …

You can configure Renovate for every package manager you can think of. Even better, Renovate allows the contribution of new package …

I continue to work on my Opentelemetry demo. Its main idea is to showcase traces across various technology stacks, including asynchronous …

In this episode you'll hear Simon Martinelli, Nicolas Fränkel, Marcus Hellberg, Rick Ossendrijver, and Abdel Sghiouar.

How I first limited my usage of BPMN and then unlocked its true power when I benefited from persistent storage.

Tauri is a Rust-based framework for building desktop applications. Here's my view.

Recently, I stumbled upon the list of all registered HTTP Headers. This post is dedicated to the Vary HTTP Header.

In this post, we list five alternatives to pass parameters server-side and explained how to access them on Apache APISIX.

Recently, I mentioned how I refactored the script that kept my GitHub profile up-to-date. Since Geecon Prague, I'm also a happy owner of a …

Last year, I wrote a post on Open Telemetry Tracing to understand more about the subject. I also created a demo around it...

Today, I'd like to write about my North America "Tour" across several conferences and user groups.

In this two-post series, I've addressed most of 16 different practices to secure APIs with Apache APISIX.

See how to configure Apache APISIX to secure your APIs against 7 of the 16 rules in the "16 practices to secure your API" list.

Most organizations don't incentivize for security. Hence, we need to be smart about it and use existing components as much as possible.

Let's try Docker Scout, the Docker image vulnerability detection tool.

In this short article, we detail the three options for versioning HTTP APIs: path-based, query-based, and header-based.

Last year, I wrote my first yearly retrospective. I liked the experience, so I'm trying one more time. Let the future decide if it will …

While the ecosystem has room for improvement, it's already possible to benefit from Docker's WASM support.

In this article, I'd like to introduce some Apache projects that are not so well-known.

In this article, learn about canary releases and how you can configure one via Apache APISIX.

Instead of forking the call on the client side, we fork the call on the Gateway side.

Let's explore aspects of the OpenTelemetry Collector that sits at the center of the OpenTelemetry architecture.

Improving low-level integration with ctypes to the generic ready-to-use pyo3 library.

Let's continue our exploration of Python's magic methods in this second part of the series.

Java was the first language I used professionally and is the scale by which I measure other languages I learned afterward. Hence, Python …

How to use Apache APISIX with imgproxy to reduce the storage cost of images in multiple resolutions.

Loki, a storage engine, provides a RESTful API to store and read logs. Let's push a log from a Java app.

Let's check the parameters of the _M.access(conf, ctx) function in an Apache APISIX plugin, especially the ctx one.

Monkey patching is a technique used to dynamically update the behavior of a piece of code at run-time.

When exposing an application to the outside world, consider a Reverse-Proxy or an API Gateway to protect it from attacks.

When configuring Apache APISIX, we should ensure it's as operable as possible. In this post, I've described several ways to make it so.

In Rust, Tower is designed around Functional Programming and two main abstractions, Service and Layer. Learn more here!

Software development is a fast-changing field, and much of our understanding is based on personal experience. So here's mine.

This review is about Designing APIs with Swagger and OpenAPI by Joshua S. Ponelat and Lukas L. Rosenstock from Manning.

In this article, I'd like to share my understanding of Spring Cloud Gateway and how it compares to Apache APISIX.

Let's browse through the surface of the main three reactive database access: Spring Data R2DBC, Hibernate, and jOOQ!

Learn how to setup sticky sessions with Apache APISIX and replication involving the Spring ecosystem and Hazelcast.

Learn about sticky sessions, that you should always use session replication with them, and how to implement sticky sessions on Apache …

If you want to understand a codebase better, you need more than just to read its code; you need to draw diagrams.

How to preview GitLab Pages and share the preview's URL with teammates in a couple of steps.

In this article, implement Data Residency within a simple architecture, thanks to Apache APISIX and Apache ShardingSphere.

Take a look at data residency and design a draft architecture to implement it. In the next article, we will delve into the technical …

While many discussions about REST focus on entities and methods, using the correct response status codes can make your API stand out.

Distroless images are a solution to reduce your image size and improve its security, by providing neither a package manager nor a shell.

A couple of weeks ago, I spent the weekend creating another CFP submission helper in the form of a Firefox extension.

Heroku's owner, Salesforce, announced it would stop the free plan, I found a new provider, Scaleway, and here are my experiences.

This review is about API Design Patterns by JJ Geewax from Manning. Check it out and if you've read it too, what did you think?

Externalizing your authentication process to a third party may be sensible, but avoid binding your infrastructure to its proprietary …

Learn how you can leverage OPA and Apache APISIX to move your authentication and authorization logic from the code to the infrastructure.

Discussion extrapoliating from per-user rate limiting showing how one can implement it in a library and an infrastructure component.

Following on from FOSDEM discussions, let's expand on the problem of nullability and how it's solved in Kotlin and Java.

API Gateways are critical components in one's infrastructure. Here we list a couple of ways to secure your Apache APISIX admin access.

SOAP's biggest flaw was its complexity and its focus on big companies, but it at least provided a shared set of standard specifications.

Years when one changes jobs are always challenging but very interesting; 2022 was no different. What are your insights into last/this year?

Spring Modulith is the successor of Oliver Drotbohm's Moduliths project (with a trailing S). It uses both ArchUnit and jMolecules.

I opened my Twitter account more than 13 years ago, in August 2009. For 12 years, I kept focusing on professional-related content: Java, the …

Learn how the most challenging issue with server-side caching is the configuration, such as what to cache and for how long.

Learn about several alternatives to cache web resources: Expiry and Cache-Control, Last-Modified and ETag, and the Cache API and web …

Creating a full-fledged API requires resources, both time and money. Let's achieve it without writing a single line of code!

Geo-routing is a requirement for successful apps and businesses. Apache APISIX doesn't provide it out-of-the-box...

RFC 7807 helps API implementors as it provides quick guidelines to avoid reinventing the wheel on every project.

Discussing the problem offers insight into what the problem is all about. If you want to bring more value, question what the problem is.

Compared to Dependabot, I love Renovate's capability to update Docker, Docker Compose, and Kubernetes files. I'll use it from now on!

Java streams don't play well with checked exceptions. To recover the readability we expect of streams, we can rely on Apache Commons Lang.

The default Python's dependency management system breaks automated version upgrades, take a look at the pip-compile alternative.

Context and more surrounding the Rust integration in Apache APISIX, a good story because it highlights the power of Open Source.

Let's browser through several extension points in Kubernetes: the data model, admission controllers, and client-side.

The idea behind the Gateway API is to have a clean separation between standard objects and the proprietary implementation.

Instead of arguing about cosmetics, e.g., annotations vs. "functional", we need to spend time on intrinsics more: actors, asynchronous, etc.

Find out about Checkov, which scans cloud infrastructure configurations to find misconfigurations before they're deployed.

Let's focus on tracing by following a request across an API gateway, two apps based on different tech stacks, and their respective …

When Kubernetes is set up, you'll want to expose some pods outside the cluster. Here I describe different ways Kubernetes provides to do it.

Let's use a very simple e-commerce use-case to demo how to implement the Backend-for-Frontend with and without the help of Apache APISIX.

Most modern infrastructures are dynamic. Servers are cattle, not pets. Learn how to implement a dynamic node registry based on a YAML file.

The idea behind Backend For Front-end is to move logic from each microservice to a dedicated deployable endpoint.

When header values depend on the web app, we need to reload the configuration without downtime and Continuous Deployment pipeline …

The VSCode ecosystem has matured, and lots of plugins are available. I decided to give it a shot. Let's see how and why to get started!

Here I list several hard things I've been exposed to. I believe there are many others: I'll be interested in the ones you've encountered!

I miss some features in Java that would improve my code's readability, expressiveness, and maintainability.

Writing summaries of conference talks is probably the best way to focus on the talk and listen actively...

Here is the complete process for setting up Jekyll on a Mac to help other developers who want to do the same and my future self.

Learn how to chop up the monolith by exposing the to-be-chopped parts via HTTP and use an API Gateway to route the wanted requests to one's …

Learn about Kotlin context receivers to be able to pass additional parameters to a function without having to do it explicitly.

Learn how to run a build on GitLab only if a condition is met, especially helpful when conditions are expensive and time-consuming …

Did you know GitHub and Google Cloud have all the infrastructure available to get short-lived tokens securely? Handy for Java devs and more!

In this article, I highlight that microservices, as presented at conferences, are doomed to fail in most organizations.

Time to spruce up your GitHub! In this article, I want to highlight some files that you can use to beautify your GitHub repository.

Java is infamous for its NullPointerException: calling a method or accessing an attribute of an object that has not been initialized.

Starting with Apache APISIX as your API Gateway is easy as pie. Use Docker, with the APISIX and etcd images, and off you go.

In this post, I'd like to describe how a couple of popular languages cope with errors. Get started here for an overview of errors …

This article discusses our shifting thought process on the notion that our practices, which were once considered good practices, can fade …

I used to believe (and still do) that DTOs should be a thing of the past. Yet, it seems their usage is still widespread.

It is more beneficial to use sealed and value class instead of enumerations in Kotlin; let’s find out why.

Almost all Java developers are familiar with logging frameworks like Log4j, but not the System.Logger that has been available since java 9.

Considering a fast data producer and a slow data consumer, backpressure "pushes back" on the producer, not to be overwhelmed by data.

Don’t wait until the release of Maven 5, if you are a library developer, consider using Maven Flatter Plugin. It’s a freebie.

Security is the poster child of a Non-Functional Requirement: most people don't care until the proverbial matter hits the rotary propeller.

I'm afraid the deprecation of the Security Manager just added several lines to that risk, all linked to running untrusted code.

If you're implementing microservices or not, chances are that you're calling HTTP endpoints. With HTTP calls, a lot of things can go wrong.

Learn how to improve the API provided by third-party libraries by combining Kotlin extension functions and delegation.

Quarkus brings an exciting take to the table. Unlike Micronaut, it doesn't generate additional bytecode during each compilation.

I frequently use Spring Boot in my demos. The latest one is no different, showing how to achieve CQRS using two different code paths.

Another approach for my demos: a regular proxy in front of my local cluster. OSX comes with an existing Apache Web Server installation.

Last week, I wrote a native web app that queried the Marvel API using Spring Boot. This week, let's do the same with the Micronaut …

As the Cloud has become more widespread, the Spring ecosystem has been forced to cope with GraalVM native.
Recently, we described several criteria to look at to choose a cache. Now it’s time to list Java cache providers based on these criteria.

I'd like to describe how to add new behavior to an existing object/type. I won't use any reactive type to make it more general.

In this article I will describe how you can benefit from such a data visualization front-end without writing a single line of code.

I'd like to first explain why the JVM platform is a bad idea for FaaS. Then, I'll proceed to propose alternatives to use Kotlin nonetheless.

Like in many design decisions, a cache is a trade-off. Caching is a trade-off where you accept stale data to have them available/fast.

Given that the JUnit ecosystem is much more developed, I think I'll switch to JUnit for new projects and reassess again in a few years.

Following on from different techniques to speed up Maven builds, I'd like to widen the scope and do the same for Maven builds inside Docker.

Some techniques how to make your Maven builds faster in this article. The next article will focus on how to do the same inside of Docker.

Alternatives are available to configure your Spring app. I'd like to list them, leaving Spring Boot out of the picture on purpose.

This article is dedicated to Jet Compose for Desktop, the new kid on the block that offers a completely different approach.

In this article, I'd like to show you how to remove annotations for different features that Spring provides!

Learn about adding computed values, as in an eager approach, but only triggering the computation when you need to access its result!

Since Docker announced that it would remove unused images from Docker Hub, I've been interested in listing places where I could host mine!

For once, I'm wondering a bit if this article can be helpful to somebody else since I believe my context is pretty specific!

This article shows how one could offload the Docker part of your build pipeline from your local machine to GitLab using the Kaniko image. It …

Learn why and how it makes sense to develop applications using the JVM and delegate the most memory-sensitive parts to Rust.

JavaFX Skins for Android, iOS; BlockHound, for detecting cases of blocking, JEP 411, the SecurityManager deprecation, recent Snyk/Azul …

BlockHound lets you check if a blocking call occurs in a thread where it shouldn't happen and throws an exception at runtime when it does.

Some alternatives that allow you to make third-party APIs behave in a way that their designers didn't intend to!

In this article, I'd like to describe how you can take advantage of Hazelcast to query your cached data in different ways and still be fast.

teeing() method returns a Collector, a composite of two downstream collectors. There will be a single Collector and a single pass in the …

Java Stream's Collectors methods fit most use-cases. Let's imagine an e-commerce platform that implements a shopping cart.

Kotlin offers many cool features, most tend to cite null safety as their favorite. For me, it's function extensions, with delegation second.

This week's post is pretty short. I've already written about overengineering, but this adds a personal touch.

Because Hazelcast is developed in Java, it's available as a JAR, and we can integrate it as a library in our application.

how one can use Arrow's type system with Spring Data. You can benefit from the explanations to craft your custom Spring Data repository.

In this article, I will share some findings regarding the security changes regarding changing a field's type across JDK versions.
Posts that have been written about Hibernate's LazyInitializationException could probably fill whole books. Time for a definitive guide!

Despite all the "magic" of Spring Boot, Spring Native handles most of GraalVM's required configuration out-of-the-box!

Gone are the times when developers' jobs ended with the release of the application and Spring Boot, Quarkus, Micronaut, Helidon can help!

This week, I learned about a "new" feature of Optional that I want to share in this post. Available since Java 9, its novelty is relative.

This article aims to describe ways to create self-contained executable JARs, also known as uber-JARs or fat JARs.