<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kotlin on foojay.io - Friends of OpenJDK</title><link>https://foojayio.github.io/website/today/category/kotlin/</link><description>Recent content in Kotlin on foojay.io - Friends of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 10 Jul 2026 08:54:25 +0000</lastBuildDate><atom:link href="https://foojayio.github.io/website/today/category/kotlin/index.xml" rel="self" type="application/rss+xml"/><item><title>Getting Started with Exposed: Kotlin ORM Made Simple</title><link>https://foojayio.github.io/website/today/exposed-kotlin-orm-complete-guide/</link><pubDate>Mon, 06 Jul 2026 03:39:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/exposed-kotlin-orm-complete-guide/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;For quite some time, I have been a huge fan of and fascinated by JetBrains products, tools, and libraries because of their masterful craftsmanship in product creation and their pristine focus on building high-quality developer tools.&lt;/p&gt;
&lt;p&gt;Even more excitingly, JetBrains Java Annotated Monthly newsletters have featured most of the technical articles I wrote for Foojay on topics such as Java, Spring, Spring Boot 4, and OpenRewrite.&lt;/p&gt;
&lt;p&gt;Recently, one Kotlin Domain-Specific Language (DSL) library caught my attention. I immediately tried converting my existing Spring Boot 4 application from Java to Kotlin using Exposed, an ORM framework for Kotlin.
&lt;img src="https://foojayio.github.io/website/today/exposed-kotlin-orm-complete-guide/Exposed-1024x683.png" alt="Exposed" loading="lazy"&gt;
 Kotlin SQL Libary&lt;/p&gt;</description></item><item><title>You’re invited to IntelliJ IDEA Conf 2026!</title><link>https://foojayio.github.io/website/today/youre-invited-to-intellij-idea-conf-2026/</link><pubDate>Mon, 29 Jun 2026 18:35:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/youre-invited-to-intellij-idea-conf-2026/</guid><description>&lt;p&gt;&lt;strong&gt;We are excited to invite you to IntelliJ IDEA Conf 2026, a free virtual event on September 8-9, 2026.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;IntelliJ IDEA Conf is a celebration of the developer community, bringing together professionals who strive for excellence in software development. Join us for this free, live online conference and learn from industry leaders and experts on September 8-9, 2026.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll be able to learn about a broad range of topics relevant to modern Java and Kotlin development, including language evolution, enterprise Java, Spring-based applications, build tooling, containerized workflows, JVM performance, and data access technologies. For more details, see the agenda below.&lt;/p&gt;</description></item><item><title>Command completion (..) in IntelliJ IDEA</title><link>https://foojayio.github.io/website/today/command-completion-intellij-idea/</link><pubDate>Tue, 20 Jan 2026 07:31:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/command-completion-intellij-idea/</guid><description>&lt;p&gt;How many shortcuts can you remember? Three? Five? More? I try to learn as many as I can and still forget some of them&amp;hellip;&lt;/p&gt;
&lt;p&gt;What if you could unlock IntelliJ IDEA features, without having to remember shortcuts? You can still use shortcuts if you want. But you don&amp;rsquo;t &lt;em&gt;&lt;strong&gt;have&lt;/strong&gt;&lt;/em&gt;to.&lt;/p&gt;
&lt;p&gt;Command completion (..) is a new feature in IntelliJ IDEA that lets you discover and execute IDE actions right from your editor.&lt;/p&gt;</description></item><item><title>Preparing for Spring Boot 4 and Spring Framework 7: What’s New?</title><link>https://foojayio.github.io/website/today/preparing-for-spring-framework-7-and-spring-boot-4/</link><pubDate>Mon, 11 Aug 2025 14:42:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/preparing-for-spring-framework-7-and-spring-boot-4/</guid><description>&lt;p&gt;&lt;strong&gt;I&amp;rsquo;m a passionate Spring Framework and Spring Boot enthusiast, and I always look forward to exploring and experimenting with the latest features and improvements they introduce. With Spring Boot 4 and Spring Boot Framework 7 right around the corner, now&amp;rsquo;s the perfect time to dive into the key enhancements that will shape the future of modern Java and enterprise application development.&lt;/strong&gt;
&lt;img src="https://foojayio.github.io/website/today/preparing-for-spring-framework-7-and-spring-boot-4/SpringImage.jpg" alt="Spring Boot 4" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;In this blog post, we will discuss some key features enhanced as part of Spring Framework 7 and Spring Boot 4.&lt;/p&gt;</description></item><item><title>Pattern-matching across different languages</title><link>https://foojayio.github.io/website/today/pattern-matching-across-different-languages/</link><pubDate>Tue, 05 Aug 2025 07:40:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/pattern-matching-across-different-languages/</guid><description>&lt;p&gt;Pattern matching is a major feature in software development. While pattern matching applies in several locations, its current usage is limited to &lt;code&gt;switch case&lt;/code&gt; blocks. I want to compare the power of pattern matching across a couple of programming languages I&amp;rsquo;m familiar with in this post.&lt;/p&gt;
&lt;p&gt;I assume that every reader is familiar with the &lt;code&gt;switch case&lt;/code&gt; syntax inherited from C. In short:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;switch&lt;/code&gt; clause references a value-returning statement&lt;/li&gt;
&lt;li&gt;Each &lt;code&gt;case&lt;/code&gt; clause sets another statement; if the value matches the statement, it executes the related block&lt;/li&gt;
&lt;li&gt;&lt;code&gt;case&lt;/code&gt; clauses are evaluated in order. The first clause that matches gets its block executed&lt;/li&gt;
&lt;li&gt;In C, &lt;code&gt;case&lt;/code&gt; clauses are fall-through; you need to explicitly &lt;code&gt;break&lt;/code&gt; to escape the &lt;code&gt;switch&lt;/code&gt;, otherwise, the next &lt;code&gt;case&lt;/code&gt; is evaluated&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-0-java-s-pattern-matching"&gt;Java&amp;rsquo;s pattern matching&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ll start with Java, as it was the first programming language I used in a professional context.&lt;/p&gt;</description></item><item><title>Kotlin adoption inside ING, five years later</title><link>https://foojayio.github.io/website/today/ing-kotlin-adoption-five-years/</link><pubDate>Wed, 02 Jul 2025 06:21:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/ing-kotlin-adoption-five-years/</guid><description>&lt;p&gt;&lt;em&gt;TL;DR: Five years after its introduction Kotlin adoption inside ING keeps growing year after year, with a current adoption rate of just over 11%. We were also featured as one of the user stories for the KotlinConf 2025 Keynote.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Five years ago, &lt;a href="https://medium.com/@Frevib" target="_blank" rel="noopener noreferrer"&gt;Hielke&lt;/a&gt;
 and I wrote one of the first blogs of this account about being &lt;a href="https://medium.com/ing-blog/introducing-kotlin-at-ing-a-long-but-rewarding-story-1bfcd3dc8da0" target="_blank" rel="noopener noreferrer"&gt;the first team to put Kotlin on production at ING&lt;/a&gt;
. The article generated some interest and to this day it is still present as one of the &lt;a href="https://kotlinlang.org/lp/server-side/case-studies/" target="_blank" rel="noopener noreferrer"&gt;Kotlin website case studies&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Authoring an OpenRewrite Recipe</title><link>https://foojayio.github.io/website/today/authoring-an-openrewrite-recipe/</link><pubDate>Mon, 09 Jun 2025 17:22:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/authoring-an-openrewrite-recipe/</guid><description>&lt;p&gt;I&amp;rsquo;ve been eying OpenRewrite for some time, but I haven&amp;rsquo;t had time to play with it yet. In case you never heard about OpenRewrite, OpenRewrite takes care of refactoring your codebase to newer language, framework, and paradigm versions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OpenRewrite is an open-source automated refactoring ecosystem for source code, enabling developers to effectively eliminate technical debt within their repositories.&lt;/p&gt;
&lt;p&gt;It consists of an auto-refactoring engine that runs prepackaged, open-source refactoring recipes for common framework migrations, security fixes, and stylistic consistency tasks &amp;ndash; reducing your coding effort from hours or days to minutes. Build tool plugins like the OpenRewrite Gradle plugin and the OpenRewrite Maven plugin help you run these recipes on one repository at a time.&lt;/p&gt;</description></item><item><title>Pull request testing on Kubernetes: testing locally and on GitHub workflows</title><link>https://foojayio.github.io/website/today/pull-request-testing-on-kubernetes-testing-locally-and-on-github-workflows/</link><pubDate>Sun, 16 Mar 2025 17:32:27 +0000</pubDate><guid>https://foojayio.github.io/website/today/pull-request-testing-on-kubernetes-testing-locally-and-on-github-workflows/</guid><description>&lt;p&gt;Imagine an organization with the following practices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Commits code on GitHub&lt;/li&gt;
&lt;li&gt;Runs its CI/CD pipelines with GitHub Actions&lt;/li&gt;
&lt;li&gt;Runs its production workload on Kubernetes&lt;/li&gt;
&lt;li&gt;Uses Google Cloud&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A new engineer manager arrives and asks for the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On every PR, run integration tests in a Kubernetes cluster similar to the production one.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It sounds reasonable.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Engineering manager: I want #integrationtests to run on the app deployed on #Cloud infra for each #GitHub PR ✅&lt;/p&gt;</description></item><item><title>Review of Junie, a coding agent by JetBrains – Revie</title><link>https://foojayio.github.io/website/today/checking-out-junie-a-coding-agent-by-jetbrains/</link><pubDate>Wed, 26 Feb 2025 01:38:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/checking-out-junie-a-coding-agent-by-jetbrains/</guid><description>&lt;p&gt;Other languages: &lt;a href="https://flounder.dev/es/posts/trying-out-junie/" target="_blank" rel="noopener noreferrer"&gt;Español&lt;/a&gt;
 &lt;a href="https://flounder.dev/ko/posts/trying-out-junie/" target="_blank" rel="noopener noreferrer"&gt;한국어&lt;/a&gt;
 &lt;a href="https://flounder.dev/pt/posts/trying-out-junie/" target="_blank" rel="noopener noreferrer"&gt;Português&lt;/a&gt;
 &lt;a href="https://flounder.dev/zh/posts/trying-out-junie/" target="_blank" rel="noopener noreferrer"&gt;中文&lt;/a&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Recently, I talked about &lt;a href="https://flounder.dev/duplicate-finder/" target="_blank" rel="noopener noreferrer"&gt;Duplicate Finder&lt;/a&gt;
 on the &lt;a href="https://foojayio.github.io/website/today/category/podcast/"&gt;Foojay Podcast&lt;/a&gt;
 hosted by &lt;a href="https://foojay.social/@frankdelporte" target="_blank" rel="noopener noreferrer"&gt;Frank Delporte&lt;/a&gt;
. We briefly touched upon implementing support for other formats, and Frank asked if I&amp;rsquo;m planning on adding AsciiDoc, as it could be useful for his technical writing at Azul.&lt;/p&gt;
&lt;p&gt;We agreed to think about adding the support soon. At the same time I got access to &lt;a href="https://www.jetbrains.com/junie/" target="_blank" rel="noopener noreferrer"&gt;Junie&lt;/a&gt;
, a newly announced coding agent by JetBrains, which is currently in early access. After a while, a thought came to me that this is a great opportunity to try it in action.&lt;/p&gt;</description></item><item><title>Duplicate finder – Tests</title><link>https://foojayio.github.io/website/today/duplicate-finder-for-text-requirements/</link><pubDate>Wed, 18 Dec 2024 16:00:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/duplicate-finder-for-text-requirements/</guid><description>&lt;p&gt;Other languages: &lt;a href="https://flounder.dev/es/posts/duplicate-finder-requirements/" target="_blank" rel="noopener noreferrer"&gt;Español&lt;/a&gt;
 &lt;a href="https://flounder.dev/ko/posts/duplicate-finder-requirements/" target="_blank" rel="noopener noreferrer"&gt;한국어&lt;/a&gt;
 &lt;a href="https://flounder.dev/pt/posts/duplicate-finder-requirements/" target="_blank" rel="noopener noreferrer"&gt;Português&lt;/a&gt;
 &lt;a href="https://flounder.dev/zh/posts/duplicate-finder-requirements/" target="_blank" rel="noopener noreferrer"&gt;中文&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This post is about the development of the duplicate finder tool. For downloads and instructions on how to use it, see the &lt;a href="https://flounder.dev/duplicate-finder/" target="_blank" rel="noopener noreferrer"&gt;Download&lt;/a&gt;
 page&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s been a while since I published the &lt;a href="https://flounder.dev/posts/duplicate-finder-intro/" target="_blank" rel="noopener noreferrer"&gt;intro to the duplicate finder project&lt;/a&gt;
, so it looks like high time to provide some progress on that.&lt;/p&gt;
&lt;p&gt;Before starting to write the program code, it makes sense to lay down the requirements first. A good way to do this is by writing tests. Not only will the tests help us develop faster, but they will also ensure that the code adheres to the specification.&lt;/p&gt;</description></item><item><title>How does it feel to test a compiler?</title><link>https://foojayio.github.io/website/today/how-does-it-feel-to-test-a-compiler/</link><pubDate>Thu, 08 Aug 2024 06:47:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-does-it-feel-to-test-a-compiler/</guid><description>&lt;p&gt;&lt;strong&gt;Hi, my name is Alex. I work as a QA engineer on the &lt;a href="https://kotlinlang.org/docs/native-overview.html" title="Kotlin/Native" target="_blank" rel="noopener noreferrer"&gt;Kotlin/Native&lt;/a&gt;
 team. I&amp;rsquo;m often asked by friends and colleagues what it&amp;rsquo;s like to test a compiler, so I decided to write an article about it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll briefly talk about my path to compiler testing, the Kotlin/Native compiler, the specifics of the tasks, the tools I use, and the knowledge that helps me in my work.&lt;/p&gt;
&lt;p&gt;I graduated with a bachelor&amp;rsquo;s and master&amp;rsquo;s degree in Software Engineering and then spent ten years in backend automation testing, including testing email backends (IMAP, POP3 protocols, email storage system, etc.), leading a testing team, and building test processes and test automation from scratch.&lt;/p&gt;</description></item><item><title>New video series "JavaFX In Action", Part 1</title><link>https://foojayio.github.io/website/today/new-video-series-javafx-in-action-part-1/</link><pubDate>Tue, 16 Jul 2024 07:35:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/new-video-series-javafx-in-action-part-1/</guid><description>&lt;p&gt;JavaFX is a powerful user interface framework, often overlooked in the world of desktop applications development. With this new series of video interviews, I want to take you behind-the-scenes of some applications built using JavaFX.&lt;/p&gt;
&lt;p&gt;JavaFX combines the best features of a modern user interface toolkit with the unparalleled strength of the Java platform. This approach enables you to perform heavy &amp;ldquo;background tasks&amp;rdquo;, like processing large amounts of data, while still providing a responsive user interface.&lt;/p&gt;</description></item><item><title>Dynamic watermarking on the JVM</title><link>https://foojayio.github.io/website/today/dynamic-watermarking-on-the-jvm/</link><pubDate>Tue, 09 Jul 2024 07:59:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/dynamic-watermarking-on-the-jvm/</guid><description>&lt;p&gt;Displaying images on your website makes for an interesting problem: on one side, you want to make them publicly available; on the other, you want to protect them against undue use. The age-long method to achieve it is watermarking:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A &lt;strong&gt;digital watermark&lt;/strong&gt; is a kind of marker covertly embedded in a noise-tolerant signal such as audio, video or image data. It is typically used to identify ownership of the copyright of such signal. &amp;ldquo;Watermarking&amp;rdquo; is the process of hiding digital information in a carrier signal; the hidden information should, but does not need to, contain a relation to the carrier signal. Digital watermarks may be used to verify the authenticity or integrity of the carrier signal or to show the identity of its owners. It is prominently used for tracing copyright infringements and for banknote authentication.&lt;/p&gt;</description></item><item><title>Foojay Podcast #54: Music and MIDI with Java and Kotlin</title><link>https://foojayio.github.io/website/today/foojay-podcast-54/</link><pubDate>Mon, 24 Jun 2024 18:23:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-54/</guid><description>&lt;p&gt;MIDI is a universal standard for communicating between musical instruments and computers.&lt;/p&gt;
&lt;p&gt;Within OpenJDK, there is a whole Java package dedicated to MIDI communication and data handling. Is it up to date? Are there better approaches now? And what can we do with music, Java, and Kotlin?&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s find out&amp;hellip;&lt;/p&gt;
&lt;h2 id="h2-0-video"&gt;Video&lt;/h2&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/tHKZA9yqIVM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;h2 id="h2-1-podcast-apps"&gt;Podcast Apps&lt;/h2&gt;
&lt;p&gt;You can listen and subscribe to the Foojay Podcast on:&lt;/p&gt;</description></item><item><title>Foojay Podcast #53: JCON Report, Part 5 – CQRS, JOOQ, GraphQL, API, Vaadin, OpenRewrite, ErrorProne, Gateways, Proxies,...</title><link>https://foojayio.github.io/website/today/foojay-podcast-53/</link><pubDate>Mon, 17 Jun 2024 09:24:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-53/</guid><description>&lt;p&gt;This is the final part of the JCON interviews. Did I save the best for last? It&amp;rsquo;s up to you to decide&amp;hellip;&lt;/p&gt;
&lt;p&gt;In this episode you&amp;rsquo;ll hear Simon Martinelli, Nicolas Fränkel, Marcus Hellberg, Rick Ossendrijver, and Abdel Sghiouar.&lt;/p&gt;
&lt;p&gt;We talked about a bunch of topics like evolving your APIs, GraphQL, Java versus Kotlin versus Rust, Vaadin, AI and ChatGPT, OpenRewrite, ErrorProne, Infrastructure, and a lot more.&lt;/p&gt;
&lt;h2 id="h2-0-video"&gt;Video&lt;/h2&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6ops5sU_UiY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;h2 id="h2-1-podcast-apps"&gt;Podcast Apps&lt;/h2&gt;
&lt;p&gt;You can listen and subscribe to the Foojay Podcast on:&lt;/p&gt;</description></item><item><title>Book review: Frontend Development with JavaFX and Kotlin</title><link>https://foojayio.github.io/website/today/book-review-frontend-development-with-javafx-and-kotlin/</link><pubDate>Fri, 14 Jun 2024 09:06:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/book-review-frontend-development-with-javafx-and-kotlin/</guid><description>&lt;figure class="wp-block-image size-full is-resized"&gt;
 &lt;img fetchpriority="high" decoding="async" width="327" height="466" src="cover.jpg" alt="" class="wp-image-110882" style="width:auto;height:200px"&gt;
&lt;/figure&gt;
&lt;p&gt;For a personal pet project, I started experimenting with JavaFX and Kotlin to create a user interface with a lot of Java / Kotlin background processing. As I knew there is a book available on this specific topic, Apress was so kind to send me a review copy of &lt;a href="https://www.amazon.nl/Frontend-Development-JavaFX-Kotlin-State/dp/1484297164" target="_blank" rel="noopener noreferrer"&gt;Frontend Development with JavaFX and Kotlin: Build State-of-the-Art Kotlin GUI Applications&lt;/a&gt;
 by Peter Späth (152 pages, 48€ on paper, 35.5€ for ebook on Amazon.nl).&lt;/p&gt;</description></item><item><title>Hack a Java application with the debugger</title><link>https://foojayio.github.io/website/today/debugger-godmode-hacking-a-jvm-application-with-the-debugger/</link><pubDate>Thu, 13 Jun 2024 04:58:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugger-godmode-hacking-a-jvm-application-with-the-debugger/</guid><description>&lt;p&gt;Read in other languages: &lt;a href="https://flounder.dev/zh/posts/debugger-god-mode/" target="_blank" rel="noopener noreferrer"&gt;中文&lt;/a&gt;
 &lt;a href="https://flounder.dev/es/posts/debugger-god-mode/" target="_blank" rel="noopener noreferrer"&gt;Español&lt;/a&gt;
 &lt;a href="https://flounder.dev/pt/posts/debugger-god-mode/" target="_blank" rel="noopener noreferrer"&gt;Português&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Back in the day, computer games were different. Not only have graphics and mechanics evolved since, but there&amp;rsquo;s also one characteristic that doesn&amp;rsquo;t seem very common in games today: nearly all of them had cheat codes.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cheat codes were sequences of keys that would give you something extraordinary, such as infinite ammo or the ability to walk through walls. The most common and powerful of them was &amp;lsquo;god mode&amp;rsquo; &amp;ndash; it made you invincible.&lt;/p&gt;</description></item><item><title>Java: Functional Programming f(x) – Part2</title><link>https://foojayio.github.io/website/today/java-functional-programming-fx-part2/</link><pubDate>Mon, 03 Jun 2024 17:05:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-functional-programming-fx-part2/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/java-functional-programming/"&gt;the preceding article&lt;/a&gt;
, we explored the significance of &lt;strong&gt;Functional Programming, Lambda Calculus&lt;/strong&gt;, and other related concepts.&lt;/p&gt;
&lt;p&gt;In this article, we delve deeper into the essential aspects of Functional Programming, such as&amp;hellip;​&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Lambda Expressions
2. Method References
3. Functional Interfaces&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And we will discuss about the relationship between each of the features.&lt;/p&gt;
&lt;p&gt;JSR 335 has greatly facilitated programming in a multicore environment by introducing Lambda Expressions/closures/anonymous method, and related features.&lt;/p&gt;</description></item><item><title>Learn how to debug unresponsive Java/JVM applications, then reload the fix on the fly, using a hands-on example</title><link>https://foojayio.github.io/website/today/debug-unresponsive-apps/</link><pubDate>Thu, 23 May 2024 07:14:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/debug-unresponsive-apps/</guid><description>&lt;p&gt;Read in other languages: &lt;a href="https://flounder.dev/zh/posts/debug-unresponsive-apps/" target="_blank" rel="noopener noreferrer"&gt;中文&lt;/a&gt;
 &lt;a href="https://flounder.dev/es/posts/debug-unresponsive-apps/" target="_blank" rel="noopener noreferrer"&gt;Español&lt;/a&gt;
 &lt;a href="https://flounder.dev/pt/posts/debug-unresponsive-apps/" target="_blank" rel="noopener noreferrer"&gt;Português&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;There are a lot of debugger tutorials out there that teach you how to set line breakpoints, log values, or evaluate expressions. While this knowledge alone gives you a lot of tools for debugging your application, real-world scenarios may be somewhat trickier and require a more advanced approach.&lt;/strong&gt;
&lt;img src="https://flounder.dev/img/debug-unresponsive-apps-banner.png" alt="Debug Unresponsive Apps – post banner" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;In this article, we will learn how to locate code that causes a UI freeze without much prior knowledge of the project and fix faulty code on the fly.&lt;/p&gt;</description></item><item><title>Duplicate Finder for Documentation</title><link>https://foojayio.github.io/website/today/duplicate-finder-for-documentation/</link><pubDate>Wed, 08 May 2024 22:08:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/duplicate-finder-for-documentation/</guid><description>&lt;p&gt;Other languages: &lt;a href="https://flounder.dev/es/posts/duplicate-finder-intro/" target="_blank" rel="noopener noreferrer"&gt;Español&lt;/a&gt;
 &lt;a href="https://flounder.dev/ko/posts/duplicate-finder-intro/" target="_blank" rel="noopener noreferrer"&gt;한국어&lt;/a&gt;
 &lt;a href="https://flounder.dev/pt/posts/duplicate-finder-intro/" target="_blank" rel="noopener noreferrer"&gt;Português&lt;/a&gt;
 &lt;a href="https://flounder.dev/zh/posts/duplicate-finder-intro/" target="_blank" rel="noopener noreferrer"&gt;中文&lt;/a&gt;
&lt;br&gt;
This post is about the development of the duplicate finder tool. For downloads and instructions on how to use it, see the &amp;lsquo;Download&amp;rsquo; page
&lt;a href="https://flounder.dev/duplicate-finder/" target="_blank" rel="noopener noreferrer"&gt;Download&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Anyone who worked on technical documentation in a big team is certainly aware of the content duplication issue. Even with the best tools and practices at hand, duplication is fundamentally difficult to overcome.
&lt;img src="https://flounder.dev/img/duplicate-finder-banner.png" alt="Duplicate Finder for Documentation - Post banner" title="Duplicate Finder for Documentation - Post banner" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Functional Programming: Revolutionizing Software Development</title><link>https://foojayio.github.io/website/today/java-functional-programming/</link><pubDate>Thu, 25 Apr 2024 17:43:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-functional-programming/</guid><description>&lt;p&gt;&lt;strong&gt;Mathematics serves as the driving force behind significant advancements in computer science from my perspective. We deeply root the fundamental principles that we utilize in our daily programming tasks and application development in mathematical concepts. I am constantly intrigued by the opportunity to incorporate mathematical ideas into the programming languages I work with as a student of Mathematics.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Many other programming paradigms, like functional programming, take inspiration from Mathematics to address challenges related to concurrency and parallelism. Computing shifts towards utilizing multiple cores and distributed systems, which makes this increasingly important.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Debug Without Breakpoints – Guide to IntelliJ IDEA's Pause</title><link>https://foojayio.github.io/website/today/debug-without-breakpoints/</link><pubDate>Mon, 22 Apr 2024 06:59:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/debug-without-breakpoints/</guid><description>&lt;p&gt;Read in other languages: &lt;a href="https://flounder.dev/zh/posts/debug-without-breakpoints/" target="_blank" rel="noopener noreferrer"&gt;中文&lt;/a&gt;
 &lt;a href="https://flounder.dev/es/posts/debug-without-breakpoints/" target="_blank" rel="noopener noreferrer"&gt;Español&lt;/a&gt;
 &lt;a href="https://flounder.dev/pt/posts/debug-without-breakpoints/" target="_blank" rel="noopener noreferrer"&gt;Português&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In a typical debugging scenario, you would set breakpoints to tell the debugger when to suspend your program. A breakpoint usually corresponds to the moment that marks the starting point of the further investigation.&lt;/p&gt;
&lt;p&gt;However, in some situations you aren&amp;rsquo;t certain about where to set a breakpoint. Other times, you might prefer to suspend the program at a particular &lt;em&gt;time&lt;/em&gt; rather than aiming at a specific &lt;em&gt;line&lt;/em&gt;.
&lt;img src="https://foojayio.github.io/website/today/debug-without-breakpoints/debug-without-breakpoints-banner-1024x538.png" alt="post banner" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>[Unit] Testing Supabase in Kotlin using Test Containers - PART 2</title><link>https://foojayio.github.io/website/today/unit-testing-supabase-in-kotlin-using-test-containers-part-2/</link><pubDate>Wed, 13 Dec 2023 08:37:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/unit-testing-supabase-in-kotlin-using-test-containers-part-2/</guid><description>&lt;p&gt;&lt;em&gt;TL;DR : You can run a full Supabase instance inside Test Containers quite easily. &lt;a href="https://github.com/jlengrand/supabase-testcontainers-kotlin?ref=lengrand.fr" target="_blank" rel="noopener noreferrer"&gt;See this repository&lt;/a&gt;
.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://foojayio.github.io/website/today/unit-testing-supabase-in-kotlin/"&gt;In my last article&lt;/a&gt;
, I was listing a few attempts I had done at running tests against my Kotlin Supabase application. The way the Supabase-Kt library is built makes it hard to mock, and I ended up building a minimal Docker Compose setup that was mimicking a Supabase instance.&lt;/p&gt;
&lt;p&gt;In this second part, we&amp;rsquo;re gonna push the madness further and actually run a FULL SUPABASE instance locally, still using &lt;a href="https://testcontainers.com/?ref=lengrand.fr" target="_blank" rel="noopener noreferrer"&gt;Test Containers&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Patterns For The Design Of Microservices – Part 3</title><link>https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-3/</link><pubDate>Thu, 16 Nov 2023 04:35:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-3/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-1/" title="part1"&gt;part1&lt;/a&gt;
, &lt;a href="https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-2/" title="part2"&gt;part2&lt;/a&gt;
, we discussed several design patterns that aid in the development of microservices.&lt;/p&gt;
&lt;p&gt;This blog post will cover the subsequent design patterns.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Observability Patterns&lt;/li&gt;
&lt;li&gt;Cross-cutting Concern Patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;img fetchpriority="high" decoding="async" class="size-medium wp-image-103034" src="MSPatternsOne-700x394.png" alt="Microservice Architecture" width="700" height="394"&gt;
&lt;p&gt;Microservice Architecture Patterns&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Undoubtedly, the logging mechanism benefits troubleshooting issues that arise when executing operations or transactions on multiple deployed microservices.&lt;/p&gt;
&lt;p&gt;We can further categorize the observability patterns into six distinct patterns.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Log Aggregation&lt;/li&gt;
&lt;li&gt;Application Metrics&lt;/li&gt;
&lt;li&gt;Audit Logging&lt;/li&gt;
&lt;li&gt;Distrubuted Tracing&lt;/li&gt;
&lt;li&gt;Exception Tracking&lt;/li&gt;
&lt;li&gt;Health Check API&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the subsequent segment, we will discuss each topic separately.&lt;/p&gt;</description></item><item><title>[Unit] Testing Supabase in Kotlin using Test Containers</title><link>https://foojayio.github.io/website/today/unit-testing-supabase-in-kotlin/</link><pubDate>Wed, 15 Nov 2023 16:36:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/unit-testing-supabase-in-kotlin/</guid><description>&lt;p&gt;&lt;strong&gt;In this article, I&amp;rsquo;ll dive into several methods I&amp;rsquo;ve been looking into to unit test a Kotlin application using Supabase and why I finally decided to go for a Docker Compose / Test Containers solution.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;TL;DR : The easiest way I found to test my database service is to mimick Supabase using Docker Compose and Test Containers. &lt;a href="https://github.com/jlengrand/supabase-mock-demo-kotlin?ref=lengrand.fr" target="_blank" rel="noopener noreferrer"&gt;Here&amp;rsquo;s the code&lt;/a&gt;
&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In case you don&amp;rsquo;t know it, I&amp;rsquo;m a big fan of &lt;a href="https://supabase.com/?ref=lengrand.fr" target="_blank" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt;
. I love that they&amp;rsquo;re a viable alternative to Firebase. I love that they&amp;rsquo;re &lt;a href="https://github.com/supabase/supabase/blob/master/apps/docs/public/img/supabase-architecture.png?ref=lengrand.fr" target="_blank" rel="noopener noreferrer"&gt;built on top of Open-Source&lt;/a&gt;
 pieces. I love &lt;a href="https://supabase.com/blog/chatgpt-supabase-docs?ref=lengrand.fr" target="_blank" rel="noopener noreferrer"&gt;how innovative they are&lt;/a&gt;
, and &lt;a href="https://github.com/supabase/postgres_lsp?ref=lengrand.fr" target="_blank" rel="noopener noreferrer"&gt;how much they give back to the community&lt;/a&gt;
. And as you already know it, I love &lt;a href="https://kotlinlang.org/?ref=lengrand.fr" target="_blank" rel="noopener noreferrer"&gt;Kotlin&lt;/a&gt;
 as well.&lt;/p&gt;</description></item><item><title>OpenAPI Generator: From YAML to JetBrains HTTP Client</title><link>https://foojayio.github.io/website/today/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/</link><pubDate>Fri, 10 Nov 2023 10:41:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/</guid><description>&lt;h3 id="h3-0-in-this-article-i-ll-be-implementing-an-openapi-generator-from-scratch-so-you-can-too-we-ll-be-creating-a-very-simple-generator-for-the-jetbrains-http-client"&gt;&lt;strong&gt;In this article, I&amp;rsquo;ll be implementing an OpenAPI generator from scratch so you can too! We&amp;rsquo;ll be creating a very simple generator for the Jetbrains HTTP Client.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://lengrand.fr/content/images/2023/11/F9_7HZZW4AEvcHF.jpeg" alt="Creating an OpenAPI generator from scratch : From YAML to JetBrains HTTP Client" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;This is the online version of the article with the same name I wrote for the Dutch Java Magazine.&lt;/p&gt;
&lt;p&gt;In the previous edition of the magazine, we discussed how the &lt;a href="https://www.jetbrains.com/help/idea/http-client-reference.html?ref=lengrand.fr" target="_blank" rel="noopener noreferrer"&gt;JetBrains HTTP Client&lt;/a&gt;
 could be used to run HTTP Queries, automate them and even use them in your CI/CD pipelines. Just like &lt;a href="https://www.postman.com/?ref=lengrand.fr" target="_blank" rel="noopener noreferrer"&gt;Postman&lt;/a&gt;
, but text based and can be part of your source code. Pretty cool.&lt;/p&gt;</description></item><item><title>Patterns For The Design of Microservices</title><link>https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-1/</link><pubDate>Wed, 11 Oct 2023 06:11:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-1/</guid><description>&lt;p&gt;Design patterns plays a pivotal role in designing and solving the commonly occurring problems in software application. It is guiding principle or template to the solve any designing problems.&lt;/p&gt;
&lt;p&gt;It applies to the Microservices architectural style as well. These patterns provide a structured approach to designing and implementing Microservice architectures, ensuring &lt;strong&gt;scalability&lt;/strong&gt; , &lt;strong&gt;maintainability&lt;/strong&gt; , and &lt;strong&gt;reusability&lt;/strong&gt;. By adhering to these design patterns, developers can proficiently tackle the common challenges encountered during Microservices development.&lt;/p&gt;</description></item><item><title>Foojay Podcast #27: Chicago JUG and KUG</title><link>https://foojayio.github.io/website/today/foojay-podcast-27/</link><pubDate>Mon, 04 Sep 2023 09:24:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-27/</guid><description>&lt;p&gt;Since December last year, the Foojay podcast virtually visited a Java User Group monthly.&lt;/p&gt;
&lt;p&gt;This journey has already brought us to many places around the world.&lt;/p&gt;
&lt;p&gt;And this time, we are in Chicago to learn from the Java and Kotlin user groups.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/UkCmZ02pJek?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;h2 id="h2-0-podcast-apps"&gt;Podcast Apps&lt;/h2&gt;
&lt;p&gt;You can listen and subscribe to the Foojay Podcast on:&lt;/p&gt;</description></item><item><title>Reactive Database Access on the JVM</title><link>https://foojayio.github.io/website/today/reactive-database-access-on-the-jvm/</link><pubDate>Mon, 17 Jul 2023 09:18:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/reactive-database-access-on-the-jvm/</guid><description>&lt;p&gt;A couple of years ago, &lt;a href="https://en.wikipedia.org/wiki/Reactive_programming" target="_blank" rel="noopener noreferrer"&gt;Reactive Programming&lt;/a&gt;
 was all the rage, but it had one big issue: reactive stopped as soon as you accessed a SQL database.&lt;/p&gt;
&lt;p&gt;You had a nice reactive chain up to the database, defeating the whole purpose. Given the prevalence of SQL databases in existing and new apps, one couldn&amp;rsquo;t enjoy the full benefits of Reactive Programming but still pay the full price of complexity.&lt;/p&gt;
&lt;p&gt;Since then, the landscape has changed tremendously. Most importantly, it offers many reactive drivers over popular databases: PostgreSQL, MariaDB and MySQL, Microsoft SQL Server, Oracle, you name it!&lt;/p&gt;</description></item><item><title>FP in Kotlin: Defining a Pipe Operator</title><link>https://foojayio.github.io/website/today/fp-in-kotlin-defining-a-pipe-operator/</link><pubDate>Fri, 02 Jun 2023 15:18:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/fp-in-kotlin-defining-a-pipe-operator/</guid><description>&lt;p&gt;There&amp;rsquo;s no support for the pipe operator &lt;code&gt;|&amp;gt;&lt;/code&gt; in Kotlin, so we have to come up with a custom and clean implementation for this function.&lt;/p&gt;
&lt;h2 id="h2-0-defining-a-pipe-operator"&gt;Defining a Pipe Operator&lt;/h2&gt;
&lt;p&gt;Next, one consistent and clean implementation is given for a pipe operator in Kotlin.&lt;/p&gt;
&lt;h4 id="finding-a-suitable-symbol"&gt;Finding a Suitable Symbol&lt;/h4&gt;
&lt;p&gt;First, I wanted to use the &lt;code&gt;|&amp;gt;&lt;/code&gt; pipe symbol commonly used in functional languages, but &lt;code&gt;&amp;gt;&lt;/code&gt; is not a supported character: &lt;code&gt;Name contains illegal characters: &amp;gt;&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Replacing Postman with the Jetbrains HTTP Client</title><link>https://foojayio.github.io/website/today/replacing-postman-with-the-jetbrains-http-client/</link><pubDate>Thu, 13 Apr 2023 06:59:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/replacing-postman-with-the-jetbrains-http-client/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;TL;DR: I&amp;rsquo;ve created the first version of an openapi-generator for the JetBrains HTTP Client, and together with the CLI runner it allows you to play against APIs without ever going out of your terminal and it can even run in your CI/CD pipeline.&lt;/strong&gt; &lt;a href="https://github.com/jlengrand/dotaClient" title="See repository here" target="_blank" rel="noopener noreferrer"&gt;&lt;strong&gt;See repository here&lt;/strong&gt;&lt;/a&gt;
&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I work a lot with APIs, whether for an app I develop myself, or to interact with others. Most people I know tend to use Postman for this. But &lt;a href="https://twitter.com/jlengrand/status/1620343955127689216" title="I personally don&amp;#39;t quite like the product any more" target="_blank" rel="noopener noreferrer"&gt;I personally don&amp;rsquo;t quite like the product any more&lt;/a&gt;
, and it forces me to move out of my IntelliJ environment which really kills my productivity.&lt;/p&gt;</description></item><item><title>Coroutines on the RaspberryPi (Pi4J-Kotlin)</title><link>https://foojayio.github.io/website/today/coroutines-on-the-raspberrypi-pi4j-kotlin/</link><pubDate>Sat, 01 Apr 2023 09:05:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/coroutines-on-the-raspberrypi-pi4j-kotlin/</guid><description>&lt;p&gt;If you didn&amp;rsquo;t know already, &lt;a href="https://pi4j.com/" target="_blank" rel="noopener noreferrer"&gt;Pi4J&lt;/a&gt;
 has had a &lt;a href="https://pi4j.com/kotlin/" target="_blank" rel="noopener noreferrer"&gt;Kotlin DSL&lt;/a&gt;
 for quite some time now.&lt;/p&gt;
&lt;p&gt;And I&amp;rsquo;m here to announce the &lt;a href="https://github.com/Pi4J/pi4j-kotlin/releases/tag/2.4.0" target="_blank" rel="noopener noreferrer"&gt;latest release &lt;code&gt;v2.4.0&lt;/code&gt;&lt;/a&gt;
 with a sack of additions and to tell you about all the good stuff that&amp;rsquo;s been added since the &lt;a href="https://foojayio.github.io/website/today/kotlin-on-the-raspberrypi-pi4j-kotlin/"&gt;first release&lt;/a&gt;
.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Coroutines {#h2-0-1-coroutines}&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;If the &lt;code&gt;pi4j { ... }&lt;/code&gt; wasn&amp;rsquo;t good enough for ya, and you want to use coroutines instead of weaving fat threads on your precious precious Pi, you can now use the new &lt;code&gt;pi4jAsync { ... }&lt;/code&gt; block&amp;mdash;It can do everything &lt;code&gt;pi4j { ... }&lt;/code&gt; does + you can run &lt;code&gt;suspend&lt;/code&gt;ed functions within.&lt;/p&gt;</description></item><item><title>The Right Feature at the Right Place</title><link>https://foojayio.github.io/website/today/the-right-feature-at-the-right-place/</link><pubDate>Tue, 28 Feb 2023 11:08:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-right-feature-at-the-right-place/</guid><description>&lt;p&gt;Before moving to Developer Relations, I transitioned from Software Architect to Solution Architect long ago.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a reasonably common career move.&lt;/p&gt;
&lt;p&gt;The problem in this situation is two-fold:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You know perfectly well software libraries&lt;/li&gt;
&lt;li&gt;You don&amp;rsquo;t know well infrastructure components&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It seems logical that people in this situation try to solve problems with the solutions they are most familiar with.&lt;/p&gt;
&lt;p&gt;However, it doesn&amp;rsquo;t mean it&amp;rsquo;s the best approach.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a bad one in most cases.&lt;/p&gt;</description></item><item><title>Null Safety: Kotlin vs. Java</title><link>https://foojayio.github.io/website/today/null-safety-kotlin-vs-java/</link><pubDate>Mon, 13 Feb 2023 12:12:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/null-safety-kotlin-vs-java/</guid><description>&lt;p&gt;Last week, I was at the &lt;a href="https://fosdem.org/" target="_blank" rel="noopener noreferrer"&gt;FOSDEM&lt;/a&gt;
 conference. FOSDEM is specific in that it has multiple rooms, each dedicated to a different theme and organized by a team. I had two talks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fosdem.org/2023/schedule/event/tracing/" target="_blank" rel="noopener noreferrer"&gt;Practical Introduction to OpenTelemetry Tracing&lt;/a&gt;
, in the &lt;em&gt;Monitoring and Observability&lt;/em&gt; devroom&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fosdem.org/2023/schedule/event/miss/" target="_blank" rel="noopener noreferrer"&gt;What I miss in Java, the perspective of a Kotlin developer&lt;/a&gt;
, in the &lt;em&gt;Friends of OpenJDK&lt;/em&gt; devroom&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second talk is from &lt;a href="https://blog.frankel.ch/miss-in-java-kotlin-developer/" target="_blank" rel="noopener noreferrer"&gt;an earlier post&lt;/a&gt;
. Martin Bonnin did a tweet from a single slide, and it created quite a stir, even attracting Brian Goetz.&lt;/p&gt;</description></item><item><title>Gossips: An Event-Bus in a Chatty Neighbourhood</title><link>https://foojayio.github.io/website/today/metaphorical-programming-gossips-event-bus/</link><pubDate>Thu, 24 Nov 2022 08:35:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/metaphorical-programming-gossips-event-bus/</guid><description>&lt;p&gt;In this article, we&amp;rsquo;ll tackle a common issue: &lt;em&gt;simple&lt;/em&gt; communication between system components. With a slightly controversial, themed, domain-driven design.&lt;/p&gt;
&lt;p&gt;Though this post has nothing to do with Android, we need a context where an Event-Bus is needed. And boy oh boy is it needed in Android! And we&amp;rsquo;ll use this as an excuse to write an Event-Bus.&lt;/p&gt;
&lt;p&gt;I chose an analogy for the entire thing: &lt;strong&gt;Gossips&lt;/strong&gt;;\&lt;/p&gt;
&lt;p&gt;It fits with the nature of the library, and the way it&amp;rsquo;ll be used. A global pub-sub component to enable cross-component communication.&lt;/p&gt;</description></item><item><title>Kotlin on the RaspberryPi (Pi4J-Kotlin)</title><link>https://foojayio.github.io/website/today/kotlin-on-the-raspberrypi-pi4j-kotlin/</link><pubDate>Thu, 17 Nov 2022 13:37:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/kotlin-on-the-raspberrypi-pi4j-kotlin/</guid><description>&lt;p&gt;&lt;a href="https://pi4j.com/" target="_blank" rel="noopener noreferrer"&gt;Pi4J&lt;/a&gt;
 is considered the project that brought the JVM to the RaspberryPi.&lt;/p&gt;
&lt;p&gt;It has been up for more than a decade allowing developers to write sophisticated, high-level, yet simple software on the RaspberryPi.&lt;/p&gt;
&lt;p&gt;And we&amp;rsquo;re glad to make it even more simpler and powerful!&lt;/p&gt;
&lt;p&gt;For quite some years now Kotlin has been a most welcome language in the JVM ecosystem and the modern development toolchain.&lt;/p&gt;
&lt;p&gt;Many factors led to this great reality, most notable to me is Kotlin&amp;rsquo;s non-disruptive integration and seamless developer experience.&lt;/p&gt;</description></item><item><title>End-to-End Tracing with OpenTelemetry</title><link>https://foojayio.github.io/website/today/end-to-end-tracing-opentelemetry/</link><pubDate>Mon, 29 Aug 2022 14:24:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/end-to-end-tracing-opentelemetry/</guid><description>&lt;p&gt;Whether you implement microservices or not (and you probably shouldn&amp;rsquo;t), your system is most probably composed of multiple components.&lt;/p&gt;
&lt;p&gt;The most straightforward system is probably made of a reverse proxy, an app, and a database.&lt;/p&gt;
&lt;p&gt;In this case, monitoring is not only a good idea; it&amp;rsquo;s a requirement.&lt;/p&gt;
&lt;p&gt;The higher the number of components through which a request may flow, the strongest the requirement.&lt;/p&gt;
&lt;p&gt;However, monitoring is only the beginning of the journey.&lt;/p&gt;</description></item><item><title>What I Miss in Java, the Perspective of a Kotlin Developer</title><link>https://foojayio.github.io/website/today/miss-java-kotlin-developer/</link><pubDate>Wed, 15 Jun 2022 08:15:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/miss-java-kotlin-developer/</guid><description>&lt;p&gt;Java has been my bread and butter for almost two decades.&lt;/p&gt;
&lt;p&gt;Several years ago, I started to learn Kotlin; I never regretted it.&lt;/p&gt;
&lt;p&gt;Though Kotlin compiles to JVM bytecode, I sometimes have to write Java again.&lt;/p&gt;
&lt;p&gt;Every time I do, I cannot stop pondering why my code doesn&amp;rsquo;t look as nice as in Kotlin.&lt;/p&gt;
&lt;p&gt;I miss some features that would improve my code&amp;rsquo;s readability, expressiveness, and maintainability.&lt;/p&gt;
&lt;p&gt;This article is not meant to bash Java but to list some features I&amp;rsquo;d like to find in Java.&lt;/p&gt;</description></item><item><title>Chopping the Monolith: The Demo</title><link>https://foojayio.github.io/website/today/chopping-monolith-demo/</link><pubDate>Mon, 23 May 2022 12:53:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/chopping-monolith-demo/</guid><description>&lt;p&gt;In my previous blog post &lt;a href="https://foojayio.github.io/website/today/chopping-monolith/"&gt;Chopping the Monolith&lt;/a&gt;
, I explained my stance on microservices and why it shouldn&amp;rsquo;t be your golden standard.&lt;/p&gt;
&lt;p&gt;However, I admitted that some parts of the codebase were less stable than others and had to change more frequently.&lt;/p&gt;
&lt;p&gt;I proposed &amp;ldquo;chopping&amp;rdquo; these few parts to cope with this requirement while keeping the monolith intact.&lt;/p&gt;
&lt;p&gt;As Linus Torvalds once wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Talk is cheap, show me the code!&lt;/p&gt;</description></item><item><title>Toying with Kotlin's Context Receivers</title><link>https://foojayio.github.io/website/today/kotlins-context-receivers/</link><pubDate>Mon, 16 May 2022 10:39:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/kotlins-context-receivers/</guid><description>&lt;p&gt;Kotlin added the idea of Context Receivers in version 1.6.20.&lt;/p&gt;
&lt;p&gt;In this article, I&amp;rsquo;d like to toy with them to understand how useful they can be.&lt;/p&gt;
&lt;p&gt;Note that if you want to play along, you&amp;rsquo;ll need to compile with the &lt;code&gt;-Xcontext-receivers&lt;/code&gt; flag.&lt;/p&gt;
&lt;p&gt;The main idea behind context receivers is to pass additional parameters to a function without having to do it explicitly.&lt;/p&gt;
&lt;h2 id="h2-0-a-simplified-model-sample"&gt;A simplified model sample&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start with a simple example to show how it works. We want to model a simple transfer operation between two bank accounts.&lt;/p&gt;</description></item><item><title>Diving into JVM Framework Monitoring and Profiling</title><link>https://foojayio.github.io/website/today/diving-into-jvm-framework-monitoring-and-profiling/</link><pubDate>Fri, 13 May 2022 06:36:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/diving-into-jvm-framework-monitoring-and-profiling/</guid><description>&lt;p&gt;Managing available resources on demand in a cloud environment can be a very challenging topic. It is worth the effort, since it may however utilise resources far more efficiently.&lt;/p&gt;
&lt;p&gt;Companies or projects are therefore very keen to migrate to the Cloud providers, such as Azul, AWS, Google Cloud or others. For software engineers one truth still stands, also in the Cloud: It&amp;rsquo;s recommended to understand the behaviour and limitations of our deployed JVM application (or pods, the smallest deployable instance in Kubernetes).&lt;/p&gt;</description></item><item><title>Switch Statement and the Factory Pattern in Three JVM Languages</title><link>https://foojayio.github.io/website/today/examining-the-switch-statement-and-the-factory-pattern-in-three-jvm-languages/</link><pubDate>Wed, 06 Apr 2022 09:10:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/examining-the-switch-statement-and-the-factory-pattern-in-three-jvm-languages/</guid><description>&lt;p&gt;The goal of this article is to examine a program selection control mechanism.&lt;/p&gt;
&lt;p&gt;A selection control mechanism allows a value, expression or variable type to influence the program flow execution. This concept is commonly used by developers.&lt;/p&gt;
&lt;p&gt;A good example for this is a widely used design pattern. A design pattern that belongs to the family of creational patterns and is used for an object creation without exposing the entire logic.&lt;/p&gt;</description></item><item><title>Handling Null: Optional and Nullable Types</title><link>https://foojayio.github.io/website/today/handling-null-optional-and-nullable-types/</link><pubDate>Mon, 04 Apr 2022 08:06:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/handling-null-optional-and-nullable-types/</guid><description>&lt;p&gt;Java has long been infamous for its &lt;code&gt;NullPointerException&lt;/code&gt;. The reason for the is calling a method or accessing an attribute of an &lt;strong&gt;object that has not been initialized&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="java"&gt;var value = foo.getBar().getBaz().toLowerCase();&lt;/pre&gt;
&lt;p&gt;Running this snippet may result in something like the following:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic"&gt;Exception in thread "main" java.lang.NullPointerException
 at ch.frankel.blog.NpeSample.main(NpeSample.java:10)&lt;/pre&gt;
&lt;p&gt;At this point, you have no clue which part is &lt;code&gt;null&lt;/code&gt; in the call chain: &lt;code&gt;foo&lt;/code&gt;, or the value returned by &lt;code&gt;getBar()&lt;/code&gt; or &lt;code&gt;getBaz()&lt;/code&gt;?&lt;/p&gt;</description></item><item><title>Observability for JVM Frameworks with Grafana in Java and Kotlin</title><link>https://foojayio.github.io/website/today/observability-for-jvm-frameworks-with-grafana-in-java-and-kotlin/</link><pubDate>Wed, 30 Mar 2022 06:30:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/observability-for-jvm-frameworks-with-grafana-in-java-and-kotlin/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/observability-for-jvm-frameworks-with-grafana-in-java-and-kotlin/observ_img1-700x470.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Grafana dashboard for all running frameworks&lt;/p&gt;
&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In times of Cloud and distributed applications, it is becoming more and more important to be able to evaluate a functionality at runtime, an aspect which is referred to as &lt;a href="https://en.wikipedia.org/wiki/Observability" target="_blank" rel="noopener noreferrer"&gt;observability&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;A Cloud-based application is usually set up as a collection of different subsystems that may be located in one or more network zones or machines. These subsystems communicate with each other by passing messages (signals) and executing desired actions to each other. The whole collection then appears to the end user as a single coherent system.&lt;/p&gt;</description></item><item><title>Kover : Code Coverage plugin for Kotlin</title><link>https://foojayio.github.io/website/today/kover-code-coverage-plugin-for-kotlin/</link><pubDate>Mon, 28 Feb 2022 21:34:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/kover-code-coverage-plugin-for-kotlin/</guid><description>&lt;p&gt;&lt;em&gt;TL;DR: Kover is a code coverage tool for Kotlin. It&amp;rsquo;s still in incubator phase but I took it for a spin and it is already very useful as part of local or CI workflows! In this article I go through the setup and some of my favourite goodies of the tool. &lt;a href="https://github.com/jlengrand/spring-petclinic-kotlin/pull/1" target="_blank" rel="noopener noreferrer"&gt;You can see my experiment over here.&lt;/a&gt;
&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;At the end of last year, the &lt;a href="https://blog.jetbrains.com/kotlin/2021/11/kotlin-1-6-0-is-released/" target="_blank" rel="noopener noreferrer"&gt;version 1.6.0 of Kotlin was officially released&lt;/a&gt;
! The release was packed with new language features, but also some very nice tooling and ecosystem goodies.&lt;/p&gt;</description></item><item><title>Avoiding Stringly-typed in Kotlin</title><link>https://foojayio.github.io/website/today/avoid-stringly-typed-in-kotlin/</link><pubDate>Mon, 28 Feb 2022 16:35:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/avoid-stringly-typed-in-kotlin/</guid><description>&lt;p&gt;A couple of years ago, I developed an application in Kotlin based on Camunda to help me manage my conference submission workflow. It tracks my submissions in Trello and synchronizes them on Google Calendar and in a Google Sheet. Google Calendar offers a REST API. As REST APIs go, it&amp;rsquo;s cluttered with &lt;code&gt;String&lt;/code&gt; everywhere. Here&amp;rsquo;s an excerpt of the code:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="kotlin"&gt;fun execute(color: String, availability: String) {
 findCalendarEntry(client, google, execution.conference)?.let {
 it.colorId = color // 1
 it.transparency = availability // 2
 client.events()
 .update(google.calendarId, it.id, it).execute()
 }
}&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Set the event&amp;rsquo;s color. Valid values are &amp;ldquo;0&amp;rdquo;, &amp;ldquo;1&amp;rdquo;, &amp;hellip; to &amp;ldquo;11&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Set the event&amp;rsquo;s availability. Valid values are &lt;code&gt;&amp;quot;transparent&amp;quot;&lt;/code&gt; and &lt;code&gt;&amp;quot;opaque&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;However, my experience has taught me to favor strong typing. I also want to avoid typos. I want to list some alternatives to using &lt;code&gt;String&lt;/code&gt; in this post.&lt;/p&gt;</description></item><item><title>Measuring Time and Durations in Kotlin</title><link>https://foojayio.github.io/website/today/measuring-time-and-duration-in-kotlin/</link><pubDate>Fri, 25 Feb 2022 09:56:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/measuring-time-and-duration-in-kotlin/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;TL;DR : The &lt;code&gt;Duration&lt;/code&gt;API is coming out of its experimental stage and offers a nice DSL to easily work with time durations. If offers the obvious but also nice extra goodies, such as coercions and ISO/String conversions and is notably used to &lt;a href="https://github.com/Kotlin/KEEP/blob/master/proposals/stdlib/durations-and-time-measurement.md#measuretime-and-measuretimedvalue" target="_blank" rel="noopener noreferrer"&gt;calculate processing time&lt;/a&gt;
.&lt;/strong&gt;&lt;/em&gt; &lt;em&gt;&lt;strong&gt;You can directly run the code I present below &lt;a href="https://pl.kotl.in/QwksQa5h1" target="_blank" rel="noopener noreferrer"&gt;in the Kotlin playground&lt;/a&gt;
!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll be diving into one of the other news of the &lt;a href="https://blog.jetbrains.com/kotlin/2021/11/kotlin-1-6-0-is-released/" target="_blank" rel="noopener noreferrer"&gt;Kotlin 1.6 release&lt;/a&gt;
 : The &lt;code&gt;Duration&lt;/code&gt;API coming out of Experimental and is available for all flavours of Kotlin (so JS as well 😊)! Let&amp;rsquo;s look quickly together what it has to offer!&lt;/p&gt;</description></item><item><title>Backpressure in Reactive Systems</title><link>https://foojayio.github.io/website/today/backpressure-in-reactive-systems/</link><pubDate>Fri, 11 Feb 2022 10:07:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/backpressure-in-reactive-systems/</guid><description>&lt;p&gt;Mid-January, I held &lt;a href="https://www.youtube.com/watch?v=w0b4OQQmhBI" target="_blank" rel="noopener noreferrer"&gt;a talk at Kotlin.amsterdam&lt;/a&gt;
 based on my post &lt;a href="https://hazelcast.org/blog/migrating-from-imperative-to-reactive/" target="_blank" rel="noopener noreferrer"&gt;Migrating from Imperative to Reactive&lt;/a&gt;
 (a Spring Boot application).&lt;/p&gt;
&lt;p&gt;Because it was a Kotlin meetup, I demoed Kotlin code, and I added a step by migrating the codebase to coroutines.&lt;/p&gt;
&lt;p&gt;During Q&amp;amp;A, somebody asked whether coroutines implemented backpressure. I admit I was not sure of the answer, so I did a bit of research.&lt;/p&gt;
&lt;p&gt;This post provides information on backpressure in general and how &lt;a href="https://github.com/ReactiveX/RxJava" target="_blank" rel="noopener noreferrer"&gt;RxJava&lt;/a&gt;
 (v3), &lt;a href="https://projectreactor.io/" target="_blank" rel="noopener noreferrer"&gt;Project Reactor&lt;/a&gt;
 and Kotlin&amp;rsquo;s &lt;a href="https://kotlinlang.org/docs/reference/coroutines-overview.html" target="_blank" rel="noopener noreferrer"&gt;Coroutines&lt;/a&gt;
 handle it.&lt;/p&gt;</description></item><item><title>Beautify Third-Party APIs with Kotlin</title><link>https://foojayio.github.io/website/today/beautify-third-party-api-kotlin/</link><pubDate>Tue, 21 Dec 2021 08:15:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/beautify-third-party-api-kotlin/</guid><description>&lt;p&gt;Scala has popularized the &amp;ldquo;Pimp my library&amp;rdquo; pattern:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is just a fancy expression to refer to the ability to supplement a library using implicit conversions.&lt;/p&gt;
&lt;p&gt;&amp;ndash; &lt;a href="https://www.baeldung.com/scala/pimp-my-library-pattern" target="_blank" rel="noopener noreferrer"&gt;Pimp My Library Pattern in Scala&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kotlin does provide the same capability. However, it achieves it via &lt;em&gt;extension functions&lt;/em&gt;. While the generated bytecode is similar to Java&amp;rsquo;s static methods, the developer experience is the same as adding functions to existing types.&lt;/p&gt;
&lt;p&gt;This approach has limitations, though. One cannot update the type hierarchy.&lt;/p&gt;</description></item><item><title>Native-image with Quarkus</title><link>https://foojayio.github.io/website/today/native-image-quarkus/</link><pubDate>Mon, 13 Dec 2021 17:50:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/native-image-quarkus/</guid><description>&lt;p&gt;So far, we have looked at how well &lt;a href="https://foojayio.github.io/website/today/native-spring-boot/"&gt;Spring Boot&lt;/a&gt;
 and &lt;a href="https://foojayio.github.io/website/today/native-image-micronaut/"&gt;Micronaut&lt;/a&gt;
 integrate GraalVM native image extension. In this post, I&amp;rsquo;ll focus on &lt;a href="https://quarkus.io/" target="_blank" rel="noopener noreferrer"&gt;Quarkus&lt;/a&gt;
:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A Kubernetes Native Java stack tailored for OpenJDK HotSpot and GraalVM, crafted from the best of breed Java libraries and standards.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="h2-0-creating-a-new-project"&gt;Creating a new project&lt;/h2&gt;
&lt;p&gt;Just as Spring Boot and Micronaut, Quarkus provides options to create new projects:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A dedicated &lt;code&gt;quarkus&lt;/code&gt; &lt;a href="https://quarkus.io/guides/cli-tooling" target="_blank" rel="noopener noreferrer"&gt;CLI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://code.quarkus.io/" target="_blank" rel="noopener noreferrer"&gt;Web UI&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;img fetchpriority="high" decoding="async" class="aligncenter size-medium wp-image-50950" src="code-quarkus-700x477.jpg" alt="" width="700" height="477"&gt;
&lt;p&gt;Quarkus offers a definite improvement over its competitors. Every dependency has a detailed contextual menu that allows:&lt;/p&gt;</description></item><item><title>Non-blocking with Spring WebFlux, Kotlin and Coroutines</title><link>https://foojayio.github.io/website/today/build-and-test-non-blocking-web-applications-with-spring-webflux-kotlin-and-coroutines/</link><pubDate>Thu, 09 Dec 2021 14:03:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/build-and-test-non-blocking-web-applications-with-spring-webflux-kotlin-and-coroutines/</guid><description>&lt;p&gt;When a HTTP request comes in, a &amp;rsquo;normal&amp;rsquo; web application would map the request to a specific thread from the thread pool. This assigned thread stays with the request until a response can be returned to the request socket. Along the way, we might need to fetch data from some web service or database, read or write to a file or do other I/O calls, during which the thread is blocked and has to wait until it gets a response. For applications with high request rates, the thread pool can at some point become exhausted and then no new requests can be handled anymore.&lt;/p&gt;</description></item><item><title>Native-image with Micronaut</title><link>https://foojayio.github.io/website/today/native-image-micronaut/</link><pubDate>Mon, 22 Nov 2021 10:18:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/native-image-micronaut/</guid><description>&lt;p&gt;Last week, I wrote a native web app that queried the Marvel API &lt;a href="https://foojayio.github.io/website/today/native-spring-boot/"&gt;using Spring Boot&lt;/a&gt;
. This week, I want to do the same with the Micronaut framework.&lt;/p&gt;
&lt;h2 id="h2-0-creating-a-new-project"&gt;Creating a new project&lt;/h2&gt;
&lt;p&gt;Micronaut offers two options to create a new project:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A &lt;a href="https://micronaut.io/launch" target="_blank" rel="noopener noreferrer"&gt;web UI&lt;/a&gt;
:&lt;/li&gt;
&lt;/ol&gt;
&lt;img fetchpriority="high" decoding="async" class="aligncenter wp-image-50794 size-medium" src="micronaut-launch-700x330.jpg" alt="Micronaut Launch Web UI" width="700" height="330"&gt;
&lt;p&gt;As for Spring Initializr, it provides several features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Preview the project before you download it&lt;/li&gt;
&lt;li&gt;Share the configuration&lt;/li&gt;
&lt;li&gt;An API&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I do like that you can check the impact that the added features have on the POM.
2. A &lt;a href="https://docs.micronaut.io/1.3.3/guide/index.html#buildCLI" target="_blank" rel="noopener noreferrer"&gt;Command-Line Interface&lt;/a&gt;
:In parallel to the webapp, you can install the on different systems. Then you can use the &lt;code&gt;mn&lt;/code&gt; command to create new projects.&lt;/p&gt;</description></item><item><title>Native-image with Spring Boot</title><link>https://foojayio.github.io/website/today/native-spring-boot/</link><pubDate>Fri, 19 Nov 2021 11:47:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/native-spring-boot/</guid><description>&lt;p&gt;The Cloud has enabled a lot of new usages that were not possible before. Among them stands Serverless:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Serverless computing is a cloud computing execution model in which the cloud provider allocates machine resources on demand, taking care of the servers on behalf of their customers. Serverless computing does not hold resources in volatile memory; computing is rather done in short bursts with the results persisted to storage. When an app is not in use, there are no computing resources allocated to the app.&lt;/p&gt;</description></item><item><title>Extending Third-Party APIs in Different Languages</title><link>https://foojayio.github.io/website/today/extending-third-party-apis-in-different-languages/</link><pubDate>Mon, 08 Nov 2021 08:36:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/extending-third-party-apis-in-different-languages/</guid><description>&lt;p&gt;The need for shorter and shorter Time-To-Market requires us to integrate more and more third-party libraries. There&amp;rsquo;s no time for the &lt;a href="https://en.wikipedia.org/wiki/Not_invented_here" target="_blank" rel="noopener noreferrer"&gt;NIH syndrom&lt;/a&gt;
 anymore, if it ever was. While most of the time the library&amp;rsquo;s API is ready to use, it may happen that one needs to &amp;ldquo;adapt&amp;rdquo; it to the codebase sometimes. How easy the adaptation is depends a lot on the language.&lt;/p&gt;
&lt;p&gt;For example, in the JVM, there are a couple of Reactive-Programming libraries: RxJava, Project Reactor, Mutiny, and coroutines. You might need a library that uses types of one library, but you based your project on another.&lt;/p&gt;</description></item><item><title>Hazelcast + Kibana: Best Buddies for Exploring &amp; Visualizing Data</title><link>https://foojayio.github.io/website/today/hazelcast-kibana-best-buddies-for-exploring-visualizing-data/</link><pubDate>Thu, 04 Nov 2021 14:22:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/hazelcast-kibana-best-buddies-for-exploring-visualizing-data/</guid><description>&lt;p&gt;A lot, if not all, data science projects require some data visualization front-end to display the results for humans to analyze. Python seems to boast the most potent libraries, but do not lose hope if you&amp;rsquo;re a Java developer (or if you&amp;rsquo;re proficient in another language as well).&lt;/p&gt;
&lt;p&gt;In this article I will describe how you can benefit from such a data visualization front-end without writing a single line of code.&lt;/p&gt;</description></item><item><title>Kotlin and FaaS: An Impossible Union?</title><link>https://foojayio.github.io/website/today/kotlin-faas-impossible-union/</link><pubDate>Tue, 02 Nov 2021 08:40:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/kotlin-faas-impossible-union/</guid><description>&lt;p&gt;Some time ago, I read a post describing how to run a serverless Kotlin function on &lt;a href="https://www.openfaas.com/" target="_blank" rel="noopener noreferrer"&gt;OpenFaaS&lt;/a&gt;
. While the content is technically correct, I believe the concept itself is very wrong. Such posts can lead people to make ill-advised decisions: &amp;ldquo;because we can&amp;rdquo; is hardly a winning strategy.&lt;/p&gt;
&lt;p&gt;In this article, I&amp;rsquo;d like to first explain why the JVM platform is a bad idea for . Then, I&amp;rsquo;ll proceed to propose alternatives to use Kotlin nonetheless.&lt;/p&gt;</description></item><item><title>Debugging Tutorial 1 – Introduction: Conditional Breakpoints &amp; Set Value</title><link>https://foojayio.github.io/website/today/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/</link><pubDate>Wed, 27 Oct 2021 08:03:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/</guid><description>&lt;p&gt;In this series, I&amp;rsquo;ll walk you through the process of debugging applications and finding issues within them. As we debug, we&amp;rsquo;ll cover the techniques important for most developers. I will cover the following debuggers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IntelliJ/IDEA &amp;ndash; with Java/Kotlin&lt;/li&gt;
&lt;li&gt;PyCharm &amp;ndash; Python&lt;/li&gt;
&lt;li&gt;VSCode &amp;ndash; for JavaScript&lt;/li&gt;
&lt;li&gt;WebStorm &amp;ndash; for JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These should cover most use cases you&amp;rsquo;ll run into and some things will seem duplicate/redundant so you can just skip to the applicable section if you feel you &amp;ldquo;got the gist&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Multiple Ways to Configure Spring</title><link>https://foojayio.github.io/website/today/multiple-ways-configure-spring/</link><pubDate>Wed, 06 Oct 2021 08:55:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/multiple-ways-configure-spring/</guid><description>&lt;p&gt;Two weeks ago, I wrote how you could write a Spring application with no annotations.&lt;/p&gt;
&lt;p&gt;Many alternatives are available to configure your Spring app.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d like to list them in this post, leaving Spring Boot out of the picture on purpose.&lt;/p&gt;
&lt;h2 id="h2-0-core-concepts"&gt;Core concepts&lt;/h2&gt;
&lt;p&gt;A couple of concepts are central in Spring. The related documentation doesn&amp;rsquo;t describe most of them. Here is my understanding of them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bean&lt;/strong&gt; : A bean is an object managed by the Spring container&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bean Factory&lt;/strong&gt; : A bean factory is a component that manages the lifecycle of &lt;em&gt;beans&lt;/em&gt;, especially regarding the instantiation of new objects&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bean Definition&lt;/strong&gt; : A bean definition is the set of properties given to the Spring container and that the requested bean will have, &lt;em&gt;e.g.&lt;/em&gt;, class, name, scope, dependencies, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Context&lt;/strong&gt;: A context is a bean factory with additional capabilities (mainly internationalization and event publishing)&lt;/li&gt;
&lt;/ul&gt;
&lt;img fetchpriority="high" decoding="async" class="aligncenter size-medium wp-image-49678" src="spring-concepts-700x492.png" alt="" width="700" height="492"&gt;
&lt;br /&gt;
&lt;p&gt;To configure a Spring application, one creates one or more contexts and registers the necessary bean definitions in the desired ones. In the following sections, we will configure the following simple model:&lt;/p&gt;</description></item><item><title>Introducing Jetpack Compose for Desktop</title><link>https://foojayio.github.io/website/today/state-jvm-desktop-frameworks-jetpack-compose-for-desktop/</link><pubDate>Mon, 27 Sep 2021 07:36:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/state-jvm-desktop-frameworks-jetpack-compose-for-desktop/</guid><description>&lt;p&gt;The previous articles of this series were dedicated to frameworks that adopted the same traditional Object-Oriented-Programming approach. Components were modeled as classes. This week&amp;rsquo;s article is dedicated to Jet Compose for Desktop, the new kid on the block that offers a completely different approach.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://blog.frankel.ch/state-jvm-desktop-frameworks/1/" target="_blank" rel="noopener noreferrer"&gt;The state of JVM desktop frameworks: introduction&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.frankel.ch/state-jvm-desktop-frameworks/2/" target="_blank" rel="noopener noreferrer"&gt;The state of JVM desktop frameworks: Swing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.frankel.ch/state-jvm-desktop-frameworks/3/" target="_blank" rel="noopener noreferrer"&gt;The state of JVM desktop frameworks: SWT&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.frankel.ch/state-jvm-desktop-frameworks/4/" target="_blank" rel="noopener noreferrer"&gt;The state of JVM desktop frameworks: TornadoFX&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="_getting_your_feet_wet"&gt;Getting your feet wet&lt;/h2&gt;
&lt;p&gt;Originally, Jetpack Compose is a framework for the Android runtime. Compose for Desktop is its port to the .&lt;/p&gt;</description></item><item><title>Building Command Line Interfaces with Kotlin using picoCLI</title><link>https://foojayio.github.io/website/today/building-command-line-interfaces-with-kotlin-using-picocli/</link><pubDate>Thu, 23 Sep 2021 07:05:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-command-line-interfaces-with-kotlin-using-picocli/</guid><description>&lt;p&gt;&lt;em&gt;TL;DR : We&amp;rsquo;ll dive into a few interesting bits about CLI applications and picoCLI. But you can directly &lt;a href="https://github.com/jlengrand/swacli" target="_blank" rel="noopener noreferrer"&gt;see the code here&lt;/a&gt;
, or view my related conference talk &lt;a href="https://www.youtube.com/watch?v=Rc_D4OTKidU&amp;amp;amp;t=460s" target="_blank" rel="noopener noreferrer"&gt;here&lt;/a&gt;
.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As a developer, there is a large chance that you use Command Line Interfaces (CLIs) every day. From Git, to kubectl or Maven, they are everywhere. In this article, we&amp;rsquo;ll look into use cases where CLIs are a great idea. We&amp;rsquo;ll also dive into best practises, and discover one of the most used library for CLIs in the JVM world: &lt;strong&gt;&lt;a href="https://picocli.info/" target="_blank" rel="noopener noreferrer"&gt;picoCLI&lt;/a&gt;
&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>VS Code: SpringOne Updates, UX Improvements, Community Feedback</title><link>https://foojayio.github.io/website/today/vs-code-java-august-updates-springone-updates-ux-improvements-community-feedback/</link><pubDate>Mon, 20 Sep 2021 06:46:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/vs-code-java-august-updates-springone-updates-ux-improvements-community-feedback/</guid><description>&lt;p&gt;Hi everyone, welcome to the August edition of the Visual Studio Code Java update!&lt;/p&gt;
&lt;p&gt;In this article, we are going to share some exciting updates from the SpringOne 2021 conference, as well as various user experience improvements.&lt;/p&gt;
&lt;p&gt;When it comes to Java development, we always keep Spring developers in mind. In this year&amp;rsquo;s &lt;a href="https://devblogs.microsoft.com/java/join-microsoft-at-springone-2021/" title="SpringOne conference" target="_blank" rel="noopener noreferrer"&gt;SpringOne conference&lt;/a&gt;
, we shared an update on our Spring tooling support in Visual Studio Code, and showcased various Spring related features in two breakout sessions.&lt;/p&gt;</description></item><item><title>A Return to Annotation-Free Spring</title><link>https://foojayio.github.io/website/today/annotation-free-spring/</link><pubDate>Fri, 17 Sep 2021 12:03:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/annotation-free-spring/</guid><description>&lt;p&gt;Some, if not most, of our judgments regarding technology stacks come either from third-party opinions or previous experiences. Yet, we seem to be adamant about them. For a long time (and sometimes even now), I&amp;rsquo;ve seen posts that detailed how Spring is bad because it uses XML for its configuration. Unfortunately, they blissfully ignore the fact that annotation-based configuration has been available for ages.&lt;/p&gt;
&lt;p&gt;And probably for of the same reason, I recently read that Spring is bad&amp;hellip; &lt;em&gt;because of annotations&lt;/em&gt;. If you belong to this crowd, I&amp;rsquo;ve news for you: you can get rid of most annotations and even more so if you&amp;rsquo;re using Kotlin.&lt;/p&gt;</description></item><item><title>Taking a Closer Look at Kotlin's Delegation</title><link>https://foojayio.github.io/website/today/kotlin-delegation/</link><pubDate>Fri, 30 Apr 2021 13:53:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/kotlin-delegation/</guid><description>&lt;p&gt;Kotlin offers many exciting features. In general, developers tend to cite null safety as their favorite. For me, it&amp;rsquo;s function extensions. But delegation comes a close second.&lt;/p&gt;
&lt;h2 id="h2-0-the-delegation-pattern"&gt;The delegation pattern&lt;/h2&gt;
&lt;p&gt;The delegation pattern is described in the book:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Delegation&lt;/em&gt; is a way to make composition as powerful for reuse as inheritance [Lie86, JZ91]. In delegation, &lt;em&gt;two&lt;/em&gt; objects are involved in handling a request: a receiving object delegates operations to its &lt;em&gt;delegate&lt;/em&gt; . This is analogous to subclasses deferring requests to parent classes. But with inheritance, an inherited operation can always refer to the receiving object through the &lt;code&gt;this&lt;/code&gt; member variable in C++ and &lt;code&gt;self&lt;/code&gt; in Smalltalk. To achieve the same effect with delegation, the receiver passes itself to the delegate to let the delegated operation refer to the receiver.&lt;/p&gt;</description></item></channel></rss>