<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java on foojay.io - Friends of OpenJDK</title><link>https://foojayio.github.io/website/today/category/java/</link><description>Recent content in Java on foojay.io - Friends of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 03 Aug 2026 15:46:30 +0000</lastBuildDate><atom:link href="https://foojayio.github.io/website/today/category/java/index.xml" rel="self" type="application/rss+xml"/><item><title>The Codename One JavaScript Port Is Now Free and Open Source</title><link>https://foojayio.github.io/website/today/the-codename-one-javascript-port-is-now-free-and-open-source/</link><pubDate>Mon, 03 Aug 2026 15:46:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-codename-one-javascript-port-is-now-free-and-open-source/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/javascript-free-open-source.jpg" alt="The Codename One JavaScript Port Is Now Free and Open Source" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;The Codename One JavaScript port is now open source and available on every plan, including Free. You can also build the JavaScript target locally without a Codename One account.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Keeping Java Hot This Summer</title><link>https://foojayio.github.io/website/today/keeping-java-hot-this-summer-august-2026/</link><pubDate>Fri, 31 Jul 2026 09:50:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/keeping-java-hot-this-summer-august-2026/</guid><description>&lt;p&gt;Summer conference season goes quiet. Most major Java events wrap by June, CFPs go dark while we&amp;rsquo;re waiting for the results and a lot of us - if we decide to carry on with the work - use August to either catch up on backlog, or training ( and I mean mental exercise here, although I&amp;rsquo;m sure some of you hit the gym more often too 😉 ).&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re in the northeastern US or eastern Canada and are around next month with some extra time to spare, this may be a good excuse to join your local community to watch and learn from a technical session on a problem most of us have hit in production, delivered by &lt;a href="https://gsjug.org/profiles/simon-ritter.html" target="_blank" rel="noopener noreferrer"&gt;Simon Ritter,&lt;/a&gt;
 a Java Champion who&amp;rsquo;s spent years in the JVM internals.&lt;/p&gt;</description></item><item><title>HTTP QUERY Method Explained: RFC 10008, Ecosystem Adoption, and a Quarkus Implementation</title><link>https://foojayio.github.io/website/today/http-query-method-explained-rfc-10008-ecosystem-adoption-and-a-quarkus-implementation/</link><pubDate>Fri, 31 Jul 2026 08:00:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/http-query-method-explained-rfc-10008-ecosystem-adoption-and-a-quarkus-implementation/</guid><description>&lt;p&gt;When you build a search API, you usually start with HTTP GET, the natural choice for a read operation: it is safe, idempotent, and cacheable. Then the search form grows, filters multiply, and nested criteria appear. Since using GET means placing the query inside the URI, a length limit problem emerges. Worse, placing sensitive query values in the URI increases the chance of exposure through access logs, browser history, proxies, and monitoring systems. Because the HTTP protocol does not forbid it, sending a body with GET may look like a way out, but building your design on behavior the standards leave undefined is not a recommended practice. Elasticsearch&amp;rsquo;s GET-with-body search API is a well-known example, and &lt;a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/_empty_search.html" target="_blank" rel="noopener noreferrer"&gt;Elastic&amp;rsquo;s own documentation&lt;/a&gt;
 openly acknowledges the problem:&lt;/p&gt;</description></item><item><title>New Between-Quarters Security Updates for Java: What CSPUs Mean for Your Release Pipeline</title><link>https://foojayio.github.io/website/today/new-between-quarters-security-updates-for-java-what-cspus-mean-for-your-release-pipeline/</link><pubDate>Mon, 27 Jul 2026 07:31:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/new-between-quarters-security-updates-for-java-what-cspus-mean-for-your-release-pipeline/</guid><description>&lt;p&gt;In an announcement on the &lt;a href="https://mail.openjdk.org/archives/list/jdk-updates-dev@openjdk.org/thread/SVHDNJDY62MX6YBEA4FSMW4U72H77F6S/" target="_blank" rel="noopener noreferrer"&gt;OpenJDK Updates Mailinglist&lt;/a&gt;
 on July 20, 2026, Rob McKenna explained a change in the Oracle security release cycle for JDK builds. They plan to deliver security updates for the Oracle JDK as part of &lt;strong&gt;(some) monthly Critical Security Patch Updates (CSPUs)&lt;/strong&gt; .&lt;/p&gt;
&lt;p&gt;This brings more exact info, after an earlier message on April 26, 2026, in which &lt;a href="https://blogs.oracle.com/security/accelerating-vulnerability-detection-and-response-at-oracle" target="_blank" rel="noopener noreferrer"&gt;Oracle announced the acceleration of Vulnerability Detection and Response&lt;/a&gt;
. In that article they introduced the idea of monthly Critical Security Patch Updates (CSPU) across all their products. At that moment, it was not clear if this also applied to the Java releases, and how this would impact the normal quarterly cycle of Critical Patch Updates (CPUs).&lt;/p&gt;</description></item><item><title>Own Your Pixels: Native Fidelity on Your Schedule</title><link>https://foojayio.github.io/website/today/own-your-pixels-native-fidelity-on-your-schedule/</link><pubDate>Fri, 24 Jul 2026 15:45:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/own-your-pixels-native-fidelity-on-your-schedule/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/pixel-perfect-is-a-test.jpg" alt="Own Your Pixels: Native Fidelity on Your Schedule" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;An iOS or Android update can change a screen you shipped without you changing a line of code. If your app builds its UI from UIKit, SwiftUI, Compose, or Material widgets, Apple or Google owns those widget implementations. Codename One does something different. It statically links our lightweight component implementation into your native app. The UI you test is the UI your users keep after the next OS update. An update can still break a platform API or permission contract, but it cannot swap our button implementation for a new one.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>AI Found the Bugs. Who's Patching Your EOL Java Code?</title><link>https://foojayio.github.io/website/today/ai-found-the-bugs-whos-patching-your-eol-java-code/</link><pubDate>Thu, 23 Jul 2026 15:26:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/ai-found-the-bugs-whos-patching-your-eol-java-code/</guid><description>&lt;p&gt;Earlier this year an AI model found a flaw in OpenBSD&amp;rsquo;s TCP stack that had been sitting there for 27 years. The same scanning run turned up a 16-year-old bug in FFmpeg&amp;rsquo;s H.264 code.&lt;/p&gt;
&lt;h4 id="how-do-you-feel-about-ai-being-used-to-discover-bugs-in-open-source-across-the-board-and-at-scale"&gt;How do you feel about AI being used to discover bugs in open source, across the board and at scale?&lt;/h4&gt;
&lt;p&gt;Because that&amp;rsquo;s what&amp;rsquo;s happening. It&amp;rsquo;s tough enough dealing with machine-speed vulnerability discovery in code that has active maintainers. What about all the code with no friendly pair of safe hands?&lt;/p&gt;</description></item><item><title>Azul Zulu July 2026 Quarterly Update Released</title><link>https://foojayio.github.io/website/today/azul-zulu-july-2026-quarterly-update-released/</link><pubDate>Thu, 23 Jul 2026 12:35:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/azul-zulu-july-2026-quarterly-update-released/</guid><description>&lt;p&gt;Every three months your production JDKs fall further behind on security patches. Azul closes that gap today with the July 2026 quarterly update for Azul Zulu Builds of OpenJDK, covering Java 26, 25, 21, 17, 11, 8, 7, and 6.&lt;/p&gt;
&lt;h2 id="h2-0-the-quarterly-update-cycle"&gt;The Quarterly Update Cycle&lt;/h2&gt;
&lt;p&gt;Every three months, in January, April, July, and October, the OpenJDK project ships security patches, bug fixes, and improvements for all supported Java versions. This predictable schedule lets teams plan Java updates and keep production environments secure.&lt;/p&gt;</description></item><item><title>BoxLang AWS, Azure, and Google Secrets Manager Module Released</title><link>https://foojayio.github.io/website/today/boxlang-aws-azure-and-google-secrets-manager-module-released/</link><pubDate>Tue, 21 Jul 2026 11:38:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-aws-azure-and-google-secrets-manager-module-released/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-aws-azure-and-google-secrets-manager-module-released/boxlang-secrets-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Every production application carries secrets: database passwords, API tokens, encryption keys. The question is never whether to manage them &amp;ndash; it&amp;rsquo;s how badly the current approach is going to hurt you.&lt;/p&gt;
&lt;p&gt;Hardcoded credentials in config files get committed to repos. Environment variables sprawl across deployment pipelines with no audit trail. Custom integration code for each cloud provider means three different patterns to maintain, test, and rotate. And when a key needs to rotate at 2am? Someone is waking up.&lt;/p&gt;</description></item><item><title>First Test of Java on Banana Pi (ARM and RISC-V), Plus a Blinking LED with Pi4J</title><link>https://foojayio.github.io/website/today/first-test-of-java-on-banana-pi-arm-and-risc-v-plus-a-blinking-led-with-pi4j/</link><pubDate>Mon, 20 Jul 2026 06:03:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/first-test-of-java-on-banana-pi-arm-and-risc-v-plus-a-blinking-led-with-pi4j/</guid><description>&lt;hr&gt;
&lt;p&gt;As part of my 2026 learning goals around Java on RISC-V (see &lt;a href="https://webtechie.be/post/2026-01-07-x86-arm-riscv/" target="_blank" rel="noopener noreferrer"&gt;this post about x86 versus ARM versus RISC-V&lt;/a&gt;
), I&amp;rsquo;ve asked various suppliers to send me evaluation boards. I already published these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://webtechie.be/post/first-experiments-with-java-on-the-lattepanda-iota-an-alternative-to-raspberry-pi/" target="_blank" rel="noopener noreferrer"&gt;LattePanda IOTA (x86)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webtechie.be/post/first-test-of-java-on-the-orange-pi-arm-and-risc-v/" target="_blank" rel="noopener noreferrer"&gt;OrangePi 5 Ultra (ARM) and OrangePi RV2 (RISC-V)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webtechie.be/post/first-test-of-java-on-the-starfive-visionfive-2-lite-risc-v/" target="_blank" rel="noopener noreferrer"&gt;VisionFive 2 Lite (RISC-V)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webtechie.be/post/first-test-of-java-on-beagleboards-arm-and-risc-v/" target="_blank" rel="noopener noreferrer"&gt;BeagleBoards (ARM and RISC-V)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webtechie.be/post/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/" target="_blank" rel="noopener noreferrer"&gt;Java 25 on BeagleV-First&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;In this post: Banana Pi&amp;rsquo;s&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I got all these boards for free, but what I write here and show in the video is not controlled by the suppliers.&lt;/p&gt;</description></item><item><title>How We Beat HotSpot Performance (By Cheating, But Not Like That)</title><link>https://foojayio.github.io/website/today/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/</link><pubDate>Fri, 17 Jul 2026 17:24:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/beating-hotspot-performance.jpg" alt="How We Beat HotSpot Performance (By Cheating, But Not Like That)" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;No, we didn&amp;rsquo;t cheat in the benchmark. At least I hope we didn&amp;rsquo;t. Every optimization in this story was gated on bit identical output checksums against HotSpot, and the harness refuses to print a ratio when a checksum differs. If anything, this post is about how good HotSpot actually is. We tilted the table in our favor in every way we could, we hand tuned C code, and we still only beat it on some benchmarks. Getting there was a genuine struggle. If you want to understand the nuts and bolts of what your Java code costs, and the tradeoffs each runtime picks, I hope this is a good read.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Warm Up Fast, Run Lean: Vertical Scaling for Java on Kubernetes with Azul Prime and Kedify</title><link>https://foojayio.github.io/website/today/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/</link><pubDate>Fri, 17 Jul 2026 08:02:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/</guid><description>&lt;p&gt;Autoscaling on Kubernetes has evolved significantly, but many production systems still rely on reactive scaling based on CPU and memory utilization. The issue is that resource metrics often lag behind real demand. By the time the CPU rises, users may already be experiencing unacceptable latency.&lt;/p&gt;
&lt;p&gt;For most real services, horizontal scaling should be driven by proactive workload signals such as request rate, concurrency, or queue depth, rather than raw CPU alone. To learn more about this, see &lt;a href="https://kedify.io/resources/blog/autoscaling-delay-resource-based-hpa-vs-proactive-metrics" target="_blank" rel="noopener noreferrer"&gt;this post&lt;/a&gt;
 on autoscaling delay and proactive metrics.&lt;/p&gt;</description></item><item><title>Your Loom App Quietly Became a Thread Pool Again: A Field Guide to Virtual Thread Pinning</title><link>https://foojayio.github.io/website/today/virtual-thread-pinning-field-guide/</link><pubDate>Thu, 16 Jul 2026 07:43:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/virtual-thread-pinning-field-guide/</guid><description>&lt;p&gt;The incident that taught me to respect pinning looked like nothing. A service freshly migrated to virtual threads, a load test that plateaued at about 420 requests per second no matter how much traffic we threw at it, CPU sitting at 9%, zero errors, zero warnings, nothing in the logs. The machine had 8 cores, and the one downstream HTTP call in the hot path took about 19 ms. Do the arithmetic: 8 × (1000 / 19) ≈ 421.&lt;/p&gt;</description></item><item><title>BoxLang 1.15.0 Released: Blazing Fast Strings, Runtime Portability, and much more</title><link>https://foojayio.github.io/website/today/boxlang-1-15-0-released-blazing-fast-strings-runtime-portability-and-much-more/</link><pubDate>Tue, 14 Jul 2026 17:57:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-1-15-0-released-blazing-fast-strings-runtime-portability-and-much-more/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-1-15-0-released-blazing-fast-strings-runtime-portability-and-much-more/boxlang-v1.15.0-700x467.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BoxLang 1.15.0&lt;/strong&gt; is a high-impact release with two big headlines and a long tail of hardening. The first headline is a &lt;strong&gt;massive performance upgrade to string handling&lt;/strong&gt; : a new first-class &lt;code&gt;BoxStringBuilder&lt;/code&gt; type, compile-time literal folding, smarter &lt;code&gt;&amp;amp;=&lt;/code&gt; semantics, and a runtime concat strategy that automatically switches to builder-backed accumulation once your expression gets big enough. Your existing string-heavy code just got faster. No rewrites required.&lt;/p&gt;
&lt;p&gt;The second headline is architectural. Every class loader in the BoxLang runtime and module system has been fully abstracted behind a pluggable &lt;code&gt;IClassLoaderFactory&lt;/code&gt; interface. That single seam is what unlocks the &lt;strong&gt;Android runtime&lt;/strong&gt; and &lt;strong&gt;Ahead-of-Time (AOT) compiled runtimes&lt;/strong&gt; such as GraalVM Native Image that we have on the roadmap. The default behavior is unchanged, but the ceiling just got a lot higher.&lt;/p&gt;</description></item><item><title>Foojay Podcast #100: Java Podcasters on Why They Started, What Broke, and What They Learned</title><link>https://foojayio.github.io/website/today/foojay-podcast-100/</link><pubDate>Mon, 13 Jul 2026 07:05:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-100/</guid><description>&lt;p&gt;Foojay Podcast hits episode 100. No plan, no roadmap. It just happened. To mark the occasion, Frank turned the microphone around and invited other podcasters: Adam Bien (airhacks.fm), Jennifer Reif (Breaktime Tech Talks), Kadi McKean and Steve Pool (10xInsights), and Oumaima Zerouali (JCast). Same three questions for each: why did you start, what broke, and what did you learn?&lt;/p&gt;
&lt;h2 id="h2-0-youtube"&gt;YouTube&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/PID--srP0_U?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>🛑⚡ When NOT TO USE Event-Driven Architecture (EDA)</title><link>https://foojayio.github.io/website/today/when-not-to-use-event-driven-architecture-eda/</link><pubDate>Sat, 11 Jul 2026 00:34:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/when-not-to-use-event-driven-architecture-eda/</guid><description>&lt;h2 id="h2-0-when-event-driven-architecture-is-not-the-right-choice"&gt;When Event-Driven Architecture Is Not the Right Choice&lt;/h2&gt;
&lt;p&gt;Event-Driven Architecture (EDA) can help teams build scalable, loosely coupled and highly responsive distributed systems. Technologies such as Apache Kafka, RabbitMQ, Pulsar and cloud messaging platforms have made this architectural style increasingly popular.&lt;/p&gt;
&lt;p&gt;However, EDA also introduces significant complexity. Asynchronous communication requires teams to manage retries, duplicate events, eventual consistency, schema evolution, observability and failure recovery. When these challenges are introduced without a clear business or technical need, an event-driven system can become harder to develop, operate and debug than a simpler synchronous architecture.&lt;/p&gt;</description></item><item><title>More Surfaces, Same Deal: Cars, Sensors, Commerce, Video And Builds</title><link>https://foojayio.github.io/website/today/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/</link><pubDate>Fri, 10 Jul 2026 18:17:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/one-codebase-more-surfaces.jpg" alt="More Surfaces, Same Deal: Cars, Sensors, Commerce, Video And Builds" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Last week&amp;rsquo;s release post was about funding open source without the bait and switch. This week&amp;rsquo;s release tests that idea again, because two of the new features touch paid infrastructure directly: Commerce and versioned builds.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0 : Sets, Ranges, Inner Classes, and a Runtime That Talks Back</title><link>https://foojayio.github.io/website/today/boxlang-1-14-0-sets-ranges-inner-classes-and-a-runtime-that-talks-back/</link><pubDate>Thu, 09 Jul 2026 18:02:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-1-14-0-sets-ranges-inner-classes-and-a-runtime-that-talks-back/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-1-14-0-sets-ranges-inner-classes-and-a-runtime-that-talks-back/BoxLang-release-1.14.0-4-700x394.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;BoxLang has never stood still, but 1.14.0 is something different. This is the release where the language stops filling gaps and starts defining what a modern dynamic JVM language looks like on its own terms. Sixty-five issues closed. Four innovative language features. A formatter that has grown up. And a companion module - &lt;code&gt;bx-mcp&lt;/code&gt; - that fundamentally changes how you operate a running BoxLang application with AI.&lt;/p&gt;
&lt;p&gt;This could have easily been a major release for the team. This has been a really amazing effort by everybody at Ortus and all of the amazing feedback from our clients migrating to BoxLang and coming up with such amazing and innovative ideas for this platform. We have only just begun!&lt;/p&gt;</description></item><item><title>The Java Story: A Film About All of Us</title><link>https://foojayio.github.io/website/today/the-java-story-a-film-about-all-of-us/</link><pubDate>Thu, 09 Jul 2026 08:43:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-java-story-a-film-about-all-of-us/</guid><description>&lt;p&gt;Every so often a story comes along that belongs to an entire community rather than any one company or person. The Java Story documentary by CultRepo is one of those. On July 17th at 7pm UTC, the official Java documentary premieres live on YouTube - if you&amp;rsquo;ve spent any significant part of your career working with Java (and I assume most Foojay readers have!), I really think you&amp;rsquo;d want to watch it!&lt;/p&gt;</description></item><item><title>Why We Moved Our Timefold Java Worker Pods from AMD to ARM64</title><link>https://foojayio.github.io/website/today/why-we-moved-our-timefold-java-worker-pods-from-amd-to-arm64/</link><pubDate>Wed, 08 Jul 2026 15:25:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-we-moved-our-timefold-java-worker-pods-from-amd-to-arm64/</guid><description>&lt;p&gt;When we investigated unexpected performance variance in our Timefold Solver worker pods on our platform, we traced it to hyperthreading on AMD (x86-64) cloud instances. Switching to ARM (ARM64), where each vCPU maps to a physical core, eliminated the problem and roughly doubled effective throughput per dollar for concurrent solver workloads.&lt;/p&gt;
&lt;p&gt;Originally written by Timefold engineers Lars Beckmann, Jenne De Bleser and Lukáš Petrovický&lt;/p&gt;
&lt;p&gt;Adapted for foojay by Tom Cools&lt;/p&gt;</description></item><item><title>Funding Open Source Without The Bait And Switch: Analytics, Native Maps, TV And More</title><link>https://foojayio.github.io/website/today/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/</link><pubDate>Sun, 05 Jul 2026 13:41:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/funding-open-source-without-the-bait-and-switch.jpg" alt="Funding Open Source Without The Bait And Switch" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Years ago I wrote a piece called &lt;a href="https://debugagent.com/open-source-bait-and-switch" target="_blank" rel="noopener noreferrer"&gt;Open Source Bait and Switch&lt;/a&gt;
. The short version: a project is released as open source while it has no business model, a community forms around it, and then the bill comes due. The project either rots into abandonware because nobody can afford to maintain it, or it sprouts a home-grown &amp;ldquo;source available&amp;rdquo; license that quietly takes back the freedoms it was given on. You have watched this happen. So have I.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>This Dependency Update Looked Exactly Like an Account Takeover</title><link>https://foojayio.github.io/website/today/this-dependency-update-looked-exactly-like-an-account-takeover/</link><pubDate>Fri, 03 Jul 2026 08:31:27 +0000</pubDate><guid>https://foojayio.github.io/website/today/this-dependency-update-looked-exactly-like-an-account-takeover/</guid><description>&lt;p&gt;I pointed a scanner I have been building at an old Spring project, and it flagged javax.activation. The bump was 1.1-rev-1 to 1.1.1. Prior releases carried a GPG signature. This one did not.
&lt;img src="https://foojayio.github.io/website/today/this-dependency-update-looked-exactly-like-an-account-takeover/pr-comment-682x510.png" alt="git hub diff comment on PR" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;If you have read the post-mortems of real supply-chain attacks, that pattern should make you sit up. A package that has signed its releases for years suddenly ships one unsigned. The boring explanation is a build pipeline change. The other explanation is that a different person is publishing now, and the signing key stayed behind with the old one. When ua-parser-js was hijacked in 2021, the malicious versions came from a compromised account. When event-stream went bad in 2018, it was a new maintainer nobody had vetted. The artifact looks fine. The metadata around it is what changed.&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0 : Navigate Anything: JSONPath Comes to BoxLang's DataNavigator</title><link>https://foojayio.github.io/website/today/boxlang-1-14-0-navigate-anything-jsonpath-comes-to-boxlangs-datanavigator/</link><pubDate>Thu, 02 Jul 2026 18:17:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-1-14-0-navigate-anything-jsonpath-comes-to-boxlangs-datanavigator/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-1-14-0-navigate-anything-jsonpath-comes-to-boxlangs-datanavigator/BoxLang-release-1.14.0-3-700x394.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Every application eventually has to deal with deeply nested data. JSON API responses with payloads six levels deep. Configuration files where the key you need is buried inside an array of objects, one of which has a &lt;code&gt;null&lt;/code&gt; for the field you thought was required. Module metadata structures that nobody wrote a schema for. Runtime introspection data shaped like a tree that grew without a plan.&lt;/p&gt;
&lt;p&gt;BoxLang introduced DataNavigators in version 1 so you can use &lt;code&gt;dataNavigate()&lt;/code&gt;, call &lt;code&gt;.from()&lt;/code&gt; to scope down, chain your &lt;code&gt;.get()&lt;/code&gt; calls, provide defaults everywhere. Clean and safe. But even with the fluent API, extracting a specific slice of a complex payload still required multiple navigator hops, or a loop, or defensive key-exists checks stacked three levels deep.&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>7 Jackson CVEs in One Day: AI-Assisted Security Research</title><link>https://foojayio.github.io/website/today/7-new-vulnerabilities-in-jackson-in-one-day-this-is-what-ai-assisted-security-research-looks-like/</link><pubDate>Mon, 29 Jun 2026 11:47:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/7-new-vulnerabilities-in-jackson-in-one-day-this-is-what-ai-assisted-security-research-looks-like/</guid><description>&lt;p&gt;&lt;strong&gt;Quick version check:&lt;/strong&gt; the affected range for all seven is broadly &lt;code&gt;&amp;gt;=2.10.0 =2.19.0 =3.0.0 &amp;lt;3.1.4&lt;/code&gt; &amp;mdash; with some CVEs affecting narrower ranges. If you&amp;rsquo;re on a supported release, upgrade to 2.18.8, 2.21.4, or 3.1.4. If you&amp;rsquo;re on an EOL line &amp;mdash; 2.13.x, 2.14.x, 2.15.x &amp;mdash; jump to the bottom of the page for more specifics or visit &lt;a href="https://docs.herodevs.com/jackson?utm_source=devrel&amp;amp;amp;utm_medium=referral&amp;amp;amp;utm_campaign=2026q2_spring-boot-3-5-eol_global" target="_blank" rel="noopener noreferrer"&gt;HeroDevs Jackson Support&lt;/a&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="h3-0-not-a-sales-pitch"&gt;Not a sales pitch&lt;/h3&gt;
&lt;p&gt;Anyone who knows me knows I dont do that. In this case I&amp;rsquo;m pointing you at &lt;a href="https://docs.herodevs.com/jackson?utm_source=devrel&amp;amp;amp;utm_medium=referral&amp;amp;amp;utm_campaign=2026q2_spring-boot-3-5-eol_global" target="_blank" rel="noopener noreferrer"&gt;HeroDevs&lt;/a&gt;
 because the Jackson issues are serious, &lt;a href="https://docs.herodevs.com/jackson?utm_source=devrel&amp;amp;amp;utm_medium=referral&amp;amp;amp;utm_campaign=2026q2_spring-boot-3-5-eol_global" target="_blank" rel="noopener noreferrer"&gt;HeroDevs&lt;/a&gt;
 have a solution thats stupidly easy to use and I know the folks behind the fixes. It takes a particular type of engineer to create security fixes and I know they have that skillset. Do your own research.&lt;/p&gt;</description></item><item><title>Endive 1.0 Is Here: Wasm on the JVM Ships Under the Bytecode Alliance</title><link>https://foojayio.github.io/website/today/endive-1-0-wasm/</link><pubDate>Mon, 29 Jun 2026 00:11:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/endive-1-0-wasm/</guid><description>&lt;p&gt;A few weeks ago, we wrote about &lt;a href="https://foojayio.github.io/website/today/a-new-generation-of-java-libraries-is-born-wasm-becomes-the-implementation-detail/"&gt;a new generation of Java libraries&lt;/a&gt;
 powered by WebAssembly. SQLite, QuickJS, Protocol Buffers, the Ruby Prism parser, all compiled to Wasm and shipped as regular JARs. No JNI, no platform-specific binaries. Wasm as an implementation detail.&lt;/p&gt;
&lt;p&gt;Today, the runtime that makes it all work has its first official release under the &lt;a href="https://bytecodealliance.org/" target="_blank" rel="noopener noreferrer"&gt;Bytecode Alliance&lt;/a&gt;
. &lt;strong&gt;&lt;a href="https://endive.run/blog/endive-1.0" target="_blank" rel="noopener noreferrer"&gt;Endive 1.0&lt;/a&gt;
&lt;/strong&gt; is available on Maven Central.&lt;/p&gt;
&lt;h2 id="h2-0-what-shipped"&gt;What Shipped&lt;/h2&gt;
&lt;p&gt;Endive continues the work started as &lt;a href="https://github.com/dylibso/chicory" target="_blank" rel="noopener noreferrer"&gt;Chicory&lt;/a&gt;
, the pure-Java WebAssembly runtime that has been powering this ecosystem since 2023. Same API, same community, same codebase. The move to the Bytecode Alliance is organizational, not technical. For details on the fork and governance, see the &lt;a href="https://bytecodealliance.org/articles/endive-and-the-next-chapter-of-webassembly-on-the-jvm" target="_blank" rel="noopener noreferrer"&gt;announcement article&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>AI-Assisted Unused &amp; Dead Code Removal</title><link>https://foojayio.github.io/website/today/ai-assisted-unused-dead-code-removal/</link><pubDate>Sun, 28 Jun 2026 07:19:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/ai-assisted-unused-dead-code-removal/</guid><description>&lt;h2 id="h-why-your-codebase-is-forcing-ai-to-underperform-and-what-to-do-about-it"&gt;Why Your Codebase Is Forcing AI to Underperform, and What to Do About It&lt;/h2&gt;
&lt;figure class="alignleft size-large is-resized"&gt;
 &lt;img fetchpriority="high" decoding="async" width="1024" height="576" src="ai-assisted-dead-code-removal-1024x576.avif" alt="" class="wp-image-124402" style="width:250px"&gt;
&lt;/figure&gt;
&lt;p&gt;Your AI coding assistant is only as good as the codebase it works on. If your Java application carries years of dead &amp;amp; unused code, and most do, the AI spends its reasoning budget on code that nobody runs. The result is more hallucinations, worse suggestions, and higher token costs. Here&amp;rsquo;s what to do about it.&lt;/p&gt;</description></item><item><title>Native Linux, Apple Watch, A Game Builder And Crash Protection</title><link>https://foojayio.github.io/website/today/native-linux-apple-watch-a-game-builder-and-crash-protection/</link><pubDate>Fri, 26 Jun 2026 18:43:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/native-linux-apple-watch-a-game-builder-and-crash-protection/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/native-linux-apple-watch-game-builder-crash-protection.jpg" alt="Native Linux, Apple Watch, A Game Builder And Crash Protection" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;This week brings a native Linux desktop port, an Apple Watch and Wear OS port, a visual Game Builder with a high-level gaming API, and a new crash-protection system, with a tutorial following each one over the coming days. There is also a large piece of work that you mostly should not have noticed: we rebuilt the build cloud, and that rebuild caused a few failed builds along the way. More on that below.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Jurassic JDK: Migrate or Extinct</title><link>https://foojayio.github.io/website/today/jurassic-jdk-migrate-or-extinct/</link><pubDate>Fri, 26 Jun 2026 07:28:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/jurassic-jdk-migrate-or-extinct/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/jurassic-jdk-migrate-or-extinct/1_wul-KqE6vXk4ynnh_IljSQ-1-1024x562.webp" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;65 million years ago, dinosaurs didn&amp;rsquo;t adapt. They&amp;rsquo;re gone. Your JDK 7 app is giving the same energy. 🫠&lt;/p&gt;
&lt;p&gt;I spent a year and a half migrating more than 15 projects in production. Full time. Real teams, real deadlines, real 2am breakage. This is everything I wish someone had written before I started.&lt;/p&gt;
&lt;h2 id="h2-0-why-are-we-still-here"&gt;Why Are We Still Here? 👀&lt;/h2&gt;
&lt;p&gt;Walk into any company with a codebase older than 5 years and you&amp;rsquo;ll hear the same thing:&lt;/p&gt;</description></item><item><title>Aggregation Optimization in MongoDB: Unnecessary Unwinds (Part 2)</title><link>https://foojayio.github.io/website/today/aggregation-optimization-in-mongodb-unnecessary-unwinds-part-2/</link><pubDate>Thu, 25 Jun 2026 10:01:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/aggregation-optimization-in-mongodb-unnecessary-unwinds-part-2/</guid><description>&lt;h2 id="h2-0-and-why-mongodb-might-be-a-better-relational-database-than-you-ever-realized"&gt;And why MongoDB might be a better relational database than you ever realized.&lt;/h2&gt;
&lt;figure class="wp-block-image size-full is-resized"&gt;
 &lt;img fetchpriority="high" decoding="async" width="700" height="307" src="tue11.png" alt="" class="wp-image-124328" style="aspect-ratio:2.2802192518511397;width:840px;height:auto"&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href="https://www.mongodb.com/events/mongodb-schema-design-reviews/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=agg-part2-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;Design reviews&lt;/em&gt;&lt;/a&gt;
&lt;em&gt;are one-on-one meetings where MongoDB experts deliver advice on data modeling best practices and application design challenges. In this series, we are going to explore common real-life scenarios where design reviews helped developers achieve meaningful success with MongoDB.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This article was written by Graeme Robinson. Find him on&lt;/em&gt; &lt;a href="https://www.linkedin.com/in/graemecrobinson" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;
&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://foojayio.github.io/website/today/aggregation-optimization-in-mongodb-a-case-study-from-the-field-part-1/"&gt;In Part 1 of this series&lt;/a&gt;
, we described a use case based on a recent design review I conducted with a team at a MongoDB customer. The team in question was new to MongoDB, and the approach they had taken to both modeling their data and then subsequently querying it was very &amp;ldquo;RDBMS-like.&amp;rdquo; As a result, query performance was significantly slower than their SLA called for.&lt;/p&gt;</description></item><item><title>What's New In The June 2026 Azul Payara Release?</title><link>https://foojayio.github.io/website/today/whats-new-in-the-june-2026-azul-payara-release/</link><pubDate>Wed, 24 Jun 2026 11:28:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/whats-new-in-the-june-2026-azul-payara-release/</guid><description>&lt;p&gt;The June 2026 cycle ships the first regular monthly release of the Payara 7 line, plus a critical security fix that lands across every supported branch. Azul Payara 7.1.0 continues the Jakarta EE 11 line that went generally available in May, and is joined by Azul Payara Community 7.2026.6, Azul Payara 6.39.0, Azul Payara 5.88.0, and Azul Payara 4.1.2.191.56.&lt;/p&gt;
&lt;p&gt;A single security fix, backported from Payara 7 down to Payara 4, runs through every release in this cycle. Two supported lines, 5.88.0 and 6.39.0, also carry a behaviour change to the server &amp;ldquo;ready&amp;rdquo; signal that a minority of deployments will want to read before upgrading.&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0 : Query Transformers - Take Full Control of Your Query Results</title><link>https://foojayio.github.io/website/today/boxlang-1-14-0-query-transformers-take-full-control-of-your-query-results/</link><pubDate>Wed, 24 Jun 2026 10:46:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-1-14-0-query-transformers-take-full-control-of-your-query-results/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-1-14-0-query-transformers-take-full-control-of-your-query-results/BoxLang-release-1.14.0-2-700x394.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;BoxLang 1.14.0 ships a lot of exciting features &amp;ndash; Dynamic Sets, Ranges, Inner Classes, JSONPath navigation &amp;ndash; but one quietly powerful addition will change the way you think about every database call in your application: &lt;strong&gt;Query Transformers&lt;/strong&gt;, and this is just the start, we have plans for a whole lot more cool query features.&lt;/p&gt;
&lt;p&gt;If you have ever executed a query and then immediately written a loop to reshape the result into what you actually needed, this feature is for you.&lt;/p&gt;</description></item><item><title>double, BigDecimal, or Fixed-Point? Precision, Performance, and Sane Choices for Numbers in Java</title><link>https://foojayio.github.io/website/today/double-bigdecimal-or-fixed-point-precision-performance-and-sane-choices-for-numbers-in-java/</link><pubDate>Wed, 24 Jun 2026 07:38:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/double-bigdecimal-or-fixed-point-precision-performance-and-sane-choices-for-numbers-in-java/</guid><description>&lt;p&gt;There is an evergreen debate in the Java world: &lt;em&gt;Should you always use&lt;/em&gt; &lt;code&gt;MARKDOWN_HASHeb731dbabfc7392f8ad8c1cdb326a26aMARKDOWN&lt;/code&gt;&lt;em&gt;HASH&lt;/em&gt; for money?&lt;/p&gt;
&lt;p&gt;The short answer is &lt;strong&gt;no&lt;/strong&gt; . The real answer is: &lt;em&gt;it depends on your computational context: the precision you need, the rounding rules you must follow, and the performance budget you have.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The problem is that this conversation is often driven by dogma rather than engineering. You hear statements like &amp;ldquo;&lt;code&gt;double&lt;/code&gt; is broken,&amp;rdquo; &amp;ldquo;&lt;code&gt;BigDecimal&lt;/code&gt; is slow,&amp;rdquo; &amp;ldquo;always use fixed-point,&amp;rdquo; or &amp;ldquo;always use IEEE 754,&amp;rdquo; each treated as an absolute truth. Reality is more nuanced and more interesting.&lt;/p&gt;</description></item><item><title>Quarkus Unpacked: Insights from the Foojay Podcast</title><link>https://foojayio.github.io/website/today/quarkus-unpacked-insights-from-the-foojay-podcast/</link><pubDate>Tue, 23 Jun 2026 12:36:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/quarkus-unpacked-insights-from-the-foojay-podcast/</guid><description>&lt;figure class="alignleft is-resized"&gt;
 &lt;img decoding="async" src="3-Quarkus-Unpacked-2-2.jpeg" alt="Quarkus: A Runtime and Framework for Cloud-Native Java" style="width:300px"&gt;
&lt;/figure&gt;
&lt;p&gt;I recently had the pleasure of joining the &lt;a href="https://www.youtube.com/watch?v=_nJCTTrnZkE" target="_blank" rel="noopener noreferrer"&gt;Foojay podcast&lt;/a&gt;
 to talk about Quarkus in depth. The conversation covered a lot of ground, from what makes Quarkus different to the practical trade-offs between JVM and native mode. This post captures the key questions and answers from that discussion, lightly edited for readability.{#_quarkus_unpacked_insights_from_the_foojay_podcast}&lt;/p&gt;
&lt;p&gt;If you have been following this blog series, note that the third installment on building your own stack with Quarkus is coming next. Consider this a bonus entry that distills the podcast conversation into a format you can read, reference, and share.&lt;/p&gt;</description></item><item><title>We Will Not Sabotage Your Code</title><link>https://foojayio.github.io/website/today/we-will-not-sabotage-your-code/</link><pubDate>Sat, 20 Jun 2026 15:37:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/we-will-not-sabotage-your-code/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/we-will-not-sabotage-your-code.jpg" alt="We Will Not Sabotage Your Code" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;This is a very low bar. I am genuinely saddened that I need to write it down at all, because until last week it seemed too obvious to say out loud.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Last week the &lt;a href="https://arstechnica.com/security/2026/05/fed-up-with-vibe-coders-dev-sneaks-data-nuking-prompt-injection-into-their-code/" target="_blank" rel="noopener noreferrer"&gt;news broke&lt;/a&gt;
 of an open source developer doing something I find reprehensible. The short version: fed up with &amp;ldquo;vibe coders,&amp;rdquo; he embedded a hidden prompt aimed at AI agents inside his framework, with instructions designed to destroy data on the machines of people who used it.&lt;/p&gt;</description></item><item><title>Native Java Win32, 3D Gaming, Printing and Wallet</title><link>https://foojayio.github.io/website/today/native-java-win32-3d-gaming-printing-and-wallet/</link><pubDate>Fri, 19 Jun 2026 15:45:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/native-java-win32-3d-gaming-printing-and-wallet/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/weekly.jpg" alt="Native Java Win32, 3D Gaming, Printing and Wallet" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;This week we&amp;rsquo;re introducing native Windows support (no JVM!), a 3D graphics API, a gaming API, support for Apple Wallet, printing and more in what is probably our biggest update ever&amp;hellip; But that&amp;rsquo;s not the thing that excites me the most.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Where production policy belongs: building Eliya in public</title><link>https://foojayio.github.io/website/today/where-production-policy-belongs-building-eliya-in-public/</link><pubDate>Fri, 19 Jun 2026 08:15:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/where-production-policy-belongs-building-eliya-in-public/</guid><description>&lt;p&gt;This is an argument about where production intent belongs in a managed runtime, and the OpenJDK distribution we built to act on it - Eliya, an opinionated, compliance-conscious OpenJDK distribution. This is the first article in a series. The later parts are engineering: reproducible builds, the glibc floor, release signing, the one source patch we shipped. This part is the thesis they all serve.
&lt;img src="https://root.asymm.systems/images/jvm-behaviour-space.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Every configurable system has two spaces. The configuration space: every behaviour you can reach by setting the knobs the system already exposes. And there&amp;rsquo;s the implementation space: behaviour that only exists if someone goes in and changes the internals.&lt;/p&gt;</description></item><item><title>Building Java Containers Without a Dockerfile: Azul Zulu and Paketo Buildpacks</title><link>https://foojayio.github.io/website/today/building-java-containers-without-a-dockerfile-azul-zulu-and-paketo-buildpacks/</link><pubDate>Thu, 18 Jun 2026 08:15:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-java-containers-without-a-dockerfile-azul-zulu-and-paketo-buildpacks/</guid><description>&lt;p&gt;&lt;em&gt;This is the 5th post in the Azul Zulu Docker Official Images series:&lt;/em&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.azul.com/blog/trusted-java-containers-azul-zulu-openjdk-joins-dockers-official-images/" target="_blank" rel="noopener noreferrer"&gt;Trusted Java Containers: Azul Zulu OpenJDK Joins Docker&amp;rsquo;s Official Images&lt;/a&gt;
&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.azul.com/blog/the-road-to-docker-official-images-for-java-the-azul-zulu-story/" target="_blank" rel="noopener noreferrer"&gt;The Road to Docker Official Images for Java: The Azul Zulu Story&lt;/a&gt;
&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.azul.com/blog/using-the-azul-zulu-docker-official-images-from-simple-pull-to-lean-container/" target="_blank" rel="noopener noreferrer"&gt;Using the Azul Zulu Docker Official Images: From Simple Pull to Lean Container&lt;/a&gt;
&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.azul.com/blog/all-azul-zulu-container-images-explained-ca-sa-and-chainguard/" target="_blank" rel="noopener noreferrer"&gt;All Azul Zulu Container Images Explained: CA, SA, and Chainguard&lt;/a&gt;
&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Every post in this series so far has shown you a Dockerfile. You pick a base image, copy a JAR, set an entrypoint, and ship. That works well. But Spring Boot developers often skip the Dockerfile entirely and still get a production-ready container with Azul Zulu as the JVM thanks to Paketo Buildpacks. Here is how that works, and how to configure it.&lt;/p&gt;</description></item><item><title>OpenAPI, ORM, SVG and Lottie</title><link>https://foojayio.github.io/website/today/openapi-orm-svg-and-lottie/</link><pubDate>Thu, 18 Jun 2026 00:52:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/openapi-orm-svg-and-lottie/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/build-time-codegen.jpg" alt="OpenAPI, ORM, SVG and Lottie" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;This is the third follow-up to &lt;a href="https://www.codenameone.com/blog/metal-default-new-build-cloud-and-a-new-format/" target="_blank" rel="noopener noreferrer"&gt;Friday&amp;rsquo;s release post&lt;/a&gt;
. Saturday&amp;rsquo;s was about how you iterate; yesterday&amp;rsquo;s was about new platform APIs in the core; today&amp;rsquo;s is about a run of pieces that change how you write the structural parts of an app.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Mac Native Builds, Live Protocols, And Open Issues Under 350</title><link>https://foojayio.github.io/website/today/mac-native-builds-live-protocols-and-open-issues-under-350/</link><pubDate>Wed, 17 Jun 2026 15:03:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/mac-native-builds-live-protocols-and-open-issues-under-350/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/weekly.jpg" alt="Mac Native Builds, Live Protocols, And Open Issues Under 350" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Our focus was all over the place this week with work that targeted many different directions: desktop, monetization, communication, media, and more. This fits with our roadmap of one platform that delivers the promise Java never delivered: WORA for Everything Everywhere.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0 : BoxSet is Here, BoxLang's New First-Class Set Type</title><link>https://foojayio.github.io/website/today/boxlang-1-14-0-boxset-is-here-boxlangs-new-first-class-set-type/</link><pubDate>Wed, 17 Jun 2026 10:36:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-1-14-0-boxset-is-here-boxlangs-new-first-class-set-type/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-1-14-0-boxset-is-here-boxlangs-new-first-class-set-type/BoxLang-release-1.14.0-1-700x394.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;BoxLang 1.14.0 ships with a new &lt;strong&gt;dynamic first-class Set type&lt;/strong&gt; baked directly into the language. Not a wrapper you reach for manually, not a &lt;code&gt;createObject( &amp;quot;java&amp;quot;, &amp;quot;java.util.HashSet&amp;quot; )&lt;/code&gt; incantation you paste from a Stack Overflow answer years ago. A real &lt;code&gt;BoxSet&lt;/code&gt; with literal syntax, operator overloads, a full functional pipeline, change listeners, JSON serialization, and deep Java interop.&lt;/p&gt;
&lt;p&gt;If you have ever deduplicated an array with a loop, compared two collections element by element, or modeled a permission system on top of a struct &amp;ndash; Sets are the tool you were missing. Let&amp;rsquo;s dig in.&lt;/p&gt;</description></item><item><title>Did AI Just Break Software Security For Ever?</title><link>https://foojayio.github.io/website/today/did-ai-just-break-software-security-for-ever/</link><pubDate>Tue, 16 Jun 2026 14:51:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/did-ai-just-break-software-security-for-ever/</guid><description>&lt;p&gt;Whether the answer is yes or no (read on for my opinion) , something fundamental has changed this year. Not one thing. Four things, converging at once.&lt;/p&gt;
&lt;h3 id="h3-0-first-the-rate-of-cve-arrivals"&gt;First: The rate of CVE arrivals&lt;/h3&gt;
&lt;p&gt;More than 40,000 CVEs were published in 2024, rising to just under 50,000 in 2025. FIRST &amp;mdash; the Forum of Incident Response and Security Teams, &lt;a href="https://www.first.org/blog/20260522-vulnerability-forecast-update" title="projects" target="_blank" rel="noopener noreferrer"&gt;projects&lt;/a&gt;
 a median of 68,000 for 2026, with realistic scenarios reaching 70,000 to 100,000.&lt;/p&gt;</description></item><item><title>Ask a Lille Dev</title><link>https://foojayio.github.io/website/today/ask-a-lille-dev-what-java-developers-really-think-about-quality-frameworks-communities-and-careers/</link><pubDate>Tue, 16 Jun 2026 00:35:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/ask-a-lille-dev-what-java-developers-really-think-about-quality-frameworks-communities-and-careers/</guid><description>&lt;p&gt;During the DevLille 2026 conference in Lille, I interviewed several Java developers and tech professionals with one simple goal: collecting authentic and spontaneous insights from the Java ecosystem. ☕🎤&lt;/p&gt;
&lt;p&gt;The result became &lt;strong&gt;&amp;ldquo;Ask a Lille Dev&amp;rdquo;&lt;/strong&gt;, a mini podcast made of short interviews recorded directly during the conference. Instead of long talks or polished marketing speeches, the idea was simple: ask practical questions to people working in tech every day.&lt;/p&gt;</description></item><item><title>Spring, Quarkus,Jooby, or Vert.x: Java Framework Comparison</title><link>https://foojayio.github.io/website/today/spring-quarkus-jooby-vertx-java-framework-comparison/</link><pubDate>Mon, 15 Jun 2026 15:06:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-quarkus-jooby-vertx-java-framework-comparison/</guid><description>&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Building the same app four times revealed that the fastest framework also needed the most code, and the safest choice isn&amp;rsquo;t always the cheapest one to run.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Just use Spring&amp;rdquo; is rarely wrong. It&amp;rsquo;s also rarely the most interesting question a team can ask about its architecture.&lt;/li&gt;
&lt;li&gt;The real final boss may show up in two years, when developers who inherit the codebase have to figure out a framework nobody else on the team knows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every Java project I&amp;rsquo;ve seen starts the same way. The question &amp;ldquo;What framework?&amp;rdquo; is answered in a matter of seconds with &amp;ldquo;Spring Boot.&amp;rdquo;&lt;/p&gt;</description></item><item><title>AI, OAuth, And Other Platform APIs In The Core</title><link>https://foojayio.github.io/website/today/codename-one-ai-oauth-and-other-platform-apis-in-the-core/</link><pubDate>Mon, 15 Jun 2026 09:00:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/codename-one-ai-oauth-and-other-platform-apis-in-the-core/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/platform-apis-in-the-core.jpg" alt="AI, OAuth, And Other Platform APIs In The Core" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;This is the second follow-up to &lt;a href="https://www.codenameone.com/blog/metal-default-new-build-cloud-and-a-new-format/" target="_blank" rel="noopener noreferrer"&gt;Friday&amp;rsquo;s release post&lt;/a&gt;
. It covers the platform APIs that moved into the framework core this release. There are two headline pieces (AI / LLM and the modern OAuth / OIDC stack), and two smaller pieces (WiFi / connectivity and share-sheet result callbacks). This continues the direction the previous release set when we moved NFC, biometrics, and cryptography into the framework core. The full background on that earlier set is in &lt;a href="https://www.codenameone.com/blog/nfc-crypto-biometrics-and-build-cloud/" target="_blank" rel="noopener noreferrer"&gt;NFC, Crypto, Biometrics, And A New Build Cloud&lt;/a&gt;
.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>On-Device Debugging And JUnit 5</title><link>https://foojayio.github.io/website/today/on-device-debugging-and-junit-5/</link><pubDate>Fri, 12 Jun 2026 08:49:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/on-device-debugging-and-junit-5/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/developer-workflow-debug-and-junit.jpg" alt="On-Device Debugging And JUnit 5" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;This is the first follow-up to &lt;a href="https://www.codenameone.com/blog/metal-default-new-build-cloud-and-a-new-format/" target="_blank" rel="noopener noreferrer"&gt;Friday&amp;rsquo;s release post&lt;/a&gt;
 and it covers the two changes from this release that affect how you iterate on a Codename One app rather than what the app itself does. On-device debugging that treats Java as Java on a real iPhone or a real Android device, and standard JUnit 5 against the JavaSE simulator. The first is the one we have been wanting for a long time, and is the one that takes the most explaining, so most of the post is about it.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0 : Introducing Inner Classes</title><link>https://foojayio.github.io/website/today/boxlang-1-14-0-introducing-inner-classes/</link><pubDate>Thu, 11 Jun 2026 10:29:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-1-14-0-introducing-inner-classes/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-1-14-0-introducing-inner-classes/BoxLang-release-1.14.0-700x394.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;BoxLang has always embraced a simple truth: the way you organize code shapes the way you think about problems. For a long time, if you needed a helper class, you needed a file. One class, one &lt;code&gt;.bx&lt;/code&gt; file, no exceptions. This also stemmed from the CFML days. That&amp;rsquo;s clean and predictable, but it creates real friction when a class is tightly coupled to exactly one caller and has no business existing anywhere else.&lt;/p&gt;</description></item><item><title>Why Spring Teams Don't Need a Second Runtime for AI Agents</title><link>https://foojayio.github.io/website/today/spring-ai-agents-no-second-runtime/</link><pubDate>Wed, 10 Jun 2026 19:02:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-ai-agents-no-second-runtime/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/spring-ai-agents-no-second-runtime/hero-700x350.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;&lt;em&gt;A JVM-native runtime for building, governing and operating AI agents on existing Spring infrastructure.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Every time a Spring team decides to add AI agents to a production system, the story tends to follow the same arc. A few prototypes are built, several frameworks are evaluated, and then a new reality emerges: the project is no longer just about adding agents. It is about operating a new platform.&lt;/p&gt;
&lt;p&gt;With that new runtime come new deployment pipelines, new monitoring mechanisms, additional security reviews, and new operational responsibilities.&lt;/p&gt;</description></item><item><title>Your TLS Stack Is Lying to You About Zero-Copy</title><link>https://foojayio.github.io/website/today/your-tls-stack-is-lying-about-zero-copy/</link><pubDate>Wed, 10 Jun 2026 12:00:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/your-tls-stack-is-lying-about-zero-copy/</guid><description>&lt;h2 id="h2-0-the-no-waste-compute-constraint"&gt;The &amp;ldquo;No Waste Compute&amp;rdquo; Constraint&lt;/h2&gt;
&lt;p&gt;When I started designing the Exeris Kernel, I set one non-negotiable rule very early: no waste compute. That rule sounds like a performance slogan until it starts killing otherwise normal design decisions.&lt;/p&gt;
&lt;p&gt;I had already banned &lt;code&gt;ThreadLocal&lt;/code&gt;, moved context propagation to Scoped Values, and pushed more of the runtime into explicit off-heap ownership. The idea was simple: if the hot path is supposed to stay outside GC pressure, then memory shape and lifetime cannot be treated as incidental details.&lt;/p&gt;</description></item><item><title>JC-AI Newsletter #16</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-16/</link><pubDate>Tue, 09 Jun 2026 18:28:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-16/</guid><description>&lt;p&gt;Over the past two weeks, the field of artificial intelligence has continued its remarkable pace of advancement. As AI becomes increasingly woven into the fabric of daily life, shaping how we work, communicate, and make decisions, it is both timely and valuable to step back and understand the broader trajectory of this technology. Whether the developments around us feel promising or challenging, one truth remains clear: AI is not simply going away. It is here to stay, and understanding its evolution is essential from many perspectives. Have you ever wondered what harness engineering is, how evals attempt to move traditional unit tests onto a probabilistic plane, or how AI is reshaping entire industries across various branches? Let&amp;rsquo;s start.&lt;/p&gt;</description></item><item><title>Metal Default, A New Build Cloud, And A New Format</title><link>https://foojayio.github.io/website/today/metal-default-a-new-build-cloud-and-a-new-format/</link><pubDate>Mon, 08 Jun 2026 09:47:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/metal-default-a-new-build-cloud-and-a-new-format/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/metal-default-new-build-cloud-and-a-new-format.jpg" alt="Metal Default, A New Build Cloud, And A New Format" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;This week&amp;rsquo;s release post looks different on purpose. The Friday omnibus has been getting longer and longer, and that has been working against us in two ways. SEO ignores 5,000 word pages that cover twelve unrelated topics, so the actual material gets buried instead of indexed against the queries that should find it. And when a single release post covers ten things, it becomes hard to point a colleague at &amp;ldquo;that one Codename One change from a few weeks ago&amp;rdquo; without scrolling for ten minutes.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Spring Boot 3.5 Migration and the CRA: When Good Enough Isn't"</title><link>https://foojayio.github.io/website/today/spring-boot-migration-and-the-cra-when-good-enough-isnt/</link><pubDate>Fri, 05 Jun 2026 08:52:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-migration-and-the-cra-when-good-enough-isnt/</guid><description>&lt;p&gt;Back in April I &lt;a href="https://foojayio.github.io/website/today/crossing-the-river-styx-spring-boot-3-5-and-the-zombie-dependency-problem/" title="wrote"&gt;wrote&lt;/a&gt;
 about what happens to your security posture when Spring Boot 3.5 crosses the EOL line.&lt;/p&gt;
&lt;p&gt;The short version: the CVE pipeline dries up, your scanner goes quiet, and the bad actors keep watching upstream for anything they can exploit downstream against the dead code nobody&amp;rsquo;s patching.&lt;/p&gt;
&lt;p&gt;I called them zombie dependencies.&lt;/p&gt;
&lt;p&gt;June 30th is coming. In a few weeks, Spring Boot 3.5 reaches end of open-source support. You&amp;rsquo;ve either got a plan or you haven&amp;rsquo;t.&lt;/p&gt;</description></item><item><title>Tiberius: A Security Testing Framework for LLM Applications in Java</title><link>https://foojayio.github.io/website/today/tiberius-a-security-testing-framework-for-llm-applications-in-java/</link><pubDate>Thu, 04 Jun 2026 20:09:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/tiberius-a-security-testing-framework-for-llm-applications-in-java/</guid><description>&lt;p&gt;&lt;em&gt;How do you write a regression test for a system that is non-deterministic by design?&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li&gt;The Problem {#h2-0-1-the-problem}&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;Large Language Models have moved from research artifacts to production infrastructure. Java applications are embedding them into customer-facing services via Spring Boot, and e.g. LangChain4J &amp;mdash; for document summarization, customer support, healthcare assistance, and financial guidance, to name just a few. The deployment surface is growing faster than the security tooling.&lt;/p&gt;
&lt;p&gt;The vulnerability landscape is empirically well-established. Horlacher, Vifian, and Zagidullina (2026) &lt;strong&gt;[4]&lt;/strong&gt; red-teamed &lt;code&gt;gpt-oss-20b&lt;/code&gt; and found that adversarial techniques achieved alarmingly high Attack Success Rates, while non-adversarial probing exposed pervasive stereotypical defaults &amp;mdash; both consistent across English and Swiss German. Their conclusion: &lt;em&gt;&amp;ldquo;current alignment mechanisms have not fully resolved jailbreaks and inherent bias, posing critical challenges for automated decision-making.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>NFC, Crypto, Biometrics, And A New Build Cloud</title><link>https://foojayio.github.io/website/today/nfc-crypto-biometrics-and-a-new-build-cloud/</link><pubDate>Wed, 03 Jun 2026 08:37:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/nfc-crypto-biometrics-and-a-new-build-cloud/</guid><description>&lt;p&gt;Last week was about defaults. This week is about device APIs moving into the framework core, a small simulator change that revolutionizes Bluetooth development, and a preview of the new Build Cloud UI we would love your feedback on. There is a handful of other things in here too &amp;mdash; and the Metal default flip I trailed &lt;a href="https://www.codenameone.com/blog/skills-java17-and-theme-accents/" target="_blank" rel="noopener noreferrer"&gt;last week&lt;/a&gt;
 is in a different state than I expected, which is worth a word at the end.&lt;/p&gt;</description></item><item><title>BoxLang AI 3.2.0 — Image Generation, Web Search, Fluent Audio, Agent Registry &amp; MCP Observability</title><link>https://foojayio.github.io/website/today/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability/</link><pubDate>Tue, 02 Jun 2026 12:27:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability/BoxLangAI-3.2-700x394.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;BoxLang AI 3.2.0 is here, and it&amp;rsquo;s a landmark release. We&amp;rsquo;re shipping five major features: image generation, web search, a fluent audio builder API, a centralized agent registry, and deep MCP observability along with a suite of analytics improvements and a critical bug fix. Let&amp;rsquo;s dig in. 🎉&lt;/p&gt;
&lt;p&gt;🖼️ Image Generation &amp;mdash; aiImage()&lt;/p&gt;
&lt;p&gt;You can now generate images directly from BoxLang using any provider that supports text-to-image generation. The aiImage() BIF follows the same fluent, chainable philosophy as the rest of bx-ai then act on the result with expressive method calls.&lt;/p&gt;</description></item><item><title>Enterprise Java quality gates in the age of AI</title><link>https://foojayio.github.io/website/today/enterprise-java-quality-gates-ai/</link><pubDate>Fri, 29 May 2026 07:00:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/enterprise-java-quality-gates-ai/</guid><description>&lt;img decoding="async" class="size-medium wp-image-123963" src="ChatGPT-Image-May-26-2026-04_44_09-PM-700x394.png" alt="Illustration of human developers and an AI assistant writing code together, with the code passing through an enterprise quality gate before reaching a trusted repository." width="100%"&gt;
&lt;p&gt;People and AI can write code together, but enterprise repositories still need deterministic quality gates to protect code quality.&lt;/p&gt;
&lt;br /&gt;
&lt;h2 id="h2-0-enterprise-quality-is-a-scaling-problem"&gt;Enterprise quality is a scaling problem&lt;/h2&gt;
&lt;p&gt;Enterprise Java development is not only about writing correct code. It is about keeping a large, long-lived codebase understandable, reviewable and safe to change while many people and many tools touch it over time.&lt;/p&gt;</description></item><item><title>Exploring MongoT</title><link>https://foojayio.github.io/website/today/exploring-mongot-atlas-search/</link><pubDate>Thu, 28 May 2026 21:02:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-mongot-atlas-search/</guid><description>&lt;p&gt;Let&amp;rsquo;s explore this fascinating and awesome Java project from MongoDB - MongoT!&lt;/p&gt;
&lt;p&gt;You can check out the source code here:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;git clone https://github.com/mongodb/mongot&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.17.36-PM-1024x548.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;MongoT is a wrapper around the amazing Java search engine: &lt;a href="https://lucene.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Lucene&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Lucene is a powerful search toolkit built around an inverted token index structure that enables advanced text search capabilities, including ranked results, autocomplete, synonyms, fuzzy matching, highlighting, and faceting &amp;mdash; all with high performance regardless of dataset size. Unlike MongoDB&amp;rsquo;s native query engine, it can efficiently search across multiple indexes simultaneously by intersecting lists of ordinal document IDs in parallel, using optimization techniques like skip-lists, ordinal compression, and document frequency ordering. It also supports indexing of various field types (integers, dates, keywords, etc.) and has expanded into vector search, enabling semantic similarity search by meaning rather than exact text matching.&lt;/p&gt;</description></item><item><title>Intro to the BoxLang Formatter</title><link>https://foojayio.github.io/website/today/intro-to-the-boxlang-formatter/</link><pubDate>Thu, 28 May 2026 17:45:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/intro-to-the-boxlang-formatter/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/intro-to-the-boxlang-formatter/boxlang-formatter-700x394.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;You know the drill. Someone opens a PR and half the review comments are about tabs vs spaces, where braces go, or why that one function has its arguments formatted differently from everything else. It&amp;rsquo;s noise. And it&amp;rsquo;s over.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The BoxLang Formatter is here, and it handles all of that for you.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can find the docs here: &lt;a href="https://boxlang.ortusbooks.com/getting-started/ide-tooling/boxlang-formatter" target="_blank" rel="noopener noreferrer"&gt;https://boxlang.ortusbooks.com/getting-started/ide-tooling/boxlang-formatter&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The BoxLang Formatter is a built-in code formatting tool that ships with BoxLang. It enforces consistent style across &lt;code&gt;.bx&lt;/code&gt;, &lt;code&gt;.bxs&lt;/code&gt;, &lt;code&gt;.bxm&lt;/code&gt;, &lt;code&gt;.cfm&lt;/code&gt;, &lt;code&gt;.cfc&lt;/code&gt;, and &lt;code&gt;.cfs&lt;/code&gt; files &amp;mdash; automatically.&lt;/p&gt;</description></item><item><title>Scoped Values: Why I Banned ThreadLocal in Exeris</title><link>https://foojayio.github.io/website/today/banned-threadlocal-java-scoped-values/</link><pubDate>Thu, 28 May 2026 09:36:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/banned-threadlocal-java-scoped-values/</guid><description>&lt;h4 id="in-a-zero-copy-runtime-designed-for-1-vt-per-stream-density-threadlocal-is-a-performance-serial-killer-here-is-the-forensic-analysis-and-how-jep-506-scoped-values-changed-everything"&gt;In a zero-copy runtime designed for 1-VT-per-Stream density, ThreadLocal is a performance serial killer. Here is the forensic analysis and how JEP 506 Scoped Values changed everything.&lt;/h4&gt;
&lt;hr&gt;
&lt;p&gt;When I started designing the &lt;strong&gt;Exeris Kernel&lt;/strong&gt; &amp;mdash; a next-generation, zero-copy runtime built for Java 26+ &amp;mdash; I established one non-negotiable architectural law: &lt;strong&gt;&amp;ldquo;No Waste Compute.&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In a system designed to handle extreme density by mapping exactly one Virtual Thread to every network stream (1-VT-per-Stream), every byte of memory and every CPU cycle must be intentional.&lt;/p&gt;</description></item><item><title>Skills, Java 17, And Theme Accents with Codename One</title><link>https://foojayio.github.io/website/today/skills-java-17-and-theme-accents-with-codename-one/</link><pubDate>Wed, 27 May 2026 09:32:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/skills-java-17-and-theme-accents-with-codename-one/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/skills-java17-and-theme-accents.jpg" alt="Skills, Java 17, And Theme Accents" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Last week was about Metal and the Skin Designer. This week the headline items are about what a brand new project looks like when you generate it: the default JDK is Java 17, and every generated project ships with an &lt;code&gt;AGENTS.md&lt;/code&gt; authoring skill that lets any modern AI agent work on the project intelligently. There are also some other things worth covering: a runtime accent palette on the new native themes, three Metal follow-ups (one of which introduces a new matrix-correct translate API), the JDK 11+ String API gap closed, and iOS push permission that no longer fires at app launch.&lt;/p&gt;</description></item><item><title>Introducing bx-jwt: Enterprise-Grade JSON Web Tokens for BoxLang</title><link>https://foojayio.github.io/website/today/introducing-bx-jwt-enterprise-grade-json-web-tokens-for-boxlang/</link><pubDate>Tue, 26 May 2026 10:14:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/introducing-bx-jwt-enterprise-grade-json-web-tokens-for-boxlang/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/introducing-bx-jwt-enterprise-grade-json-web-tokens-for-boxlang/bx-jwt-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;JWT authentication is everywhere. But rolling it correctly &amp;mdash; with proper algorithm enforcement, key management, clock skew handling, JWE encryption, and zero security footguns &amp;mdash; is anything but trivial. Today, we&amp;rsquo;re shipping &lt;strong&gt;bx-jwt&lt;/strong&gt;, a production-ready JWT/JWE module for BoxLang that handles all of it out of the box, so you can focus on building, not fighting cryptography.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bx-jwt&lt;/strong&gt; is part of the &lt;a href="https://www.boxlang.io/plans" title="BoxLang&amp;#43; and BoxLang&amp;#43;&amp;#43; subscription tiers" target="_blank" rel="noopener noreferrer"&gt;BoxLang+ and BoxLang++ subscription tiers&lt;/a&gt;
 &amp;mdash; our enterprise-grade module collection built for teams that take security seriously.&lt;/p&gt;</description></item><item><title>Metal and Skins</title><link>https://foojayio.github.io/website/today/metal-and-skins/</link><pubDate>Thu, 21 May 2026 08:59:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/metal-and-skins/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/metal-and-skins.jpg" alt="Metal and Skins" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;This post has a lot to cover. Before we get to any of it I want to take on the uncomfortable subject first: quality. Two incidents from the past two weeks deserve a public explanation, one was a bug that fits into our normal iteration loop and one was a serious mistake on my part. Both deserve the kind of explanation I would want if I were on the other side of the import.
| &lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/" target="_blank" rel="noopener noreferrer"&gt;codenameone.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>All Azul Zulu Container Images Explained: CA, SA, and Chainguard</title><link>https://foojayio.github.io/website/today/all-azul-zulu-container-images-explained-ca-sa-and-chainguard/</link><pubDate>Wed, 20 May 2026 09:56:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/all-azul-zulu-container-images-explained-ca-sa-and-chainguard/</guid><description>&lt;p&gt;&lt;em&gt;Previously in this series:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.azul.com/blog/trusted-java-containers-azul-zulu-openjdk-joins-dockers-official-images/" target="_blank" rel="noopener noreferrer"&gt;Trusted Java Containers: Azul Zulu OpenJDK Joins Docker&amp;rsquo;s Official Images&lt;/a&gt;
&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.azul.com/blog/the-road-to-docker-official-images-for-java-the-azul-zulu-story/" target="_blank" rel="noopener noreferrer"&gt;The Road to Docker Official Images for Java: The Azul Zulu Story&lt;/a&gt;
&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.azul.com/blog/using-the-azul-zulu-docker-official-images-from-simple-pull-to-lean-container/" target="_blank" rel="noopener noreferrer"&gt;Using the Azul Zulu Docker Official Images: From Simple Pull to Lean Container&lt;/a&gt;
&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The launch of &lt;a href="https://hub.docker.com/_/azul-zulu" target="_blank" rel="noopener noreferrer"&gt;Azul Zulu as Docker Official Images&lt;/a&gt;
 was a milestone, but it&amp;rsquo;s just one of several ways to get Azul Zulu Builds of OpenJDK in a container. Depending on whether you&amp;rsquo;re evaluating Azul Zulu, running it in production under a support contract, or operating in a high-security environment, the right image source will vary. In this post, I&amp;rsquo;ll show you all the possibilities.
&lt;img src="https://foojayio.github.io/website/today/all-azul-zulu-container-images-explained-ca-sa-and-chainguard/azul-zulu-ca-sa-chainguard-1024x576.avif" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>BoxLang v1.13.0: Compatibility, Concurrency, and Formatter Maturity</title><link>https://foojayio.github.io/website/today/boxlang-v1-13-0-compatibility-concurrency-and-formatter-maturity/</link><pubDate>Tue, 19 May 2026 12:11:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-v1-13-0-compatibility-concurrency-and-formatter-maturity/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-v1-13-0-compatibility-concurrency-and-formatter-maturity/boxlang-v1.13.0-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BoxLang 1.13.0&lt;/strong&gt; is a stability-first release with deep compatibility work and runtime hardening. This build closes 48 issues, with the majority focused on CFML compatibility edge cases, concurrency correctness, formatting parity, and miniserver/runtime reliability under real production loads.&lt;/p&gt;
&lt;p&gt;While this release is bug-fix heavy, it still introduces several meaningful features and quality-of-life improvements: character-aware trimming, class metadata lookup by absolute path, process environment control in SystemExecute(), SOAP headers, new query column rename capabilities, and safer miniserver routing/security defaults.&lt;/p&gt;</description></item><item><title>AI-Powered Code Review Assistant: Automated Code Analysis with Spring AI and MongoDB</title><link>https://foojayio.github.io/website/today/ai-powered-code-review-assistant-automated-code-analysis-with-spring-ai-and-mongodb/</link><pubDate>Thu, 14 May 2026 17:09:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/ai-powered-code-review-assistant-automated-code-analysis-with-spring-ai-and-mongodb/</guid><description>&lt;p&gt;Code reviews catch bugs before they ship, but they take time. Most teams rely on manual review or basic linters that flag syntax issues but miss deeper problems like subtle resource leaks, poor exception handling, or security anti-patterns. Static analysis tools help, but they work with rigid rules that cannot generalize across code variations. A rule that catches &lt;code&gt;catch (Exception e) {}&lt;/code&gt; will miss &lt;code&gt;catch (Throwable t) { return null; }&lt;/code&gt;, even though both are the same underlying problem.&lt;/p&gt;</description></item><item><title>How to Develop AI Agents Using BoxLang AI: A Practical Guide</title><link>https://foojayio.github.io/website/today/how-to-develop-ai-agents-using-boxlang-ai-a-practical-guide/</link><pubDate>Tue, 12 May 2026 12:52:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-develop-ai-agents-using-boxlang-ai-a-practical-guide/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/how-to-develop-ai-agents-using-boxlang-ai-a-practical-guide/boxlang-ai-v3-1-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;AI agents are transforming how we build software. Unlike traditional chatbots that just answer questions, agents can reason about what tools they need, decide when to use them, chain multiple actions together, and remember what happened earlier in a conversation.&lt;/p&gt;
&lt;p&gt;In this tutorial, I&amp;rsquo;ll show you how to build a real-world AI agent using &lt;a href="https://ai.boxlang.io/" title="BoxLang AI" target="_blank" rel="noopener noreferrer"&gt;BoxLang AI&lt;/a&gt;
 &amp;mdash; the official AI framework for the BoxLang JVM language. We&amp;rsquo;ll build &lt;strong&gt;SupportBot&lt;/strong&gt;, an e-commerce customer support agent that can look up orders, check inventory, issue refunds, and answer questions grounded in your knowledge base.&lt;/p&gt;</description></item><item><title>Foojay Podcast #95: Is Your Java App Actually Secure, Or Does It Just Look That Way?</title><link>https://foojayio.github.io/website/today/foojay-podcast-95/</link><pubDate>Mon, 11 May 2026 09:57:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-95/</guid><description>&lt;p&gt;Is your Java application actually secure, or does it just look that way? In this episode of the Foojay Podcast, Frank is joined by Steve Poole and David Welch, both from &lt;a href="https://www.herodevs.com/" target="_blank" rel="noopener noreferrer"&gt;HeroDevs&lt;/a&gt;
, to dig deep into the state of Java security in 2025 and beyond.&lt;/p&gt;
&lt;p&gt;Steve introduces the concept of zombie dependencies: end-of-life libraries that appear safely dormant but are quietly accumulating vulnerabilities waiting to bite you. David, a co-chair of the CVE Automation Working Group, explains what a CVE actually is, how the identification and disclosure process works in practice, and why AI tools like Mythos are dramatically accelerating the pace at which new vulnerabilities are found &amp;mdash; on both sides of the wall.&lt;/p&gt;</description></item><item><title>Liquid Glass, Material 3, And A Lot Of Plumbing</title><link>https://foojayio.github.io/website/today/liquid-glass-material-3-and-a-lot-of-plumbing/</link><pubDate>Mon, 11 May 2026 09:10:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/liquid-glass-material-3-and-a-lot-of-plumbing/</guid><description>&lt;p&gt;&lt;img src="https://www.codenameone.com/blog/liquid-glass-material-3-modern-native-themes.jpg" alt="Header Image" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;It has been one of those weeks where the diff is bigger than the headline. The headline is short &amp;mdash; Codename One now ships modern native themes: an iOS &amp;ldquo;liquid glass&amp;rdquo; look and an Android Material 3 look, bundled into the iOS and Android ports, on by default in the Playground, and selectable from a brand new menu in the simulator. The diff behind that headline is several thousand lines across the platform ports, the simulator, the GUI plumbing, and a small army of screenshot tests.&lt;/p&gt;</description></item><item><title>Explore Spring AI SDK – Amazon Bedrock AgentCore – Part 3</title><link>https://foojayio.github.io/website/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/</link><pubDate>Sun, 10 May 2026 09:09:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/spring-ai-amazon-bedrock-sdk-guide/"&gt;Part 1&lt;/a&gt;
 and &lt;a href="https://foojayio.github.io/website/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/"&gt;Part 2&lt;/a&gt;
, we explored the Spring AI SDK and Amazon Bedrock AgentCore features, including the agentcore runtime starter and integration of agentcore memory. In this article, we will explore the integration of AgentCore built-in tools, including the Browser and Code Interpreter features.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Repository containing the companion code for the tutorial. &lt;a href="https://github.com/bsmahi/simple-spring-boot-agent" target="_blank" rel="noopener noreferrer"&gt;Go to GitHub&lt;/a&gt;
{#https://github.com/bsmahi/simple-spring-boot-agent}.&lt;/strong&gt;
&lt;img src="https://foojayio.github.io/website/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/AgentcoreBrowser.png" alt="AgentCore Built-In Tool Browser" loading="lazy"&gt;
 Built-In Tool Browser&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;The use case I am trying to build here is for the given URL; it navigates the entire website and retrieves the content and gives key points and the summary of the page using &lt;strong&gt;the AgentCore Browser&lt;/strong&gt; tool.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>💪😤 THE 12 LABOURS OF PRIMEFACES 15.0.15 #release</title><link>https://foojayio.github.io/website/today/the-12-labours-of-primefaces-15-0-15-release/</link><pubDate>Sun, 10 May 2026 08:15:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-12-labours-of-primefaces-15-0-15-release/</guid><description>&lt;br /&gt;
&lt;img fetchpriority="high" decoding="async" class="size-medium wp-image-123733" src="toge-herculer-700x394.png" alt="💪😤 THE 12 LABOURS OF PRIMEFACES 15.0.15 #release" width="700" height="394"&gt;
&lt;br /&gt;
&lt;p&gt;💪😤 THE 12 LABOURS OF PRIMEFACES 15.0.15 #release&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id="h3-0-primefaces-15-0-15-has-just-been-released"&gt;PrimeFaces 15.0.15 has just been released. 🚀&lt;/h3&gt;
&lt;p&gt;And no, this is not &amp;ldquo;React for Java&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;PrimeFaces is a component library for JSF / Jakarta Faces.&lt;/p&gt;
&lt;p&gt;Its goal is simple:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;build server-side Java web applications with rich UI components without writing everything manually in HTML, CSS and JavaScript.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This release is mostly about polish:&lt;/p&gt;</description></item><item><title>Using the Azul Zulu Docker Official Images: From Simple Pull to Lean Container</title><link>https://foojayio.github.io/website/today/using-the-azul-zulu-docker-official-images-from-simple-pull-to-lean-container/</link><pubDate>Fri, 08 May 2026 09:05:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/using-the-azul-zulu-docker-official-images-from-simple-pull-to-lean-container/</guid><description>&lt;p&gt;&lt;em&gt;Previously in this series:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.azul.com/blog/trusted-java-containers-azul-zulu-openjdk-joins-dockers-official-images/" target="_blank" rel="noopener noreferrer"&gt;Trusted Java Containers: Azul Zulu OpenJDK Joins Docker&amp;rsquo;s Official Images&lt;/a&gt;
&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.azul.com/blog/the-road-to-docker-official-images-for-java-the-azul-zulu-story/" target="_blank" rel="noopener noreferrer"&gt;The Road to Docker Official Images for Java: The Azul Zulu Story&lt;/a&gt;
&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://hub.docker.com/_/azul-zulu" target="_blank" rel="noopener noreferrer"&gt;Azul Zulu is now a Docker Official Image&lt;/a&gt;
, so getting a trusted, secure Java base image is now just a &lt;code&gt;FROM azul-zulu&lt;/code&gt; line in your Dockerfile. But pulling the right image is just the beginning. This post shows you how to use these images in practice, and how a few extra steps can seriously cut the size of what you ship.
&lt;img src="https://foojayio.github.io/website/today/using-the-azul-zulu-docker-official-images-from-simple-pull-to-lean-container/azul-docker-official-1024x576.avif" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Building an AI-Powered Operations Assistant with Spring AI and MongoDB Atlas — Part 1: RAG Foundation</title><link>https://foojayio.github.io/website/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-1-rag-foundation/</link><pubDate>Thu, 07 May 2026 19:22:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-1-rag-foundation/</guid><description>&lt;p&gt;This is the first article in a three-part series. Part 2 covers short-term and long-term memory; Part 3 introduces stateful workflow checkpointing with pause/resume.&lt;/p&gt;
&lt;h2 id="h2-0-the-problem"&gt;The problem&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s 2 a.m. Suddenly, an alert pops up indicating abnormal CPU usage on the payment services. The on-call engineer opens their laptop, logs into the monitoring dashboards, and begins the hunt. One by one, he searches the runbooks on Confluence, checks the Slack chats, and opens the GitHub wikis and documents shared during the design phase. By the time he finds any useful information, ten minutes have already passed.&lt;/p&gt;</description></item><item><title>Java is Not the Dark Side: Why Learning Java is Easier Than You Think</title><link>https://foojayio.github.io/website/today/java-is-not-the-dark-side-why-learning-java-is-easier-than-you-think/</link><pubDate>Thu, 07 May 2026 08:44:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-is-not-the-dark-side-why-learning-java-is-easier-than-you-think/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/java-is-not-the-dark-side-why-learning-java-is-easier-than-you-think/duke_sw_01-1024x687.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Every year on May 4th, fans around the world celebrate Star Wars Day with the iconic phrase &amp;ldquo;May the 4th be with you.&amp;rdquo; The following day, May 5th, is often recognized as &amp;ldquo;Revenge of the Fifth&amp;rdquo;, a playful nod to Revenge of the Sith, where many embrace the darker side of the Force and celebrate iconic Sith Lords and villains.&lt;/p&gt;
&lt;p&gt;So, this week is ideal for talking about one of the most misunderstood technologies in programming: &lt;strong&gt;Java&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>UCanAccess: The Modern Pure-Java Bridge to Microsoft Access</title><link>https://foojayio.github.io/website/today/ucanaccess-java-ms-access-jdbc-guide/</link><pubDate>Wed, 06 May 2026 08:44:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/ucanaccess-java-ms-access-jdbc-guide/</guid><description>&lt;p&gt;Microsoft Access databases are everywhere. Decades of &lt;code&gt;.mdb&lt;/code&gt; and &lt;code&gt;.accdb&lt;/code&gt; files silently power spreadsheets, small business applications, and legacy data stores across organizations of all sizes. Yet for Java developers, connecting to these files has historically meant wrestling with native Windows libraries, ODBC bridges, and platform-specific hacks.&lt;/p&gt;
&lt;figure class="aligncenter size-full is-resized"&gt;
 &lt;img decoding="async" src="ucanaccess-logo.svg" alt="UCanAccess Logo" class="wp-image-123938" style="width:320px"&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;UCanAccess&lt;/strong&gt; puts an end to that. It is an open-source, pure-Java JDBC driver that lets you read and write Microsoft Access databases (&lt;code&gt;.mdb&lt;/code&gt; and &lt;code&gt;.accdb&lt;/code&gt;) just like any other SQL database &amp;mdash; no native drivers, no Windows dependency, no friction.&lt;/p&gt;</description></item><item><title>The Code Was Always the Door</title><link>https://foojayio.github.io/website/today/ai-shepherd-senior-developer/</link><pubDate>Tue, 05 May 2026 08:59:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/ai-shepherd-senior-developer/</guid><description>&lt;h2 id="h2-0-the-doorman-in-a-hoodie"&gt;The doorman in a hoodie&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s a story Rory Sutherland tells in his book &lt;em&gt;Alchemy&lt;/em&gt; . A consultant is hired to find savings at a luxury hotel. He watches a doorman for twenty minutes and writes in his report: &lt;em&gt;this man opens doors&lt;/em&gt;. Automatic doors also open doors. Automatic doors are cheaper. So the hotel removes him.&lt;/p&gt;
&lt;p&gt;The lobby falls apart. Guests can&amp;rsquo;t find the restaurant. Nobody hails a taxi. The ineffable sense that someone is in charge of the front of house disappears with him. The consultant measured the visible action and missed the actual function.&lt;/p&gt;</description></item><item><title>JCast</title><link>https://foojayio.github.io/website/today/introducing-jcast-conversations-about-java-and-developer-life-in-dutch/</link><pubDate>Mon, 04 May 2026 08:00:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/introducing-jcast-conversations-about-java-and-developer-life-in-dutch/</guid><description>&lt;p&gt;The Java community thrives on sharing knowledge and experiences. Most content is in English, which works well for many developers. However, there&amp;rsquo;s something special about discussing complex topics in your native language. The nuances. The humor. The ability to express yourself freely without translating your thoughts first.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s why we created JCast, a podcast for the Dutch-speaking developer community. Moreover, today we&amp;rsquo;re excited to launch Season 2!&lt;/p&gt;
&lt;h2 id="h2-0-season-2-starts-with-frank-delporte"&gt;Season 2 Starts with Frank Delporte&lt;/h2&gt;
&lt;p&gt;For our second season opener, we sat down with Frank Delporte. He&amp;rsquo;s well-known in the Java community as a Java Champion. Additionally, he&amp;rsquo;s a Java Developer, Technical Writer at Azul, Blogger, and Author of &amp;ldquo;Getting started with Java on Raspberry Pi&amp;rdquo;. Furthermore, he&amp;rsquo;s a Pi4J Contributor.&lt;/p&gt;</description></item><item><title>Foojay Podcast #94: More Than a Blog: How Foojay Connects, Sustains, and Evolves the Java Community</title><link>https://foojayio.github.io/website/today/foojay-podcast-94/</link><pubDate>Mon, 04 May 2026 06:26:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-94/</guid><description>&lt;p&gt;Foojay.io, the website for the Friends of OpenJDK, is turning six years old. To celebrate, Frank Delporte headed to JCON in Cologne, Germany, and sat down with twelve members of the Java community to talk about what Foojay means to them, what they learn from each other, and how the community is evolving.&lt;/p&gt;
&lt;p&gt;This episode covers a lot of ground. Sharat Chandar reflects on 25 years in the Java community and why the people are what keep the language alive. Markus Westergren and Iryna Dohndorf both focus on a theme that comes up again and again: developer sustainability. Not just green software, but how you stay healthy, grounded, and relevant when AI is changing everything around you. Markus and his wife researched how developers are reacting to AI, from ignoring it completely to transforming everything they do. Iryna talks about building resilience and robustness as skills, not afterthoughts.&lt;/p&gt;</description></item><item><title>Large-Scale ETL Pipeline Architecture</title><link>https://foojayio.github.io/website/today/large-scale-etl-pipeline-architecture/</link><pubDate>Fri, 01 May 2026 19:23:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/large-scale-etl-pipeline-architecture/</guid><description>&lt;p&gt;Modern data-driven systems. ETL pipelines are no longer simply scheduled background processes that run silently overnight, one after another. They are the backbone of real-time analytics, powering operational dashboards and recommendation systems. They enable machine learning workflows.&lt;/p&gt;
&lt;p&gt;This evolution, while creating enormous benefits, has&amp;mdash;with the increase in data volume and the decrease in latency tolerance&amp;mdash;called into question the traditional sequential ETL approach. A bottleneck for the speed is now required.&lt;/p&gt;</description></item><item><title>BoxLang AI Deep Dive — Part 5 of 7: One API, 17 Providers — The Provider Architecture Deep Dive</title><link>https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-5-of-7-one-api-17-providers-the-provider-architecture-deep-dive/</link><pubDate>Wed, 29 Apr 2026 16:38:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-5-of-7-one-api-17-providers-the-provider-architecture-deep-dive/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-5-of-7-one-api-17-providers-the-provider-architecture-deep-dive/bxai-series-cover-05-700x368.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;&lt;em&gt;BoxLang AI 3.0 Series · Part 5 of 7&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Vendor lock-in is the silent killer of AI projects. You pick OpenAI, build everything against the OpenAI API, and then GPT-5 launches at three times the price. Or a competitor launches a model that&amp;rsquo;s faster for your use case. Or you need to self-host for compliance. Or your client is on AWS and wants Bedrock.&lt;/p&gt;
&lt;p&gt;Every time the answer to &amp;ldquo;can we switch providers?&amp;rdquo; is &amp;ldquo;it would take months,&amp;rdquo; something went wrong architecturally.&lt;/p&gt;</description></item><item><title>Dockerizing a Java 26 Project with Docker Init</title><link>https://foojayio.github.io/website/today/dockerizing-a-java-26-project-with-docker-init/</link><pubDate>Mon, 27 Apr 2026 09:55:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/dockerizing-a-java-26-project-with-docker-init/</guid><description>&lt;p&gt;Docker Init was introduced in Docker Desktop 4.27, before LLMs became the default answer to everything. It&amp;rsquo;s a &amp;ldquo;smart&amp;rdquo; interactive wizard that analyzes your project and generates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A &lt;code&gt;Dockerfile&lt;/code&gt; (multi-stage, production-ready)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;code&gt;compose.yaml&lt;/code&gt; file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;code&gt;.dockerignore&lt;/code&gt; file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;code&gt;README.Docker.md&lt;/code&gt; with build and run instructions&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What makes it valuable is that it&amp;rsquo;s deterministic&amp;mdash;not a probabilistic guess. It produces the same correct output every time, following Docker&amp;rsquo;s own best practices.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://dockersecurity.io/commandos-asgard/asgard-init.png" alt="Docker Commandos setting up the command center" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Explore Spring AI SDK – Amazon Bedrock AgentCore – Part 2</title><link>https://foojayio.github.io/website/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/</link><pubDate>Mon, 27 Apr 2026 09:09:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/</guid><description>&lt;br /&gt;
&lt;p&gt;&lt;em&gt;If you&amp;rsquo;re joining us from &lt;a href="https://foojayio.github.io/website/today/spring-ai-amazon-bedrock-sdk-guide/"&gt;Part 1&lt;/a&gt;
 or need a quick refresher on the architecture, listen to this brief overview of how Spring AI and Amazon Bedrock work together.&lt;/em&gt;
&lt;em&gt;Generated using Notebook LLM for my previous &lt;a href="https://foojayio.github.io/website/today/spring-ai-amazon-bedrock-sdk-guide/"&gt;article&lt;/a&gt;
{#https://foojay.io/today/spring-ai-amazon-bedrock-sdk-guide/}&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this article, we explore one of the AgentCore capabilities i.e., &lt;em&gt;&lt;strong&gt;memory&lt;/strong&gt;&lt;/em&gt;
&lt;img src="https://a.b.cdn.console.awsstatic.com/a/v1/ACHOUHHJ3XZF7J5AYP2XIR2NCZIPH56WAM33AFJA44HJSRMAO4DA/assets/images/Overview/ac_overviewchart_04_07.png" alt="" loading="lazy"&gt;
 &lt;em&gt;&lt;strong&gt;Source: Amazon&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To begin, enable &lt;strong&gt;AgentCore memory&lt;/strong&gt; for the agent you built earlier.&lt;br&gt;
&lt;img src="https://foojayio.github.io/website/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/SpringAISDK.png" alt="SpringAI SDK" loading="lazy"&gt;
&lt;/p&gt;
&lt;h3 id="h3-0-step-1-add-the-ai-model-and-agentcore-memory-dependencies"&gt;Step 1: Add the Ai model and AgentCore memory dependencies&lt;/h3&gt;
&lt;br /&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="xml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;&amp;lt;dependency&amp;gt;
 &amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;spring-ai-model&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
 &amp;lt;groupId&amp;gt;org.springaicommunity&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;spring-ai-agentcore-memory&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/pre&gt;
&lt;h3 id="h3-1-step-2-create-short-long-term-in-aws-management-console"&gt;Step 2: Create Short/Long Term in AWS Management Console&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Navigate to &lt;strong&gt;Amazon Bedrock AgentCore &amp;gt; Memory&lt;/strong&gt; to create short/long-term memories.&lt;/em&gt;
&lt;img src="https://foojayio.github.io/website/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/AgentCoreMemory-1024x441.png" alt="AgentCore Memory" loading="lazy"&gt;
 AgentCore Memory&lt;/p&gt;</description></item><item><title>The Road to Docker Official Images for Java: The Azul Zulu Story</title><link>https://foojayio.github.io/website/today/the-road-to-docker-official-images-for-java-the-azul-zulu-story/</link><pubDate>Fri, 24 Apr 2026 08:57:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-road-to-docker-official-images-for-java-the-azul-zulu-story/</guid><description>&lt;p&gt;&lt;em&gt;Previously in this series:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.azul.com/blog/trusted-java-containers-azul-zulu-openjdk-joins-dockers-official-images/" target="_blank" rel="noopener noreferrer"&gt;Trusted Java Containers: Azul Zulu OpenJDK Joins Docker&amp;rsquo;s Official Images&lt;/a&gt;
&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After more than two years of collaboration, reviews, and back-and-forth with the Docker team, Azul Zulu Builds of OpenJDK have officially joined &lt;a href="https://hub.docker.com/_/azul-zulu" target="_blank" rel="noopener noreferrer"&gt;Docker&amp;rsquo;s Official Images&lt;/a&gt;
 program. This is not just a badge of honor. It changes how Java developers can pull and trust their container base images.&lt;/p&gt;
&lt;p&gt;The formal announcement is on the &lt;a href="https://www.azul.com/blog/trusted-java-containers-azul-zulu-openjdk-joins-dockers-official-images/" target="_blank" rel="noopener noreferrer"&gt;Azul blog&lt;/a&gt;
. In this post, I&amp;rsquo;ll walk you through what happened, why it matters, and how to start using these images today.&lt;/p&gt;</description></item><item><title>Building a Personalized Content Delivery System</title><link>https://foojayio.github.io/website/today/building-a-personalized-content-delivery-system/</link><pubDate>Thu, 23 Apr 2026 15:10:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-a-personalized-content-delivery-system/</guid><description>&lt;p&gt;Recommendation engines have a reputation for requiring specialized ML infrastructure: matrix factorization pipelines, training jobs, and model serving layers. That is one way to do it, but not the only way. If your data already lives in MongoDB and your application runs on Spring Boot, you can build a practical recommendation system using tools you already have. MongoDB aggregation pipelines handle the scoring math server-side, and Atlas Vector Search adds semantic matching without a separate vector database.&lt;/p&gt;</description></item><item><title>Eliminating Flaky Tests to End World Hunger</title><link>https://foojayio.github.io/website/today/eliminating-flaky-tests-to-end-world-hunger/</link><pubDate>Thu, 23 Apr 2026 09:02:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/eliminating-flaky-tests-to-end-world-hunger/</guid><description>&lt;p&gt;Rita Mae Brown once said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Insanity&lt;/strong&gt; is doing the same thing over and over again and expecting different results.​&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;However, everyone has at least once experienced a test that failed and then passed in the next run without changing the code or the environment. In software engineering, we don&amp;rsquo;t call it insanity; we call such unpredictable failures &lt;strong&gt;flaky tests&lt;/strong&gt;. At first, they may seem like minor problems, but like clutter in a junk drawer, they become worse over time if you never take care of them.&lt;/p&gt;</description></item><item><title>Azul Zulu April 2026 Quarterly Update Released</title><link>https://foojayio.github.io/website/today/azul-zulu-april-2026-quarterly-update-released/</link><pubDate>Thu, 23 Apr 2026 07:12:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/azul-zulu-april-2026-quarterly-update-released/</guid><description>&lt;p&gt;The &lt;strong&gt;April 2026 quarterly update for Azul Zulu Builds of OpenJDK&lt;/strong&gt; is now available. This quarterly release brings &lt;strong&gt;security and bug fixes&lt;/strong&gt;, along with a few notable new changes, to all currently supported Java versions.&lt;/p&gt;
&lt;h2 id="h2-0-the-quarterly-update-cycle"&gt;The Quarterly Update Cycle&lt;/h2&gt;
&lt;p&gt;Every three months (in January, April, July, and October), the OpenJDK project releases security updates, bug fixes, and improvements for all supported Java versions. This predictable schedule helps organizations plan their Java updates and maintain secure, stable production environments.&lt;/p&gt;</description></item><item><title>Distributed Cache Invalidation Patterns</title><link>https://foojayio.github.io/website/today/distributed-cache-invalidation-patterns/</link><pubDate>Tue, 21 Apr 2026 13:52:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/distributed-cache-invalidation-patterns/</guid><description>&lt;p&gt;Caching is one of the most powerful tools developers have at their disposal for optimizing application performance. Caching systems can significantly reduce latency and reduce the load on databases or external systems by storing frequently accessed data as close as possible to the application layer. The result? Improved responsiveness and overall system usability.&lt;/p&gt;
&lt;p&gt;In small monolithic applications, cache management is usually very simple. A service retrieves data from a database, stores it in memory, and fulfills subsequent requests by retrieving the data directly from the cache. When the data changes, the cache key is invalidated or updated.&lt;/p&gt;</description></item><item><title>BoxLang AI Deep Dive — Part 3 of 7: Multi-Agent Orchestration — Building AI Teams That Work 🌲</title><link>https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-3-of-7-multi-agent-orchestration-building-ai-teams-that-work/</link><pubDate>Tue, 21 Apr 2026 08:32:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-3-of-7-multi-agent-orchestration-building-ai-teams-that-work/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-3-of-7-multi-agent-orchestration-building-ai-teams-that-work/bxai-series-cover-03-700x368.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;BoxLang AI 3.0 Series · Part 3 of 7&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A single agent is useful. An orchestra of agents is powerful.&lt;/p&gt;
&lt;p&gt;The problem with most multi-agent frameworks is that the orchestration layer is bolted on &amp;mdash; you&amp;rsquo;re managing agent references manually, passing outputs between them by hand, and hoping you haven&amp;rsquo;t introduced a cycle. There&amp;rsquo;s no concept of hierarchy. No cycle detection. No way to ask &amp;ldquo;who&amp;rsquo;s in charge here?&amp;rdquo; or &amp;ldquo;how deep in the tree am I?&amp;rdquo;&lt;/p&gt;</description></item><item><title>Explore Spring AI SDK - Amazon Bedrock AgentCore - Part 1</title><link>https://foojayio.github.io/website/today/spring-ai-amazon-bedrock-sdk-guide/</link><pubDate>Mon, 20 Apr 2026 13:44:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-ai-amazon-bedrock-sdk-guide/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Artificial intelligence has rapidly expanded across every industry since the inception of ChatGPT. It represents a breakthrough in how we build and use software. Moreover, this breakthrough technology has driven major transformation. At the same time, it has created significant noise and hype.&lt;/p&gt;
&lt;p&gt;Today, AI is no longer experimental. Instead, it has become essential, much like electricity and the internet. As a result, it now plays a key role in our daily lives. Overall, this shift reflects strong technological acceleration across industries.&lt;/p&gt;</description></item><item><title>Spring Boot 3.5 EOL — The CVE Blind Spot Nobody Talks About</title><link>https://foojayio.github.io/website/today/crossing-the-river-styx-spring-boot-3-5-and-the-zombie-dependency-problem/</link><pubDate>Sun, 19 Apr 2026 13:37:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/crossing-the-river-styx-spring-boot-3-5-and-the-zombie-dependency-problem/</guid><description>&lt;p&gt;Tomorrow I start (o so early) for &lt;a href="https://2026.europe.jcon.one/" target="_blank" rel="noopener noreferrer"&gt;JCON Europe&lt;/a&gt;
 in Cologne and then, at the tail end of the week, go to Devoxx France to give more talks. If you&amp;rsquo;re at either, come say hi. Herodevs has a booth at both.&lt;/p&gt;
&lt;p&gt;After digging into the CVE stories behind &lt;a href="https://foojayio.github.io/website/today/the-real-mechanics-of-vulnerabilities-in-an-upstream-downstream-topsy-turvy-eol-world/"&gt;Tomcat 8.5&amp;rsquo;s end of life&lt;/a&gt;
, I turned my attention to Spring Boot 3.5. Same question, different framework: what &lt;em&gt;actually&lt;/em&gt; happens to your security posture when a project crosses the EOL line?&lt;/p&gt;</description></item><item><title>Choosing the Right OpenJDK Distribution for Production</title><link>https://foojayio.github.io/website/today/which-java-runtime-should-you-use-in-production-comparing-openjdk-distributions/</link><pubDate>Sat, 18 Apr 2026 15:01:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/which-java-runtime-should-you-use-in-production-comparing-openjdk-distributions/</guid><description>&lt;h2 id="h2-0-tldr"&gt;TLDR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;All eight distributions on this list start from the same OpenJDK codebase. The version number is the thing they have most in common. However, support ownership, vendor accountability, and additional tooling variety are where they go separate ways.&lt;/li&gt;
&lt;li&gt;BellSoft and Azul are the two vendors for whom Java is the primary business rather than a portfolio item. The difference is in support window length and toolchain depth.&lt;/li&gt;
&lt;li&gt;If your infrastructure already standardizes on AWS, Azure, RHEL, SAP, or IBM platforms, the aligned distribution answers itself. The real decision is for teams without that constraint.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-1-intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;Picking a Java runtime is like picking any commodity infrastructure, isn&amp;rsquo;t it? You simply find the version you need and grab a build.&lt;/p&gt;</description></item><item><title>Spring I/O 2026: Field Notes from Barcelona</title><link>https://foojayio.github.io/website/today/spring-i-o-2026-field-notes-from-barcelona/</link><pubDate>Fri, 17 Apr 2026 13:09:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-i-o-2026-field-notes-from-barcelona/</guid><description>&lt;p&gt;Spring I/O 2026 wrapped in Barcelona on Wednesday. Three days at the Palau de Congressos. A thousand-plus developers, five tracks, sixty sessions (or there abouts) Here are the things I&amp;rsquo;m still thinking about..&lt;/p&gt;
&lt;h2 id="h2-0-agents-everywhere"&gt;Agents everywhere&lt;/h2&gt;
&lt;p&gt;It was a Spring AI conference with a Spring Boot conference attached.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s not a complaint. Count the programme yourself. Across the two main days, roughly a third of the main-track sessions were about Spring AI, MCP, agents, or building on LLMs. Josh Long opened Day 2 at eleven with &lt;em&gt;Bootiful Spring Boot 4&lt;/em&gt; . By twelve, the Auditorium had moved on to &lt;em&gt;The Spring AI Ecosystem in 2026: From Foundations to Agents&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>CQRS in Java: Separating Reads and Writes Cleanly</title><link>https://foojayio.github.io/website/today/cqrs-in-java-separating-reads-and-writes-cleanly/</link><pubDate>Thu, 16 Apr 2026 20:25:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/cqrs-in-java-separating-reads-and-writes-cleanly/</guid><description>&lt;h3 id="h3-0-what-you-ll-learn"&gt;What you&amp;rsquo;ll learn&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;How the MongoDB Spring repository can be used to abstract MongoDB operations&lt;/li&gt;
&lt;li&gt;Separating Reads and Writes in your application&lt;/li&gt;
&lt;li&gt;How separating these can make schema design changes easier&lt;/li&gt;
&lt;li&gt;Why you should avoid save() and saveAll() functions in Spring&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Command Query Responsibility Segregation (CQRS) pattern is a design method that segregates data access into separate services for reading and writing data. This allows a higher level of maintainability in your applications, especially if the schema or requirements change frequently. This pattern was originally developed with separate read and write sources in mind. However, implementing CQRS for a single data source is an effective way to abstract data from the application and make maintenance easier in the future. In this blog, we will use Spring Boot with MongoDB in order to create a CQRS pattern-based application.&lt;/p&gt;</description></item><item><title>BoxLang AI Deep Dive — Part 2 of 7: Building a Production-Grade AI Tool Ecosystem</title><link>https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-2-of-7-building-a-production-grade-ai-tool-ecosystem/</link><pubDate>Thu, 16 Apr 2026 09:27:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-2-of-7-building-a-production-grade-ai-tool-ecosystem/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-2-of-7-building-a-production-grade-ai-tool-ecosystem/bxai-series-cover-02-700x368.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;BoxLang AI 3.0 Series · Part 2 of 7&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Function calling is where most AI frameworks look deceptively simple on the surface and turn into a mess underneath. You define a tool, pass it to the LLM, and when the LLM calls it &amp;mdash; who handles the lifecycle? Who fires observability events? Who serializes the result? Who resolves the tool by name when the only thing you have is a string?&lt;/p&gt;</description></item><item><title>How I Automated Weekly Twitter/X Posts With Java, JBang and GitHub Actions</title><link>https://foojayio.github.io/website/today/how-i-automated-weekly-twitter-x-posts-with-java-jbang-and-github-actions/</link><pubDate>Tue, 14 Apr 2026 16:05:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-i-automated-weekly-twitter-x-posts-with-java-jbang-and-github-actions/</guid><description>&lt;p&gt;Every Monday at 10 AM Eastern, &lt;a href="https://x.com/javaevolved" target="_blank" rel="noopener noreferrer"&gt;@javaevolved&lt;/a&gt;
 now tweets a modern Java pattern &amp;mdash; automatically. No manual steps, no third-party services, no cron servers. Just a GitHub Actions workflow, a couple of JBang scripts, and the Twitter API.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how it works, and how you can do the same for your own project.&lt;/p&gt;
&lt;h2 id="h2-0-the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://javaevolved.github.io" target="_blank" rel="noopener noreferrer"&gt;Java Evolved&lt;/a&gt;
 is a static site with 113 code patterns showing the old way vs. the modern way to write Java. Each pattern has a title, summary, old/modern approach labels, JDK version, and a link to its detail page.&lt;/p&gt;</description></item><item><title>BoxLang AI Deep Dive — Part 1 of 7: The Skills Revolution 🎓</title><link>https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-1-of-7-the-skills-revolution/</link><pubDate>Tue, 14 Apr 2026 11:50:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-1-of-7-the-skills-revolution/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-1-of-7-the-skills-revolution/bxai-series-cover-01-700x368.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This article is part of our 7-part deep dive on building production-ready AI systems with BoxLang.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BoxLang AI 3.0 Series · Part 1 of 7&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Every AI framework eventually hits the same wall: your system prompts start drifting. Agent A has a slightly different version of the SQL rules than Agent B. The tone policy on your support bot is three weeks behind the tone policy on your documentation bot. Someone copy-pasted the wrong version. Nobody noticed.&lt;/p&gt;</description></item><item><title>AWS Nitro and CPU Graviton Meets Unikernels</title><link>https://foojayio.github.io/website/today/aws-nitro-and-cpu-graviton-meets-unikernels/</link><pubDate>Fri, 10 Apr 2026 16:26:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/aws-nitro-and-cpu-graviton-meets-unikernels/</guid><description>&lt;h2 id="h2-0-aws-nitro-and-cpu-graviton-meets-unikernels-java-and-quarkus-on-arm64-aws-graviton-with-nanos-unikernel"&gt;AWS Nitro and CPU Graviton Meets Unikernels: Java and Quarkus on ARM64 AWS Graviton with Nanos Unikernel&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://github.com/user-attachments/assets/2c957ea8-2c6b-4caa-86f8-5adeb9e8bedc" alt="image" loading="lazy"&gt;
&lt;/p&gt;
&lt;h2 id="h2-1-java-and-jakarta-ee-truly-meet-unikernels"&gt;Java and Jakarta EE Truly Meet Unikernels&lt;/h2&gt;
&lt;p&gt;The key message of this article is simple and strong:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;any Java or Jakarta EE application is already ready&lt;/strong&gt; to benefit from the advantages of unikernels.&lt;/p&gt;
&lt;p&gt;Java and Jakarta EE, including modern frameworks such as Quarkus, can immediately take advantage of the unikernel model &lt;strong&gt;without waiting for new languages, new runtimes, or radical rewrites&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Building a Kotlin App with Spring Boot and MongoDB Search</title><link>https://foojayio.github.io/website/today/building-a-kotlin-app-with-spring-boot-and-mongodb-search/</link><pubDate>Thu, 09 Apr 2026 15:21:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-a-kotlin-app-with-spring-boot-and-mongodb-search/</guid><description>&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/b0dkQYcvBkQ?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;p&gt;One of my favorite activities is traveling and exploring the world. You know that feeling of discovering a new place and thinking, &amp;ldquo;How have I not been here before?&amp;rdquo; It&amp;rsquo;s with that sensation that I&amp;rsquo;m always motivated to seek out new places to discover. Often, when searching for a place to stay, we&amp;rsquo;re not entirely sure what we&amp;rsquo;re looking for or what experiences we&amp;rsquo;d like to have. For example, we might want to rent a room in a city with a view of a castle. Finding something like that can seem difficult, right? However, there is a way to search for information accurately using MongoDB Search.&lt;/p&gt;</description></item><item><title>Why Java Developers Over-Trust AI-Generated Code</title><link>https://foojayio.github.io/website/today/why-java-developers-over-trust-ai-dependency-suggestions/</link><pubDate>Thu, 09 Apr 2026 10:45:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-java-developers-over-trust-ai-dependency-suggestions/</guid><description>&lt;p&gt;&lt;em&gt;This article is adapted from &lt;a href="https://noregressions.substack.com/p/the-confidence-trap-why-developers" target="_blank" rel="noopener noreferrer"&gt;The Confidence Trap&lt;/a&gt;
, part of the &amp;ldquo;2026 Supply Chain Reckoning&amp;rdquo; series on my No Regressions newsletter.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Your boss calls you on a Friday afternoon. He&amp;rsquo;s read all the available data, he tells you with absolute confidence, and he&amp;rsquo;s decided that migrating from Spring Boot 3.5 to 4.0 will be straightforward. Wants it done over the weekend.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;d push back. You&amp;rsquo;d ask which data. You&amp;rsquo;d point out the breaking changes.&lt;/p&gt;</description></item><item><title>Manage HTTP Sessions with Spring Session MongoDB</title><link>https://foojayio.github.io/website/today/building-distributed-http-sessions-with-spring-session-mongodb/</link><pubDate>Tue, 07 Apr 2026 15:19:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-distributed-http-sessions-with-spring-session-mongodb/</guid><description>&lt;p&gt;&lt;a href="https://www.mongodb.com/docs/drivers/java/sync/current/integrations/spring-session/?utm_campaign=devrel&amp;amp;utm_source=third-part-content&amp;amp;utm_medium=cta&amp;amp;utm_content=spring&amp;#43;sessions&amp;#43;mongodb&amp;amp;utm_term=tim.kelly" target="_blank" rel="noopener noreferrer"&gt;Spring Session MongoDB&lt;/a&gt;
 is a library that enables Spring applications to store and manage HTTP session data in MongoDB rather than relying on container-specific session storage. In traditional deployments, session state is often tied to a single application instance, which makes scaling across multiple servers difficult. By integrating &lt;a href="https://spring.io/projects/spring-session" target="_blank" rel="noopener noreferrer"&gt;Spring Session&lt;/a&gt;
 with MongoDB, session data can be persisted beyond application restarts and shared across instances in a cluster, enabling scalable distributed applications with minimal configuration.&lt;/p&gt;</description></item><item><title>Thread Safe Native Memory in Java</title><link>https://foojayio.github.io/website/today/java-native-memory-access-modes/</link><pubDate>Tue, 07 Apr 2026 10:00:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-native-memory-access-modes/</guid><description>&lt;h2 id="h2-0-what-is-memory-order-and-why-does-it-matter-for-native-memory"&gt;What is Memory Order and Why Does It Matter for Native Memory?&lt;/h2&gt;
&lt;p&gt;The Foreign Function and Memory (FFM) API is Java&amp;rsquo;s way of interacting with native code and memory. In the previous post, you learned how to do so using Java&amp;rsquo;s built-in &lt;code&gt;Arena&lt;/code&gt; types. The Arena provides temporal safety and bounds checks, but what about thread safety? MemorySegments created by &lt;code&gt;.ofShared()&lt;/code&gt;, &lt;code&gt;.auto()&lt;/code&gt;, and &lt;code&gt;.global()&lt;/code&gt; can be used by multiple threads at the same time. Using a VarHandle with just get/set can backfire if you don&amp;rsquo;t use something like locking. The downside is that locks are slow and heavy. So let us take a look at a more granular, hardware-aware approach: using VarHandle access modes.&lt;/p&gt;</description></item><item><title>From Zero to Full Observability with Dash0</title><link>https://foojayio.github.io/website/today/from-zero-to-full-observability-with-dash0/</link><pubDate>Sat, 04 Apr 2026 06:35:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/from-zero-to-full-observability-with-dash0/</guid><description>&lt;p&gt;This guide walks through the complete process of deploying a minimal Spring Boot service to Kubernetes and adding full observability using the &lt;a href="https://www.dash0.com/docs/dash0/monitoring/kubernetes/about-kubernetes" target="_blank" rel="noopener noreferrer"&gt;Dash0 Kubernetes Operator&lt;/a&gt;
 &amp;mdash; without making any changes to the application code.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.dash0.com/docs/dash0" target="_blank" rel="noopener noreferrer"&gt;Dash0&lt;/a&gt;
 is an OpenTelemetry-native observability platform that collects and correlates traces, metrics, and logs, and provides infrastructure monitoring across Kubernetes resources &amp;mdash; pods, nodes, namespaces, deployments, daemonsets, statefulsets, jobs, and cronjobs &amp;mdash; as well as cloud infrastructure such as AWS. Its Kubernetes operator can automatically instrument workloads at the pod level, with no changes required to application code or container images.
&lt;img src="https://foojayio.github.io/website/today/from-zero-to-full-observability-with-dash0/kubernetes-dash0-1024x581.png" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Introducing Floci: A High-Performance, GraalVM-Powered AWS Emulator</title><link>https://foojayio.github.io/website/today/introducing-floci-a-high-performance-graalvm-powered-aws-emulator/</link><pubDate>Fri, 03 Apr 2026 19:00:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/introducing-floci-a-high-performance-graalvm-powered-aws-emulator/</guid><description>&lt;h2 id="h2-0-the-motivation-why-another-aws-emulator"&gt;The Motivation: Why Another AWS Emulator?&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/introducing-floci-a-high-performance-graalvm-powered-aws-emulator/perf-chart-light-700x394.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;As Java developers, we are used to local-first development. Tools that emulate the cloud environment have become essential for keeping feedback loops tight and costs at zero. However, the ecosystem has shifted. Many of us have felt the friction of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mandatory Authentication: Needing to log in or use tokens just to run local tests.&lt;/li&gt;
&lt;li&gt;Heavy Resource Footprint: Docker containers that consume a lot of resources.&lt;/li&gt;
&lt;li&gt;Slow Startup: Waiting several seconds for the environment to be &lt;strong&gt;ready.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I created Floci (from the floccus cloud formation) to solve these specific pain points. It is a 100% open-source, MIT-licensed alternative designed for speed, privacy, and simplicity.&lt;/p&gt;</description></item><item><title>Does Java Really Use Too Much Memory? Let’s Look at the Facts (JEPs)</title><link>https://foojayio.github.io/website/today/does-java-really-use-too-much-memory-lets-look-at-the-facts-jeps/</link><pubDate>Fri, 03 Apr 2026 07:28:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/does-java-really-use-too-much-memory-lets-look-at-the-facts-jeps/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/does-java-really-use-too-much-memory-lets-look-at-the-facts-jeps/duke_Pinocchio01-1024x640.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Breaking news: Java has been confirmed to consume all available RAM. Developers worldwide shocked.&lt;/p&gt;
&lt;p&gt;&amp;hellip; okay, not really. Happy April 1st.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s only fair to bring in the biggest liar in history to help us talk about one of the oldest myths in the Java world.&lt;/p&gt;
&lt;p&gt;Meet &lt;strong&gt;Pinocchio Duke&lt;/strong&gt;, the official Java mascot who swears up and down that &amp;ldquo;Java doesn&amp;rsquo;t use that much memory anymore!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;But every time he says it&amp;hellip; his nose grows a little longer.&lt;/p&gt;</description></item><item><title>Java Faceted Full-Text Search API Using MongoDB Atlas Search</title><link>https://foojayio.github.io/website/today/java-faceted-full-text-search-api-using-mongodb-atlas-search/</link><pubDate>Thu, 02 Apr 2026 16:27:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-faceted-full-text-search-api-using-mongodb-atlas-search/</guid><description>&lt;p&gt;This is going to be a fun, practical tutorial demonstrating how to build a Java faceted full-text search API (like the ones powering sites like Amazon)!&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll use an interesting dataset which showcases how you can effectively pair machine learning/AI-generated data with more traditional search to produce fast, cheap, repeatable, and intuitive search engines.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: If you (like me!) are less about words and more about code, you can jump straight in. Check it out and run it locally like this:&lt;/p&gt;</description></item><item><title>MongoDB Search Score Breakdown</title><link>https://foojayio.github.io/website/today/mongodb-search-score-breakdown/</link><pubDate>Tue, 31 Mar 2026 15:05:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/mongodb-search-score-breakdown/</guid><description>&lt;p&gt;Full-text search powers all of our digital lives &amp;mdash; googling for this and that; asking Siri where to find a tasty, nearby dinner; shopping at Amazon; and so on. We receive relevant results, often even in spite of our typos, voice transcription mistakes, or vaguely formed queries. We have grown accustomed to expecting the best results for our searching intentions, right there, at the top.&lt;/p&gt;
&lt;p&gt;But now it&amp;rsquo;s your turn, dear developer, to build the same satisfying user experience into your Atlas-powered application.&lt;/p&gt;</description></item><item><title>Modeling One-to-Many Relationships in Java with MongoDB</title><link>https://foojayio.github.io/website/today/modeling-one-to-many-relationships-in-java-with-mongodb/</link><pubDate>Thu, 26 Mar 2026 15:50:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/modeling-one-to-many-relationships-in-java-with-mongodb/</guid><description>&lt;p&gt;In a relational database, modeling a one-to-many relationship is straightforward: you create two tables and connect them with a foreign key. When you need the data together, you write a JOIN. In MongoDB, you have a choice, and that choice has a direct impact on your application&amp;rsquo;s performance, scalability, and maintainability.&lt;/p&gt;
&lt;p&gt;Consider a common scenario: a BlogPost that has many Comment objects. In Java, this is a natural List&amp;lt;Comment&amp;gt; field on the post. But when it comes time to persist that relationship in MongoDB, you need to decide &lt;em&gt;how&lt;/em&gt; to store it. Should the comments live inside the blog post document? Or should they sit in their own collection, connected by references?&lt;/p&gt;</description></item><item><title>Spring Boot Actuator Health for MicroProfile Developers</title><link>https://foojayio.github.io/website/today/spring-boot-actuator-health-for-microprofile-developers/</link><pubDate>Thu, 26 Mar 2026 09:30:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-actuator-health-for-microprofile-developers/</guid><description>&lt;p&gt;If you worked with MicroProfile Health, you already understand the value of exposing application health information through standardized endpoints. You know about liveness, readiness and startup probes. You implemented the HealthCheck interface and annotated your procedures with @Liveness, @Readiness and @Startup. Spring Boot Actuator follows a similar philosophy but takes a different architectural approach. This post will help you map your MicroProfile Health knowledge to Spring&amp;rsquo;s world.&lt;/p&gt;
&lt;h2 id="h2-0-the-conceptual-bridgethe-conceptual-bridge"&gt;The Conceptual BridgeThe Conceptual Bridge&lt;/h2&gt;
&lt;p&gt;At its core, Spring Boot Actuator serves the same purpose as MicroProfile Health: it provides a mechanism for validating the availability and status of your application in containerized environments. Both specifications recognize that modern cloud platforms like Kubernetes need machine-readable health information to make decisions about pod lifecycle management.&lt;/p&gt;</description></item><item><title>Does Language Still Matter in the Age of AI? Yes — But the Tradeoff Has Changed</title><link>https://foojayio.github.io/website/today/does-language-still-matter-in-the-age-of-ai-yes-but-the-tradeoff-has-changed/</link><pubDate>Wed, 25 Mar 2026 16:37:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/does-language-still-matter-in-the-age-of-ai-yes-but-the-tradeoff-has-changed/</guid><description>&lt;h2 id="h2-0-"&gt;&lt;img src="https://foojayio.github.io/website/today/does-language-still-matter-in-the-age-of-ai-yes-but-the-tradeoff-has-changed/dominance-700x467.png" alt="" loading="lazy"&gt;
&lt;/h2&gt;
&lt;p&gt;I keep hearing the same question in architecture reviews, slack threads, and conference Hallways:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;If AI is writing the code, does language even matter anymore?&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It does. More than ever, actually &amp;mdash; just not for the reasons we&amp;rsquo;ve been arguing about for the last decade.&lt;/p&gt;
&lt;h2 id="h2-1-the-bottleneck-has-moved"&gt;The Bottleneck Has Moved&lt;/h2&gt;
&lt;p&gt;For decades, we optimized for developer productivity. How fast can someone write code? How expressive is the language? How quickly can we ship features?&lt;/p&gt;</description></item><item><title>How We Built a Java AI Agent by Connecting the Dots the Ecosystem Already Had</title><link>https://foojayio.github.io/website/today/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/</link><pubDate>Wed, 25 Mar 2026 09:00:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/</guid><description>&lt;p&gt;Everyone assumes you need Python to build AI agents. But the Java ecosystem already has every piece: Spring AI for LLM integration, Spring Events for decoupled messaging, JobRunr for reliable background jobs, and Spring Modulith for clean architecture. We didn&amp;rsquo;t build anything new. We connected the pieces that were already there.&lt;/p&gt;
&lt;p&gt;The result is &lt;a href="https://ClawRunr.io" target="_blank" rel="noopener noreferrer"&gt;ClawRunr&lt;/a&gt;
 (everyone calls it JavaClaw, and we&amp;rsquo;ve stopped correcting them). An open-source AI agent runtime, written in pure Java. You can chat with it on Telegram or in the browser, ask it to summarize your emails every morning, schedule reminders, browse websites, run shell commands, connect external tools via MCP, and teach it new skills at runtime by dropping a Markdown file into a folder.&lt;/p&gt;</description></item><item><title>Grails Is Back: Inside the Apache Software Foundation Migration</title><link>https://foojayio.github.io/website/today/grails-isnt-done-yet-part-1-inside-the-asf-reboot/</link><pubDate>Wed, 25 Mar 2026 08:30:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/grails-isnt-done-yet-part-1-inside-the-asf-reboot/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Steve Poole | With contributions from James Fredley, Apache Grails PMC Chair&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For a technology that many people filed under &amp;ldquo;legacy,&amp;rdquo; Grails has been unusually active. While much of the industry&amp;rsquo;s attention has drifted toward newer frameworks and shinier stacks, something more deliberate has been happening in the background.&lt;/p&gt;
&lt;p&gt;Grails has been moving into the Apache Software Foundation (ASF), modernising and positioning itself for the next chapter.&lt;/p&gt;
&lt;p&gt;If you have not looked at Grails recently, your mental model is likely several years out of date. And that, in many ways, is exactly the problem.&lt;/p&gt;</description></item><item><title>TestBox 7: Real-Time Feedback, a Browser-Based IDE, and Modern Testing Workflows on the JVM</title><link>https://foojayio.github.io/website/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/</link><pubDate>Tue, 24 Mar 2026 16:58:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/testbox-7-1-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;TestBox 7.x focuses on improving testing workflows for BoxLang and CFML applications. This release introduces improvements to the &lt;strong&gt;BoxLang CLI runner&lt;/strong&gt; , real-time &lt;strong&gt;streaming test execution via SSE&lt;/strong&gt; , &lt;strong&gt;dry run&lt;/strong&gt; capabilities, a browser-based &lt;strong&gt;TestBox RUN&lt;/strong&gt; interface, and several developer experience enhancements.&lt;/p&gt;
&lt;p&gt;Check out the what&amp;rsquo;s new here: &lt;a href="https://testbox.ortusbooks.com/readme/release-history/whats-new-with-7.0.0" target="_blank" rel="noopener noreferrer"&gt;https://testbox.ortusbooks.com/readme/release-history/whats-new-with-7.0.0&lt;/a&gt;
&lt;/p&gt;
&lt;h4 id="testbox-run-a-browser-ide-for-your-tests"&gt;TestBox RUN: A Browser IDE for Your Tests&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/image-700x155.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;The centerpiece of TestBox 7 is &lt;strong&gt;TestBox RUN&lt;/strong&gt; : a self-hosted, single-page web app (&lt;code&gt;bx/tests/index.bxm&lt;/code&gt;) that you drop into any &lt;strong&gt;BoxLang&lt;/strong&gt; project and open in a browser. No build toolchain. No external service. Just BoxLang.&lt;/p&gt;</description></item><item><title>Clean Architecture with Spring Boot and MongoDB</title><link>https://foojayio.github.io/website/today/clean-architecture-with-spring-boot-and-mongodb/</link><pubDate>Tue, 24 Mar 2026 16:43:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/clean-architecture-with-spring-boot-and-mongodb/</guid><description>&lt;p&gt;Most Spring Boot tutorials tightly wire everything together. Controllers call services, services call repositories, and MongoDB annotations like &lt;code&gt;@Document&lt;/code&gt; and &lt;code&gt;@Field&lt;/code&gt; sit right next to your business logic. It works until you need to swap the database, test logic in isolation, or reuse domain rules in a different context.&lt;/p&gt;
&lt;p&gt;Clean Architecture enforces one rule: source code dependencies always point inward. Your business logic never imports Spring or MongoDB classes. The database becomes a pluggable detail at the outermost layer, something you can replace without rewriting core application code.&lt;/p&gt;</description></item><item><title>How to Use Java as a Scripting Language</title><link>https://foojayio.github.io/website/today/java-for-scripting/</link><pubDate>Mon, 23 Mar 2026 10:00:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-for-scripting/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/java-for-scripting/java-script-cover-700x467.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;h2 id="h2-0-the-scripting-dilemma"&gt;The Scripting Dilemma&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re like me, as a Java developer, you struggle to remember bash or python syntax for quick scripts.&lt;/p&gt;
&lt;p&gt;You end up &amp;ldquo;vibe coding&amp;rdquo; it, then struggle again when you need to adapt it. If only you could write it in Java!&lt;/p&gt;
&lt;p&gt;You might say &amp;ldquo;Java is not for scripting&amp;rdquo; and &amp;ldquo;I don&amp;rsquo;t want maven or Gradle&amp;rdquo;.Modern Java has quietly eliminated the traditional barriers that made it unsuitable for scripting.With instant execution, shebang support, and zero-setup automation, Java has evolved into a lean scripting language. Write precise, maintainable code without the &amp;ldquo;vibe coding&amp;rdquo; that comes with unfamiliar languages.&lt;/p&gt;</description></item><item><title>Azul Zulu OpenJDK Docker Images Now Available on Docker Hub</title><link>https://foojayio.github.io/website/today/official-azul-zulu-openjdk-images-now-available-on-docker-hub/</link><pubDate>Mon, 23 Mar 2026 07:53:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/official-azul-zulu-openjdk-images-now-available-on-docker-hub/</guid><description>&lt;p&gt;&lt;a href="https://www.azul.com/blog/trusted-java-containers-azul-zulu-openjdk-joins-dockers-official-images/" title="Azul recently announced that" target="_blank" rel="noopener noreferrer"&gt;Azul recently announced that&lt;/a&gt;
 Azul Zulu Builds of OpenJDK are now available as Docker Official images on Docker Hub. That means you can pull TCK‑verified, fully compliant OpenJDK builds directly from the same Official Images library you already trust for your base OS and databases.&lt;/p&gt;
&lt;p&gt;You can browse and pull the images here:&lt;br&gt;
&lt;a href="https://hub.docker.com/_/azul-zulu" target="_blank" rel="noopener noreferrer"&gt;https://hub.docker.com/_/azul-zulu&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id="h2-0-why-should-you-care-about-official-images"&gt;Why should you care about official images?&lt;/h2&gt;
&lt;p&gt;With the official Docker images you get:&lt;/p&gt;</description></item><item><title>Native Memory in Java: Arenas, Malloc, and Pools</title><link>https://foojayio.github.io/website/today/java-native-memory-allocation-ffm-api/</link><pubDate>Fri, 20 Mar 2026 10:20:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-native-memory-allocation-ffm-api/</guid><description>&lt;h2 id="h2-0-what-is-the-memory-api"&gt;What is the Memory API&lt;/h2&gt;
&lt;p&gt;The Foreign Function &amp;amp; Memory (FFM) API is Java&amp;rsquo;s new way of interacting with native code and memory. It is mostly useful when storing data off-heap or passing arguments to a native method. Handling this native memory comes down to balancing how much control you need against the risk of memory leaks. You can rely on the provided &lt;code&gt;Arena&lt;/code&gt;s to bind memory to safe scopes, or you do it yourself using &lt;code&gt;malloc&lt;/code&gt; and &lt;code&gt;free&lt;/code&gt; for absolute control, or implement custom pools and slices to optimize allocations for your use case.&lt;/p&gt;</description></item><item><title>Building Reactive Data Streams with Project Reactor</title><link>https://foojayio.github.io/website/today/building-reactive-data-streams-with-project-reactor/</link><pubDate>Thu, 19 Mar 2026 15:13:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-reactive-data-streams-with-project-reactor/</guid><description>&lt;h2 id="h2-0-creating-non-blocking-streaming-endpoints-for-high-throughput-applications"&gt;Creating Non-Blocking Streaming Endpoints for High-Throughput Applications&lt;/h2&gt;
&lt;p&gt;There are problems that only occur in production. Or rather, we only notice them in production.&lt;/p&gt;
&lt;p&gt;We have created an application that exposes clean APIs, according to all standards. You have modeled the domain elegantly and efficiently: all load tests show reassuring data. CPU usage is reasonable, to say the least. However, there is a problem: when traffic exceeds a threshold, the system slows down. Response time latency becomes inconsistent; threads stack up on top of each other. Response times increase unpredictably, and application customers begin to complain about this situation.&lt;/p&gt;</description></item><item><title>Introducing the BoxLang Spring Boot Starter: Dynamic JVM Templating for Spring</title><link>https://foojayio.github.io/website/today/introducing-the-boxlang-spring-boot-starter-dynamic-jvm-templating-for-spring/</link><pubDate>Thu, 19 Mar 2026 14:20:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/introducing-the-boxlang-spring-boot-starter-dynamic-jvm-templating-for-spring/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/introducing-the-boxlang-spring-boot-starter-dynamic-jvm-templating-for-spring/boxlang-spring-boot-release-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Spring Boot developers know the pain of evaluating view technologies. Thymeleaf is great &amp;mdash; until you need more expressiveness. FreeMarker is powerful &amp;mdash; until the syntax fights you. What if you could write templates in a dynamic JVM language that gives you the full power of the platform, feels natural, and requires zero setup to integrate?&lt;/p&gt;
&lt;p&gt;Meet the &lt;strong&gt;BoxLang Spring Boot Starter.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Drop one dependency into your Spring Boot 3 app and start writing dynamic &lt;code&gt;.bxm&lt;/code&gt; templates powered by BoxLang &amp;mdash; a modern, expressive JVM language. Zero configuration. Full web scopes. 100% Java interoperable. Not only that, you get full access to BoxLang&amp;rsquo;s framework capabilities so you can integrate tons of features into your Spring Boot applications:&lt;/p&gt;</description></item><item><title>How is Leyden improving Java Performance? Part 3 of 3</title><link>https://foojayio.github.io/website/today/how-is-leyden-improving-java-performance-part-3-of-3/</link><pubDate>Thu, 19 Mar 2026 12:10:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-is-leyden-improving-java-performance-part-3-of-3/</guid><description>&lt;p&gt;In part 1 of this series of 3 blog posts we introduced the specific performance challenges OpenJDK faces lowering application &amp;lsquo;startup&amp;rsquo;, &amp;lsquo;warmup&amp;rsquo; and &amp;lsquo;initial footprint&amp;rsquo; costs and provided an overview of what Leyden is doing to address those challenges.&lt;/p&gt;
&lt;p&gt;Part 2 described how to use the new capabilities offered by Leyden and presented test results which show that very significant progress has already been made and is set to continue.&lt;/p&gt;</description></item><item><title>How is Leyden improving Java Performance? Part 2 of</title><link>https://foojayio.github.io/website/today/how-is-leyden-improving-java-performance-part-2-of-3/</link><pubDate>Wed, 18 Mar 2026 12:05:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-is-leyden-improving-java-performance-part-2-of-3/</guid><description>&lt;p&gt;In part 1 of this series of 3 blog posts we introduced the specific performance challenges OpenJDK faces lowering application &amp;lsquo;startup&amp;rsquo;, &amp;lsquo;warmup&amp;rsquo; and &amp;lsquo;initial footprint&amp;rsquo; costs and provided an overview of what Leyden is doing to address those challenges.&lt;/p&gt;
&lt;p&gt;Part 2 describes how to use the new AOT capabilities offered by Leyden and presents test results which show that very significant progress has already been made and is set to continue.&lt;/p&gt;</description></item><item><title>Language Learning Flashcard System - Part 1</title><link>https://foojayio.github.io/website/today/language-learning-flashcard-system-part-1/</link><pubDate>Tue, 17 Mar 2026 16:39:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/language-learning-flashcard-system-part-1/</guid><description>&lt;p&gt;My native language is Spanish. I&amp;rsquo;ve been learning (and butchering) English my whole life. But at some point, I felt confident with English and wanted to learn Japanese. Big mistake. This is a totally different beast: three writing systems (Hiragana ひらがな, Katakana カタカナ and Kanji 漢字), a completely different grammar, no relation whatsoever with European languages&amp;hellip; I needed help. And tools to learn. And one of them is Space Repetition System based apps.&lt;/p&gt;</description></item><item><title>How is Leyden improving Java Performance? Part 1 of 3</title><link>https://foojayio.github.io/website/today/how-is-leyden-improving-java-performance-part-1-of-3/</link><pubDate>Tue, 17 Mar 2026 12:00:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-is-leyden-improving-java-performance-part-1-of-3/</guid><description>&lt;p&gt;In this series of 3 blog posts we will explain how OpenJDK project Leyden is helping to improve a specific area of performance where Java has notably lagged behind other languages i.e. application &amp;lsquo;startup&amp;rsquo;, &amp;lsquo;warmup&amp;rsquo;, and &amp;lsquo;initial footprint&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;Part 1 explains what those terms mean and why Java faces challenges in matching the behaviour of other languages. It then provides an overview of what Leyden has done to improve startup and warmup in existing JDK releases and what is planned for upcoming releases.&lt;/p&gt;</description></item><item><title>BoxLang 1.11.0 Release</title><link>https://foojayio.github.io/website/today/boxlang-1-11-0-release/</link><pubDate>Tue, 17 Mar 2026 09:40:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-1-11-0-release/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-1-11-0-release/boxlang-v1.11.0-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re proud to announce &lt;strong&gt;BoxLang 1.11.0&lt;/strong&gt;, a highly focused performance and stability release that delivers measurable speed improvements across every BoxLang application, with zero code changes required. The team invested deeply in bytecode generation, class loading, lock management, and type casting to produce one of the most impactful runtime optimization releases to date. Alongside the performance wave, this release resolves critical concurrency bugs, hardens DateTime handling, and ships powerful new developer tooling.&lt;/p&gt;</description></item><item><title>Java 26 Is Here, And With It a Solid Foundation for the Future</title><link>https://foojayio.github.io/website/today/java-26-is-here-and-with-it-a-solid-foundation-for-the-future/</link><pubDate>Tue, 17 Mar 2026 07:00:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-26-is-here-and-with-it-a-solid-foundation-for-the-future/</guid><description>&lt;p&gt;Java 26 is here! Six months ago, we welcomed Java 25 into our hearts, which means it&amp;rsquo;s time for another fresh helping of Java features. This time, the set of features is a bit smaller compared to some of the previous releases, which can only mean one thing: the focus for this release was to provide a solid foundation for something big to be released soon™️! My hope is that the first JEPs out of Project Valhalla will be announced later this year. That hope is fueled by some of Java 26&amp;rsquo;s changes as they feel like appropriate preparation steps for the first Valhalla features (this is especially true for JEPs &lt;a href="#jep-500-prepare-to-make-final-mean-final"&gt;500&lt;/a&gt;
 and &lt;a href="#jep-529-vector-api-eleventh-incubator"&gt;529&lt;/a&gt;
).&lt;/p&gt;</description></item><item><title>Foojay Podcast #92: Java 26 Is Here: What's New, What's Gone, and Why It Matters in 2026</title><link>https://foojayio.github.io/website/today/foojay-podcast-92/</link><pubDate>Mon, 16 Mar 2026 06:58:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-92/</guid><description>&lt;p&gt;Welcome to another episode of the Foojay Podcast! In this episode, we&amp;rsquo;re talking about Java 26, released on March 17 in the year 26. Again, right on schedule with Java&amp;rsquo;s six-month release cadence.&lt;/p&gt;
&lt;p&gt;Now, Java 26 is not a Long Term Support (LTS) release; that was Java 25. But don&amp;rsquo;t let that fool you into thinking there&amp;rsquo;s nothing interesting here. This release brings ten JDK Enhancement Proposals (JEPs). They cover everything from performance improvements to long-overdue cleanups. Of those ten JEPS, five are new features, and we also get five preview/incubator features.&lt;/p&gt;</description></item><item><title>Atlas Online Archive: Efficiently Manage the Data Lifecycle</title><link>https://foojayio.github.io/website/today/atlas-online-archive-efficiently-manage-the-data-lifecycle/</link><pubDate>Thu, 12 Mar 2026 14:55:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/atlas-online-archive-efficiently-manage-the-data-lifecycle/</guid><description>&lt;h2 id="h2-0-problem-statement"&gt;Problem statement&lt;/h2&gt;
&lt;p&gt;In the production environment, in a MongoDB Atlas database, a collection contains massive amounts of data stored, including aged and current data. However, aged data is not frequently accessed through applications, and the data piles up daily in the collection, leading to performance degradation and cost consumption. This results in needing to upgrade the cluster tier size to maintain sufficient resources according to workload, as it would be difficult to continue with the existing tier size.&lt;/p&gt;</description></item><item><title>Event-Driven Architecture in Java and Kafka</title><link>https://foojayio.github.io/website/today/event-driven-architecture-in-java-and-kafka/</link><pubDate>Tue, 10 Mar 2026 18:35:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/event-driven-architecture-in-java-and-kafka/</guid><description>&lt;p&gt;Reactive Java is well suited to modern streaming, event driven applications. In this article, we&amp;rsquo;ll walk through an example of such an application using Reactive Java with MongoDB. Specifically, we&amp;rsquo;re going to cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why Reactive Java was introduced and how it differs from more traditional Java programming.&lt;/li&gt;
&lt;li&gt;Details of some of the key elements of Reactive Java - &lt;strong&gt;Mono&lt;/strong&gt; , &lt;strong&gt;Flux&lt;/strong&gt; and &lt;strong&gt;flatMap&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A walk through of a sample application, comparing a Reactive version of the code using the Reactive Streams MongoDB driver, with a more traditional version of the code using the synchronous MongoDB driver.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-0-streaming-data-the-air-traffic-control-example"&gt;Streaming Data - The Air Traffic Control Example.&lt;/h2&gt;
&lt;p&gt;As a key part of global initiatives to modernize national airspace systems, many national aviation authorities have introduced mandates requiring most non-military aircraft transmit GPS based location data using a system known as Automatic Dependent Surveillance Broadcast, or &amp;ldquo;ADS-B&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Introducing the BoxLang IDE Plugin for IntelliJ</title><link>https://foojayio.github.io/website/today/introducing-the-boxlang-ide-plugin-for-intellij/</link><pubDate>Tue, 10 Mar 2026 14:25:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/introducing-the-boxlang-ide-plugin-for-intellij/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/introducing-the-boxlang-ide-plugin-for-intellij/1773053085130-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;The IntelliJ ecosystem is one of the most powerful development environments for JVM developers. Today, we&amp;rsquo;re excited to introduce &lt;a href="http://https://plugins.jetbrains.com/plugin/30311-boxlang-ide" title="the official BoxLang IDE plugin for IntelliJ" target="_blank" rel="noopener noreferrer"&gt;the official BoxLang IDE plugin for IntelliJ&lt;/a&gt;
, bringing modern BoxLang development directly into the JetBrains IDE family.&lt;/p&gt;
&lt;p&gt;Whether you&amp;rsquo;re building new BoxLang applications or maintaining existing CFML codebases, this plugin gives you first-class tooling inside IntelliJ.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/introducing-the-boxlang-ide-plugin-for-intellij/testbox-integration-700x438.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;h2 id="h2-0-installing-the-plugin"&gt;Installing the Plugin&lt;/h2&gt;
&lt;p&gt;Installing the plugin is easy from the JetBrains Marketplace.&lt;/p&gt;</description></item><item><title>Role-Based Access Control in Java Applications</title><link>https://foojayio.github.io/website/today/role-based-access-control-in-java-applications/</link><pubDate>Thu, 05 Mar 2026 20:31:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/role-based-access-control-in-java-applications/</guid><description>&lt;p&gt;We often work with Java applications where security begins and ends with authentication. The JWT token is validated, Spring Security is integrated, and an identity provider is added, thinking that this type of configuration is sufficiently secure.&lt;/p&gt;
&lt;p&gt;The real problem is that authentication only answers one question: who are you? In real applications, we also have to answer another question, which is often more complex and more dangerous to get wrong: what are you allowed to do?&lt;/p&gt;</description></item><item><title>No Keys, No LLM: Building a Wikidata Definition API with Embabel</title><link>https://foojayio.github.io/website/today/embabel-spring-boot-wikidata-definition-api/</link><pubDate>Thu, 05 Mar 2026 08:00:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/embabel-spring-boot-wikidata-definition-api/</guid><description>&lt;h2 id="h2-0-tl-dr"&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I built a &lt;strong&gt;Spring Boot 4&lt;/strong&gt; API that defines terms via &lt;strong&gt;Wikidata&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The app is fully reproducible: &lt;strong&gt;no API keys&lt;/strong&gt; and &lt;strong&gt;no model installation&lt;/strong&gt; needed.&lt;/li&gt;
&lt;li&gt;Embabel orchestrates the pipeline as a sequence of actions to achieve the goal &lt;code&gt;DefinitionResult&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The logs show planning, execution, and typed object binding&amp;mdash;the most useful part for teaching agentic flows.&lt;/li&gt;
&lt;/ul&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/TiuYS6K3HaU?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;br /&gt;
&lt;p&gt;I wanted a demo that is &lt;strong&gt;simple&lt;/strong&gt; , &lt;strong&gt;reproducible&lt;/strong&gt; , and still &lt;strong&gt;shows agentic orchestration&lt;/strong&gt; in a way that&amp;rsquo;s easy to explain on video.&lt;/p&gt;</description></item><item><title>I Benchmarked Java on Single-Board Computers: Orange Pi 5 Ultra and Raspberry Pi 5 Lead the Pack</title><link>https://foojayio.github.io/website/today/java-benchmarks-on-single-board-computers/</link><pubDate>Wed, 04 Mar 2026 06:52:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-benchmarks-on-single-board-computers/</guid><description>&lt;hr&gt;
&lt;p&gt;In my &amp;ldquo;Java on Single Board Computers&amp;rdquo; series, I already published several posts and videos in which I unpack the board, connect it for the first time, and try to install and run some simple Java code. In this post, I want to share some benchmarks of Java on these boards to get a better idea of the performance we can expect from Java on these platforms.&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/efLS8pBtqZ0?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;p&gt;Already published in this series:&lt;/p&gt;</description></item><item><title>JC-AI Newsletter #14</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-14/</link><pubDate>Tue, 03 Mar 2026 15:11:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-14/</guid><description>&lt;p&gt;&lt;strong&gt;Two&lt;/strong&gt; weeks have passed and a lot have been happening on the field of artificial-intelligence.&lt;/p&gt;
&lt;p&gt;Two weeks have passed and a lot has been silently yet visibly happening in the field of artificial intelligence. This newsletter brings interesting developments, including Dario Amodei&amp;rsquo;s (Anthropic) view on the progress achieved in the LLM field and his response to the utilization of these models for specific kinds of military purposes, as well as OpenAI&amp;rsquo;s response to it. Aside from the fact that development may follow more sigmoids instead of exponential progress, it is important to have awareness of utilization across branches. Does prompting and clarifying the goal influence agent responses, and if so, how? How far are we from reliable robotics applications? How much bias is introduced when clinical data is being analyzed?&lt;/p&gt;</description></item><item><title>BoxLang Homebrew Installer Released</title><link>https://foojayio.github.io/website/today/boxlang-homebrew-installer-released/</link><pubDate>Tue, 03 Mar 2026 12:34:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-homebrew-installer-released/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-homebrew-installer-released/boxlang-homebrew-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re excited to announce the official &lt;strong&gt;BoxLang Homebrew tap&lt;/strong&gt; &amp;mdash; the easiest way to get BoxLang up and running on macOS (and Linux with Homebrew). One command, and you&amp;rsquo;re in business.&lt;/p&gt;
&lt;h3 id="h3-0-getting-started"&gt;Getting Started&lt;/h3&gt;
&lt;p&gt;First, make sure you have &lt;a href="https://brew.sh/" title="Homebrew installed" target="_blank" rel="noopener noreferrer"&gt;Homebrew installed&lt;/a&gt;
, then add our tap:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="java"&gt;brew tap ortus-boxlang/boxlang
&lt;/pre&gt;
&lt;p&gt;From there, choose your installation path.&lt;/p&gt;
&lt;h2 id="h2-1-option-1-bvm-boxlang-version-manager"&gt;Option 1: BVM &amp;mdash; BoxLang Version Manager&lt;/h2&gt;
&lt;p&gt;If you want to manage multiple BoxLang versions side by side, &lt;strong&gt;BVM&lt;/strong&gt; is your tool.&lt;/p&gt;</description></item><item><title>Java 26: What’s New?</title><link>https://foojayio.github.io/website/today/java-26-whats-new/</link><pubDate>Tue, 03 Mar 2026 10:00:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-26-whats-new/</guid><description>&lt;p&gt;This article was first published in my personal blog: &lt;a href="https://www.loicmathieu.fr/wordpress/informatique/java-26-whats-new/" target="_blank" rel="noopener noreferrer"&gt;Java 26: What&amp;rsquo;s new?&lt;/a&gt;
 and is part of a serie on &lt;a href="https://www.loicmathieu.fr/wordpress/tag/whatsnew/" target="_blank" rel="noopener noreferrer"&gt;what&amp;rsquo;s new on the last versions of Java&lt;/a&gt;
).&lt;/p&gt;
&lt;p&gt;Now that Java 26 is features complete (Rampdown Phase Two at the day of writing), it&amp;rsquo;s time to walk through all the functionalities that bring to us, developers, this new version.&lt;/p&gt;
&lt;p&gt;After Java 25 and its 18 JEPs, Java 26 arrives with a small number of JEPs, 10, with very few new features.&lt;/p&gt;</description></item><item><title>Shaping Jakarta Agentic AI Together</title><link>https://foojayio.github.io/website/today/shaping-jakarta-agentic-ai-together-watch-the-open-conversation/</link><pubDate>Mon, 02 Mar 2026 11:15:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/shaping-jakarta-agentic-ai-together-watch-the-open-conversation/</guid><description>&lt;p&gt;Last week, Eclipse Foundation and Payara hosted &lt;em&gt;Jakarta Agentic AI, An Open Conversation&lt;/em&gt;, an open house Jakarta TechTalk session, exploring a brand new initiative under the Eclipse Foundation. If you could not join us live, the full recording is now available.&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/92Iv-q6o1fQ?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;br /&gt;
&lt;h2 id="h2-0-what-is-jakarta-agentic-ai"&gt;What is Jakarta Agentic AI?&lt;/h2&gt;
&lt;p&gt;Jakarta Agentic AI is an exploratory project looking at how AI agents could be built, deployed and run within Jakarta EE runtimes. As AI systems increasingly move from simple inference to autonomous, agent-based behaviour, the question becomes how these systems fit into enterprise Java environments that value reliability, security, and portability.&lt;/p&gt;</description></item><item><title>How to Build a Search Service in Java with MongoDB</title><link>https://foojayio.github.io/website/today/how-to-build-a-search-service-in-java-with-mongodb/</link><pubDate>Fri, 27 Feb 2026 18:28:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-build-a-search-service-in-java-with-mongodb/</guid><description>&lt;p&gt;We need to code our way from the search box to our search index. Performing a search and rendering the results in a presentable fashion, itself, is not a tricky endeavor: Send the user&amp;rsquo;s query to the search server, and translate the response data into some user interface technology. However, there are some important issues that need to be addressed, such as security, error handling, performance, and other concerns that deserve isolation and control.&lt;/p&gt;</description></item><item><title>Gotta Code 'Em All: How Java Evolved Beyond Verbosity – Celebrating 30 Years of Pokémon</title><link>https://foojayio.github.io/website/today/gotta-code-em-all-how-java-evolved-beyond-verbosity-celebrating-30-years-of-pokemon/</link><pubDate>Fri, 27 Feb 2026 09:57:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/gotta-code-em-all-how-java-evolved-beyond-verbosity-celebrating-30-years-of-pokemon/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/gotta-code-em-all-how-java-evolved-beyond-verbosity-celebrating-30-years-of-pokemon/pokemon01-1024x640.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Happy 30th Anniversary to &lt;strong&gt;Pokémon&lt;/strong&gt;! 🎉&lt;/p&gt;
&lt;p&gt;February 27, 2026 marks exactly 30 years since the original Pokémon Red and Green launched in Japan on February 27, 1996. From catching your first Pokémon in Pallet Town to becoming Champion in the Indigo League, the franchise has spent three decades teaching millions of players about strategy, friendship, exploration, and constant improvement, evolving creatures, teams, and even entire generations of games.&lt;/p&gt;
&lt;p&gt;Pokémon is literally all about evolution and that same spirit of evolution perfectly matches what&amp;rsquo;s happening in Java right now.&lt;/p&gt;</description></item><item><title>Tomcat TLSv1.3 cipher configuration</title><link>https://foojayio.github.io/website/today/tomcat-tlsv13-cipher-configuration-spring-boot/</link><pubDate>Thu, 26 Feb 2026 18:02:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/tomcat-tlsv13-cipher-configuration-spring-boot/</guid><description>&lt;p&gt;A recent update to Apache Tomcat introduced a subtle but significant change to how TLS cipher suites are configured. If your Spring Boot application explicitly configures TLS ciphers, particularly TLSv1.3 ciphers, and runs on Tomcat 9.0.115+ (Spring Boot 2.x), 10.1.52+ (Spring Boot 3.x), or 11.0.18+ (Spring Boot 4.x), your cipher configuration may be silently ignored.&lt;/p&gt;
&lt;p&gt;Prior to the change, Tomcat used a single &lt;code&gt;ciphers&lt;/code&gt; attribute on the SSL connector to configure cipher suites for all TLS versions. Starting with the versions of Tomcat listed above (Tomcat &lt;a href="https://github.com/apache/tomcat/commit/9abf6bddb2e84ecf1668780bb3150b799f832ccf" target="_blank" rel="noopener noreferrer"&gt;commit&lt;/a&gt;
), this attribute was split:&lt;/p&gt;</description></item><item><title>Personal Branding Tips for Java Developers</title><link>https://foojayio.github.io/website/today/watch-the-recording-diy-technical-marketing-for-java-developers/</link><pubDate>Thu, 26 Feb 2026 10:28:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/watch-the-recording-diy-technical-marketing-for-java-developers/</guid><description>&lt;p&gt;The software development industry is more competitive than ever. Being a strong technical expert is essential, but on its own it is often not enough to grow your career or open new opportunities.&lt;/p&gt;
&lt;p&gt;In this short, practical talk&lt;em&gt;DIY Technical Marketing, Real World Tips For Building A Successful Developer Brand&lt;/em&gt; , delivered at &lt;a href="https://www.jfokus.se/" title="Jfokus 2026 conference" target="_blank" rel="noopener noreferrer"&gt;Jfokus 2026 conference&lt;/a&gt;
, Payara Community Manager Dominika Tasarz-Sochacka explores why personal branding matters for developers and how even small, intentional actions can make a real difference over time.&lt;/p&gt;</description></item><item><title>Ports and Adapters in Java: Keeping Your Core Clean</title><link>https://foojayio.github.io/website/today/ports-and-adapters-in-java-keeping-your-core-clean/</link><pubDate>Thu, 19 Feb 2026 16:13:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/ports-and-adapters-in-java-keeping-your-core-clean/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;If we want to evolve our Java system over time, architecture is more important than the choice of framework. Very often, teams realize too late that what was supposed to be a simple persistence layer at the beginning ended up influencing and overwhelming the entire application design. MongoDB annotations end up in domain models, repository abstractions mirror collections, and business logic becomes an integral part of the infrastructure.&lt;/p&gt;
&lt;p&gt;Hexagonal architecture, also known as Ports and Adapters, offers an architectural model that aims to avoid this problem. It involves the correct attribution of responsibilities to the various application layers. It encourages us to consider external systems (databases, message brokers, HTTP APIs, MCP servers) as details rather than pillars at the center of our design.&lt;/p&gt;</description></item><item><title>Optimizing the MongoDB Java Driver</title><link>https://foojayio.github.io/website/today/optimizing-the-mongodb-java-driver-how-minor-optimizations-led-to-macro-gains/</link><pubDate>Tue, 17 Feb 2026 15:33:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/optimizing-the-mongodb-java-driver-how-minor-optimizations-led-to-macro-gains/</guid><description>&lt;p&gt;Co-authored by &lt;em&gt;Slav Babanin&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www-cs-faculty.stanford.edu/~knuth/" target="_blank" rel="noopener noreferrer"&gt;Donald Knuth&lt;/a&gt;
{#https://www-cs-faculty.stanford.edu/~knuth/}, widely recognized as the &amp;lsquo;father of the analysis of algorithms,&amp;rsquo; warned against premature optimization&amp;mdash;spending effort on code that appears inefficient but is not on the critical path. He observed that programmers often focus on the wrong 97% of the codebase. Real performance gains come from identifying and optimizing the critical 3%. But, how can you identify the critical 3%? Well, that&amp;rsquo;s where the philosophy of &amp;rsquo;never guess, always measure&amp;rsquo; comes in.&lt;/p&gt;</description></item><item><title>Runtime Code Analysis in the Age of Vibe Coding</title><link>https://foojayio.github.io/website/today/runtime-code-analysis-in-the-age-of-vibe-coding/</link><pubDate>Tue, 17 Feb 2026 14:00:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/runtime-code-analysis-in-the-age-of-vibe-coding/</guid><description>&lt;p&gt;In the era of &lt;strong&gt;vibe coding&lt;/strong&gt;&amp;mdash;where large amounts of code are introduced or refactored in short bursts, often with the help of LLMs&amp;mdash;you need immediate feedback on how new logic actually executes. Not comprehensive analysis. Not nanosecond-precise timing. Just a quick confirmation that your loops aren&amp;rsquo;t spinning 10,000x more than they should.&lt;/p&gt;
&lt;p&gt;However, traditional profilers can feel like overkill for quick validation. In addition, they present results at method/stack granularity and require context-switching to interpret. They also introduce overhead, ranging from negligible (e.g., JFR/sampling) to noticeable (call tracing/instrumentation). As a result, they are less convenient as always-on feedback during rapid iteration.&lt;/p&gt;</description></item><item><title>DevBcn, the developer's conference in Barcelona</title><link>https://foojayio.github.io/website/today/devbcn-2026/</link><pubDate>Tue, 17 Feb 2026 09:56:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/devbcn-2026/</guid><description>&lt;p&gt;Hola developers !!!!!&lt;/p&gt;
&lt;p&gt;The 11th edition of &lt;strong&gt;&lt;a href="http://www.devbcn.com" target="_blank" rel="noopener noreferrer"&gt;DevBcn&lt;/a&gt;
&lt;/strong&gt;, the developer&amp;rsquo;s conference in Barcelona is coming next June. The perfect place to have great technology talks 🤖, perfect weather 🏖️, amazing food 🥘, and an unforgettable experience 💖.&lt;/p&gt;
&lt;figure class="aligncenter size-full is-resized"&gt;
 &lt;a target="_blank" href="http://www.devbcn.com"&gt;&lt;img fetchpriority="high" decoding="async" width="1011" height="851" src="Screenshot-2026-02-17-at-10.35.06.png" alt="" class="wp-image-122749" style="aspect-ratio:1.18804004331396;width:564px;height:auto"&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;br /&gt;
&lt;p&gt;It will be hosted on the 16th and 17th of June 2026, in the &lt;strong&gt;World Trade Center Conference Center&lt;/strong&gt; , having 4 rooms with talks in parallel during the 2 days of the conference : &lt;strong&gt;Java/JVM, AI, Cloud, Frontend, Managing and Soft skills&lt;/strong&gt;.
&lt;img src="https://foojayio.github.io/website/today/devbcn-2026/unnamed-1-1024x282.png" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>What 2,000+ Professionals Told Us About the State of Java, AI, Cloud Costs, and the Future of the Java Ecosystem</title><link>https://foojayio.github.io/website/today/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/</link><pubDate>Tue, 17 Feb 2026 08:58:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/</guid><description>&lt;p&gt;Every year, I look forward to our &lt;a href="https://www.azul.com/state-of-java-2026?utm_medium=blog&amp;amp;utm_campaign=State-of-Java-2026&amp;amp;utm_source=web&amp;amp;utm_content=&amp;amp;utm_term=" target="_blank" rel="noopener noreferrer"&gt;State of Java Survey &amp;amp; Report&lt;/a&gt;
 because it gives us a view into how organizations are using Java today and where they&amp;rsquo;re heading next. This year, more than 2,000 Java professionals from around the world weighed in, and their message is clear:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Java is evolving faster than ever. AI is accelerating that shift. And the pressure to optimize cloud spending and avoid unpredictable Java licensing costs is now shaping strategic decisions across the enterprise.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Foojay Podcast #90: Highlights of the Java Features Between LTS 21 and 25</title><link>https://foojayio.github.io/website/today/foojay-podcast-90/</link><pubDate>Mon, 16 Feb 2026 07:32:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-90/</guid><description>&lt;p&gt;Every six months, we get a new version of Java. Java 26 is just around the corner and will be released soon. But most companies stick to LTS (Long-Term Support) versions, which are maintained and receive security updates for many more years. Versions 8, 11, 17, 21, and 25 are such LTS versions. Hopefully, most of your systems are already on the latest versions and you are not stuck on 8 or earlier. As a reminder, 8 was released in 2014, so much has changed since then.&lt;/p&gt;</description></item><item><title>MongoDB Sharding: What to Know Before You Shard a Collection</title><link>https://foojayio.github.io/website/today/mongodb-sharding-what-to-know-before-you-shard/</link><pubDate>Thu, 12 Feb 2026 16:47:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/mongodb-sharding-what-to-know-before-you-shard/</guid><description>&lt;p&gt;When we think about a system that operates at scale, we are usually talking about an application that needs to serve millions of users. This often happens when an application suddenly becomes popular and usage grows much faster than expected. As more people start using it, the system naturally begins to struggle to keep up with the load.&lt;/p&gt;
&lt;p&gt;More users mean more requests, more data being generated, and more pressure on the database. If nothing is done, bottlenecks start to appear and the overall performance of the system degrades. There are two traditional ways to deal with this problem: vertical scaling and horizontal scaling.&lt;/p&gt;</description></item><item><title>Unikernel: Profiling and Troubleshooting JVM on Nanos Unikernel</title><link>https://foojayio.github.io/website/today/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/</link><pubDate>Wed, 11 Feb 2026 13:50:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/</guid><description>&lt;h3 id="h3-0-profiling-a-java-application-running-inside-an-unikernel-with-jprofiler"&gt;Profiling a Java Application Running Inside an Unikernel with JProfiler&lt;/h3&gt;
&lt;p&gt;Unikernels are often associated with minimalism and tight resource control.&lt;/p&gt;
&lt;p&gt;But can we profile a Java application running inside a unikernel using a standard JVM profiler?&lt;/p&gt;
&lt;p&gt;The answer is yes.&lt;/p&gt;
&lt;p&gt;In this guide, we will walk step by step through profiling a Quarkus&lt;/p&gt;
&lt;p&gt;application running inside a Nanos unikernel using &lt;strong&gt;JProfiler&lt;/strong&gt; and&lt;br&gt;
&lt;strong&gt;IBM Semeru JRE 25 (OpenJ9)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;No special hacks. Just standard JVM tooling.&lt;/p&gt;</description></item><item><title>Reactive Java with Project Reactor</title><link>https://foojayio.github.io/website/today/reactive-java-with-project-reactor/</link><pubDate>Tue, 10 Feb 2026 14:32:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/reactive-java-with-project-reactor/</guid><description>&lt;p&gt;&lt;strong&gt;Introduction: Why Reactive Java Still Matters&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Over the past decade, the Java ecosystem has gradually abandoned the idea that increasing the number of threads is the scalable solution to growing load. Cloud-native implementations, containerized workloads, and high-I/O applications have highlighted the inefficiencies of the traditional synchronous thread-per-request model.&lt;/p&gt;
&lt;p&gt;Reactive programming is not a panacea, a miracle solution. Certainly, it does not make applications &amp;ldquo;faster&amp;rdquo; by default. What it offers, when applied correctly, is the ability to predict behavior under load, better resource utilization, and explicit control over data flow. For systems that handle high concurrency, streaming data, or variable traffic patterns, these characteristics are hugely relevant.&lt;/p&gt;</description></item><item><title>From a JAR to a full-fledged MacOS app</title><link>https://foojayio.github.io/website/today/from-a-jar-to-a-full-fledged-macos-app/</link><pubDate>Thu, 05 Feb 2026 10:15:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/from-a-jar-to-a-full-fledged-macos-app/</guid><description>&lt;p&gt;A couple of years ago, I developed a small &lt;a href="https://blog.frankel.ch/state-jvm-desktop-frameworks/2/" target="_blank" rel="noopener noreferrer"&gt;Kotlin GUI&lt;/a&gt;
 to help me rename my files in batch. I actually created it with &lt;a href="https://blog.frankel.ch/focus/state-jvm-desktop-frameworks/" target="_blank" rel="noopener noreferrer"&gt;different JVM frameworks&lt;/a&gt;
 to compare their relative merits. In any case, I didn&amp;rsquo;t use it up until last week. And then, I was surprised to see that it didn&amp;rsquo;t work to rename a network volume, although it had in the past. In this brief post, I aim to describe the issue and its solution.&lt;/p&gt;</description></item><item><title>BoxLang 1.10.0: Functional Arrays, Elegant Loops &amp; Distributed Locking</title><link>https://foojayio.github.io/website/today/boxlang-1-10-0-functional-arrays-elegant-loops-distributed-locking/</link><pubDate>Wed, 04 Feb 2026 10:46:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-1-10-0-functional-arrays-elegant-loops-distributed-locking/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-1-10-0-functional-arrays-elegant-loops-distributed-locking/boxlang-v1.10.0-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re excited to announce &lt;strong&gt;BoxLang 1.10.0&lt;/strong&gt;, a feature-packed release that brings powerful functional programming capabilities, elegant loop syntax, and enterprise-grade distributed locking to the BoxLang runtime. This release represents a significant leap forward in developer productivity and application scalability.&lt;/p&gt;
&lt;h2 id="h2-0-what-s-new"&gt;🎯 What&amp;rsquo;s New&lt;/h2&gt;
&lt;h3 id="h3-1-nine-new-array-methods-for-functional-programming"&gt;Nine New Array Methods for Functional Programming&lt;/h3&gt;
&lt;p&gt;BoxLang 1.10.0 introduces nine powerful array methods that bring modern functional programming patterns to your collections. These methods enable cleaner, more expressive code while reducing the need for verbose iteration patterns.&lt;/p&gt;</description></item><item><title>GraphQL for Java Developers: Building a Flexible Data Layer</title><link>https://foojayio.github.io/website/today/graphql-for-java-developers-building-a-flexible-data-layer/</link><pubDate>Tue, 03 Feb 2026 15:43:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/graphql-for-java-developers-building-a-flexible-data-layer/</guid><description>&lt;p&gt;For many years, REST has been the standard architectural style for creating APIs in the Java ecosystem. Frameworks such as Spring MVC and, more recently, Spring WebFlux make it easy to expose HTTP endpoints with the REST paradigm, supported by well-structured service layers. In many cases, this model works well and serves as the basis for numerous enterprise solutions.&lt;/p&gt;
&lt;p&gt;However, as applications grow and frontend requirements become more dynamic, REST-based APIs are beginning to show their limitations. Multiple endpoints that return rigid DTOs often lead to over-fetching, under-fetching, and a proliferation of specialised endpoints created to meet slightly different customer needs. Over time, APIs become more difficult to evolve without introducing radical changes.&lt;/p&gt;</description></item><item><title>Bringing Java Closer to Education: A Community-Driven Initiative</title><link>https://foojayio.github.io/website/today/bringing-java-closer-to-education-a-community-driven-initiative/</link><pubDate>Mon, 02 Feb 2026 18:02:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/bringing-java-closer-to-education-a-community-driven-initiative/</guid><description>&lt;p&gt;Over the past decades, Java has proven itself to be one of the most reliable, versatile, and widely used programming languages in the world. From enterprise systems to mobile applications and embedded devices, Java continues to evolve and adapt. Yet, one important area still holds enormous untapped potential: education.&lt;/p&gt;
&lt;p&gt;This initiative was born from a simple but powerful idea: to aggregate Java-related educational content in a way that helps newcomers get started, supports educators, and encourages new Java initiatives focused on learning. By making Java more accessible and visible in educational environments, we strengthen not only the language itself, but the entire ecosystem around it.&lt;/p&gt;</description></item><item><title>Claude Code SonarQube MCP: A Java Developer’s Workflow</title><link>https://foojayio.github.io/website/today/claude-code-sonarqube-mcp/</link><pubDate>Mon, 02 Feb 2026 15:15:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/claude-code-sonarqube-mcp/</guid><description>&lt;p&gt;Hola Java developers! 👋&lt;/p&gt;
&lt;p&gt;We all know the feeling. You are &amp;ldquo;in the zone,&amp;rdquo; coding away in your terminal, feeling like a hacker from a 90s movie. But then, reality hits. You need to check a rule, review a vulnerability, or verify if your project passes the quality gate.&lt;/p&gt;
&lt;p&gt;What do you do? You Alt+Tab. You open the browser. You log in. You search. And just like that&amp;hellip; the flow is gone. 📉&lt;/p&gt;</description></item><item><title>Abstracting Data Access in Java With the DAO Pattern</title><link>https://foojayio.github.io/website/today/abstracting-data-access-in-java-with-the-dao-pattern/</link><pubDate>Thu, 29 Jan 2026 16:37:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/abstracting-data-access-in-java-with-the-dao-pattern/</guid><description>&lt;p&gt;The Data Access Object (DAO) pattern is a structural pattern that isolates your application&amp;rsquo;s business logic from persistence operations. By using an abstract API, the DAO pattern hides all the complexity of performing CRUD operations against your database&amp;mdash;whether that&amp;rsquo;s MongoDB, a relational database, or any other storage mechanism.&lt;/p&gt;
&lt;p&gt;This separation is crucial: Your business logic shouldn&amp;rsquo;t care whether you&amp;rsquo;re using MongoDB&amp;rsquo;s flexible document model or a rigid SQL schema. The DAO pattern ensures both layers can evolve independently.&lt;/p&gt;</description></item><item><title>Enterprise Java in Practice</title><link>https://foojayio.github.io/website/today/enterprise-java-in-practice-fragmentation-platforms-and-real-world-trade-offs/</link><pubDate>Thu, 29 Jan 2026 10:11:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/enterprise-java-in-practice-fragmentation-platforms-and-real-world-trade-offs/</guid><description>&lt;p&gt;Enterprise Java has matured into one of the most stable and widely adopted ecosystems in software development. Yet for many teams, the biggest challenges no longer come from the language itself, but from the complexity of the environments built around it.&lt;/p&gt;
&lt;p&gt;Modern enterprise Java teams are dealing with a mix of legacy Java EE applications, Jakarta EE runtimes, microservices, container platforms, cloud-native deployments, and increasingly sophisticated DevOps pipelines. The result is an ecosystem that is powerful, but often fragmented across frameworks, runtimes, tooling, and operational models.&lt;/p&gt;</description></item><item><title>Testing Emails with Testcontainers and Mailpit</title><link>https://foojayio.github.io/website/today/testing-emails-with-testcontainers-and-mailpit/</link><pubDate>Thu, 29 Jan 2026 08:38:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/testing-emails-with-testcontainers-and-mailpit/</guid><description>&lt;p&gt;Testing email functionality is often painful. SMTP servers are external, tests become slow or flaky, and local setups differ from CI environments. As a result, many teams either mock the mail sender or skip proper email tests completely.&lt;/p&gt;
&lt;p&gt;Both approaches are unsatisfying. Mocking does not test real behavior, and shared SMTP servers introduce hidden dependencies. What we really want is a real SMTP server that runs locally and in CI, is fully isolated per test run, and allows us to inspect sent emails easily.&lt;/p&gt;</description></item><item><title>Introduction to Behavior Driving Development with Java and MongoDB</title><link>https://foojayio.github.io/website/today/introduction-to-behavior-driving-development-with-java-and-mongodb/</link><pubDate>Tue, 27 Jan 2026 16:35:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/introduction-to-behavior-driving-development-with-java-and-mongodb/</guid><description>&lt;p&gt;When we face software development, the biggest mistake is about delivering what the client wants. It sounds like a cliché, but after decades, we are still facing this problem. One good way to solve it is to start the test focusing on what the business needs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Behavior-driven development&lt;/strong&gt; (BDD) is a software development methodology where the focus is on behavior and the domain terminology or ubiquitous language. It utilizes a shared, natural language to define and test software behaviors from the user&amp;rsquo;s perspective. BDD builds upon test-driven development (TDD) by focusing on scenarios that are relevant to the business. These scenarios are written as plain-language specifications that can be automated as tests, simultaneously serving as living documentation.&lt;/p&gt;</description></item><item><title>DocBox v5 - Reborn: Modern API Docs for BoxLang &amp; CFML</title><link>https://foojayio.github.io/website/today/docbox-v5-reborn-modern-api-docs-for-boxlang-cfml/</link><pubDate>Tue, 27 Jan 2026 12:15:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/docbox-v5-reborn-modern-api-docs-for-boxlang-cfml/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/docbox-v5-reborn-modern-api-docs-for-boxlang-cfml/bx-docbox-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Welcome to DocBox v5! We didn&amp;rsquo;t just update DocBox. We rebuilt it from the ground up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DocBox v5.0.0&lt;/strong&gt; represents a complete architectural rewrite&amp;mdash;modern syntax, blazing performance, and a stunning new look that finally brings API documentation into 2025. Gone are the clunky HTML pages of yesteryear. Say hello to a gorgeous, theme-driven single-page application that makes browsing your API docs feel like using a premium developer tool. We have also released a dedicated module for BoxLang: &lt;strong&gt;BX-DOCBOX&lt;/strong&gt;. A fully interactive CLI tool for generating your docs from the command line using pure BoxLang.&lt;/p&gt;</description></item><item><title>What’s New in the January 2026 Payara Platform Release?</title><link>https://foojayio.github.io/website/today/whats-new-in-the-january-2026-payara-platform-release/</link><pubDate>Mon, 26 Jan 2026 14:37:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/whats-new-in-the-january-2026-payara-platform-release/</guid><description>&lt;p&gt;As we begin 2026, we&amp;rsquo;re pleased to announce new releases across all Payara Platform editions this January: &lt;a href="https://payara.fish/downloads/payara-platform-community-edition/" title="Payara Platform Community 7.2026.1" target="_blank" rel="noopener noreferrer"&gt;Payara Platform Community 7.2026.1&lt;/a&gt;
, &lt;a href="https://payara.fish/payara-enterprise-downloads/" title="Payara Platform Enterprise 6.34.0 and 5.83.0" target="_blank" rel="noopener noreferrer"&gt;Payara Platform Enterprise 6.34.0 and 5.83.0&lt;/a&gt;
. These releases deliver important security fixes, address deployment and administration issues as well as refreshing multiple component versions across the platform.&lt;/p&gt;
&lt;h2 id="h2-0-security-priority"&gt;Security Priority&lt;/h2&gt;
&lt;p&gt;This month&amp;rsquo;s releases address two security vulnerabilities. First, we&amp;rsquo;ve resolved CVE-2020-5258, a cross-site scripting vulnerability in the dojo.js library (versions 6.0.2 and earlier). This fix applies to Payara Platform Community 7.2026.1 and Payara Platform Enterprise 6.34.0, with dojo.js now upgraded to version 6.0.3.&lt;/p&gt;</description></item><item><title>Bring AI into your Jakarta EE apps with LangChain4J-CDI</title><link>https://foojayio.github.io/website/today/bring-ai-into-your-jakarta-ee-apps-with-langchain4j-cdi/</link><pubDate>Sat, 24 Jan 2026 17:20:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/bring-ai-into-your-jakarta-ee-apps-with-langchain4j-cdi/</guid><description>&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt; : This article will demonstrate how to add AI features to a Jakarta EE / MicroProfile application using &lt;strong&gt;LangChain4J‑CDI&lt;/strong&gt;, with simple to implement examples that runs on Payara, WildFly, Open Liberty, Helidon, Quarkus or any CDI 4.x compatible runtime.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; This is an updated article to the one published on the &lt;a href="https://javapro.io/2025/10/28/04-2025-java-25-special-edition/" target="_blank" rel="noopener noreferrer"&gt;JAVAPRO&amp;rsquo;s magazine - &amp;ldquo;04-2025 | Java 25 - Special Edition&amp;rdquo;&lt;/a&gt;
. Since the release of LangChain4J-CDI version 1.0.0, there&amp;rsquo;s been minor changes, but the fundamental architecture and usage of the library is the same.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Java on Single Board Computers: x86 vs ARM vs RISC-V</title><link>https://foojayio.github.io/website/today/java-on-single-board-computers-x86-vs-arm-vs-risc-v/</link><pubDate>Fri, 23 Jan 2026 06:17:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-on-single-board-computers-x86-vs-arm-vs-risc-v/</guid><description>&lt;p&gt;Ever since I started my #JavaOnRaspberryPi journey in 2019, which resulted in my book &amp;ldquo;&lt;a href="https://webtechie.be/books/" target="_blank" rel="noopener noreferrer"&gt;Getting Started with Java on the Raspberry Pi&lt;/a&gt;
&amp;rdquo;, I&amp;rsquo;ve been fascinated with these tiny, inexpensive computers. For 2026, I&amp;rsquo;ve set one of my goals to experiment with Java on various Single-Board Computers (SBC), going beyond my &amp;ldquo;Raspberry Pi comfort zone.&amp;rdquo; The market is flooded with SBCs ranging from budget boards (tens of euros) to powerhouses (hundreds of euros). One of the reasons of this price range is the difference between the processors they use. Raspberry Pi uses an ARM processor, but RISC-V is gaining momentum, while Intel maintains its presence. So before I start experimenting, now is the perfect time to compare these three processor families and understand their differences.&lt;/p&gt;</description></item><item><title>BoxLang AI v2: Enterprise AI Development Without the Complexity</title><link>https://foojayio.github.io/website/today/boxlang-ai-v2-enterprise-ai-development-without-the-complexity/</link><pubDate>Thu, 22 Jan 2026 15:09:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-ai-v2-enterprise-ai-development-without-the-complexity/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-ai-v2-enterprise-ai-development-without-the-complexity/boxlang-ai-v2-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One Year. 100+ Features. Unlimited Possibilities.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Just one year ago, in March 2024, we launched BoxLang AI 1.0. Today, we&amp;rsquo;re thrilled to announce &lt;strong&gt;BoxLang AI v2&lt;/strong&gt;&amp;mdash;a massive leap forward that positions BoxLang as one of the most powerful and versatile AI framework on the JVM. This release is 9-months in the making, with over 100 new features! This would have not been possible without all the new features that the BoxLang JVM language exposes to developers like: Server Side Events, HTTP Streaming, HTTP pooling, Caching, and so much more.&lt;/p&gt;</description></item><item><title>OpenJDK January 2026 Critical Patch Update and Patch Set Update Released</title><link>https://foojayio.github.io/website/today/openjdk-january-2026-critical-patch-update-and-patch-set-update-released/</link><pubDate>Wed, 21 Jan 2026 08:32:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/openjdk-january-2026-critical-patch-update-and-patch-set-update-released/</guid><description>&lt;p&gt;The January 2026 OpenJDK quarterly updates are now (or will soon be) available from various OpenJDK distributors. This quarterly release brings important security fixes and updates to all currently supported Java versions.&lt;/p&gt;
&lt;h2 id="h2-0-the-quarterly-update-cycle"&gt;The Quarterly Update Cycle&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Every three months&lt;/strong&gt; (in January, April, July, and October), the OpenJDK project releases &lt;strong&gt;security updates, bug fixes, and improvements&lt;/strong&gt; for &lt;strong&gt;all supported Java versions&lt;/strong&gt;. This predictable schedule helps organizations plan their Java updates and maintain secure, stable production environments.&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>The FFM API: How OpenJDK Changed the Game for Native Interactions (And Made Pi4J Better!)</title><link>https://foojayio.github.io/website/today/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/</link><pubDate>Fri, 16 Jan 2026 08:18:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/</guid><description>&lt;p&gt;The &lt;a href="https://www.pi4j.com/" target="_blank" rel="noopener noreferrer"&gt;Pi4J project&lt;/a&gt;
 is a Java library that allows you to control the GPIO pins and electronic components connected to a Raspberry Pi with pure Java code. It removes the complexity of using native libraries and the &lt;a href="https://www.baeldung.com/jni" target="_blank" rel="noopener noreferrer"&gt;Java Native Interface (JNI)&lt;/a&gt;
, allowing you to focus on your application logic.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;This is a crosspost from the article I contributed to &lt;a href="https://www.javaadvent.com/2025/12/ffm-api-for-java-on-raspberry-pi.html" target="_blank" rel="noopener noreferrer"&gt;this year&amp;rsquo;s JVM Advent&lt;/a&gt;
.&lt;/strong&gt;&lt;/em&gt;
&lt;img src="https://foojayio.github.io/website/today/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/pi4j-overview-1024x427.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;In the Java Advent of 2020, I published &amp;ldquo;&lt;a href="https://www.javaadvent.com/2020/12/light-up-your-christmas-lights-with-java-and-raspberry-pi.html" target="_blank" rel="noopener noreferrer"&gt;Light up your Christmas lights with Java and Raspberry Pi&lt;/a&gt;
&amp;rdquo;, using Java 11 and Pi4J V1.2. Wow, things have changed a lot: this article uses Java 25 and a snapshot of the soon-to-be-released Pi4J V4!&lt;/p&gt;</description></item><item><title>The Ultimate 10 Years Java Garbage Collection Guide (2016–2026) - Choosing the Right GC for Every Workload</title><link>https://foojayio.github.io/website/today/the-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload/</link><pubDate>Thu, 15 Jan 2026 10:00:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload/</guid><description>&lt;p&gt;Memory management remains the primary factor for application performance in enterprise Java environments. Between 2017 and 2025, the ecosystem shifted from manual tuning to architectural selection. Industry data suggests that 60 percent of Java performance issues and 45 percent of production incidents in distributed systems stem from suboptimal Garbage Collection (GC) behavior. This guide provides a strategic framework for selecting collectors based on workload characteristics. It covers the transition from legacy collectors to Generational ZGC, analyzing trade-offs regarding throughput, latency, and hardware constraints with mathematical precision.&lt;/p&gt;</description></item><item><title>Pointer Arithmetic in Modern Java</title><link>https://foojayio.github.io/website/today/pointer-arithmetic-in-modern-java/</link><pubDate>Thu, 15 Jan 2026 09:00:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/pointer-arithmetic-in-modern-java/</guid><description>&lt;h2 id="_introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In this post, we dive into a more advanced topic: pointer arithmetic in Java. With the introduction of the Foreign Function &amp;amp; Memory API (Panama), we can interact with native memory.&lt;/p&gt;
&lt;p&gt;Usually, when we work with off-heap memory, we use &lt;code&gt;MemorySegment&lt;/code&gt; instances to ensure safety. However, creating these objects can sometimes add overhead. In this post, we will look at how to access native memory using addresses. The goal is to create fewer objects that are not strictly needed and only add GC pressure.&lt;/p&gt;</description></item><item><title>Flaky Tests: a journey to beat them all</title><link>https://foojayio.github.io/website/today/flaky-tests-a-journey-to-beat-them-all/</link><pubDate>Tue, 13 Jan 2026 13:00:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/flaky-tests-a-journey-to-beat-them-all/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Sleep is not a synchronization primitive.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Every test engineer, eventually&lt;/p&gt;
&lt;h2 id="h2-0-what-s-a-flaky-test"&gt;What&amp;rsquo;s a flaky test?&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;flaky test&lt;/strong&gt; is a test that sometimes passes and sometimes fails without any code changes. They&amp;rsquo;re the by‑product of non‑determinism: timing, concurrency, eventual consistency, network hiccups, clock drift, resource contention, and (our favorite) &lt;strong&gt;tests leaking state across runs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://kestra.io" target="_blank" rel="noopener noreferrer"&gt;Kestra&lt;/a&gt;
 is an open-source declarative orchestration platform designed to run, coordinate, and monitor large-scale, event-driven workflows. It is built to handle parallelism, asynchronous execution, and distributed systems at scale, exactly the kind of environment where determinism is hard and flaky tests tend to emerge.&lt;/p&gt;</description></item><item><title>BoxLang Dynamic JVM Language Release 1.9.0</title><link>https://foojayio.github.io/website/today/boxlang-1-9-0-released-production-ready-stability-and-enterprise-grade-reliability/</link><pubDate>Mon, 12 Jan 2026 11:16:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-1-9-0-released-production-ready-stability-and-enterprise-grade-reliability/</guid><description>&lt;p&gt;&lt;strong&gt;Houston, Texas &amp;ndash; January 2025&lt;/strong&gt; &amp;ndash; Ortus Solutions, a leading innovator in professional open-source development, today announced the release of BoxLang 1.9.0, a major stability and compatibility release focused on production-readiness. This release resolves over 50 critical bugs and introduces significant enhancements to datasource management, context lifecycle handling, and web form processing for mission-critical enterprise applications.&lt;/p&gt;
&lt;h2 id="h2-0-production-ready-enhancements"&gt;Production-Ready Enhancements&lt;/h2&gt;
&lt;p&gt;BoxLang 1.9.0 delivers critical improvements based on real-world client migrations and production deployments:&lt;/p&gt;</description></item><item><title>Java and Jakarta EE and the Evolution of the Cloud with Nanos Unikernel</title><link>https://foojayio.github.io/website/today/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/</link><pubDate>Tue, 06 Jan 2026 20:51:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/</guid><description>&lt;p&gt;The evolution of the Java and Jakarta Enterprise ecosystem is converging toward an increasingly simple, efficient, and scalable architecture that improves security, delivers higher performance, and reduces hardware and infrastructure costs.&lt;/p&gt;
&lt;p&gt;For years, Kubernetes has been considered the de‑facto standard for modernizing Java applications in a cloud‑native direction. However, Kubernetes is not the only way to achieve scalability, continuous upgrades, and isolation. An alternative approach &amp;mdash; often underestimated &amp;mdash; is to leverage the &lt;strong&gt;hypervisors already included and fully managed by major cloud providers&lt;/strong&gt; , using &lt;strong&gt;Unikernel&lt;/strong&gt; images based on &lt;a href="https://nanovms.com" target="_blank" rel="noopener noreferrer"&gt;&lt;strong&gt;Nanos&lt;/strong&gt;&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>The Real Mechanics of Vulnerabilities in an Upstream/Downstream, Topsy-Turvy EOL World</title><link>https://foojayio.github.io/website/today/the-real-mechanics-of-vulnerabilities-in-an-upstream-downstream-topsy-turvy-eol-world/</link><pubDate>Fri, 19 Dec 2025 13:36:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-real-mechanics-of-vulnerabilities-in-an-upstream-downstream-topsy-turvy-eol-world/</guid><description>&lt;h3 id="h3-0-in-this-article-you-ll-learn"&gt;In this article you&amp;rsquo;ll learn&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Why CVEs record that a vulnerability exists, not that a usable fix exists&lt;/li&gt;
&lt;li&gt;How vulnerabilities are often discovered and fixed downstream before upstream ever acknowledges them&lt;/li&gt;
&lt;li&gt;Why EOL branches continue to accumulate exploitable behaviour even when no CVEs appear&lt;/li&gt;
&lt;li&gt;How downstream-only patches break the assumptions scanners and SBOMs rely on&lt;/li&gt;
&lt;li&gt;What disclosure actually enables when &amp;ldquo;just upgrade&amp;rdquo; is not a viable option&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-1-introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;There is a tidy, almost academic version of how software security is supposed to work. It appears in conference talks, compliance documents and in the cheerful diagrams seen on marketing slides. It usually looks something like this:&lt;/p&gt;</description></item><item><title>Scalable Enterprise Java for the Cloud</title><link>https://foojayio.github.io/website/today/scalable-enterprise-java-for-the-cloud/</link><pubDate>Thu, 18 Dec 2025 11:41:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/scalable-enterprise-java-for-the-cloud/</guid><description>&lt;p&gt;We&amp;rsquo;re excited to introduce &lt;a href="https://payara.fish/resource/scalable-enterprise-java-for-the-cloud/" title="*Scalable Enterprise Java for the Cloud*," target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;Scalable Enterprise Java for the Cloud&lt;/em&gt;,&lt;/a&gt;
 a new free eBook created through a close collaboration between &lt;a href="https://payara.fish/" title="Payara" target="_blank" rel="noopener noreferrer"&gt;Payara&lt;/a&gt;
, Java Champion &lt;a href="https://otaviojava.com/" title="Otavio Santana" target="_blank" rel="noopener noreferrer"&gt;Otavio Santana&lt;/a&gt;
, and the Oracle NoSQL team Dario Vega &amp;amp; Michael Brey. This project brings together different parts of the Java ecosystem with a shared goal, helping developers build modern, cloud-native enterprise applications using open standards.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://payara.fish/resource/scalable-enterprise-java-for-the-cloud/" title="**Download the free eBook here**" target="_blank" rel="noopener noreferrer"&gt;&lt;strong&gt;Download the free eBook here&lt;/strong&gt;&lt;/a&gt;
 (no form fill necessary).&lt;/p&gt;</description></item><item><title>Announcing bx-ldap: Enterprise LDAP for BoxLang</title><link>https://foojayio.github.io/website/today/announcing-bx-ldap-enterprise-ldap-for-boxlang/</link><pubDate>Tue, 16 Dec 2025 17:01:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/announcing-bx-ldap-enterprise-ldap-for-boxlang/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/announcing-bx-ldap-enterprise-ldap-for-boxlang/bx-ldap-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re excited to announce the release of &lt;strong&gt;bx-ldap&lt;/strong&gt;, a comprehensive LDAP module that brings enterprise-grade directory access to BoxLang! This module goes above and beyond traditional CFML LDAP implementations, offering modern features like connection pooling, event-driven programming, multiple return formats, and a clean, intuitive API.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; bx-ldap is a premium module available exclusively to BoxLang +/++ &lt;strong&gt;subscribers&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="h2-0-why"&gt;🎯 Why?&lt;/h2&gt;
&lt;p&gt;Whether you&amp;rsquo;re integrating with Active Directory, OpenLDAP, or any LDAP-compliant directory service, &lt;strong&gt;bx-ldap&lt;/strong&gt; makes it simple and powerful. From basic queries to complex directory operations, this module handles it all with grace and performance.&lt;/p&gt;</description></item><item><title>Java developer's guide : Sync Rules &amp; Stop CI Failures</title><link>https://foojayio.github.io/website/today/developers-guide-to-sonarqube-part-2/</link><pubDate>Tue, 16 Dec 2025 15:53:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/developers-guide-to-sonarqube-part-2/</guid><description>&lt;p&gt;Hola Java developers! 👋&lt;/p&gt;
&lt;p&gt;Welcome back. In &lt;a href="https://foojayio.github.io/website/today/developers-guide-to-sonarqube-part-1/"&gt;&lt;strong&gt;Part 1&lt;/strong&gt;&lt;/a&gt;
, we installed &lt;strong&gt;SonarQube for IDE&lt;/strong&gt; in IntelliJ. You are now catching those nasty NullPointerExceptions and Optional.get() risks &lt;em&gt;before&lt;/em&gt; they leave your keyboard.&lt;/p&gt;
&lt;p&gt;But&amp;hellip; you are not working alone. You are part of a team pushing code to a repo full of XML configs, DTOs, and Services.&lt;/p&gt;
&lt;p&gt;Here is the nightmare scenario: You spend all day refactoring your &lt;strong&gt;Spring Boot&lt;/strong&gt; service. It looks perfect. You run your tests. They pass. You push it to Git. You grab a coffee. ☕ And then&amp;hellip; &lt;strong&gt;FAIL.&lt;/strong&gt; 🔴&lt;/p&gt;</description></item><item><title>BoxLang Native Couchbase Module</title><link>https://foojayio.github.io/website/today/boxlang-couchbase-module-enterprise-caching-distributed-locking-and-ai-vector-memory/</link><pubDate>Tue, 16 Dec 2025 08:37:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-couchbase-module-enterprise-caching-distributed-locking-and-ai-vector-memory/</guid><description>&lt;p&gt;&lt;strong&gt;Ortus Solutions&lt;/strong&gt; is thrilled to announce the official release of &lt;strong&gt;bx-couchbase v1.0&lt;/strong&gt; , a groundbreaking module that brings native enterprise-grade Couchbase capabilities to the BoxLang language and ecosystem. Designed for modern distributed applications, &lt;strong&gt;bx-couchbase&lt;/strong&gt; unifies high-performance caching, resilient distributed locking, and advanced AI vector memory&amp;mdash;empowering developers to build scalable, intelligent, fault-tolerant systems with unprecedented ease.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="h2-0-couchbase-boxlang-a-high-performance-combination"&gt;&lt;strong&gt;Couchbase + BoxLang: A High-Performance Combination&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Couchbase is more than a database&amp;mdash;it&amp;rsquo;s a distributed NoSQL platform engineered for speed, flexibility, and global scale. With sub-millisecond key-value operations, built-in vector search, and multi-data-center support, it is the ideal foundation for next-generation AI-powered applications.&lt;/p&gt;</description></item><item><title>SonarQube for IDE in IntelliJ: The Ultimate Java Developer’s Guide</title><link>https://foojayio.github.io/website/today/developers-guide-to-sonarqube-part-1/</link><pubDate>Fri, 12 Dec 2025 15:43:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/developers-guide-to-sonarqube-part-1/</guid><description>&lt;p&gt;Hola Java developers! 👋&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s be honest. We have all been there. You write a piece of code, it compiles perfectly, the unit tests pass, and you think: &lt;em&gt;&amp;ldquo;This is solid.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Then&amp;hellip; boom. The CI/CD pipeline fails 20 minutes later because of a security vulnerability. Or worse, a NullPointerException wakes you up on the weekend because you forgot to check if that Optional was actually present.&lt;/p&gt;
&lt;p&gt;We want to deliver &lt;strong&gt;High&lt;/strong&gt; &lt;strong&gt;Code Quality and Security&lt;/strong&gt;, but we are humans. We get tired, we lose focus.&lt;/p&gt;</description></item><item><title>Jakarta Data Makes Persistence a Breeze</title><link>https://foojayio.github.io/website/today/jakarta-data-makes-persistence-a-breeze/</link><pubDate>Fri, 12 Dec 2025 11:55:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/jakarta-data-makes-persistence-a-breeze/</guid><description>&lt;p&gt;Working with enterprise Java databases can sometimes feel like swimming upstream. Jakarta EE 11&amp;rsquo;s Jakarta Data helps developers glide through data operations effortlessly, cutting complexity and keeping projects flowing smoothly.&lt;/p&gt;
&lt;p&gt;In this blog post, we look at what Jakarta Data brings to the table and how it can transform everyday Java development tasks.&lt;/p&gt;
&lt;p&gt;Jakarta EE is evolving, and one of the most talked-about additions in the latest release (&lt;a href="https://payara.fish/blog/jakarta-ee-11-is-here-and-its-ready-for-the-cloud/" title="Jakarta EE 11" target="_blank" rel="noopener noreferrer"&gt;Jakarta EE 11&lt;/a&gt;
) is &lt;a href="https://projects.eclipse.org/projects/ee4j.data" title="Jakarta Data" target="_blank" rel="noopener noreferrer"&gt;Jakarta Data&lt;/a&gt;
, a framework designed to simplify how developers interact with databases. By reducing boilerplate and offering a more intuitive approach, Jakarta Data promises to make enterprise Java development cleaner, faster and more maintainable.&lt;/p&gt;</description></item><item><title>How to Release a Java Module to Maven Central with JReleaser and GitHub Actions (2025 Guide)</title><link>https://foojayio.github.io/website/today/how-to-publish-a-java-maven-project-to-maven-central-using-jreleaser-and-github-actions-2025-guide/</link><pubDate>Fri, 12 Dec 2025 07:42:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-publish-a-java-maven-project-to-maven-central-using-jreleaser-and-github-actions-2025-guide/</guid><description>&lt;p&gt;This article is a tutorial that guides you through the process of releasing a Java module with &lt;a href="https://jreleaser.org/" target="_blank" rel="noopener noreferrer"&gt;JReleaser&lt;/a&gt;
 to Maven Central with Github Actions. It is a 2025 update of the &lt;a href="https://foojayio.github.io/website/today/how-to-release-a-java-module-with-jreleaser-to-maven-central-with-github-actions/"&gt;foojay.io/today/how-to-release-a-java-module-with-jreleaser-to-maven-central-with-github-actions&lt;/a&gt;
 article.&lt;/p&gt;
&lt;p&gt;JReleaser is a tool that streamlines the release process for Java projects, allowing developers to quickly and efficiently publish their modules to Maven Central.&lt;/p&gt;
&lt;p&gt;This article will use the &lt;a href="https://github.com/jagodevreede/semver-check/" title="SemVer Check project" target="_blank" rel="noopener noreferrer"&gt;SemVer Check project&lt;/a&gt;
 as an example project that uses Maven as a build tool.&lt;/p&gt;</description></item><item><title>Building Java Microservices with the Repository Pattern</title><link>https://foojayio.github.io/website/today/building-java-microservices-with-the-repository-pattern/</link><pubDate>Thu, 11 Dec 2025 23:19:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-java-microservices-with-the-repository-pattern/</guid><description>&lt;h3 id="h3-0-what-you-ll-learn"&gt;What you&amp;rsquo;ll learn&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;How the MongoDB Spring repository can be used to abstract MongoDB operations&lt;/li&gt;
&lt;li&gt;Ensuring data access is separate from core application logic&lt;/li&gt;
&lt;li&gt;Why you should avoid save() and saveAll() functions in Spring&lt;/li&gt;
&lt;li&gt;Why schema and index design still matters in this case&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The repository pattern is a design method that allows for abstraction between business logic and the data of an application. This allows for retrieving and saving/updating objects without exposing the technical details of how that data is stored in the main application. In this blog, we will use Spring Boot with MongoDB in order to create a repository pattern-based application.&lt;/p&gt;</description></item><item><title>First Experiments with Java on the LattePanda IOTA: An Alternative to Raspberry Pi?</title><link>https://foojayio.github.io/website/today/first-experiments-with-java-on-the-lattepanda-iota/</link><pubDate>Thu, 11 Dec 2025 09:13:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/first-experiments-with-java-on-the-lattepanda-iota/</guid><description>&lt;p&gt;After years of experimenting with Raspberry Pi boards, Java, JavaFX, and &lt;a href="https://www.pi4j.com/" target="_blank" rel="noopener noreferrer"&gt;Pi4J&lt;/a&gt;
 to control electronics, I wanted to explore whether my knowledge and experience could be applied to similar boards from other providers. There are many alternatives available these days, based on ARM, Intel processors, and RISC-V architectures.&lt;/p&gt;
&lt;p&gt;I reached out to several suppliers to see if I could get evaluation copies, and I&amp;rsquo;m happy to share that I received my first box from DFRobot containing the &lt;a href="https://www.dfrobot.com/product-2989.html" target="_blank" rel="noopener noreferrer"&gt;&lt;strong&gt;LattePanda IOTA&lt;/strong&gt;&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Spring Boot 4 - OpenTelemetry Guide</title><link>https://foojayio.github.io/website/today/spring-boot-4-opentelemetry-explained/</link><pubDate>Wed, 10 Dec 2025 09:09:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-4-opentelemetry-explained/</guid><description>&lt;p&gt;In my previous &lt;a href="https://foojayio.github.io/website/today/preparing-for-spring-framework-7-and-spring-boot-4/"&gt;article&lt;/a&gt;
, I outlined a comprehensive list of features introduced in Spring Framework 7 and Spring Boot 4.&lt;/p&gt;
&lt;p&gt;In this series of articles, we will explore these features in detail using a pragmatic approach. In this second article, I will dive deep into integration of Observability framework i.e., &lt;em&gt;&lt;strong&gt;OpenTelemetry with SpringBoot&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;As an architect and developer, when I engage in system design&amp;mdash;whether it involves monolithic architecture, microservices, or contemporary cloud-native applications&amp;mdash;I have made the integration of &lt;strong&gt;observability&lt;/strong&gt; patterns utilizing &lt;strong&gt;open-telemetry&lt;/strong&gt; tools a standard practice. Through observability, we can monitor application behavior via &lt;strong&gt;metrics, logs, and traces&lt;/strong&gt; that we trigger&lt;/p&gt;</description></item><item><title>Optimizing MongoDB Queries in Java Applications</title><link>https://foojayio.github.io/website/today/optimizing-mongodb-queries-in-java-applications/</link><pubDate>Tue, 09 Dec 2025 17:45:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/optimizing-mongodb-queries-in-java-applications/</guid><description>&lt;p&gt;Modern Java applications often struggle with performance bottlenecks that have little to do with the JVM itself. In most cases, the culprit lies deeper in how the application interacts with its database. Slow queries, missing indexes, or inefficient access patterns can quietly degrade user experience, increase latency, and inflate infrastructure costs. MongoDB, known for its flexibility and document-oriented design, can deliver remarkable performance when used correctly. However, that performance can quickly diminish when queries and indexes are not aligned with real-world access patterns.&lt;/p&gt;</description></item><item><title>Java, What's Old? Part III - I/O</title><link>https://foojayio.github.io/website/today/java-whats-old-part-iii-i-o/</link><pubDate>Tue, 09 Dec 2025 08:23:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-whats-old-part-iii-i-o/</guid><description>&lt;p&gt;After Java, &lt;a href="https://foojayio.github.io/website/today/java-whats-old-part-i-collections/"&gt;What&amp;rsquo;s Old? Part I: Collections&lt;/a&gt;
 and &lt;a href="https://foojayio.github.io/website/today/java-whats-old-part-ii-utils/"&gt;Java, What&amp;rsquo;s Old? Part II: Utils&lt;/a&gt;
, let&amp;rsquo;s now have a look at less-known old input/output classes of the JDK that can still be useful.&lt;/p&gt;
&lt;p&gt;Everything in this series will be in Java 8 and later, so after reading this article, you will be able to use it in your projects.&lt;/p&gt;
&lt;h2 id="h2-0-scanner"&gt;Scanner&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html" target="_blank" rel="noopener noreferrer"&gt;Scanner&lt;/a&gt;
 is a class in &lt;code&gt;java.util&lt;/code&gt; package that helps you parse files and input stream.&lt;/p&gt;</description></item><item><title>Java 25: What's New?</title><link>https://foojayio.github.io/website/today/java-25-whats-new/</link><pubDate>Wed, 03 Dec 2025 09:02:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-25-whats-new/</guid><description>&lt;p&gt;&lt;em&gt;This article was first published in my personal blog: &lt;a href="https://www.loicmathieu.fr/wordpress/informatique/java-25-whats-new/" target="_blank" rel="noopener noreferrer"&gt;Java 25: What&amp;rsquo;s new?&lt;/a&gt;
 and is part of a serie on &lt;a href="//www.loicmathieu.fr/wordpress/tag/whatsnew/" target="_blank" rel="noopener noreferrer"&gt;what&amp;rsquo;s new on the last versions of Java&lt;/a&gt;
.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Now that Java 25 is out, it&amp;rsquo;s time to walk through all the functionalities that bring to us, developers, this new version.&lt;/p&gt;
&lt;p&gt;Java 25 is the new Long-Term Support (LTS) version, containing no less than 18 JEPs. Even if this isn&amp;rsquo;t as good as the 24 JEPs in Java 24, it&amp;rsquo;s still a pretty significant number. No big news on the program, but a number of nice little ones anyway.&lt;/p&gt;</description></item><item><title>Atlas Searching with the Java Driver</title><link>https://foojayio.github.io/website/today/atlas-searching-with-the-java-driver/</link><pubDate>Tue, 02 Dec 2025 17:28:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/atlas-searching-with-the-java-driver/</guid><description>&lt;p&gt;Dear fellow developer, welcome!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.mongodb.com/atlas/search/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=atlas-search-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;Atlas Search&lt;/a&gt;
 is a full-text search engine embedded in MongoDB Atlas that gives you a seamless, scalable experience for building relevance-based app features. Built on Apache Lucene, Atlas Search eliminates the need to run a separate search system alongside your database. The gateway to Atlas Search is the $search aggregation pipeline stage.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://www.mongodb.com/docs/atlas/atlas-search/query-syntax/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=atlas-search-foojay&amp;amp;utm_term=tony.kim#std-label-search-agg-pipeline" target="_blank" rel="noopener noreferrer"&gt;$search&lt;/a&gt;
 stage, as one of the newest members of the &lt;a href="https://www.mongodb.com/docs/manual/core/aggregation-pipeline/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=atlas-search-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;MongoDB aggregation pipeline&lt;/a&gt;
 family, has gotten native, convenient support added to various language drivers. Driver support helps developers build concise and readable code. This article delves into using the Atlas Search support built into the MongoDB Java driver, where we&amp;rsquo;ll see how to use the driver, how to handle `$search` features that don&amp;rsquo;t yet have native driver convenience methods or have been released after the driver was released, and a glimpse into Atlas Search relevancy scoring. Let&amp;rsquo;s get started!&lt;/p&gt;</description></item><item><title>BoxLang RSS : Full-Featured RSS/Atom Feed Module for BoxLang</title><link>https://foojayio.github.io/website/today/boxlang-rss-full-featured-rss-atom-feed-module-for-boxlang/</link><pubDate>Tue, 02 Dec 2025 11:19:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-rss-full-featured-rss-atom-feed-module-for-boxlang/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-rss-full-featured-rss-atom-feed-module-for-boxlang/bx-rss-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re thrilled to announce the release of &lt;code&gt;bx-rss&lt;/code&gt;, a comprehensive RSS and Atom feed module that brings powerful syndication capabilities to &lt;a href="https://www.boxlang.io/#" title="BoxLang" target="_blank" rel="noopener noreferrer"&gt;BoxLang&lt;/a&gt;
! Whether you&amp;rsquo;re building a content aggregator, publishing a podcast, or exposing your application&amp;rsquo;s data as feeds, &lt;code&gt;bx-rss&lt;/code&gt; makes it incredibly simple.&lt;/p&gt;
&lt;h2 id="h2-0-thanks-to-ray-camden"&gt;Thanks To Ray Camden&lt;/h2&gt;
&lt;p&gt;I just want to thank you to &lt;a href="https://www.raymondcamden.com/" title="Ray Camden" target="_blank" rel="noopener noreferrer"&gt;Ray Camden&lt;/a&gt;
 for his contributions to this module. Thanks Ray! You rock!&lt;/p&gt;
&lt;h2 id="h2-1-why-bx-rss"&gt;Why bx-rss?&lt;/h2&gt;
&lt;p&gt;In today&amp;rsquo;s interconnected web, RSS and Atom feeds remain crucial for content distribution and syndication. From blog posts and news articles to podcasts and video channels, feeds power how content flows across the internet. The bx-rss module brings enterprise-grade feed capabilities to BoxLang with an elegant, easy-to-use API.&lt;/p&gt;</description></item><item><title>From Spring Boot To Jakarta EE 11</title><link>https://foojayio.github.io/website/today/from-spring-boot-to-jakarta-ee-11-how-payara-starter-eases-the-transition/</link><pubDate>Fri, 28 Nov 2025 08:11:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/from-spring-boot-to-jakarta-ee-11-how-payara-starter-eases-the-transition/</guid><description>&lt;p&gt;If you&amp;rsquo;ve been living in the Spring ecosystem, you&amp;rsquo;re used to fast project setup. Spring Initializr gives you a sleek interface, some starter dependencies and a running project within minutes. Now you&amp;rsquo;re moving to Jakarta EE, where do you begin?&lt;/p&gt;
&lt;p&gt;In this blog, you&amp;rsquo;ll see how Spring developers &lt;strong&gt;can create Jakarta EE applications with the same ease they&amp;rsquo;re used to from Spring Initializr.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s be honest: Spring Boot abstracts away so much of the setup pain that you forget it&amp;rsquo;s even there. You don&amp;rsquo;t worry about the underlying servlet container, dependency versions or deployment descriptors, as Spring Boot handles it all.&lt;/p&gt;</description></item><item><title>JC-AI Newsletter #10</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-10/</link><pubDate>Wed, 26 Nov 2025 18:39:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-10/</guid><description>&lt;p&gt;&lt;strong&gt;F&lt;/strong&gt;ourteen days have passed, and it is time to present a fresh collection of readings that could influence developments in the field of artificial intelligence.&lt;/p&gt;
&lt;p&gt;This newsletter focuses on examining how agentic AI systems improve accuracy, tutorials on agentic system architecture, and importnat security challenges arising from increased not only from agentic AI systems adoption. This edition of the AI newsletter includes compelling discussions and interviews about the future of AI and approaches.&lt;/p&gt;</description></item><item><title>The Visitor Pattern - 'Revisited' using Data Oriented Programming techniques</title><link>https://foojayio.github.io/website/today/the-visitor-pattern-revisited-using-data-oriented-programming-techniques/</link><pubDate>Wed, 26 Nov 2025 10:38:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-visitor-pattern-revisited-using-data-oriented-programming-techniques/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Design patterns are great, they standardize solutions for common programming problems so you don&amp;rsquo;t shoot yourself in the foot or reinvent the wheel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;However, some might argue that some design patterns only exist in a programming language because that language lacks a way to elegantly and efficiently express it in its syntax.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For example, the &lt;a href="https://en.wikipedia.org/wiki/Strategy_pattern" target="_blank" rel="noopener noreferrer"&gt;Strategy pattern&lt;/a&gt;
 is a design pattern that enables selecting algorithms at runtime. Taking the example of different &lt;em&gt;strategies&lt;/em&gt; of tax calculation, let&amp;rsquo;s see what an implementation looked like &lt;em&gt;before&lt;/em&gt; java 8:&lt;/p&gt;</description></item><item><title>The Art of Performance Tuning: Why Saving 30% in the Cloud Means Nothing if Your Code Wastes 1000× More</title><link>https://foojayio.github.io/website/today/the-art-of-performance-tuning-why-saving-30-in-the-cloud-means-nothing-if-your-code-wastes-1000x-more/</link><pubDate>Tue, 25 Nov 2025 06:46:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-art-of-performance-tuning-why-saving-30-in-the-cloud-means-nothing-if-your-code-wastes-1000x-more/</guid><description>&lt;h2 id="h2-0-the-hidden-cost-of-good-enough-code"&gt;The Hidden Cost of &amp;ldquo;Good Enough&amp;rdquo; Code&lt;/h2&gt;
&lt;p&gt;A few weeks ago, Kirk Pepperdine published a fascinating performance challenge &amp;mdash; a small Java code snippet that appeared trivial but produced puzzling runtime behavior.&lt;/p&gt;
&lt;p&gt;He invited readers to take a shot at solving it. If you haven&amp;rsquo;t seen it yet, stop here for a moment and try it yourself &amp;mdash; and when you&amp;rsquo;re done, check his Kirk&amp;rsquo;s official solution&lt;/p&gt;
&lt;p&gt;When I saw it, I thought it would be a fun exercise to revisit some fundamentals &amp;mdash; but the deeper I went, the more I realized it wasn&amp;rsquo;t just about performance. It was about how we think.&lt;/p&gt;</description></item><item><title>Foojay Podcast 83: OpenJDK Evolutions plus Tips and Tricks</title><link>https://foojayio.github.io/website/today/foojay-podcast-83/</link><pubDate>Mon, 24 Nov 2025 06:07:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-83/</guid><description>&lt;p&gt;Welcome to another episode of the Foojay Podcast! Just like in the previous episode, I bring you conversations from two of Europe&amp;rsquo;s premier Java conferences - Devoxx in Belgium and JFall in the Netherlands.&lt;/p&gt;
&lt;p&gt;At these conferences, I had the opportunity to speak with members of the Java community about topics ranging from the evolution of Java itself to mobile development, performance optimization, and even automotive security.&lt;/p&gt;
&lt;p&gt;My first guest is Johan Vos, a Java Champion who takes us on a journey through Java&amp;rsquo;s history - from porting Java to Linux in 1995 to his current work on bringing Java and JavaFX to mobile and embedded devices through the Java On Mobile project.&lt;/p&gt;</description></item><item><title>Goodbye Payara Community 6, welcome Payara Community 7</title><link>https://foojayio.github.io/website/today/goodbye-payara-community-6-on-to-the-next-chapter-with-payara-community-7/</link><pubDate>Thu, 20 Nov 2025 16:00:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/goodbye-payara-community-6-on-to-the-next-chapter-with-payara-community-7/</guid><description>&lt;p&gt;With the November 2025 release, Payara community reached an important milestone. Payara Platform Community 6 &lt;a href="https://payara.fish/blog/whats-new-in-the-payara-platform-november-2025-release/" title="received its final update" target="_blank" rel="noopener noreferrer"&gt;received its final update&lt;/a&gt;
 , marking the official end of community support for the 6.x line. At the same time, we introduced Payara Platform Community 7, a new generation of the platform built for Jakarta EE 11 and modern cloud native development.&lt;/p&gt;
&lt;p&gt;See what this transition means and how it benefits Java and Jakarta EE developers today and long term.&lt;/p&gt;</description></item><item><title>Service Layer Pattern in Java With Spring Boot</title><link>https://foojayio.github.io/website/today/service-layer-pattern-in-java-with-spring-boot/</link><pubDate>Tue, 18 Nov 2025 14:40:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/service-layer-pattern-in-java-with-spring-boot/</guid><description>&lt;p&gt;In modern software design, it is important to develop code that is clean and maintainable. One way developers do this is using the &lt;strong&gt;Service Layer pattern&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="h2-0-what-you-ll-learn"&gt;What you&amp;rsquo;ll learn&lt;/h2&gt;
&lt;p&gt;In this article, you&amp;rsquo;ll learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What the Service Layer pattern is and why it matters.&lt;/li&gt;
&lt;li&gt;How it fits with the MVC architecture.&lt;/li&gt;
&lt;li&gt;How to implement it in a real Spring Boot application.&lt;/li&gt;
&lt;li&gt;How to add MongoDB with minimal code.&lt;/li&gt;
&lt;li&gt;Best practices and common mistakes to avoid.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-1-what-is-the-service-layer-pattern"&gt;What is the Service Layer pattern?&lt;/h2&gt;
&lt;p&gt;The Service Layer pattern is an architectural pattern that defines an application&amp;rsquo;s boundary with a layer of services that establishes a set of available operations and coordinates the application&amp;rsquo;s response in each operation.&lt;/p&gt;</description></item><item><title>Foojay Podcast #82: OpenJDK Projects (Leyden, Babylon, Panama) and TornadoVM</title><link>https://foojayio.github.io/website/today/foojay-podcast-82/</link><pubDate>Mon, 17 Nov 2025 07:35:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-82/</guid><description>&lt;p&gt;In this Foojay Podcast, we&amp;rsquo;re diving deep into some of the most exciting developments happening within the OpenJDK and TornadoVM projects.&lt;/p&gt;
&lt;p&gt;At the Devoxx and JFall conferences, we spoke with several speakers and visitors about some of the major themes shaping the future of Java development. The first guest is Moritz Halbritter from the Spring Engineering team. He provides us with more insights into Project Leyden and how it&amp;rsquo;s improving Java startup times through ahead-of-time compilation and profiling. We&amp;rsquo;ll learn how Spring Boot developers can already take advantage of these improvements today.&lt;/p&gt;</description></item><item><title>Micrometer &amp; Prometheus in Spring Boot: Kafka Burger Orders</title><link>https://foojayio.github.io/website/today/micrometer-prometheus-in-spring-boot-kafka-burger-orders/</link><pubDate>Fri, 14 Nov 2025 10:13:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/micrometer-prometheus-in-spring-boot-kafka-burger-orders/</guid><description>&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/eSreg0xPGqo?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;br /&gt;
&lt;p&gt;👨‍💻 GitHub: &lt;a href="https://github.com/vinny59200/dukeburger" target="_blank" rel="noopener noreferrer"&gt;https://github.com/vinny59200/dukeburger&lt;/a&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;🔵⚪⚪⚪⚪⚪⚪⚪⚪⚪⚪⚪&lt;/p&gt;
&lt;p&gt;This guide shows how to use &lt;strong&gt;Micrometer and Prometheus in Spring Boot&lt;/strong&gt; to track a custom metric for a Kafka-driven Burger Orders app. You&amp;rsquo;ll post a burger order to a REST endpoint, publish it to Kafka, consume the topic, and increment a counter for all &amp;ldquo;DukeBurger&amp;rdquo; orders. Copy the snippets, run, and you&amp;rsquo;ll see your metric on &lt;code&gt;/actuator/prometheus&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Beyond Keywords: Hybrid Search With Atlas and Vector Search (Part 3)</title><link>https://foojayio.github.io/website/today/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/</link><pubDate>Thu, 13 Nov 2025 13:56:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/</guid><description>&lt;p&gt;Bringing together semantic vectors and exact keyword matching with $rankFusion&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve been following along this series, you already know we started by giving our movie search app the ability to understand meaning&amp;mdash;not just keywords&amp;mdash;using semantic search, as discussed in &lt;a href="https://foojayio.github.io/website/today/beyond-keywords-implementing-semantic-search-in-java-with-spring-data-part-1/"&gt;&lt;em&gt;Part 1: Implementing Semantic Search in Java With Spring Data&lt;/em&gt;&lt;/a&gt;
. Then, we made it even smarter by adding filters and optimizing performance with embedding strategies in &lt;a href="https://foojayio.github.io/website/today/beyond-keywords-optimizing-vector-search-with-filters-and-caching-part-2/"&gt;&lt;em&gt;Part 2: Optimizing Vector Search With Filters and Caching&lt;/em&gt;&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>JC-AI Newsletter #9</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-9/</link><pubDate>Wed, 12 Nov 2025 15:21:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-9/</guid><description>&lt;p&gt;&lt;strong&gt;F&lt;/strong&gt;ourteen days have passed, and it is time to present a fresh collection of readings that could influence developments in the field of artificial intelligence.&lt;/p&gt;
&lt;p&gt;This newsletter focuses on examining how AI enhances productivity through enterprise studies, tutorial, agentic system architecture, GraphRAG, evaluating risk methodologies in agentic systems, and the security challenges arising from increased AI-LLM adoption. This edition of the AI newsletter includes a compelling discussion between six of the most influential leaders in artificial intelligence, along with additional content.&lt;/p&gt;</description></item><item><title>A Guide to SonarQube MCP Server on IntelliJ</title><link>https://foojayio.github.io/website/today/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/</link><pubDate>Fri, 07 Nov 2025 17:00:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/</guid><description>&lt;p&gt;Hey Java devs! 👋 Ever feel like you&amp;rsquo;re drowning in a sea of code, trying to keep it reliable,, efficient, and secure? We&amp;rsquo;ve all been there. Juggling new features, bug fixes, and pull requests is a daily grind. But what if you had an AI-powered assistant to help you out? That&amp;rsquo;s where the &lt;a href="https://github.com/SonarSource/sonarqube-mcp-server" target="_blank" rel="noopener noreferrer"&gt;&lt;strong&gt;SonarQube MCP Server&lt;/strong&gt;&lt;/a&gt;
 comes in. Let&amp;rsquo;s dive into how this cool new MCP can supercharge your daily coding routine. 🚀&lt;/p&gt;</description></item><item><title>Modeling Relationships With Hibernate ORM and MongoDB</title><link>https://foojayio.github.io/website/today/modeling-relationships-with-hibernate-orm-and-mongodb/</link><pubDate>Tue, 04 Nov 2025 17:08:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/modeling-relationships-with-hibernate-orm-and-mongodb/</guid><description>&lt;p&gt;In the&lt;a href="https://foojayio.github.io/website/today/getting-started-with-hibernate-orm-and-mongodb/"&gt;previous article&lt;/a&gt;
&amp;mdash;&lt;em&gt;Getting Started With Hibernate ORM and MongoDB&lt;/em&gt;&amp;mdash;we learned how to configure Hibernate to work with MongoDB, create an entity, and perform basic CRUD operations using the familiar Hibernate API.&lt;/p&gt;
&lt;p&gt;If you haven&amp;rsquo;t read that first part yet, I recommend starting there before continuing. It covers the project setup, dependencies, and the fundamentals that we&amp;rsquo;ll build upon here.&lt;/p&gt;
&lt;p&gt;In this second part, we&amp;rsquo;ll &lt;strong&gt;extend our application&lt;/strong&gt; to model relationships between entities&amp;mdash;introducing a Review entity and linking it to our existing Book class. This will allow us to explore more advanced capabilities of the MongoDB Hibernate integration, including:&lt;/p&gt;</description></item><item><title>Getting Started With Hibernate ORM and MongoDB</title><link>https://foojayio.github.io/website/today/getting-started-with-hibernate-orm-and-mongodb/</link><pubDate>Tue, 04 Nov 2025 17:06:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/getting-started-with-hibernate-orm-and-mongodb/</guid><description>&lt;p&gt;For years, &lt;a href="https://hibernate.org/" target="_blank" rel="noopener noreferrer"&gt;Hibernate&lt;/a&gt;
 ORM has been one of the most popular frameworks in the Java ecosystem. It was built to simplify data persistence by letting developers work with Java objects instead of SQL statements, a technique known as &lt;em&gt;object-relational mapping (ORM)&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Traditionally, Hibernate ORM has been tightly associated with relational databases like PostgreSQL, MySQL, and Oracle. It manages connections, transactions, and entity state behind the scenes, and even provides &lt;strong&gt;Hibernate Query Language (HQL)&lt;/strong&gt; so you can query your data using Java entity names rather than table names.&lt;/p&gt;</description></item><item><title>Let's create an AI MCP server with Quarkus</title><link>https://foojayio.github.io/website/today/lets-talk-about-mcp/</link><pubDate>Mon, 03 Nov 2025 10:15:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/lets-talk-about-mcp/</guid><description>&lt;h2 id="h2-0-hey-java-devs-let-s-talk-about-ai-mcp"&gt;&lt;strong&gt;Hey Java Devs, Let&amp;rsquo;s Talk About AI MCP! 🤖&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Ever feel like your AI models are stuck in a bubble, cut off from the real-time data and tools they need to be truly useful? Well, you&amp;rsquo;re not alone! This has been a major headache for developers. But what if I told you there&amp;rsquo;s a new sheriff in town that&amp;rsquo;s changing the game? Enter the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="h3-1-so-what-s-the-big-deal-with-mcp"&gt;&lt;strong&gt;So, What&amp;rsquo;s the Big Deal with MCP?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Think of MCP as a universal translator for your AI. It&amp;rsquo;s an open standard that lets AI assistants, like large language models (LLMs), seamlessly connect with external data sources, tools, and just about any environment you can think of. No more building custom, one-off integrations for every single tool and data source. With MCP, you create a standardized way for your AI to talk to the outside world. Pretty neat, huh? 😉&lt;/p&gt;</description></item><item><title>JC-AI Newsletter #8</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-8/</link><pubDate>Thu, 30 Oct 2025 06:36:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-8/</guid><description>&lt;p&gt;&lt;strong&gt;Fourteen days have passed, and it is time to present a fresh collection of readings that could influence developments in the field of artificial intelligence.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This newsletter focuses on examining how AI enhances productivity through enterprise studies, agentic system architecture, attack vectors, Model Context Protocol (MCP) implementation, Agent-to-Agent (A2A) protocol, Java code generation within IDEs, LLM benchmarking methodologies, and the security challenges arising from increased AI-LLM adoption.&lt;/p&gt;
&lt;p&gt;The world influenced by LLM is changing very quickly, let&amp;rsquo;s start&amp;hellip;&lt;/p&gt;</description></item><item><title>Spring Framework 7 API Versioning Explained</title><link>https://foojayio.github.io/website/today/explore-spring-framework-7-features-api-versioning/</link><pubDate>Wed, 29 Oct 2025 06:45:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/explore-spring-framework-7-features-api-versioning/</guid><description>&lt;p&gt;In my previous &lt;a href="https://foojayio.github.io/website/today/preparing-for-spring-framework-7-and-spring-boot-4/"&gt;article&lt;/a&gt;
, I outlined a comprehensive list of features introduced in Spring Framework 7 and Spring Boot 4.&lt;/p&gt;
&lt;p&gt;In this series of articles, we will explore these features in detail using a pragmatic approach. To begin, I will deep dive into the &lt;em&gt;&lt;strong&gt;API&lt;/strong&gt;&lt;/em&gt; &lt;em&gt;&lt;strong&gt;versioning&lt;/strong&gt;&lt;/em&gt; feature introduced in Spring Framework 7.
&lt;img src="https://foojayio.github.io/website/today/explore-spring-framework-7-features-api-versioning/Sb4version_1.png" alt="API Versioning" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Any architectural or feature change stems from evolving business requirements, and API versioning is no exception. In today&amp;rsquo;s app-driven ecosystem, APIs are central to product integration and user experience.&lt;/p&gt;</description></item><item><title>Certified for the Future: Jakarta EE 11 with Payara Platform</title><link>https://foojayio.github.io/website/today/leading-the-way-payara-platform-community-7-beta-now-fully-jakarta-ee-11-certified/</link><pubDate>Fri, 24 Oct 2025 06:39:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/leading-the-way-payara-platform-community-7-beta-now-fully-jakarta-ee-11-certified/</guid><description>&lt;p&gt;&lt;strong&gt;We&amp;rsquo;re excited to announce that Payara Platform Community 7 Beta application server is now fully certified as Jakarta EE 11 compatible for the Web, Platform and Core Profiles.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This milestone makes Payara the first vendor to achieve full Jakarta EE 11 certification across all profiles, underscoring our commitment to delivering an innovative, production-ready runtime for the enterprise Java community.&lt;/p&gt;
&lt;p&gt;The Jakarta EE 11 certification was achieved by successfully passing the Jakarta EE Technology Compatibility Kit (TCK), also referred to as the Compatibility Test Suite (CTS). This verifies that an implementation conforms to the Jakarta EE specifications across all profiles.&lt;/p&gt;</description></item><item><title>Beyond Keywords: Optimizing Vector Search with Filters and Caching (Part 2)</title><link>https://foojayio.github.io/website/today/beyond-keywords-optimizing-vector-search-with-filters-and-caching-part-2/</link><pubDate>Thu, 23 Oct 2025 15:44:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/beyond-keywords-optimizing-vector-search-with-filters-and-caching-part-2/</guid><description>&lt;p&gt;Enhancing precision with pre-filters and reducing costs with embedding caching&lt;/p&gt;
&lt;p&gt;Welcome back! If you landed here without reading &lt;a href="https://foojayio.github.io/website/today/beyond-keywords-implementing-semantic-search-in-java-with-spring-data-part-1/"&gt;&lt;em&gt;Part 1: Beyond Keywords: Implementing Semantic Search in Java With Spring Data&lt;/em&gt;&lt;/a&gt;
, I recommend going back and checking it first so the steps in this article make more sense in sequence.&lt;/p&gt;
&lt;p&gt;This is the second part of a &lt;strong&gt;three-part series&lt;/strong&gt; where we&amp;rsquo;re building a movie search application. So far, our app supports &lt;strong&gt;semantic search&lt;/strong&gt; using vector queries with Spring Data and Voyage AI. In this article, we&amp;rsquo;ll take things further:&lt;/p&gt;</description></item><item><title>Beyond Keywords: Implementing Semantic Search in Java With Spring Data (Part 1)</title><link>https://foojayio.github.io/website/today/beyond-keywords-implementing-semantic-search-in-java-with-spring-data-part-1/</link><pubDate>Thu, 16 Oct 2025 13:39:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/beyond-keywords-implementing-semantic-search-in-java-with-spring-data-part-1/</guid><description>&lt;p&gt;Building a semantic movie search app with embeddings and vector queries&lt;/p&gt;
&lt;p&gt;Have you ever tried to search for something such as a product, a song, or a movie but couldn&amp;rsquo;t quite remember its exact name? Maybe you recall only a clue&amp;mdash;a desert pyramid, a short melody, or &amp;ldquo;that ship that hit an iceberg.&amp;rdquo; Keyword search struggles with that. Vector search doesn&amp;rsquo;t: It lets you search by meaning.&lt;/p&gt;
&lt;p&gt;It works by turning text into embeddings, vectors (arrays of numbers) that capture semantic similarity, so results are ranked by what they mean, not just what they say.&lt;/p&gt;</description></item><item><title>7 habits of Highly Effective Java Coding</title><link>https://foojayio.github.io/website/today/7-habits-of-highly-effective-java-coding/</link><pubDate>Wed, 15 Oct 2025 11:25:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/7-habits-of-highly-effective-java-coding/</guid><description>&lt;h3 id="h3-0-from-ai-user-to-ai-pro"&gt;&lt;strong&gt;From AI User to AI Pro&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s be real, AI coding tools are everywhere now. 🤖 They&amp;rsquo;re no longer some shiny new toy&amp;mdash;they&amp;rsquo;re a part of our daily grind as developers, just like our morning coffee. ☕&lt;/p&gt;
&lt;p&gt;For us Java devs, whether we&amp;rsquo;re wrestling with a giant legacy app or juggling a bunch of microservices, these tools look like a huge win for getting stuff done faster. 🚀&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s the catch: just coding faster isn&amp;rsquo;t the whole story. If you&amp;rsquo;re not careful, it can actually lead to bigger problems down the road. 🤔&lt;/p&gt;</description></item><item><title>JC-AI Newsletter #7</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-7/</link><pubDate>Tue, 14 Oct 2025 05:35:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-7/</guid><description>&lt;p&gt;&lt;strong&gt;Fourteen days have passed, and it is time to present a fresh collection of readings that could influence developments in the field of artificial intelligence.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Beyond focused tutorials that can enhance your understanding of AI applications, this newsletter concentrates on Hallucination, Java Code Generation, Testing, Agentic System Architecture and LLM benchmarking methodologies designed to ensure models accuracy and competency in handling complex contextual information.&lt;/p&gt;
&lt;p&gt;The world influenced by LLM is changing very quickly, let&amp;rsquo;s start&amp;hellip;&lt;/p&gt;</description></item><item><title>Take the State of Java 2025 Survey</title><link>https://foojayio.github.io/website/today/take-the-state-of-java-2025-survey/</link><pubDate>Mon, 06 Oct 2025 12:23:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/take-the-state-of-java-2025-survey/</guid><description>&lt;p&gt;Do you want to know which Java JDK distribution is used where for what and when? The time has come again to take the State of Java Survey and share insights while gaining Java ecosystem knowledge.&lt;/p&gt;
&lt;p&gt;All those participating will get the complete research, which can be of great benefit in your technology choices in the Java ecosystem.&lt;/p&gt;
&lt;p&gt;Click the image below to get started:
&lt;a href="https://survey.alchemer.com/s3/8466906/Azul-State-of-Java-Survey" target="_blank" rel="noopener noreferrer"&gt;&lt;img src="https://foojayio.github.io/website/today/take-the-state-of-java-2025-survey/which-1024x387.png" alt="" loading="lazy"&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Or simply click this link:&lt;/p&gt;</description></item><item><title>Ai4Devs Amsterdam: Successful Inaugural Developer-Focused AI Conference</title><link>https://foojayio.github.io/website/today/ai4devs-amsterdam-successful-inaugural-developer-focused-ai-conference/</link><pubDate>Fri, 03 Oct 2025 09:37:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/ai4devs-amsterdam-successful-inaugural-developer-focused-ai-conference/</guid><description>&lt;p&gt;&lt;strong&gt;The &lt;a href="https://amsterdam.ai4devs.io/" target="_blank" rel="noopener noreferrer"&gt;inaugural AI4Devs conference in Amsterdam&lt;/a&gt;
, held recently Friday 19 September, a collaboration between Java Champion Jonathan Vila, &lt;a href="https://www.iodigital.com/en" target="_blank" rel="noopener noreferrer"&gt;local developer agency IO Digital&lt;/a&gt;
 (in particular Joost Kaan, Arno Koehler, and Michel Blankenstein), and the Friends of OpenJDK (Foojay.io), proved to be a resounding success, bringing together approximately 200 developers at Amsterdam&amp;rsquo;s iO Digital Campus.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ING, Azul, Qodo, and ContentStack&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Co-sponsored and co-organized with ING and Azul, together with Qodo and ContentStack, the event featured standout keynote sessions from Josh Long, of SpringBoot fame, and Pratik Patel, from Azul, who delivered insights on AI in the context of Spring and on increasing the speed of Java-based applications, especially in the context of AI-oriented applications.
&lt;img src="https://foojayio.github.io/website/today/ai4devs-amsterdam-successful-inaugural-developer-focused-ai-conference/IMG_6230-1024x683.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Think in Graphs, Not Just Chains: JGraphlet for TaskPipelines</title><link>https://foojayio.github.io/website/today/think-in-graphs-not-just-chains-jgraphlet-for-taskpipelines/</link><pubDate>Thu, 02 Oct 2025 13:24:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/think-in-graphs-not-just-chains-jgraphlet-for-taskpipelines/</guid><description>&lt;h2 id="h2-0-let-s-dive-into-the-eight-core-principles-that-define-jgraphlet"&gt;&lt;strong&gt;&lt;strong&gt;JGraphlet is a tiny, zero-dependency Java library for building task pipelines. It uses a graph model where you define tasks as nodes and connect them to create simple or complex workflows (like fan-in/fan-out). It supports both asynchronous (default) and synchronous tasks, has a simple API, allows data sharing via a PipelineContext, and offers optional caching to avoid re-computing results.&lt;/strong&gt;&lt;/strong&gt;
**Its power comes not from a long list of features, but from a small set of core design principles that work together in harmony.
At the heart of JGraphlet is simplicity, backed by a Graph. Add Tasks to a pipeline and connect them to create your graph. Each &lt;code&gt;Task&lt;/code&gt; has an input and output. A &lt;code&gt;TaskPipeline&lt;/code&gt; builds and executes a pipeline while managing the I/O for each Task.
For example, a &lt;code&gt;Map&lt;/code&gt; for Fan-in, a &lt;code&gt;Record&lt;/code&gt; for your own data model, etc. A Task pipeline also has a way &lt;code&gt;PipelineContext&lt;/code&gt; to share data between Tasks, and Tasks can also be cached, so the computation doesn&amp;rsquo;t need to take place again and again.
You can choose how your Task pipeline flow should be, and you can decide whether it should be synchronous &lt;code&gt;SyncTask&lt;/code&gt; or asynchronous. By default, all Tasks are asynchronous.
Let&amp;rsquo;s dive into the eight core principles that define JGraphlet.&lt;/h2&gt;
&lt;h3 id="h3-1-1-a-graph-first-execution-model"&gt;1. A Graph-First Execution Model&lt;/h3&gt;
&lt;p&gt;JGraphlet treats your workflow as a Directed Acyclic Graph (DAG). You define tasks as nodes and explicitly draw the connections (edges) between them. This makes complex patterns like fan-out (one task feeding many) and fan-in (many tasks feeding one) natural.
&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>JC-AI Newsletter #6</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-6/</link><pubDate>Wed, 01 Oct 2025 17:18:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-6/</guid><description>&lt;p&gt;&lt;strong&gt;Fourteen days have passed, and it is time to present a fresh collection of readings that could influence developments in the field of artificial intelligence.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Beyond opinion pieces and Java focused tutorials that can enhance your understanding of AI applications, this newsletter concentrates on Hallucination, Security, RAG and LLM benchmarking methodologies designed to ensure models accuracy and competency in handling complex contextual information.&lt;/p&gt;
&lt;p&gt;The world influenced by LLM is changing very quickly, let&amp;rsquo;s start&amp;hellip;&lt;/p&gt;</description></item><item><title>Payara Server Maven Plugin + AI Agent</title><link>https://foojayio.github.io/website/today/boost-developer-productivity-with-payara-server-maven-plugin-ai-agent/</link><pubDate>Tue, 30 Sep 2025 08:43:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/boost-developer-productivity-with-payara-server-maven-plugin-ai-agent/</guid><description>&lt;h2 id="h2-0-managing-payara-server-just-got-smarter"&gt;Managing Payara Server Just Got Smarter&lt;/h2&gt;
&lt;p&gt;Imagine managing your Jakarta EE applications not just with Maven goals, but by asking natural questions.&lt;/p&gt;
&lt;p&gt;With the &lt;a href="http:/https://docs.payara.fish/community/docs/6.2025.5/Technical%20Documentation/Ecosystem/Project%20Management%20Tools/Maven%20Plugin/Payara%20Server%20Maven%20Plugin.html#ai-agent/" title="experimental AI Agent"&gt;experimental AI Agent&lt;/a&gt;
 built into the Payara Server Community&amp;rsquo;s Maven Plugin, you can now query server internals and perform admin tasks using plain English &amp;mdash; directly from the same terminal where you build and deploy your applications.&lt;/p&gt;
&lt;p&gt;Thanks to this integration, developers can inspect, query and even execute server commands using natural language. It&amp;rsquo;s a powerful and intuitive way to interact with Payara Server &amp;mdash; no need to remember long command syntax or dig through documentation.&lt;/p&gt;</description></item><item><title>Introduction to Data-Driven Testing with Java and MongoDB</title><link>https://foojayio.github.io/website/today/introduction-to-data-driven-testing-with-java-and-mongodb/</link><pubDate>Thu, 25 Sep 2025 13:53:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/introduction-to-data-driven-testing-with-java-and-mongodb/</guid><description>&lt;p&gt;As applications expand, the complexity of the rules they enforce also increases. In many systems, these rules are embedded within the data, primarily in database queries that filter, join, or compute based on real-world conditions. However, the tests for these queries are often shallow, repetitive, or, worse yet, completely absent. When there is an error in the database logic, the application may still compile successfully, but the business can suffer significant consequences.&lt;/p&gt;</description></item><item><title>Design Patterns Update to JDK25</title><link>https://foojayio.github.io/website/today/design-patterns-update-to-jdk25/</link><pubDate>Wed, 24 Sep 2025 11:29:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/design-patterns-update-to-jdk25/</guid><description>&lt;p&gt;&lt;strong&gt;T&lt;/strong&gt; he information technology landscape is changing rapidly. This is not only due to the utilization of AI and &lt;a href="https://foojayio.github.io/website/today/stochastic-ai-agility-breaking-cycles-of-debt/" title="new methodologies"&gt;new methodologies [8]&lt;/a&gt;
, or business requirements trying to keep up, but also because of the incremental complexity of expected solutions.&lt;/p&gt;
&lt;p&gt;Statistics and probability are slowly beginning to play a very important role in this evolution. The Java ecosystem has proven its maturity many times by delivering essential features that businesses require, although many may argue that these have been inspired by other existing solutions.&lt;/p&gt;</description></item><item><title>How to Kickstart Your Jakarta EE 11 Projects with Payara Starter</title><link>https://foojayio.github.io/website/today/how-to-kickstart-your-jakarta-ee-11-projects-with-payara-starter/</link><pubDate>Tue, 23 Sep 2025 10:26:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-kickstart-your-jakarta-ee-11-projects-with-payara-starter/</guid><description>&lt;p&gt;&lt;strong&gt;Jakarta EE 11 is here, bringing powerful new capabilities for enterprise Java developers. But getting started quickly can be a challenge - that&amp;rsquo;s where the latest Payara Starter comes in. With full Jakarta EE 11 support, an updated ERD-based code generator, and a new Jakarta Faces project generator, it gives you everything you need to launch your next application with ease.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With Jakarta EE 11 now &lt;a href="https://blog.payara.fish/jakarta-ee-11-is-here-and-its-ready-for-the-cloud" title="officially released" target="_blank" rel="noopener noreferrer"&gt;officially released&lt;/a&gt;
, you are likely eager to explore its new capabilities but setting up your first application may take longer than you want. That&amp;rsquo;s where the latest version of Payara Starter steps in, giving you a fast, hassle-free way to get a fully functional Jakarta EE 11 project up and running. Read more to learn how!&lt;/p&gt;</description></item><item><title>JC-AI Newsletter #5</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-5/</link><pubDate>Thu, 18 Sep 2025 07:19:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-5/</guid><description>&lt;h3 id="h3-0-fourteen-days-have-passed-and-it-is-time-to-present-a-fresh-collection-of-readings-that-could-influence-developments-in-the-field-of-artificial-intelligence"&gt;Fourteen days have passed, and it is time to present a fresh collection of readings that could influence developments in the field of artificial intelligence.&lt;/h3&gt;
&lt;p&gt;Beyond opinion pieces and Java focused tutorials that can enhance your understanding of AI applications, this newsletter concentrates on LLM benchmarking methodologies designed to ensure models accuracy and competency in handling complex contextual information.&lt;/p&gt;
&lt;p&gt;The world influenced by LLM is changing very quickly, let&amp;rsquo;s start&amp;hellip;&lt;/p&gt;</description></item><item><title>Here's Java 25, Ready to Perform to the Limit</title><link>https://foojayio.github.io/website/today/heres-java-25-ready-to-perform-to-the-limit/</link><pubDate>Tue, 16 Sep 2025 06:05:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/heres-java-25-ready-to-perform-to-the-limit/</guid><description>&lt;p&gt;It&amp;rsquo;s been six months since Java 24 was released, so it&amp;rsquo;s time for a fresh set of new Java features.&lt;/p&gt;
&lt;p&gt;And the feature that immediately grabs the attention this time is &lt;em&gt;stable values&lt;/em&gt;, taking Java&amp;rsquo;s support of immutability to the next level. Also, Java&amp;rsquo;s focus on improving performance intensifies, as more JEPs emerge from Project Leyden. On top of that, the Java Flight Recorder is now more equipped than ever to tackle performance issues!&lt;/p&gt;</description></item><item><title>Foojay Podcast #78: Welcome to OpenJDK 25!</title><link>https://foojayio.github.io/website/today/foojay-podcast-78/</link><pubDate>Mon, 15 Sep 2025 10:22:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-78/</guid><description>&lt;p&gt;We&amp;rsquo;re excited to present the first episode of the Foojay Podcast&amp;rsquo;s fifth season, marking the release of OpenJDK 25!&lt;/p&gt;
&lt;p&gt;For the first time, an OpenJDK release is aligned with the year, and we can welcome release 25 in 2025. As usual in the release podcast, I have my regular guest, Simon Ritter. And in this episode, we are joined by Balkrishna Rawool to talk about all the new features in this new OpenJDK version.&lt;/p&gt;</description></item><item><title>Research: Measuring Energy Consumption in Programming Languages for AI Applications</title><link>https://foojayio.github.io/website/today/research-measuring-energy-consumption-in-programming-languages-for-ai-applications/</link><pubDate>Mon, 15 Sep 2025 07:03:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/research-measuring-energy-consumption-in-programming-languages-for-ai-applications/</guid><description>&lt;p&gt;&lt;strong&gt;Decades ago, I contributed to a very interesting project called &lt;a href="https://sunspotdev.org/#" title="SunSPOT " target="_blank" rel="noopener noreferrer"&gt;SunSPOT&lt;/a&gt;
at SUN Microsystems. It was a small device with wireless connectivity, built-in sensors, running on Java (compatible with runtime 1.6), and powered by battery. It enabled the design of small applications and the connection of additional hardware, or simply the utilization of available sensors. Later, together with Markus Hirt, we created the &lt;a href="https://github.com/Robo4J/robo4j" title="Robo4j framework" target="_blank" rel="noopener noreferrer"&gt;Robo4j framework&lt;/a&gt;
. A small and lightweight Java framework that enables rapid assembly of robots or other IoT systems (JDK 21+). In Robo4j, we primarily used the&lt;a href="https://www.pi4j.com/blog/" title=" Pi4j project" target="_blank" rel="noopener noreferrer"&gt;Pi4j project&lt;/a&gt;
 for handling I/O operations on the Raspberry Pi platform with drivers created for specific hardware.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>MongoDB Schemas in Java</title><link>https://foojayio.github.io/website/today/mongodb-schemas-in-java/</link><pubDate>Thu, 11 Sep 2025 13:15:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/mongodb-schemas-in-java/</guid><description>&lt;p&gt;If (like me!) you prefer to read code rather than a long and boring article, jump straight to the example! TLDR; here&amp;rsquo;s the &lt;a href="https://github.com/luketn/mongodb-schemas-in-java" target="_blank" rel="noopener noreferrer"&gt;code&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;You can clone and run the tests like this:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;git clone https://github.com/luketn/mongodb-schemas-in-java&amp;nbsp;
cd mongodb-schemas-in-java&amp;nbsp;
mvn test&lt;/pre&gt;
&lt;p&gt;And if you want to play with the example API visually (like I do!) and you have a local Mongo or an Atlas Cluster with the &lt;a href="https://www.mongodb.com/docs/guides/atlas/sample-data/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=mongodb-schemas-java&amp;amp;utm_term=megan.grant" target="_blank" rel="noopener noreferrer"&gt;Weather Sample&lt;/a&gt;
 data, run:&lt;/p&gt;</description></item><item><title>Building REST APIs in Java with Spring Boot</title><link>https://foojayio.github.io/website/today/building-rest-apis-in-java-with-spring-boot/</link><pubDate>Tue, 09 Sep 2025 14:51:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-rest-apis-in-java-with-spring-boot/</guid><description>&lt;p&gt;REST has become the default choice for building web services, and for good reason. It&amp;rsquo;s straightforward to implement, easy for clients to consume, and built directly on top of the same principles of the web itself.&lt;/p&gt;
&lt;p&gt;HTTP already gives us well-defined methods (GET, POST, PUT, DELETE), built-in caching, redirect support, secure transport via TLS, and widespread tooling support across platforms. REST doesn&amp;rsquo;t reinvent the web&amp;mdash;it uses it.&lt;/p&gt;
&lt;p&gt;REST is not a protocol or a rigid standard. It&amp;rsquo;s a lightweight architectural approach that encourages scalable, evolvable, and interoperable services. Its creator, Roy Fielding, helped define many of the specs that underpin the web today.&lt;/p&gt;</description></item><item><title>JC-AI Newsletter #4</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-4/</link><pubDate>Tue, 02 Sep 2025 20:27:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-4/</guid><description>&lt;p&gt;14 days have passed and it&amp;rsquo;s time for a new batch of readings that could shape developments in the field of artificial intelligence.&lt;/p&gt;
&lt;p&gt;The current newsletter vol. 4 offers us a closer look at several different areas of artificial intelligence. We start with the topic of energy consumption and the environmental impact of systems serving artificial intelligence, and continue with automation, how we obtain data for RAG, robustness of GenAI systems, vibe-coding and more.&lt;/p&gt;</description></item><item><title>Copy of Queryable Encryption with Spring Data MongoDB: How to Query Encrypted Fields</title><link>https://foojayio.github.io/website/today/queryable-encryption-with-spring-data-mongodb-how-to-query-encrypted-fields/</link><pubDate>Tue, 02 Sep 2025 19:00:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/queryable-encryption-with-spring-data-mongodb-how-to-query-encrypted-fields/</guid><description>&lt;p&gt;Information is one of the most valuable assets in computing and keeping it protected is even more critical. When we talk about data protection, it&amp;rsquo;s not just about preventing breaches or leaks; it&amp;rsquo;s also about complying with privacy regulations and protecting user data.&lt;/p&gt;
&lt;p&gt;MongoDB provides strong encryption capabilities, including in transit, at rest, and in use. The Queryable Encryption feature falls into the &lt;em&gt;in use&lt;/em&gt; category. It allows data to be encrypted on the client side, so that even with access to the database and its credentials, no one can read the protected fields without the proper encryption key. At the same time, it supports querying over encrypted fields, making it possible to filter, match, or retrieve data without compromising confidentiality.&lt;/p&gt;</description></item><item><title>Boosting Kafka Latency Performance by 3x with Zing JVM and AutoMQ</title><link>https://foojayio.github.io/website/today/boosting-kafka-latency-performance-by-3x-with-zing-jvm-and-automq/</link><pubDate>Fri, 29 Aug 2025 12:57:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/boosting-kafka-latency-performance-by-3x-with-zing-jvm-and-automq/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boosting-kafka-latency-performance-by-3x-with-zing-jvm-and-automq/kafka-with-zing-and-automq.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;h2 id="h2-0-why-is-latency-so-important-to-kafka"&gt;Why is Latency so Important to Kafka?&lt;/h2&gt;
&lt;p&gt;The importance of low latency in Kafka stems from the use cases it enables. Many applications that rely on Kafka are time-sensitive.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Real-time applications&lt;/strong&gt;, such as financial trading platforms, fraud detection systems, and real-time monitoring services, depend on obtaining the most current information available. A delay of even a few seconds could mean the difference between a successful trade and a missed opportunity, or a prevented fraudulent transaction and a financial loss.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User experience&lt;/strong&gt; is another area where latency plays a significant role. Think about in-app notifications, live-updating dashboards, or multiplayer games. A snappy, responsive system feels good to use. Sluggishness, on the other hand, can be a significant turn-off for users.&lt;/li&gt;
&lt;li&gt;From an &lt;strong&gt;operational perspective&lt;/strong&gt;, latency is a key indicator of health for your Kafka cluster. A spike in latency can be an early warning sign of a problem, such as a network bottleneck or a slow consumer, which can lead to message backlogs and system instability if left unaddressed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Maintaining low latency in the cloud with traditional Kafka is challenging. Its architecture couples compute and storage, making scaling slow and expensive due to data rebalancing. This creates a complex trade-off between high costs from overprovisioning and poor performance during traffic spikes. To solve this, new cloud-native streaming systems have emerged with a different architectural approach.&lt;/p&gt;</description></item><item><title>Taking Java Arrays to Another Dimension</title><link>https://foojayio.github.io/website/today/taking-java-arrays-to-another-dimension/</link><pubDate>Fri, 29 Aug 2025 12:53:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/taking-java-arrays-to-another-dimension/</guid><description>&lt;p&gt;&lt;em&gt;Explore the intricacies of Java&amp;rsquo;s multidimensional arrays with this in-depth guide. Learn how to declare, initialize, and utilize arrays of Java arrays to manage complex data structures effectively. In this blog post, Azul Deputy CTO Simon Ritter explains how to leverage multidimensional arrays as a tool to do even more.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Java, along with many other programming languages, includes the concept of arrays. An array is an object that contains a number of variables. Since an array is itself an object, the variables in an array can also be arrays, which leads us to the idea of multidimensional arrays.&lt;/p&gt;</description></item><item><title>AI Gives Time, Not Confidence: Developer Productivity Toolkit</title><link>https://foojayio.github.io/website/today/ai-gives-time-not-confidence-developer-productivity-toolkit/</link><pubDate>Mon, 25 Aug 2025 07:07:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/ai-gives-time-not-confidence-developer-productivity-toolkit/</guid><description>&lt;p&gt;Let&amp;rsquo;s be real &amp;ndash; keeping up with the pace of software development today is intense. New frameworks pop up and the push for faster, better, &lt;em&gt;and&lt;/em&gt; more secure code never stops.&lt;/p&gt;
&lt;p&gt;This article is all about cutting through the buzz and looking at how AI-powered tools can actually help you, the Java developer, day-to-day. We&amp;rsquo;ll dive into specific ways AI can help you through the whole SDLC:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Understanding Complex Tasks&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accelerating Code Creation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streamlining Cloud Deployment&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Creating Effective Tests&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Increasing Code Quality and Security&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improving Code Review&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, first up: wrapping your head around the job at hand. You know those moments where you need to implement a feature based on requirements that feel a bit&amp;hellip; fuzzy. Traditionally, this means lots of reading, maybe drawing diagrams, and asking clarifying questions.&lt;/p&gt;</description></item><item><title>Managing MongoDB Database Changes Using Liquibase Pro</title><link>https://foojayio.github.io/website/today/managing-mongodb-database-changes-using-liquibase-pro/</link><pubDate>Wed, 20 Aug 2025 14:21:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/managing-mongodb-database-changes-using-liquibase-pro/</guid><description>&lt;p&gt;This article explores how Liquibase and MongoDB can be integrated with Git actions to implement source control for database changes.&lt;/p&gt;
&lt;h2 id="h2-0-what-is-liquibase"&gt;What is Liquibase?&lt;/h2&gt;
&lt;p&gt;Liquibase is an open-source tool designed to manage version control for database schema changes. It allows developers to simplify and automate the process of applying database updates across various database platforms.&lt;/p&gt;
&lt;p&gt;By using database-independent formats like XML, YAML, or JSON, Liquibase enables teams to define changes in a consistent and structured way. In a Java project, these updates are organized into files containing &lt;em&gt;changesets&lt;/em&gt;, which outline the specific instructions needed to modify or refactor the database schema.&lt;/p&gt;</description></item><item><title>JC-AI Newsletter #3</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-3/</link><pubDate>Tue, 19 Aug 2025 08:06:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-3/</guid><description>&lt;p&gt;&lt;strong&gt;The &lt;a href="https://foojayio.github.io/website/today/ai-newsletter-1/" title="first"&gt;first&lt;/a&gt;
 and &lt;a href="https://foojayio.github.io/website/today/jc-ai-newsletter-2/" title="second"&gt;second&lt;/a&gt;
 newsletters introduced a 14-day cadence, and even though it is the holiday season for many of us, we are sticking to the promised period.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The current newsletter vol.3, brings a collection of valuable articles focusing on challenges that are commonly reported through reported breakthroughs in the field of artificial intelligence. Although some articles may remain open or contain suggestions for future research due to the intensive development and utilization efforts of agentic AI systems, these articles can be considered valuable to the community, increasing awareness and understanding of ongoing challenges.&lt;/p&gt;</description></item><item><title>Domain-Driven Design in Java: A Practical Guide</title><link>https://foojayio.github.io/website/today/domain-driven-design-in-java-a-practical-guide/</link><pubDate>Fri, 15 Aug 2025 09:30:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/domain-driven-design-in-java-a-practical-guide/</guid><description>&lt;p&gt;While waiting for your flight in an airport, have you ever wondered how much behind-the-scenes planning it takes to keep an airport running smoothly? Every day, thousands of flights take off and land, passengers rush through terminals, and staff work tirelessly to make sure everything unfolds without a hitch. What looks like chaos on the surface is actually the result of a highly coordinated system&amp;mdash;a kind of &amp;ldquo;brain&amp;rdquo; that&amp;rsquo;s always working in the background to manage logistics, adapt to surprises, and keep the airport humming along.&lt;/p&gt;</description></item><item><title>Enforcing Governance in MongoDB Atlas with Resource Policies</title><link>https://foojayio.github.io/website/today/enforcing-governance-in-mongodb-atlas-with-resource-policies/</link><pubDate>Wed, 13 Aug 2025 12:52:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/enforcing-governance-in-mongodb-atlas-with-resource-policies/</guid><description>&lt;p&gt;The growing adoption of &lt;a href="https://www.mongodb.com/lp/cloud/atlas/try4-reg/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=samuel-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;MongoDB Atlas&lt;/a&gt;
 as a managed database platform increasingly demands mechanisms that align security, compliance, and governance. In April 2025, MongoDB introduced a critical feature for this purpose: &lt;a href="https://www.mongodb.com/en-us/docs/atlas/atlas-resource-policies/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=samuel-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;&lt;strong&gt;Resource Policies&lt;/strong&gt;&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;This article presents the concept and capabilities of Resource Policies, highlights their importance in enterprise environments, and demonstrates how to use them effectively via Terraform &amp;mdash; ensuring that essential configurations rely not only on best practices but also on enforceable and auditable constraints.&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>Semantic Caching with SpringBoot &amp; Redis</title><link>https://foojayio.github.io/website/today/semantic-caching-with-springboot-redis/</link><pubDate>Thu, 07 Aug 2025 06:58:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/semantic-caching-with-springboot-redis/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; You&amp;rsquo;re building a semantic caching system using Spring AI and Redis to improve LLM application performance.&lt;/p&gt;
&lt;p&gt;Unlike traditional caching that requires exact query matches, semantic caching understands the meaning behind queries and can return cached responses for semantically similar questions.&lt;/p&gt;
&lt;p&gt;It works by storing query-response pairs as vector embeddings in Redis, allowing your application to retrieve cached answers for similar questions without calling the expensive LLM, reducing both latency and costs.&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>Run an Atlas cluster locally in minutes</title><link>https://foojayio.github.io/website/today/run-an-atlas-cluster-locally-in-minutes/</link><pubDate>Tue, 05 Aug 2025 07:33:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/run-an-atlas-cluster-locally-in-minutes/</guid><description>&lt;p&gt;You no longer need a cloud account to try &lt;a href="https://www.mongodb.com/lp/cloud/atlas/try4-reg/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=foojay-blog-atlas&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt;
 Atlas features. Spin up a fully compatible local cluster in seconds, with no login, no credit card, and no friction.&lt;/p&gt;
&lt;p&gt;🕒 Reading time: 2-3 min&lt;/p&gt;
&lt;p&gt;🍃 What is the MongoDB Atlas Platform?&lt;/p&gt;
&lt;p&gt;MongoDB Atlas is a fully managed, multi-cloud data platform provided by MongoDB Inc. It allows you to deploy and run MongoDB clusters on Amazon Web Services (AWS), Google Cloud Platform (GCP), and Microsoft Azure, with full support for replica sets (for high availability), sharding (for horizontal scalability), and multi-cloud deployments. Atlas handles infrastructure, backups, security, scaling, and monitoring out of the box. It also extends the core MongoDB server capabilities with a set of integrated features.&lt;/p&gt;</description></item><item><title>JC-AI Newsletter #2</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-2/</link><pubDate>Tue, 05 Aug 2025 06:30:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-2/</guid><description>&lt;h3 id="h3-0-in-the-first-newsletter-we-introduced-a-14-day-cadence-which-means-that-this-week-it-s-time-for-a-new-collection-of-articles-from-the-fields-of-ai-llm-java-and-more"&gt;&lt;strong&gt;I&lt;/strong&gt; n &lt;a href="https://foojayio.github.io/website/today/ai-newsletter-1/"&gt;the first newsletter&lt;/a&gt;
, we introduced a 14-day cadence, which means that this week it&amp;rsquo;s time for a new collection of articles from the fields of AI, LLM, Java and more.&lt;/h3&gt;
&lt;p&gt;The JC-AI Newsletter Vol.2 brings again a very interesting collection of articles worth considering.&lt;/p&gt;
&lt;p&gt;The world influenced by LLM is changing very quickly, let&amp;rsquo;s start&amp;hellip;&lt;/p&gt;
&lt;h3 id="h3-1-article-openai-ceo-sam-altman-warns-of-an-ai-fraud-crisis"&gt;article: &lt;a href="http:https://edition.cnn.com/2025/07/22/tech/openai-sam-altman-fraud-crisis//" title="OpenAI CEO Sam Altman warns of an AI ‘fraud crisis’"&gt;OpenAI CEO Sam Altman warns of an AI &amp;lsquo;fraud crisis&amp;rsquo;&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;author&lt;/strong&gt; : Clare Duffy, CNN&lt;br&gt;
&lt;strong&gt;date&lt;/strong&gt; : 2025-07-22&lt;br&gt;
&lt;strong&gt;desc.&lt;/strong&gt;: Sam Altman discusses the serious potential for current AI abuse. Although the example of attacks on financial institutions is mentioned, Sam Altman warns of the broader impact before one even takes advantage of LLM agent systems.&lt;/p&gt;</description></item><item><title>Release V0.0.2 of Java DMX512 Library With Universes and USB-to-DMX support</title><link>https://foojayio.github.io/website/today/release-v0-0-2-of-java-dmx512-library-with-universes-and-usb-to-dmx-support/</link><pubDate>Mon, 04 Aug 2025 14:19:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/release-v0-0-2-of-java-dmx512-library-with-universes-and-usb-to-dmx-support/</guid><description>&lt;p&gt;Earlier this month, I &lt;a href="https://webtechie.be/post/2025-07-17-introducing-java-dmx512-library-with-demo-javafx-ui/" target="_blank" rel="noopener noreferrer"&gt;released V0.0.1 of my new Java library to interact with DMX512 devices using (optionally) the Open Fixture Library (OFL)&lt;/a&gt;
. After some more experimenting, I&amp;rsquo;m able to announce the next (beta) release V0.0.2 with the following major changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Code refactoring&lt;/strong&gt;: As this library is still in beta, major changes were expected and happened 😉 The video of V0.0.1 is still valid, but some of the demonstrated code has changed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved demos&lt;/strong&gt; : Demo code has been moved to the &lt;a href="https://github.com/codewriterbv/DMX512/tree/main/src/main/java/be/codewriter/dmx512/demo" target="_blank" rel="noopener noreferrer"&gt;&lt;code&gt;demo&lt;/code&gt; directory in the sources&lt;/a&gt;
 to make them easier to understand and reuse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Introduction of DMX Universes&lt;/strong&gt;: to be able to control fixtures connected to the two ports of my IP-to-DMX controller, universes needed to be added. (more info below)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;USB-to-DMX Support&lt;/strong&gt;: First working protocol over serial communication to DMX512! (more info below)&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex"&gt;
 &lt;figure class="wp-block-image size-large"&gt;
 &lt;img fetchpriority="high" decoding="async" width="1024" height="637" data-id="117016" src="ip-to-dmx-universes-1024x637.jpg" alt="" class="wp-image-117016"&gt;
 &lt;/figure&gt;
 &lt;figure class="wp-block-image size-large"&gt;
 &lt;img decoding="async" width="1024" height="572" data-id="117015" src="usb-to-dmx-1024x572.jpg" alt="" class="wp-image-117015"&gt;
 &lt;/figure&gt;
&lt;/figure&gt;
&lt;h2 id="h2-0-introduction-of-dmx-universes"&gt;Introduction of DMX Universes&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/slC4niKWUq0?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;p&gt;For my tests, I&amp;rsquo;m using an &lt;a href="https://www.amazon.com.be/dp/B0CYPQ2Z4V" target="_blank" rel="noopener noreferrer"&gt;JUNELIONY ArtNet 1024 2-Port Sulite DMX LAN512 2-Port ArtNet Converter&lt;/a&gt;
 controller. It has two XLR-connectors, labeled as &lt;code&gt;DMX1&lt;/code&gt; and &lt;code&gt;DMX2&lt;/code&gt;, which can be controlled as universe ID 0 and 1.&lt;/p&gt;</description></item><item><title>Why Java is Still Worth Learning in 2025: A Developer's 25-Year Journey</title><link>https://foojayio.github.io/website/today/why-java-is-still-worth-learning-in-2025-a-developers-25-year-journey/</link><pubDate>Mon, 04 Aug 2025 06:32:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-java-is-still-worth-learning-in-2025-a-developers-25-year-journey/</guid><description>&lt;h3 id="h3-0-i-ll-be-honest-my-first-encounter-with-java-in-1999-wasn-t-love-at-first-sight-it-was-during-a-university-distributed-systems-course-and-coming-from-a-background-in-assembler-and-c-java-felt-bloated-slow-and-frankly-untrustworthy-that-automatic-memory-handling-seemed-like-dangerous-magic-i-couldn-t-control-after-years-of-meticulously-tracking-every-allocated-memory-block-the-idea-that-the-runtime-would-handle-memory-management-felt-like-giving-up-control-to-forces-i-didn-t-understand"&gt;I&amp;rsquo;ll be honest - my first encounter with Java in 1999 wasn&amp;rsquo;t love at first sight. It was during a university distributed systems course, and coming from a background in assembler and C, Java felt bloated, slow, and frankly untrustworthy. That &amp;ldquo;automatic memory handling&amp;rdquo; seemed like dangerous magic I couldn&amp;rsquo;t control. After years of meticulously tracking every allocated memory block, the idea that the runtime would handle memory management felt like giving up control to forces I didn&amp;rsquo;t understand.&lt;/h3&gt;
&lt;p&gt;For the first eight years of my career, I stubbornly stuck with C, convinced that Java was just a passing trend for developers who couldn&amp;rsquo;t handle &amp;ldquo;real&amp;rdquo; programming.&lt;/p&gt;</description></item><item><title>Java, What's Old? Part II: Utils</title><link>https://foojayio.github.io/website/today/java-whats-old-part-ii-utils/</link><pubDate>Wed, 30 Jul 2025 08:48:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-whats-old-part-ii-utils/</guid><description>&lt;p&gt;After &lt;a href="https://foojayio.github.io/website/today/java-whats-old-part-i-collections/"&gt;Java, What&amp;rsquo;s Old? Part I - Collections&lt;/a&gt;
, let&amp;rsquo;s now have a look at less known old utility classes that can still be useful.&lt;/p&gt;
&lt;p&gt;Everything in this series will be in Java 8 and later, so after reading this article, you will be able to use it in your projects.&lt;/p&gt;
&lt;h2 id="h2-0-objects"&gt;Objects&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://docs.oracle.com/javase/8/docs/api/java/util/Objects.html" target="_blank" rel="noopener noreferrer"&gt;Objects&lt;/a&gt;
 (with a s) is a utility class from the &lt;code&gt;java.util&lt;/code&gt; package that contains static methods to make your code more readable. Do not confuse it with the &lt;code&gt;Object&lt;/code&gt; (without s) class of the &lt;code&gt;java.lang&lt;/code&gt; package.&lt;/p&gt;</description></item><item><title>AI Applications with LangChain4j Guardrails and Spring Boot</title><link>https://foojayio.github.io/website/today/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/</link><pubDate>Tue, 29 Jul 2025 11:16:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/</guid><description>&lt;p&gt;&lt;strong&gt;As AI applications become increasingly complex, ensuring that language models behave predictably and safely is paramount. LangChain4j&amp;rsquo;s guardrails feature provides a powerful framework for validating both the inputs and outputs of your AI services.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This article demonstrates how to implement comprehensive guardrails in a Spring Boot application, with practical examples that you can adapt to your use cases.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;📦 &lt;strong&gt;Complete source code available at&lt;/strong&gt; : &lt;a href="https://github.com/rokon12/guardrails-demo" target="_blank" rel="noopener noreferrer"&gt;github.com/rokon12/guardrails-demo&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="h2-0-understanding-langchain4j-guardrails"&gt;Understanding LangChain4j Guardrails&lt;/h2&gt;
&lt;p&gt;In LangChain4j, guardrails are validation mechanisms that operate exclusively on AI Services, the framework&amp;rsquo;s high-level abstraction for interacting with language models. Unlike simple validators, guardrails provide sophisticated control over the entire AI interaction lifecycle.&lt;/p&gt;</description></item><item><title>Introducing a New Java DMX512 Library With Demo JavaFX User Interface</title><link>https://foojayio.github.io/website/today/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/</link><pubDate>Fri, 25 Jul 2025 06:17:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/</guid><description>&lt;p&gt;In this post, I would like to inform you about a new Java library that is now available on Maven Central, allowing interaction with DMX512 devices using (optionally) the Open Fixture Library (OFL). I also published a video with a code walkthrough of my test setup and demo code.&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/ztrO3Crexmg?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;p&gt;But first&amp;hellip;&lt;/p&gt;</description></item><item><title>Java 22 to 24: Level up your Java Code by embracing new features in a safe way</title><link>https://foojayio.github.io/website/today/java-22-to-24-level-up-your-java-code-by-embracing-new-features-in-a-safe-way/</link><pubDate>Wed, 23 Jul 2025 15:29:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-22-to-24-level-up-your-java-code-by-embracing-new-features-in-a-safe-way/</guid><description>&lt;h3 id="h3-0-java-introduces-several-new-language-features-in-the-22-to-24-versions-which-collectively-simplify-code-enhance-documentation-and-provide-powerful-tools-for-bytecode-manipulation-and-advanced-stream-processing-this-article-shows-you-how-to-leverage-these-new-features-with-simple-examples"&gt;Java introduces several new language features in the 22 to 24 versions which collectively simplify code, enhance documentation, and provide powerful tools for bytecode manipulation and advanced stream processing. This article shows you how to leverage these new features with simple examples.&lt;/h3&gt;
&lt;p&gt;Understanding these new features in Java is crucial for writing updated, efficient, and high quality code. To assist developers in adopting these changes correctly, SonarQube has introduced &lt;a href="https://rules.sonarsource.com/java/tag/java22" target="_blank" rel="noopener noreferrer"&gt;several new rules&lt;/a&gt;
 designed to check for the proper usage of unnamed variables and patterns, javadoc and markdown, Class-file new API and Stream gatherers, ensuring your code adheres to best practices and avoids common pitfalls.&lt;/p&gt;</description></item><item><title>MongoDB ACID Transactions With Java</title><link>https://foojayio.github.io/website/today/mongodb-acid-transactions-with-java/</link><pubDate>Wed, 23 Jul 2025 14:39:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/mongodb-acid-transactions-with-java/</guid><description>&lt;p&gt;A database is constantly under pressure. Real-time applications, exponential growth of data, and multiple operations may hit the system at once. Without coordination, this can lead to race conditions, conflicts, and ultimately, the dreaded inconsistent data! To address this, MongoDB supports &lt;a href="https://learn.mongodb.com/courses/mongodb-transactions?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=java&amp;#43;acid&amp;amp;utm_term=tim.kelly" target="_blank" rel="noopener noreferrer"&gt;transactions&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Transactions let us group multiple operations together so they either all succeed or none take effect, a concept known as &lt;a href="https://www.mongodb.com/docs/manual/reference/glossary/#std-term-atomic-operation?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=java&amp;#43;acid&amp;amp;utm_term=tim.kelly" target="_blank" rel="noopener noreferrer"&gt;atomicity&lt;/a&gt;
. MongoDB&amp;rsquo;s document model already provides atomicity at the single-document level, which covers a lot of use cases. But when you need atomicity across multiple documents or collections, transactions are the answer.&lt;/p&gt;</description></item><item><title>AI Newsletter #1</title><link>https://foojayio.github.io/website/today/ai-newsletter-1/</link><pubDate>Tue, 22 Jul 2025 05:39:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/ai-newsletter-1/</guid><description>&lt;p&gt;&lt;strong&gt;There is a lot going on in today&amp;rsquo;s technological world, but the most intense and vibrant area is undoubtedly the field of artificial intelligence. After brainstorming, our Java Champion Education group agreed to create a newsletter with a 14 days cadence. In our newsletters, we will include a collection of recently read interesting resources in the field of artificial intelligence with a short description.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Although the stream of published articles is very large and the ability to read them all is an illusion, the published selection, such as the below is implicitly narrowed. The purpose of the AI Newsletter is to help everyone stay informed and expand their knowledge in areas related to artificial intelligence.&lt;/p&gt;</description></item><item><title>Spring Cloud Stream for Real-Time Event-Driven Systems</title><link>https://foojayio.github.io/website/today/spring-cloud-stream-event-driven-architecture-part-1/</link><pubDate>Mon, 21 Jul 2025 13:33:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-cloud-stream-event-driven-architecture-part-1/</guid><description>&lt;p&gt;&lt;strong&gt;Envision operating a successful e-commerce platform where every moment is crucial. Customers make purchases, adjust inventory levels, process payments, and dispatch shipping alerts&amp;mdash;all in real time. In the background, microservices diligently function to guarantee seamless operations. However, how do these services interact effectively, particularly during peak traffic occurrences such as flash sales or holiday shopping events?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;An efficient method to execute this use case involves utilizing Spring Cloud Stream (SCS) as the messaging infrastructure. SCS facilitates seamless interaction among microservices, enhancing the system&amp;rsquo;s responsiveness and scalability. A significant benefit of SCS is that it provides an abstraction layer, allowing developers to transition between messaging technologies such as Kafka or RabbitMQ or Pulsar or Amazon Kinesis without altering their fundamental business logic.&lt;/p&gt;</description></item><item><title>Foojay Podcast #76: DevBcn Report, Part 1 – Learn from the Community</title><link>https://foojayio.github.io/website/today/foojay-podcast-76/</link><pubDate>Mon, 21 Jul 2025 06:41:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-76/</guid><description>&lt;p&gt;In early July, the DevBcn conference in Barcelona featured a diverse lineup of speakers, covering topics across multiple technology domains. Geertjan Wielenga took the camera and microphone with him to Spain. Together with Nacho Cougil and Jonathan Vila, two of the organizers, he spoke with many visitors about what they like most in Java, how AI influences their work, and what is important to them in the work they do.&lt;/p&gt;</description></item><item><title>How to Make a RAG Application With LangChain4j</title><link>https://foojayio.github.io/website/today/how-to-make-a-rag-application-with-langchain4j/</link><pubDate>Thu, 17 Jul 2025 20:42:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-make-a-rag-application-with-langchain4j/</guid><description>&lt;p&gt;Retrieval-augmented generation, or RAG, introduces some serious capabilities to your large language models (LLMs). These applications can answer questions about your specific corpus of knowledge, while leveraging all the nuance and sophistication of a traditional LLM.&lt;/p&gt;
&lt;p&gt;This tutorial will take you through the ins and outs of creating a Q&amp;amp;A chatbot using RAG. The application will:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Retrieve data from a MongoDB Atlas database.&lt;/li&gt;
&lt;li&gt;Embed and store documents as vector embeddings.&lt;/li&gt;
&lt;li&gt;Use LangChain4J to query the database and augment LLM prompts with the retrieved data.&lt;/li&gt;
&lt;li&gt;Enable secure, scalable, and efficient AI-powered applications.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you want to see the completed application, it is available in the &lt;a href="https://github.com/mongodb-developer/langchainrag" target="_blank" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Understanding MCP Through Raw STDIO Communication</title><link>https://foojayio.github.io/website/today/understanding-mcp-through-raw-stdio-communication/</link><pubDate>Thu, 17 Jul 2025 15:57:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/understanding-mcp-through-raw-stdio-communication/</guid><description>&lt;h2 id="h2-0-deep-dive-into-the-model-context-protocol"&gt;Deep Dive into the Model Context Protocol&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Ever wondered how AI assistants like Claude actually communicate with external tools and services? While most tutorials focus on using pre-built SDKs and frameworks, this article takes a different approach&amp;mdash;we&amp;rsquo;ll dissect a production MCP server built from scratch using only Java&amp;rsquo;s standard libraries and raw STDIO communication.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;By stripping away all the abstractions and implementing the Model Context Protocol directly, we&amp;rsquo;ll uncover the surprisingly elegant mechanics that enable AI systems to discover, understand, and execute tools.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Spring Boot documentation with Redocusaurus</title><link>https://foojayio.github.io/website/today/spring-boot-api-documentation-redocusaurus/</link><pubDate>Wed, 16 Jul 2025 06:45:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-api-documentation-redocusaurus/</guid><description>&lt;h4 id="create-clear-and-interactive-api-documentation-quickly"&gt;&lt;em&gt;Create clear and interactive API documentation quickly.&lt;/em&gt;&lt;/h4&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/fs6wiUqJGo8?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;br /&gt;
&lt;hr&gt;
&lt;h4 id="heading"&gt;🔵⚪⚪⚪⚪⚪⚪⚪&lt;/h4&gt;
&lt;h3 id="h3-0-introduction-why-use-redocusaurus-for-spring-boot"&gt;📘 Introduction: Why Use Redocusaurus for Spring Boot?&lt;/h3&gt;
&lt;h4 id="discover-why-clean-api-docs-matter-and-how-redocusaurus-makes-it-easy"&gt;&lt;em&gt;Discover why clean API docs matter and how Redocusaurus makes it easy.&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Firstly&lt;/strong&gt;, clear API documentation is very important.&lt;/p&gt;
&lt;p&gt;It helps users understand your API better. This is true whether your API is for coworkers or external users.&lt;/p&gt;</description></item><item><title>Sustainability Starts with Your Runtime: Meet a Green JVM</title><link>https://foojayio.github.io/website/today/sustainability-starts-with-your-runtime-meet-a-green-jvm/</link><pubDate>Tue, 15 Jul 2025 14:20:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/sustainability-starts-with-your-runtime-meet-a-green-jvm/</guid><description>&lt;p&gt;&lt;strong&gt;Reducing spend in the cloud is a top priority for many organizations, and a high-performance Java platform can help cloud cost reduction efforts. These same optimizations can help organizations achieve sustainability goals, including achieving carbon net-zero. And pursuing sustainability goals can also lead to financial advantages.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cloud costs are under the microscope, and reducing spend in the cloud is a top priority for many organizations. We&amp;rsquo;ve been helping customers on that journey with Azul Platform Prime, a &lt;a href="https://www.azul.com/blog/5-ways-to-reduce-cloud-waste/" target="_blank" rel="noopener noreferrer"&gt;high-performance Java platform that runs code faster, uses fewer compute resources, and helps cut your cloud bill&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>How I Improved Zero-Shot Classification in Deep Java Library (DJL) OSS: Enhancing Machine Learning Model Translators</title><link>https://foojayio.github.io/website/today/how-i-improved-zero-shot-classification-in-deep-java-library-djl-oss/</link><pubDate>Wed, 09 Jul 2025 10:51:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-i-improved-zero-shot-classification-in-deep-java-library-djl-oss/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Did you know the Deep Java Library (DJL) powers Spring AI and Redis OM Spring? DJL helps you run machine learning models right inside your Java applications.&lt;/p&gt;
&lt;p&gt;Check them out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring AI with DJL: &lt;a href="https://docs.spring.io/spring-ai/reference/api/embeddings/onnx.html" target="_blank" rel="noopener noreferrer"&gt;https://docs.spring.io/spring-ai/reference/api/embeddings/onnx.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Semantic Search with SpringBoot &amp;amp; Redis: &lt;a href="https://foojayio.github.io/website/today/semantic-search-with-spring-boot-redis/"&gt;https://foojay.io/today/semantic-search-with-spring-boot-redis/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="h2-0-tl-dr"&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;You&amp;rsquo;re doing zero-shot classification in a Java app using DJL.&lt;/li&gt;
&lt;li&gt;DJL didn&amp;rsquo;t handle some models well &amp;mdash; like DeBERTa. It missed support for token_type_ids, assumed wrong label positions, and oversimplified the softmax implementation.&lt;/li&gt;
&lt;li&gt;It was fixed by reading the model config files and adjusting DJL&amp;rsquo;s translator logic.&lt;/li&gt;
&lt;li&gt;Now DJL gives correct results across different models &amp;mdash; just like the Transformers library does in Python.&lt;/li&gt;
&lt;li&gt;The fix is merged and will probably be released with version 0.34.0.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-1-what-s-zero-shot-classification-and-why-it-matters"&gt;What&amp;rsquo;s Zero-Shot Classification (and Why It Matters)&lt;/h2&gt;
&lt;p&gt;Zero-shot classification is a machine learning technique that allows models to classify text into categories they haven&amp;rsquo;t explicitly seen during training. Unlike traditional classification models that can only predict classes they were trained on, zero-shot classifiers can generalize to new, unseen categories.&lt;/p&gt;</description></item><item><title>Building a Spring Boot CRUD Application Using MongoDB’s Relational Migrator</title><link>https://foojayio.github.io/website/today/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/</link><pubDate>Tue, 08 Jul 2025 19:05:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/</guid><description>&lt;p&gt;Imagine this: You&amp;rsquo;re working with a relational database that&amp;rsquo;s served you well for years, but now your applications demand flexibility, scalability, and faster development cycles. Transitioning from structured tables to MongoDB&amp;rsquo;s dynamic, schema-less JSON documents might be daunting. That&amp;rsquo;s where MongoDB&amp;rsquo;s Relational Migrator becomes your secret weapon.&lt;/p&gt;
&lt;p&gt;The Relational Migrator tool built by MongoDB no longer only supports migrating data from relational databases to MongoDB. Rather, it supports features like code generation and also a query converter that converts a relational database, such as a Postgres query, or queries from views and stored procedures, into a MongoDB query.&lt;/p&gt;</description></item><item><title>Prime Time: The High Performance Java Event</title><link>https://foojayio.github.io/website/today/prime-time-the-high-performance-java-event/</link><pubDate>Tue, 08 Jul 2025 07:05:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/prime-time-the-high-performance-java-event/</guid><description>&lt;p&gt;&lt;strong&gt;Java is the engine behind mission-critical applications and end user experiences. From faster response times to consistent performance, Java can have a significant impact on business results and cloud costs.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Join Azul and leading voices from the Java community for Prime Time, a dynamic virtual event dedicated to innovations, strategies, and real-world insights that power high-performance Java estates. No matter where you&amp;rsquo;re running your apps &amp;ndash; on-prem or in the cloud, or if you&amp;rsquo;re looking to modernize legacy Java workloads &amp;ndash; when performance, elasticity, scale and cloud cost matter, &lt;strong&gt;Make It Prime&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>CAP in the Pocket</title><link>https://foojayio.github.io/website/today/cap-in-the-pocket-developing-java-applications-on-your-phone/</link><pubDate>Mon, 07 Jul 2025 15:27:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/cap-in-the-pocket-developing-java-applications-on-your-phone/</guid><description>&lt;p&gt;Smartphones are more powerful then ever, with processors rivaling old laptops. So let&amp;rsquo;s try to use them like a laptop to develop web-applications on the go.&lt;/p&gt;
&lt;p&gt;Below I&amp;rsquo;ll show you how to do use run and develop a &lt;a href="https://cap.cloud.sap/docs/java/" target="_blank" rel="noopener noreferrer"&gt;CAP Java&lt;/a&gt;
 &lt;a href="https://spring.io/projects/spring-boot" target="_blank" rel="noopener noreferrer"&gt;Spring Boot&lt;/a&gt;
 application on your smartphone and how to run &lt;a href="https://code.visualstudio.com/" target="_blank" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;
 locally to develop and modify it. This, of course, works only on Android phones, as they are a Linux at their core.
&lt;img src="https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-8-2025-1_28_58-PM-2000x900.png" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Carbon Aware Job Processing With JobRunr v8</title><link>https://foojayio.github.io/website/today/carbon-aware-job-processing-with-jobrunr-v8/</link><pubDate>Mon, 07 Jul 2025 09:00:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/carbon-aware-job-processing-with-jobrunr-v8/</guid><description>&lt;p&gt;As we produce, mutate, configure, and consume more and more data in various shapes and forms, think: video on demand, AI ingestion and generation of content, Internet of Things always-on connectivity, and more.&lt;/p&gt;
&lt;p&gt;The energy consumption of our digital lives have gone up dramatically as well. We rarely notice this, and although multiple organisations put out &lt;a href="https://www.iea-4e.org/wp-content/uploads/2025/05/Data-Centre-Energy-Use-Critical-Review-of-Models-and-Results.pdf" target="_blank" rel="noopener noreferrer"&gt;alarming reports&lt;/a&gt;
 on energy use of data centres, policy makers seem reluctant to act fast.&lt;/p&gt;</description></item><item><title>When ReadyNow Can Only Compile on Traffic Loads</title><link>https://foojayio.github.io/website/today/when-readynow-can-only-compile-on-traffic-loads/</link><pubDate>Fri, 04 Jul 2025 19:36:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/when-readynow-can-only-compile-on-traffic-loads/</guid><description>&lt;p&gt;&lt;em&gt;This is the fifth and final blog post in a series on faster Java application warmup with ReadyNow. If you haven&amp;rsquo;t been following the series, go back to the first blog post, &lt;a href="https://foojayio.github.io/website/today/faster-java-warmup-crac-versus-readynow/"&gt;Faster Java Warmup: CRaC versus ReadyNow&lt;/a&gt;
, and catch up. This post examines how to resolve a situation when traffic loads and gets redirected to an application before ReadyNow has completed compiling and optimizing bytecode.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;ReadyNow enables applications to handle load optimally by compiling bytecode to native code shortly after startup. It also optimizes the compiled code by removing unused pathways, inlining, etc. But this compiling and optimizing can&amp;rsquo;t be fully executed in specific situations before traffic gets redirected to the application.&lt;/p&gt;</description></item><item><title>Data Modeling for Java Developers: Structuring With PostgreSQL and MongoDB</title><link>https://foojayio.github.io/website/today/data-modeling-for-java-developers-structuring-with-postgresql-and-mongodb/</link><pubDate>Thu, 03 Jul 2025 21:02:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/data-modeling-for-java-developers-structuring-with-postgresql-and-mongodb/</guid><description>&lt;p&gt;&lt;strong&gt;Application and system designs have always been considered the most essential step in application development. All the later steps and technologies to be used depend on how the system has been designed. If you are a Java developer, choosing the right approach can mean distinguishing between a rigid, complex schema and a nimble, scalable solution. If you are a Java developer who works with PostgreSQL or other relational databases, you understand the pain of representing the many-to-many relationships between the tables.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Java 21+ Not Working on the Raspberry Pi Zero 2</title><link>https://foojayio.github.io/website/today/java-21-not-working-on-the-raspberry-pi-zero-2/</link><pubDate>Wed, 02 Jul 2025 07:46:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-21-not-working-on-the-raspberry-pi-zero-2/</guid><description>&lt;p&gt;This story is about how &amp;ldquo;Write Once, Run Anywhere&amp;rdquo; got broken in a specific use case. It reveals the complexity of maintaining this &amp;ldquo;Run Anywhere&amp;rdquo; principle. At the same time, it shows how the OpenJDK community already detected this issue and has a fix available for the next update.&lt;/p&gt;
&lt;h2 id="h2-0-problem-on-raspberry-pi-zero-2"&gt;Problem on Raspberry Pi Zero 2&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.pi4j.com/about/team/" target="_blank" rel="noopener noreferrer"&gt;Dieter Holz&lt;/a&gt;
&lt;/strong&gt; was experimenting with Pi4J V3 on a Raspberry Pi Zero 2. Because this version requires Java 21 or newer, he upgraded his OS to a newer Java version and found out that no Java code could be executed. He tried with Java 21 and 24, and neither worked correctly, although Java 17 runs without problems.&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>Java Virtual Threads in Action: Optimizing MongoDB Operation</title><link>https://foojayio.github.io/website/today/java-virtual-threads-in-action-optimizing-mongodb-operation/</link><pubDate>Tue, 01 Jul 2025 08:12:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-virtual-threads-in-action-optimizing-mongodb-operation/</guid><description>&lt;p&gt;Virtual threads have become one of the most popular resources in Java and are trending inside the language. Indeed, this resource introduced a cheap way to create threads inside the JVM. In this tutorial, we will explain how to use it with MongoDB.&lt;/p&gt;
&lt;p&gt;You can find all the code presented in this tutorial in the &lt;a href="https://github.com/soujava/mongodb-virtual-threads" target="_blank" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;
:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;git clone &lt;a href="https://foojayio.github.io/website/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fe99978abe99978a968b9cd09d9193"&gt;[email&amp;nbsp;protected]&lt;/a&gt;:soujava/mongodb-virtual-threads.git
&lt;/pre&gt;
&lt;h2 id="h2-0-prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;For this tutorial, you&amp;rsquo;ll need:&lt;/p&gt;</description></item><item><title>Improve Your Java Applications’ Startup and Compilation Speed with Optimizer Hub</title><link>https://foojayio.github.io/website/today/improve-your-java-applications-startup-and-compilation-speed-with-optimizer-hub/</link><pubDate>Fri, 27 Jun 2025 09:35:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/improve-your-java-applications-startup-and-compilation-speed-with-optimizer-hub/</guid><description>&lt;p&gt;&lt;em&gt;This is the fourth blog post in a series on faster Java application warmup with ReadyNow. If you haven&amp;rsquo;t been following the series, go back to the first blog post, &lt;a href="https://foojayio.github.io/website/today/faster-java-warmup-crac-versus-readynow/"&gt;Faster Java Warmup: CRaC versus ReadyNow&lt;/a&gt;
, and catch up. This post examines Optimizer Hub, a set of services external to the JVM within Azul Platform Prime that you can run in your cloud or on-premises environment&lt;/em&gt; to improve your applications&amp;rsquo; startup and compilation speed*.*&lt;/p&gt;</description></item><item><title>Sentiment Analysis with Java, Quarkus, LangChain4j, and Local LLMs</title><link>https://foojayio.github.io/website/today/build-a-sentiment-analysis-api-in-java-with-quarkus-and-local-llms/</link><pubDate>Wed, 25 Jun 2025 12:20:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/build-a-sentiment-analysis-api-in-java-with-quarkus-and-local-llms/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/build-a-sentiment-analysis-api-in-java-with-quarkus-and-local-llms/49de875e-fe8c-40d2-9613-61a6c8270eb3_1536x1024-700x467.webp" alt="Abstract image" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;In a world full of opinions, tweets, reviews, chats, emails, understanding the tone behind words is crucial. Whether you&amp;rsquo;re building a feedback system, monitoring brand reputation, or adding emotion detection to a chatbot, sentiment analysis plays a key role. It turns raw text into actionable signals: Is the customer happy? Frustrated? Neutral?&lt;/p&gt;
&lt;p&gt;Traditionally, this kind of natural language processing (NLP) required cloud APIs or heavyweight ML stacks. But now, thanks to modern Java frameworks like &lt;a href="https://quarkus.io/" target="_blank" rel="noopener noreferrer"&gt;Quarkus&lt;/a&gt;
, local Large Language Models (LLMs), and the &lt;a href="https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" target="_blank" rel="noopener noreferrer"&gt;LangChain4j&lt;/a&gt;
 library, you can build a sentiment analyzer that runs entirely on your machine&amp;mdash;no cloud account, no API keys, no surprise billing.&lt;/p&gt;</description></item><item><title>Benchmark and profiling Java with JMH</title><link>https://foojayio.github.io/website/today/benchmarking-and-profiling-java-with-jmh/</link><pubDate>Tue, 24 Jun 2025 21:49:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/benchmarking-and-profiling-java-with-jmh/</guid><description>&lt;h2 id="h2-0-introduction-why-jmh"&gt;Introduction: Why JMH?&lt;/h2&gt;
&lt;p&gt;Performance matters in Java applications, but measuring it accurately is harder than you might think. I&amp;rsquo;ve seen countless developers try to measure performance by wrapping code in System.currentTimeMillis() calls or using simple timing loops, only to get misleading results due to JVM optimizations, garbage collection, or just mistakes during measurement.&lt;/p&gt;
&lt;p&gt;The JVM is incredibly good at optimizing code, sometimes so good that it optimizes away the very code you&amp;rsquo;re trying to benchmark. Dead code elimination, constant folding, and just-in-time compilation can all skew your measurements in ways that don&amp;rsquo;t reflect real-world performance.&lt;/p&gt;</description></item><item><title>Clean and Modular Java: A Hexagonal Architecture Approach</title><link>https://foojayio.github.io/website/today/clean-and-modular-java-a-hexagonal-architecture-approach/</link><pubDate>Tue, 24 Jun 2025 08:03:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/clean-and-modular-java-a-hexagonal-architecture-approach/</guid><description>&lt;p&gt;One of the discussions that always leaves me with both doubts and excitement is the one about system architecture. Ever since I started diving deeper into programming, I&amp;rsquo;ve encountered questions like how to separate packages and modules: is it really worth creating so many divisions? I must admit, it&amp;rsquo;s often complicated to understand or make decisions without being fully sure that I&amp;rsquo;m doing the right thing.&lt;/p&gt;
&lt;p&gt;Right from the start, I want to make it clear that this content will definitely spark a lot of discussion around best practices and whether what I&amp;rsquo;m doing is correct &amp;mdash; but, above all, I guarantee it will be fun!&lt;/p&gt;</description></item><item><title>Save Time and Money by Reducing False Positives</title><link>https://foojayio.github.io/website/today/save-time-and-money-by-reducing-false-positives/</link><pubDate>Mon, 23 Jun 2025 08:35:27 +0000</pubDate><guid>https://foojayio.github.io/website/today/save-time-and-money-by-reducing-false-positives/</guid><description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.azul.com/blog/how-azul-identifies-java-security-vulnerabilities-with-1000-times-greater-accuracy/" target="_blank" rel="noopener noreferrer"&gt;Recently Azul announced that AVD&lt;/a&gt;
 (Azul Vulnerability Detection), which is our solution to scan for security vulnerabilities in production, now comes with a new feature that only makes it possible to identify vulnerable components on a JAR file level but also on class file level.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="h3-0-the-production-scanning-challenge"&gt;The Production Scanning Challenge&lt;/h3&gt;
&lt;p&gt;So what does that mean? Usually, security scanners work in environments from development up to CI/CD, but not in production. The main reason for that is the fact that once you start scanning for vulnerabilities in production, the scanning process itself needs too many resources, which brings down the performance of the system. The performance decrease can be in the range of 10 to 30%, which explains why companies trust security scanners that scan in CI/CD and don&amp;rsquo;t add additional scans in production.&lt;/p&gt;</description></item><item><title>How to Train ReadyNow to Achieve Optimal Java Performance</title><link>https://foojayio.github.io/website/today/how-to-train-readynow-to-achieve-optimal-java-performance/</link><pubDate>Fri, 20 Jun 2025 19:31:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-train-readynow-to-achieve-optimal-java-performance/</guid><description>&lt;p&gt;&lt;em&gt;This is the third blog post in a series on faster Java application warmup with ReadyNow. If you haven&amp;rsquo;t been following the series, go back to the first blog post, &lt;a href="https://foojayio.github.io/website/today/faster-java-warmup-crac-versus-readynow/"&gt;Faster Java Warmup: CRaC versus ReadyNow&lt;/a&gt;
, and catch up. This post explains how you can train the ReadyNow feature in Azul Platform Prime to achieve optimal Java performance.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Using a profile log made from a single run is only a first step in Java warmup. ReadyNow learns from previous executions and incrementally improves the warmup time at every new invocation. By using several training runs, you can improve your application&amp;rsquo;s performance even further. ReadyNow gathers data from training runs and stores it in a profile log, which ensures better performance after the first and subsequent runs.&lt;/p&gt;</description></item><item><title>SpringBoot and Kafka Streams – Event Routing &amp; Testing</title><link>https://foojayio.github.io/website/today/spring-boot-kafka-streams-event-routing-testing/</link><pubDate>Thu, 19 Jun 2025 08:37:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-kafka-streams-event-routing-testing/</guid><description>&lt;p&gt;Welcome to this hands-on guide to building a Spring Boot Kafka Streams application! (SpringBoot and Kafka Streams).&lt;/p&gt;
&lt;p&gt;In this article, I&amp;rsquo;ll walk you through a project I built during the first day of a three-day Kafka Streams training. The goal? Validate sightseeing events in Lille based on predefined timetables and route the data accordingly.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s explore how Kafka Streams powers a real-time city tour experience! 🧭&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/s07d3SmoBMI?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;br /&gt;
&lt;hr&gt;
&lt;p&gt;🔵⚪⚪⚪⚪⚪⚪⚪⚪⚪&lt;/p&gt;</description></item><item><title>Java, What's Old? Part I: Collections</title><link>https://foojayio.github.io/website/today/java-whats-old-part-i-collections/</link><pubDate>Thu, 19 Jun 2025 08:31:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-whats-old-part-i-collections/</guid><description>&lt;p&gt;A few weeks ago, I had the honor to present at the &lt;a href="https://www.meetup.com/nl-NL/arnhemjug/" target="_blank" rel="noopener noreferrer"&gt;Arnhem JUG&lt;/a&gt;
 in the Netherlands about &amp;ldquo;Java, What&amp;rsquo;s old?&amp;rdquo; In this series, I&amp;rsquo;m focusing on what&amp;rsquo;s old in the JDK, not that known, and can be useful. A few hidden gems in the JDK.&lt;/p&gt;
&lt;p&gt;Everything in this series is in Java 8 and earlier. So after reading this article, you will be able to use it in your projects.&lt;/p&gt;</description></item><item><title>Foojay Podcast #73: JCon Report, Part 2 – Evolutions in the Java language and runtime</title><link>https://foojayio.github.io/website/today/foojay-podcast-73/</link><pubDate>Mon, 16 Jun 2025 07:42:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-73/</guid><description>&lt;p&gt;In the second part of our JCON interviews, recorded at the conference in May, we focuses on general evolutions within the Java world and how they influence how we write code and develop applications. We take a look back at the history of Java, discuss new features in the latest release, how Java evolves with OpenJDK projects and JEPS, how Java is used in education, and much more&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/T9_5LYsFZn8?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>Java Concurrency Best Practices for MongoDB</title><link>https://foojayio.github.io/website/today/java-concurrency-best-practices-for-mongodb/</link><pubDate>Thu, 12 Jun 2025 15:30:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-concurrency-best-practices-for-mongodb/</guid><description>&lt;p&gt;In a multi-threaded, distributed environment like MongoDB, when clients execute queries concurrently, operations interleave with one another if they are not isolated, whether those operations involve single-document or multi-document operations.&lt;/p&gt;
&lt;p&gt;For instance, Client C1&amp;rsquo;s read operation might observe the effects of a write performed by Client C2, even if that write has not yet been made durable. When at least one of the concurrent operations is a write and isolation is not enforced, this can lead to undesirable outcomes, such as:&lt;/p&gt;</description></item><item><title>Performance Best Practise No. 1: Optimize Database Operations</title><link>https://foojayio.github.io/website/today/performance-best-practise-no-1-optimize-database-operations/</link><pubDate>Wed, 11 Jun 2025 13:24:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/performance-best-practise-no-1-optimize-database-operations/</guid><description>&lt;p&gt;Database operations are a very critical part of most applications in regards of performance. There are multiple reasons why database operations can significantly contribute to lower performance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The database often runs on a remote server, slowing down communication with the database and the data transfer&lt;/li&gt;
&lt;li&gt;Establishing individual connections to a database can take a significant portion of time compared to running the whole database query&lt;/li&gt;
&lt;li&gt;Database queries can run for a long time&lt;/li&gt;
&lt;li&gt;Network communication is unstable and may required restarting queries in case of network failures&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can address the above issues and boost Jakarta EE database performance by leveraging the following best practices.&lt;/p&gt;</description></item><item><title>Faster Java Warmup: CRaC versus ReadyNow</title><link>https://foojayio.github.io/website/today/faster-java-warmup-crac-versus-readynow/</link><pubDate>Fri, 06 Jun 2025 17:23:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/faster-java-warmup-crac-versus-readynow/</guid><description>&lt;p&gt;&lt;em&gt;This is the first blog post in a series on faster Java application warmup with ReadyNow.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Azul has developed different solutions to help achieve faster Java application warmup, including Coordinated Restore at Checkpoint (CRaC) and ReadyNow. While CRaC and ReadyNow aim to solve the same challenge, they take different approaches. This post explains the differences.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One of the challenges in a Java system is application warmup.&lt;/p&gt;
&lt;p&gt;Java is the beating heart of many applications. It powers countless applications, from small business processes on a single machine to massive clusters handling vast amounts of data and transactions. Azul optimizes performance, especially Java warmup in complex setups and time-sensitive use cases.&lt;/p&gt;</description></item><item><title>Java’s Structured Concurrency: Finally Finding Its Footing</title><link>https://foojayio.github.io/website/today/javas-structured-concurrency-finally-finding-its-footing/</link><pubDate>Wed, 04 Jun 2025 12:21:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/javas-structured-concurrency-finally-finding-its-footing/</guid><description>&lt;p&gt;The structured concurrency API changed again after two incubations and four rounds of previews.&lt;/p&gt;
&lt;p&gt;Ideally, this scenario is unexpected.&lt;/p&gt;
&lt;p&gt;However, given its status as a preview API, such changes can occur, as was the case here.&lt;/p&gt;
&lt;p&gt;These changes lend considerable maturity to the API, and I am hopeful it will now stabilize without requiring further modifications.&lt;/p&gt;
&lt;h3 id="h3-0-what-actually-changed-this-time"&gt;&lt;strong&gt;What Actually Changed This Time&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;When I first started working with structured concurrency back in its incubation phase, I was excited about the promise of cleaner concurrent code.&lt;/p&gt;</description></item><item><title>Brokk: AI for Large (Java) Codebases</title><link>https://foojayio.github.io/website/today/brokk-for-java-developers/</link><pubDate>Fri, 30 May 2025 04:39:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/brokk-for-java-developers/</guid><description>&lt;p&gt;There are two reasons that AI makes mistakes writing code:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The LLM just isn&amp;rsquo;t smart enough to tackle the problem effectively, and it simply gets the answer wrong.&lt;/li&gt;
&lt;li&gt;The AI doesn&amp;rsquo;t know enough about the relationships and dependencies of the code it&amp;rsquo;s editing, so (best case) it hallucinates APIs that don&amp;rsquo;t exist or (worse, because more subtle) it solves the problem in an awkward way that increases technical debt.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first category is small, but it does still exist; e.g., concurrent data structures remain challenging for today&amp;rsquo;s models to get right the first time. AI labs will continue to make progress on this.&lt;/p&gt;</description></item><item><title>10 Best Practises For Jakarta EE Performance Optimization</title><link>https://foojayio.github.io/website/today/10-best-practises-for-jakarta-ee-performance-optimization/</link><pubDate>Thu, 29 May 2025 13:44:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/10-best-practises-for-jakarta-ee-performance-optimization/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;With this article, we start a series where we compiled 10 best practices for performance optimizations and suggestions how to implement them using &lt;a href="https://jakarta.ee/" target="_blank" rel="noopener noreferrer"&gt;Jakarta EE&lt;/a&gt;
 &amp;amp; &lt;a href="https://omnifish.ee/glassfish/" target="_blank" rel="noopener noreferrer"&gt;Eclipse GlassFish&lt;/a&gt;
.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Enjoy reading this initial overview and watching the video about performance tuning Java applications, and stay tuned for upcoming articles from our &lt;a href="https://omnifish.ee/" target="_blank" rel="noopener noreferrer"&gt;OmniFish team&lt;/a&gt;
 that will go into details about each best practice.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To make your &lt;a href="https://jakarta.ee/" target="_blank" rel="noopener noreferrer"&gt;Jakarta EE&lt;/a&gt;
 applications faster and more efficient, here are &lt;strong&gt;10 proven best practices&lt;/strong&gt; you can easily implement:&lt;/p&gt;</description></item><item><title>AI-Driven Testing Best Practices</title><link>https://foojayio.github.io/website/today/ai-driven-testing-best-practices/</link><pubDate>Mon, 26 May 2025 08:06:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/ai-driven-testing-best-practices/</guid><description>&lt;h2 id="h2-0-so-ai-can-write-tests-now-cool-but"&gt;&lt;strong&gt;So, AI Can Write Tests Now? Cool, But&amp;hellip;&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;AI assisted coding tools are everywhere now, helping with autocomplete, suggesting fixes, and sometimes writing surprisingly large blocks of code. A hot topic is using generative AI to generate tests automatically &amp;ndash; unit, integration, e2e, etc.&lt;/p&gt;
&lt;p&gt;The idea&amp;rsquo;s definitely appealing. Who wouldn&amp;rsquo;t want an AI to help crank out tests, bump up those coverage numbers, and maybe save us from some of the testing grind? It sounds like a fast track to better feedback and tackling that mountain of untested code.&lt;/p&gt;</description></item><item><title>How to send prompts in bulk with Spring AI and Virtual Threads</title><link>https://foojayio.github.io/website/today/how-to-send-prompts-in-bulk-with-spring-ai-and-java-virtual-threads/</link><pubDate>Wed, 21 May 2025 09:18:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-send-prompts-in-bulk-with-spring-ai-and-java-virtual-threads/</guid><description>&lt;blockquote&gt;
&lt;p&gt;TL;DR: You&amp;rsquo;re building an AI-powered app that needs to send lots of prompts to OpenAI.&lt;/p&gt;
&lt;p&gt;Instead of sending them one by one, you want to do it in bulk &amp;mdash; efficiently and safely.&lt;/p&gt;
&lt;p&gt;This is how you can use Spring AI with Java Virtual Threads to process hundreds of prompts in parallel.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When calling LLM APIs like OpenAI, you&amp;rsquo;re dealing with a high-latency, network-bound task. Normally, doing that in a loop slows you down and blocks threads. But with Spring AI and Java 21 Virtual Threads, you can fire off hundreds of requests in parallel without killing your app.&lt;/p&gt;</description></item><item><title>GenAI blood, sweat, and tears: Loading data to Pinecone</title><link>https://foojayio.github.io/website/today/genai-blood-sweat-and-tears-loading-data-to-pinecone/</link><pubDate>Wed, 07 May 2025 22:10:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/genai-blood-sweat-and-tears-loading-data-to-pinecone/</guid><description>&lt;p&gt;As someone who is pretty familiar with relational and graph databases, I wanted to dig a little deeper into vector databases and understand the strengths and quirks they bring to the database table. I put together a conference abstract on vector RAG versus GraphRAG which got picked up, so I went to work building a demo and learning all I could.&lt;/p&gt;
&lt;p&gt;I pivoted a few times along the way, but ended up with a Spring AI application that connects to both Pinecone (vector database) and Neo4j (graph database). There were a few surprises throughout, which I&amp;rsquo;ll be sure to mention. Let&amp;rsquo;s get started!&lt;/p&gt;</description></item><item><title>Local AI with Spring: Building Privacy-First Agents Using Ollama</title><link>https://foojayio.github.io/website/today/local-ai-with-spring-building-privacy-first-agents-using-ollama/</link><pubDate>Tue, 06 May 2025 06:44:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/local-ai-with-spring-building-privacy-first-agents-using-ollama/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Building local AI agents with Spring AI and Ollama has emerged as a game-changer for developers seeking to maintain complete control over their AI implementations and have access always at their fingertips, even offline.&lt;/p&gt;
&lt;p&gt;This powerful combination allows you to create sophisticated AI agents that run entirely on your own machine, are perfect for experimenting and learning concepts, while, more importantly, eliminating the need to share sensitive data with third-party services. While cloud-based AI services dominate headlines, they come with significant trade-offs: sending your data to third parties, paying per-token fees, and suffering latency penalties.&lt;/p&gt;</description></item><item><title>Semantic Search with Spring Boot &amp; Redis</title><link>https://foojayio.github.io/website/today/semantic-search-with-spring-boot-redis/</link><pubDate>Mon, 05 May 2025 15:35:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/semantic-search-with-spring-boot-redis/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;strong&gt;You&amp;rsquo;re building a semantic search app using Spring Boot and Redis. Instead of matching exact words, semantic search finds meaning using Vector Similarity Search (VSS). It works by turning movie synopses into vectors with embedding models, storing them in Redis (as a vector database), and finding the closest matches to user queries.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&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/o3XN4dImESE?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;br /&gt;
&lt;p&gt;A traditional searching system works by matching the words a user types with the words stored in a database or document collection. It usually looks for exact or partial matches without understanding the meaning behind the words.&lt;/p&gt;</description></item><item><title>Foojay Podcast #71: Celebrating 30 Years of Java with James Gosling</title><link>https://foojayio.github.io/website/today/foojay-podcast-71/</link><pubDate>Mon, 05 May 2025 06:55:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-71/</guid><description>&lt;p&gt;&lt;strong&gt;We are celebrating Java&amp;rsquo;s 30th anniversary this May!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a very special anniversary episode of the Foojay Podcast! As we approach May 23rd, marking exactly 30 years since Java&amp;rsquo;s first beta release in 1995, we&amp;rsquo;re honored to present our first-ever single-guest podcast. But we have a very special guest for you: James Gosling, the creator of Java!&lt;/p&gt;
&lt;p&gt;Join us for this exclusive conversation as we explore Java&amp;rsquo;s beginnings, its revolutionary impact on the programming world, its continuous evolution over three decades, and James&amp;rsquo;s insights on where the language is heading. From that groundbreaking beta release over &amp;ldquo;Write Once, Run Anywhere&amp;rdquo; to powering billions of devices worldwide, this is the story of Java, told by the man who started it all, the father of Java.&lt;/p&gt;</description></item><item><title>Async file IO with Java and io_uring</title><link>https://foojayio.github.io/website/today/async-file-io-with-java-and-io_uring/</link><pubDate>Fri, 18 Apr 2025 09:28:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/async-file-io-with-java-and-io_uring/</guid><description>&lt;p&gt;When I first started exploring Virtual Threads in Java, I wanted to understand everything about them like, performance characteristics, when they yield, and limitations. This journey led me to an interesting challenge about file I/O operations. These operations cause Virtual Threads to become &amp;ldquo;pinned&amp;rdquo; to platform threads, limiting their effectiveness for I/O-heavy applications.&lt;/p&gt;
&lt;p&gt;This pinning issue has been widely acknowledged across the Java community. It&amp;rsquo;s mentioned in the Virtual Threads &lt;a href="https://openjdk.org/jeps/425" target="_blank" rel="noopener noreferrer"&gt;JEP&lt;/a&gt;
, discussed on &lt;a href="https://www.reddit.com/r/java/comments/1h0cr5g/comment/lz3lv11/" target="_blank" rel="noopener noreferrer"&gt;Reddit threads&lt;/a&gt;
, debated on &lt;a href="https://mail.openjdk.org/pipermail/loom-dev/2024-June/006638.html" target="_blank" rel="noopener noreferrer"&gt;mailing lists&lt;/a&gt;
, and highlighted in the &amp;ldquo;&lt;a href="https://cr.openjdk.org/~rpressler/loom/loom/sol1_part1.html" target="_blank" rel="noopener noreferrer"&gt;State of Loom&lt;/a&gt;
&amp;rdquo;. The consistent message: File I/O and Virtual Threads don&amp;rsquo;t play nicely together.&lt;/p&gt;</description></item><item><title>Optimizing the Garbage Collector when Migrating Cloud Workloads</title><link>https://foojayio.github.io/website/today/optimizing-the-garbage-collector-when-migrating-cloud-workloads/</link><pubDate>Wed, 16 Apr 2025 10:27:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/optimizing-the-garbage-collector-when-migrating-cloud-workloads/</guid><description>&lt;p&gt;&lt;strong&gt;You might associate Arm primarily with smartphones and the Java-based Android runtime. However, OpenJDK has supported AArch64 on Linux since 2014&amp;mdash; before Arm-based cloud instances were widely available.&lt;/strong&gt; &lt;strong&gt;Fast forward a decade and major cloud providers have their own Arm-based instances like AWS Graviton, Microsoft Azure Cobalt, and others, prompting many organizations to migrate Java workloads from x86 to multi-architecture environments.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A multi-architecture deployment shift allows an organization to be adaptable and choose the architecture with the ideal price to performance ratio. Large independent software vendors, such as Uber, are &lt;a href="https://www.uber.com/en-GB/blog/adopting-arm-at-scale-bootstrapping-infrastructure/" target="_blank" rel="noopener noreferrer"&gt;already making this transition&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Breaktime Tech Talks (Ep39): Why embedding models should match + Advice for starting a blog</title><link>https://foojayio.github.io/website/today/breaktime-tech-talks-ep39-why-embedding-models-should-match-advice-for-starting-a-blog/</link><pubDate>Wed, 16 Apr 2025 05:35:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/breaktime-tech-talks-ep39-why-embedding-models-should-match-advice-for-starting-a-blog/</guid><description>&lt;p&gt;This is episode 39 of the &lt;a href="https://www.youtube.com/playlist?list=PLzZ7iUdr2mwS6qexoz9dsI0NfnU614p1w" target="_blank" rel="noopener noreferrer"&gt;Breaktime Tech Talks podcast&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m at a conference this week presenting on a variety of different topics, but I stopped for just a few minutes to document some recent learnings while I was preparing the code projects for this week&amp;rsquo;s sessions.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll chat about a hands-on experience that helped me understand why embedding models for vectors and search should actually match. Then I came across an article with advice for creating a blog that outlines a lot of the practices I myself follow when I write tech blogs. I hope you enjoy it as well.&lt;/p&gt;</description></item><item><title>Six JDK 24 Features You Should Know About</title><link>https://foojayio.github.io/website/today/six-jdk-24-features-you-should-know-about/</link><pubDate>Thu, 03 Apr 2025 08:42:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/six-jdk-24-features-you-should-know-about/</guid><description>&lt;p&gt;&lt;em&gt;Since 2018, we&amp;rsquo;ve had a new release of the Java platform every six months. With Swiss watch-like regularity, the latest version of Java is upon us. This time it&amp;rsquo;s JDK 24. In an almost poetic way, it contains 24 JDK Enhancement Proposals (JEPs).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;JDK 24, which was released on March 18, 2025, has 24 JDK Enhancement Proposals (JEPs), the largest number of new features since the introduction of the time-based release schedule. While 10 of them are preview features, incubator modules, or experimental, that still leaves 14 new features.&lt;/p&gt;</description></item><item><title>Introduction to intermediate operations modeler: Stream Gatherers</title><link>https://foojayio.github.io/website/today/introduction-to-intermediate-operations-modeler-stream-gatherers/</link><pubDate>Wed, 19 Mar 2025 13:04:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/introduction-to-intermediate-operations-modeler-stream-gatherers/</guid><description>&lt;p&gt;&lt;strong&gt;Java is a programming language with many language features, specifications, and APIs. Even among experienced Java developers, being aware of all of these is quite rare. If a study were conducted, we might come across Java developers who have never worked with Threads, never used JPA, or never developed custom annotations. However, is there a Java developer who has worked with Java 8 or later but has never used the Stream API? I highly doubt it.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Breaktime Tech Talks (Ep37): Vector Database Frustration + Microsoft LazyGraphRAG</title><link>https://foojayio.github.io/website/today/breaktime-tech-talks-ep37-vector-database-frustration-microsoft-lazygraphrag/</link><pubDate>Wed, 19 Mar 2025 12:54:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/breaktime-tech-talks-ep37-vector-database-frustration-microsoft-lazygraphrag/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This is episode 37 of the &lt;a href="https://www.youtube.com/playlist?list=PLzZ7iUdr2mwS6qexoz9dsI0NfnU614p1w" target="_blank" rel="noopener noreferrer"&gt;Breaktime Tech Talks&lt;/a&gt;
.&lt;/p&gt;
&lt;/blockquote&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/hv-FtjIHg_I?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;p&gt;You are listening to the Breaktime Tech Talks podcast, a bite-sized tech podcast for busy developers, where we&amp;rsquo;ll briefly cover technical topics, new snippets, and more in short time blocks. I&amp;rsquo;m your host, Jennifer Reif, an avid developer and problem solver with special interest in data, learning, and all things technology.&lt;/p&gt;</description></item><item><title>Java 24 Rolls Out Today! Find Out Why It's Aptly Named</title><link>https://foojayio.github.io/website/today/java-24-rolls-out-today-find-out-why-its-aptly-named/</link><pubDate>Tue, 18 Mar 2025 07:36:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-24-rolls-out-today-find-out-why-its-aptly-named/</guid><description>&lt;p&gt;Java 24 rolls out today! It&amp;rsquo;s been six months since Java 23 was released, so it&amp;rsquo;s time for another helping of new features. And this particular release of Java is aptly named, because it contains exactly 24 JEPs. Coincidence? I think not. 🙂&lt;/p&gt;
&lt;p&gt;{#more-115735}&lt;/p&gt;
&lt;p&gt;Java 24 brings a diverse set of features, delivering performance improvements like compact object headers, garbage collection optimizations and the first JEP to come out of Project Leyden. On top of that, various security features related to the quantum computing field were added, and a solution to virtual thread pinning is now available!&lt;/p&gt;</description></item><item><title>Foojay Podcast #68: Welcome to OpenJDK (Java) 24</title><link>https://foojayio.github.io/website/today/foojay-podcast-68/</link><pubDate>Mon, 17 Mar 2025 06:44:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-68/</guid><description>&lt;p&gt;We serve you a podcast about the new Java version every six months.&lt;/p&gt;
&lt;p&gt;Our regular guest, Simon Ritter, Deputy CTO of Azul, is known on social media as &amp;ldquo;speakjava.&amp;rdquo; He is part of the OpenJDK vulnerability group, JCP executive committee, and expert group for the Java SE specification request so that he can share a lot of inside information with us.&lt;/p&gt;
&lt;p&gt;In this episode, we are joined by Hanno Embregts, a Java Developer by day and musician by night. He publishes a post on Foojay with all the details of every new Java release and prepared a long description of all the new features included in Java 24.&lt;/p&gt;</description></item><item><title>Path Traversal Vulnerability in Deep Java Library (DJL)</title><link>https://foojayio.github.io/website/today/path-traversal-vulnerability-in-deep-java-library-djl-and-its-impact-on-java-ai-development/</link><pubDate>Tue, 11 Mar 2025 12:21:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/path-traversal-vulnerability-in-deep-java-library-djl-and-its-impact-on-java-ai-development/</guid><description>&lt;p&gt;Deep Java Library (&lt;a href="https://djl.ai/" target="_blank" rel="noopener noreferrer"&gt;++DJL++&lt;/a&gt;
) is an open source deep learning framework that brings AI capabilities to Java developers without requiring a shift to Python.&lt;/p&gt;
&lt;p&gt;It provides an intuitive, high-level API for building, training, and deploying machine learning models, supporting deep learning engines like TensorFlow, PyTorch, and MXNet.&lt;/p&gt;
&lt;p&gt;While not as widely adopted as Python-based frameworks, DJL is gaining traction in Java-based AI applications, especially in enterprise software, cloud environments, and financial services.&lt;/p&gt;</description></item><item><title>Enhancing LLM’s Conversations with Efficient Summarization</title><link>https://foojayio.github.io/website/today/summarizingtokenwindowchatmemory-enhancing-llms-conversations-with-efficient-summarization/</link><pubDate>Mon, 03 Mar 2025 13:16:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/summarizingtokenwindowchatmemory-enhancing-llms-conversations-with-efficient-summarization/</guid><description>&lt;p&gt;&lt;strong&gt;LLM chat models have become an integral part of many applications today. We are all experimenting and exploring the best ways to utilize them effectively. For Java developers, LangChain4j has been an incredible tool in this journey.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;By design, most available APIs, such as ChatGPT and Gemini, operate in a &lt;strong&gt;fire-and-forget&lt;/strong&gt; mode. They don&amp;rsquo;t retain previous interactions, meaning every request is treated as a completely new one.&lt;/p&gt;
&lt;p&gt;However, for a smooth and engaging conversation, maintaining context is crucial&amp;mdash;otherwise, the interaction becomes disjointed and frustrating. The common solution is to pass previous messages along with each new prompt, allowing the LLM to infer context. This is where the &lt;strong&gt;chat memory&lt;/strong&gt; concept comes in.&lt;/p&gt;</description></item><item><title>Spring Cloud Stream: Demystifying Event-Driven Architecture</title><link>https://foojayio.github.io/website/today/spring-cloud-stream-demystifying-event-driven-architecture/</link><pubDate>Fri, 28 Feb 2025 08:34:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-cloud-stream-demystifying-event-driven-architecture/</guid><description>&lt;p&gt;&lt;em&gt;Consider a bustling restaurant environment. The kitchen receives a flood of orders, waitstaff dart between tables, and patrons anxiously glance at their watches. Each time a waiter takes an order, he or she must verify it with the kitchen and wait for the kitchen to prepare the meal before attending to another table. This cumbersome method hampers efficiency, leaving the restaurant unable to meet customer demand.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Now envision an alternative situation. Instead of enduring delays, waitstaff enter orders into a centralized system, prompting the kitchen to begin meal preparation immediately upon receipt. As soon as the kitchen prepares the food, waiters receive instant notifications, enabling them to serve customers promptly without any delays. This exemplifies event-driven architecture: a fluid, real-time system where they exchange information asynchronously, promoting scalability and quick responsiveness.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Build local LLM applications with Quarkus, Ollama, Testcontainers</title><link>https://foojayio.github.io/website/today/building-local-llm-ai-powered-applications-with-quarkus-ollama-and-testcontainers/</link><pubDate>Thu, 27 Feb 2025 10:13:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-local-llm-ai-powered-applications-with-quarkus-ollama-and-testcontainers/</guid><description>&lt;p&gt;Traditionally, many AI-powered applications rely on cloud-based APIs or centralized services for model hosting and execution. While this approach has its advantages, such as scalability and ease of use, it also introduces challenges around latency, data privacy, and dependency on third-party providers.&lt;/p&gt;
&lt;p&gt;This is where local AI models shine. By running models directly within your application&amp;rsquo;s infrastructure, you gain greater control over performance, data security, and deployment flexibility. However, building such systems requires the right tools and frameworks to bridge the gap between traditional software development and AI model integration.&lt;/p&gt;</description></item><item><title>Java 24 : What's New?</title><link>https://foojayio.github.io/website/today/java-24-whats-new/</link><pubDate>Wed, 26 Feb 2025 09:58:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-24-whats-new/</guid><description>&lt;p&gt;&lt;strong&gt;Java 24 will be available soon, on March 18th. What are all the functionalities that this version brings to us as developers?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Java 24 contains not less than 24 JEPs, a record and above all an eponymous figure!&lt;/p&gt;
&lt;h2 id="h2-0-jep-404-generational-shenandoah-experimental"&gt;JEP 404: Generational Shenandoah (Experimental)&lt;/h2&gt;
&lt;p&gt;Shenandoah is a Garbage Collector (GC) originally developed by RedHat and included in OpenJDK. It reduces GC pause times by performing evacuation work concurrently to application threads.&lt;/p&gt;</description></item><item><title>Sliding Window Counter Rate Limiter (Redis &amp; Java)</title><link>https://foojayio.github.io/website/today/sliding-window-counter-rate-limiter-redis-java/</link><pubDate>Tue, 25 Feb 2025 21:21:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/sliding-window-counter-rate-limiter-redis-java/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This content is also available on YouTube. &lt;a href="https://youtu.be/Wvm_u0IR69M" target="_blank" rel="noopener noreferrer"&gt;Check it out!&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Sliding Window Counter offers a more efficient way to handle rate limiting compared to the Sliding Window Log. While the Sliding Window Log keeps an exact log of timestamps for each request, allowing precise tracking over a rolling time period, this precision comes at the cost of higher memory usage and computational overhead as the number of requests increases.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Building a declarative API with Spring AOP and SpEL</title><link>https://foojayio.github.io/website/today/building-a-declarative-api-with-spring-aop-and-spel/</link><pubDate>Wed, 12 Feb 2025 15:57:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-a-declarative-api-with-spring-aop-and-spel/</guid><description>&lt;p&gt;&lt;strong&gt;In this article, we&amp;rsquo;ll implement a declarative API to perform tasks belonging to cross-cutting concerns, using auditing as an example. We&amp;rsquo;ll see how SpEL and Spring AOP allow us to easily intercept invocations throughout a code base and perform arbitrary logic in an expressive and non-invasive manner.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-a-story-about-legacy"&gt;A story about legacy&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s pretend that we inherited a legacy system. The system is in a dismal state, with every change always at risk of bringing the whole thing down. One day, there is a business requirement to audit a few dozen methods scattered throughout the code base. After every invocation of these methods, we should notify an external system by sending a client id and an operation (&lt;code&gt;1234&lt;/code&gt;, &lt;code&gt;&amp;quot;CREATE_USER&amp;quot;&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Foojay Podcast #66: Let's Talk About Java Code!</title><link>https://foojayio.github.io/website/today/foojay-podcast-66/</link><pubDate>Tue, 11 Feb 2025 08:24:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-66/</guid><description>&lt;p&gt;In this Foojay podcast, we dive into a few articles that were published recently and focus on code.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Igor Kulakov of JetBrains gives us his insights into the tool he created to find duplicate content in documentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;
&lt;ul&gt;
&lt;li&gt;Rijo Sam explains how you can generate real random values and how he created a train departure display.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;
&lt;ul&gt;
&lt;li&gt;Maxillian Arruda explains in a very detailed post the different ways to construct a complex Java object.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;
&lt;ul&gt;
&lt;li&gt;And we start with Wim De Troye about the code changes he had to do in a project that got upgraded from Spring Boot 2 to 3.&lt;/li&gt;
&lt;/ul&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/IB7drozkKUk?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>Spring Data Neo4j: How to update an entity</title><link>https://foojayio.github.io/website/today/spring-data-neo4j-how-to-update-an-entity/</link><pubDate>Wed, 05 Feb 2025 18:58:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-data-neo4j-how-to-update-an-entity/</guid><description>&lt;p&gt;&lt;strong&gt;After working on a new &lt;a href="https://graphacademy.neo4j.com/courses/app-spring-data/" target="_blank" rel="noopener noreferrer"&gt;online Spring Data Neo4j course&lt;/a&gt;
, I learned a couple more things about updating an entity.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The course required a different set of scenarios than outlined in my &lt;a href="https://jmhreif.com/blog/2023/sdn-cypher-update-entity/" target="_blank" rel="noopener noreferrer"&gt;previous SDN update blog post&lt;/a&gt;
, so I wanted to cover those scenarios, as well.&lt;/p&gt;
&lt;h2 id="_spring_save_method"&gt;Spring save() method&lt;/h2&gt;
&lt;p&gt;First up is the out-of-the-box &lt;code&gt;save()&lt;/code&gt; method that is provided by Spring as a default. This method takes an input of the entity object you want to save to the database.&lt;/p&gt;</description></item><item><title>Sliding Window Log Rate Limiter (Redis &amp; Java)</title><link>https://foojayio.github.io/website/today/sliding-window-log-rate-limiter-redis-java/</link><pubDate>Tue, 04 Feb 2025 12:21:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/sliding-window-log-rate-limiter-redis-java/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://youtu.be/bCYzRg0oQjY" target="_blank" rel="noopener noreferrer"&gt;This article is also available on YouTube. Check it out!&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Sliding Window Log is a &lt;em&gt;more precise&lt;/em&gt; way to handle rate limiting. Instead of splitting time into fixed intervals like the &lt;a href="https://foojayio.github.io/website/wp-admin/post.php?post=115337"&gt;Fixed Window Counter&lt;/a&gt;
 , it keeps a log of timestamps for each request. This allows it to track requests over a rolling time period, like the last second or minute, without abrupt resets at the end of an interval.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Project Loom: Structured Concurrency - Java</title><link>https://foojayio.github.io/website/today/project-loom-structured-concurrency-java/</link><pubDate>Wed, 29 Jan 2025 12:12:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/project-loom-structured-concurrency-java/</guid><description>&lt;p&gt;In today&amp;rsquo;s era of cloud computing, where high-performance infrastructure is readily available, developers face a complex challenge in achieving efficient concurrency.&lt;/p&gt;
&lt;p&gt;While modern technological advancements have brought us closer to solving these challenges, we must adopt a thoughtful, incremental approach to concurrency.&lt;/p&gt;
&lt;p&gt;This principle holds especially true as we strive to design scalable, reliable, and easy-to-maintain systems.&lt;/p&gt;
&lt;p&gt;One such advancement in this domain is &lt;em&gt;structured concurrency&lt;/em&gt;, a paradigm that simplifies concurrent programming by bringing order and predictability to task management.&lt;/p&gt;</description></item><item><title>Token Bucket Rate Limiter (Redis &amp; Java) - Raphael De Lio</title><link>https://foojayio.github.io/website/today/token-bucket-rate-limiter-redis-java/</link><pubDate>Tue, 28 Jan 2025 07:07:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/token-bucket-rate-limiter-redis-java/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://youtu.be/cfF6nXIpDwE" target="_blank" rel="noopener noreferrer"&gt;This article is also available on YouTube!&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;strong&gt;Token Bucket&lt;/strong&gt; algorithm is a flexible and efficient rate-limiting mechanism.&lt;/p&gt;
&lt;p&gt;It works by filling a bucket with tokens at a fixed rate (e.g., one token per second).&lt;/p&gt;
&lt;p&gt;Each request consumes a token, and if no tokens are available, the request is rejected.&lt;/p&gt;
&lt;p&gt;The bucket has a maximum capacity, so it can handle bursts of traffic as long as the burst doesn&amp;rsquo;t exceed the number of tokens in the bucket.&lt;/p&gt;</description></item><item><title>Receiving mails in Java with IMAP or POP3</title><link>https://foojayio.github.io/website/today/receiving-mails-in-java-with-imap-or-pop3/</link><pubDate>Fri, 24 Jan 2025 10:33:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/receiving-mails-in-java-with-imap-or-pop3/</guid><description>&lt;p&gt;&lt;strong&gt;I was recently in need to write some small demo project which was receiving and processing mails. There is a lot of documentation for sending mails, but gathering information about the receiving and processing part is less easy.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This example shows you how to receive mails in Java either using the IMAP or the POP3 protocol. The SSL encrypted variants IMAPS and POP3S are also supported. Received mails will be set to read, which means that you will only receive the latest ones. I will also give some hints about how to handle incoming mails concerning application security. Remember that you should always sanitize user inputs.&lt;/p&gt;</description></item><item><title>Challenge yourself with Application Observability Code Challenges</title><link>https://foojayio.github.io/website/today/challenge-yourself-with-application-observability-code-challenges/</link><pubDate>Wed, 22 Jan 2025 13:19:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/challenge-yourself-with-application-observability-code-challenges/</guid><description>&lt;p&gt;Code challenges are a nice way to challenge yourself with programming, resulting in some great challenges like &lt;a href="https://github.com/gunnarmorling/1brc" target="_blank" rel="noopener noreferrer"&gt;#1brc&lt;/a&gt;
 and the yearly &lt;a href="https://adventofcode.com" target="_blank" rel="noopener noreferrer"&gt;Advent of Code (#AoC)&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;While these challenges often include a competitive element, the Application Observability Code Challenges are focussed on the learning about observability practices.&lt;/p&gt;
&lt;h2 id="h2-0-what-are-the-application-observability-code-challenges"&gt;What are the Application Observability Code Challenges?&lt;/h2&gt;
&lt;p&gt;The idea of these challenges came to me based on the challenges above and the fact that I see in practice that quite a few developers are struggling to get up to speed with applying observability practices.&lt;/p&gt;</description></item><item><title>How JVM handles exceptions</title><link>https://foojayio.github.io/website/today/how-jvm-handles-exceptions/</link><pubDate>Tue, 21 Jan 2025 14:45:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-jvm-handles-exceptions/</guid><description>&lt;p&gt;&lt;strong&gt;It&amp;rsquo;s interesting to know how the JVM runs bytecode instructions&amp;hellip; But do you know what is going on when an exception is thrown? How does the JVM handle the delegation of control? What does it look like in the bytecode?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let me quickly show you!&lt;/p&gt;
&lt;h3 id="h3-0-example"&gt;Example&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s a simple bit of Java code that includes all the important actors in the exception-throwing game (try-catch-finally):&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic"&gt;int a = 0;
try {
 if (a == 0) { // to make it less boring, let's have some branching logic
 throw new Exception("Exception message!");
 }
} catch (Exception e) {
 doSomethingOnException();
} finally {
 doSomethingFinally();
}&lt;/pre&gt;
&lt;h3 id="h3-1-exception-table"&gt;Exception table&lt;/h3&gt;
&lt;p&gt;The resulting bytecode includes an interesting section in the Code attribute called the Exception table. Each method can have its own exception table, and it&amp;rsquo;s only present when relevant. If there is no exception-handling logic in the method, it won&amp;rsquo;t have an exception table.&lt;/p&gt;</description></item><item><title>Fixed Window Counter Rate Limiter (Redis &amp; Java)</title><link>https://foojayio.github.io/website/today/fixed-window-counter-rate-limiter-redis-java/</link><pubDate>Mon, 20 Jan 2025 16:34:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/fixed-window-counter-rate-limiter-redis-java/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://youtu.be/Ki3WKSNpdRU" target="_blank" rel="noopener noreferrer"&gt;This article is also available on YouTube!&lt;/a&gt;

The &lt;strong&gt;Fixed Window Counter&lt;/strong&gt; is the simplest and most straightforward rate-limiting algorithm. It divides time into fixed intervals (e.g., seconds, minutes, or hours) and counts the number of requests within each interval. If the count exceeds a predefined threshold, the requests are rejected until the next interval begins. Looking for a more precise algorithm? Take a look at the &lt;a href="https://foojayio.github.io/website/today/sliding-window-log-rate-limiter-redis-java/"&gt;Sliding Window Log implementation&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>The slow Death of the onjcmd Debugger Feature</title><link>https://foojayio.github.io/website/today/the-slow-death-of-the-onjcmd-debugger-feature/</link><pubDate>Sat, 18 Jan 2025 10:47:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-slow-death-of-the-onjcmd-debugger-feature/</guid><description>&lt;p&gt;Almost to the day, one and a quarter years ago, I published my blog post called &lt;a href="https://foojayio.github.io/website/today/level-up-your-java-debugging-skills-with-on-demand-debugging/"&gt;Level-up your Java Debugging Skills with on-demand Debugging&lt;/a&gt;
. In this artucle, I wrote about multiple rarely known and rarely used features of the Java debugging agent, including the onjcmd feature.{#block-a9c8a1e1-3105-4ea3-80ff-84fea4726402}&lt;/p&gt;
&lt;p&gt;To quote my own article:{#block-a9c8a1e1-3105-4ea3-80ff-84fea4726402}&lt;/p&gt;
&lt;blockquote&gt;
&lt;h2 id="block-34217269-4b27-4330-a4cb-2c66085f9a1c"&gt;JCmd triggered debugging&lt;/h2&gt;
&lt;p&gt;There are often cases where the code that you want to debug is executed later in your program&amp;rsquo;s run or after a specific issue appears. So don&amp;rsquo;t waste time running the debugging session from the start of your program, but use the &lt;code&gt;onjcmd=y&lt;/code&gt; option to tell the JDWP agent to wait with the debugging session till it is triggered via &lt;code&gt;jcmd&lt;/code&gt;.{#block-19cdbfac-1c23-4648-af2f-6bd2f85951c2}&lt;/p&gt;</description></item><item><title>An Example of HACS: Adaptive Lighting</title><link>https://foojayio.github.io/website/today/an-example-of-hacs-adaptive-lighting/</link><pubDate>Wed, 15 Jan 2025 08:40:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/an-example-of-hacs-adaptive-lighting/</guid><description>&lt;p&gt;&lt;strong&gt;In the &lt;a href="https://blog.frankel.ch/home-assistant/3/" target="_blank" rel="noopener noreferrer"&gt;previous post&lt;/a&gt;
 of this focus, we replaced Philips Hue automation with the one from Home Assistant. One significant gap we noticed was that Home Assistant doesn&amp;rsquo;t automatically adjust the brightness according to the time of the day, a feature Philips Hue offers. In this post, we are going to address this gap.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The first step when wanting to add a feature to Home Assistant is to browse through available integrations. While there was no out-of-the-box integration, I discovered an alternative: HACS.&lt;/p&gt;</description></item><item><title>Make the life of your developer client's easier with smart builders</title><link>https://foojayio.github.io/website/today/make-the-life-of-your-developer-clients-easier-with-smart-builders/</link><pubDate>Thu, 09 Jan 2025 11:49:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/make-the-life-of-your-developer-clients-easier-with-smart-builders/</guid><description>&lt;p&gt;&lt;strong&gt;We often hear the phrase: &amp;ldquo;Make the life of your client easier&amp;rdquo;. But, what about the developers? They are the ones who will be working with the code you write. It is important to make their lives easier too.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Despite the target customer of your solution, you&amp;rsquo;ll be creating code that will be maintained by other developers and, sometimes, it may include you as well. Choosing good approaches and techniques will make their life, or your life, easier probably.&lt;/p&gt;</description></item><item><title>Integrating Google Analytics With Vaadin Flow: A Step-By-Step Guide</title><link>https://foojayio.github.io/website/today/integrating-google-analytics-with-vaadin-flow-a-step-by-step-guide/</link><pubDate>Wed, 08 Jan 2025 11:55:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/integrating-google-analytics-with-vaadin-flow-a-step-by-step-guide/</guid><description>&lt;p&gt;&lt;strong&gt;Want to track how users interact with your Vaadin Flow application? Learn how to integrate Google Analytics with a clean, reusable component. This guide shows you step-by-step instructions on how to set up tracking, monitor page views, and capture custom events in your Vaadin application.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Analytics are crucial for understanding how users interact with your web application. In this guide, I&amp;rsquo;ll show you how to integrate Google Analytics with your Vaadin Flow application in a clean, maintainable way.&lt;/p&gt;</description></item><item><title>The proper way to define configuration properties in Spring</title><link>https://foojayio.github.io/website/today/the-proper-way-to-define-configuration-properties-in-spring/</link><pubDate>Tue, 07 Jan 2025 16:55:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-proper-way-to-define-configuration-properties-in-spring/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I recently did a (long overdue) &lt;strong&gt;migration from Spring Boot 2 to 3&lt;/strong&gt; on one of our larger applications.&lt;/p&gt;
&lt;p&gt;Something that surprised me was that classes marked with &lt;code&gt;@ConfigurationProperties&lt;/code&gt; had properties that were properly bound when running in Spring Boot 2 but were &lt;strong&gt;no longer&lt;/strong&gt; bound after the upgrade.&lt;/p&gt;
&lt;p&gt;Luckily, the automated testing suite caught this issue at &lt;em&gt;run time&lt;/em&gt; , but it&amp;rsquo;s obvious that such a thing silently failing can be &lt;strong&gt;quite problematic&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>AI-powered Chat Application using watsonx.ai and Spring AI</title><link>https://foojayio.github.io/website/today/ai-powered-chat-application-using-ibm-watsonx-ai-and-spring-ai/</link><pubDate>Fri, 03 Jan 2025 08:31:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/ai-powered-chat-application-using-ibm-watsonx-ai-and-spring-ai/</guid><description>&lt;p&gt;&lt;strong&gt;Generative Artificial Intelligence (Gen AI) disrupted enterprises with the introduction of GPT-4 foundation model by Open AI in the late 2022 to early 2023 triggering big tech to release their own Gen AI platform and foundation models. Among them are Google, Microsoft, AWS and IBM. In this article, we will deal with the Gen AI platform and model of IBM called watsonx and integrate it with Spring AI to create a custom chat application using the IBM Granite Foundation Model.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Pseudorandom Number Generators - The Secret Behind Santa’s Gift Bag</title><link>https://foojayio.github.io/website/today/pseudorandom-number-generator/</link><pubDate>Thu, 02 Jan 2025 14:51:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/pseudorandom-number-generator/</guid><description>&lt;p&gt;On a snowy Christmas Eve, Santa sets off on his journey around the world, gliding through the night sky on his sleigh to deliver presents to children everywhere.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s one of the busiest nights of the year for Santa, as children eagerly await their special gifts. With his magical gift bag which provides an endless supply of presents, Santa ensures no one is ever disappointed. To those watching, the gifts might seem to appear randomly, but Santa knows precisely which gift to deliver next, following an order only he can understand.&lt;/p&gt;</description></item><item><title>Issues with old GlassFish server? Upgrade to Eclipse GlassFish!</title><link>https://foojayio.github.io/website/today/issues-with-old-glassfish-server-upgrade-to-eclipse-glassfish/</link><pubDate>Tue, 24 Dec 2024 09:05:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/issues-with-old-glassfish-server-upgrade-to-eclipse-glassfish/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Rely on hardened and production-ready Eclipse GlassFish 7 or newer. Benefit from key feature updates and Jakarta EE advancements, brought to you by OmniFish and the amazing community of opensource GlassFish contributors.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The advancements made in Eclipse GlassFish under the Eclipse Foundation have transformed it into a more developer-friendly, cloud-native, and secure application server compared to its legacy predecessors from before 2020.&lt;/p&gt;
&lt;p&gt;Since version 7, Eclipse GlassFish provides a lot of benefits not available with old GlassFish versions, for example:&lt;/p&gt;</description></item><item><title>Foojay Podcast #64: Interviews at JFall about opensource, OpenJDK evolutions, Project Loom, JVM,...</title><link>https://foojayio.github.io/website/today/foojay-podcast-64/</link><pubDate>Mon, 23 Dec 2024 10:51:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-64/</guid><description>&lt;p&gt;Let&amp;rsquo;s wrap up this year with more interviews from the JFall conference.&lt;/p&gt;
&lt;p&gt;In this episode you&amp;rsquo;ll learn more about Foojay, JVM internals and writing your own programming language, Project Loom and structured concurrency, learning at conferences, code reviews, creating desktop applications with Java, infrastructure as code, JUG Noord, and much 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/kx6DfVE-I0o?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 #63: How do we keep your Java applications up to date and secure?</title><link>https://foojayio.github.io/website/today/foojay-podcast-63/</link><pubDate>Mon, 16 Dec 2024 12:41:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-63/</guid><description>&lt;h2 id="h2-0-last-month-i-published-a-foojay-article-about-the-risks-in-systems-that-are-stuck-on-old-or-outdated-java-versions-and-got-a-lot-of-feedback-from-developers-most-of-them-want-to-move-on-but-get-stuck-on-management-decisions-outdated-production-environments-or-one-of-the-many-other-reasons-that-keep-systems-stuck-on-old-java-versions-and-dependencies"&gt;Last month, I published a Foojay article about &lt;a href="https://foojayio.github.io/website/today/why-java-8-is-a-ticking-time-bomb-hiding-within-your-organization/"&gt;the risks in systems that are stuck on old or outdated Java versions&lt;/a&gt;
 and got &lt;a href="https://foojayio.github.io/website/today/how-organizations-became-stuck-on-outdated-java-versions/"&gt;a lot of feedback from developers&lt;/a&gt;
. Most of them want to move on but get stuck on management decisions, outdated production environments, or one of the many other reasons that keep systems stuck on old Java versions and dependencies.&lt;/h2&gt;
&lt;p&gt;Do you want to bring your system from Java 8 to 23? Did you know that Java 17 already has 13 security releases? And that you can use tools like OpenRewrite to help you update your code?&lt;/p&gt;</description></item><item><title>Run a Java Lambda Function From a Docker image</title><link>https://foojayio.github.io/website/today/run-a-java-lambda-function-from-a-docker-image/</link><pubDate>Wed, 11 Dec 2024 16:16:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/run-a-java-lambda-function-from-a-docker-image/</guid><description>&lt;p&gt;&lt;strong&gt;Have you ever wanted to deploy a Java Serverless function, but package it with a Docker Image? That is possible now with AWS new Container support. This guide will show you how to try it yourself, step by step!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Hello Lambda Function project contains an AWS Lambda maven application with &lt;a href="https://github.com/aws/aws-sdk-java-v2" target="_blank" rel="noopener noreferrer"&gt;AWS Java SDK 2.x&lt;/a&gt;
 dependencies.&lt;/p&gt;
&lt;p&gt;Here follows instructions from AWS Document on building &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/java-image.html#java-image-instructions" target="_blank" rel="noopener noreferrer"&gt;Lambda for Java&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The sample code seen below can be found in my GitHub repository: &lt;a href="https://github.com/charlfasching/hello-lambda" target="_blank" rel="noopener noreferrer"&gt;hello-lambda&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Speed up your Spring Batch with Native Image and GraalVM</title><link>https://foojayio.github.io/website/today/speed-up-your-spring-batch-with-native-image-and-graalvm/</link><pubDate>Tue, 10 Dec 2024 15:47:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/speed-up-your-spring-batch-with-native-image-and-graalvm/</guid><description>&lt;p&gt;&lt;strong&gt;Spring Batch is often used for&lt;/strong&gt; data processing &lt;strong&gt;jobs that don&amp;rsquo;t run continuously.&lt;/strong&gt; Instead, they start, process, and stop,&lt;strong&gt;which makes them a perfect candidate for GraalVM Native Image.&lt;/strong&gt; Unlike traditional Java applications that require a long JVM startup time, Native Images execute almost instantly, giving a significant performance boost.&lt;/p&gt;
&lt;p&gt;In this article, you&amp;rsquo;ll learn how to build a Spring Batch application that reads a CSV file, logs its content, and writes it to a PostgreSQL database.&lt;strong&gt;We&amp;rsquo;ll see how to compile it into a Native Image using GraalVM&lt;/strong&gt; , and most importantly**, we&amp;rsquo;ll benchmark the difference between** running it as &lt;strong&gt;a traditional JAR and&lt;/strong&gt; as &lt;strong&gt;a native binary&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Prevent LDAP injection in #java 💥💉with #springboot</title><link>https://foojayio.github.io/website/today/prevent-ldap-injection-in-java-with-springboot/</link><pubDate>Wed, 04 Dec 2024 14:45:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/prevent-ldap-injection-in-java-with-springboot/</guid><description>&lt;p&gt;&lt;strong&gt;LDAP (Lightweight Directory Access Protocol)&lt;/strong&gt; is essential for managing and accessing directory information in Java web applications. However, it&amp;rsquo;s crucial to understand and prevent &lt;strong&gt;LDAP Injection&lt;/strong&gt;, a serious security vulnerability that can lead to unauthorized access and data breaches.&lt;/p&gt;
&lt;p&gt;Following &lt;strong&gt;OWASP Recommendations&lt;/strong&gt; , such as validating user inputs and using parameterized queries, is vital for securing your applications. In this article, we&amp;rsquo;ll dive into LDAP, explore LDAP Injection, share OWASP&amp;rsquo;s best practices, and demonstrate secure coding in &lt;strong&gt;Spring Boot&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Task schedulers in Java: modern alternatives to Quartz Scheduler</title><link>https://foojayio.github.io/website/today/task-schedulers-in-java-modern-alternatives-to-quartz-scheduler/</link><pubDate>Thu, 28 Nov 2024 18:04:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/task-schedulers-in-java-modern-alternatives-to-quartz-scheduler/</guid><description>&lt;h3 id="h3-0-quartz-is-often-considered-the-standard-job-scheduling-library-in-java-which-can-lead-developers-to-overlook-more-modern-alternatives"&gt;Quartz is often considered the standard job scheduling library in Java, which can lead developers to overlook more modern alternatives.&lt;/h3&gt;
&lt;p&gt;For a long time, Quartz, also known as Quartz Scheduler, was the only viable open-source task scheduler in Java. In fact, the official Quartz documentation still suggests that there is &lt;a href="https://www.quartz-scheduler.org/documentation/2.3.1-SNAPSHOT/faq.html" title="no real alternative" target="_blank" rel="noopener noreferrer"&gt;no real alternative&lt;/a&gt;
. In this article, we will list a few different &lt;strong&gt;Quartz alternatives that offer a similar set of features while being easier and more enjoyable to use.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>How Organizations Became Stuck on Outdated Java Versions</title><link>https://foojayio.github.io/website/today/how-organizations-became-stuck-on-outdated-java-versions/</link><pubDate>Wed, 27 Nov 2024 15:46:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-organizations-became-stuck-on-outdated-java-versions/</guid><description>&lt;p&gt;My recent article &lt;a href="https://foojayio.github.io/website/today/why-java-8-is-a-ticking-time-bomb-hiding-within-your-organization/"&gt;&amp;ldquo;Why Java 8 is a Ticking Time Bomb Hiding Within Your Organization&amp;rdquo;&lt;/a&gt;
 triggered quit some reactions&amp;hellip; and so I went a step further and asked on social media: &amp;ldquo;&lt;em&gt;Why is your company still on Java 8 (or older)? And why did you never move to 9, 10,&amp;hellip; and got stuck on this outdated version?&lt;/em&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Here is a summary of what I learned from the reactions!&lt;/p&gt;
&lt;h2 id="h2-0-reasons-to-stick-to-8"&gt;Reasons to Stick to 8&lt;/h2&gt;
&lt;p&gt;Of course, there are many reasons why some projects deliberately are kept on Java 8 or don&amp;rsquo;t succeed on moving to a newer version.&lt;/p&gt;</description></item><item><title>Hot Class Reload in Java: A Webpack HMR-Like Experience</title><link>https://foojayio.github.io/website/today/hot-class-reload-in-java-a-webpack-hmr-like-experience-for-java-developers/</link><pubDate>Tue, 19 Nov 2024 15:57:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/hot-class-reload-in-java-a-webpack-hmr-like-experience-for-java-developers/</guid><description>&lt;p&gt;&lt;strong&gt;In the world of software development, time is everything. Every developer knows the frustration of waiting for a full application restart just to see a small change take effect.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Java developers, in particular, have long dealt with this issue. But what if you didn&amp;rsquo;t have to stop and restart every time you updated a class? Enter &lt;strong&gt;Hot Class Reload (HCR)&lt;/strong&gt; in Java&amp;mdash;a technique that can keep you in the flow, reloading classes on the fly, much like &lt;strong&gt;Hot Module Reload (HMR)&lt;/strong&gt; does in JavaScript.&lt;/p&gt;</description></item><item><title>Crafting Your Own Railway Display with Java!</title><link>https://foojayio.github.io/website/today/crafting-your-own-railway-display-with-java/</link><pubDate>Mon, 18 Nov 2024 08:46:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/crafting-your-own-railway-display-with-java/</guid><description>&lt;p&gt;&lt;strong&gt;Have you fancied to have your own railway display at home? If you love traveling by public transport and always jump on the train just before the door closes like us, it&amp;rsquo;s really cool and highly efficient to have your own personalized display.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/crafting-your-own-railway-display-with-java/NS_display_2-scaled.jpg" alt="custom railway display showing the train timings" loading="lazy"&gt;
&lt;/p&gt;
&lt;h3 id="h3-0-background"&gt;&lt;strong&gt;Background&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Without live data, this project could not work. Luckily, all the data we needed was publicly and freely available with Nederlandse Spoorwegen (NS) APIs. To access them, you only need to create an account in the &lt;a href="https://apiportal.ns.nl/" target="_blank" rel="noopener noreferrer"&gt;NS API Portal and subscribe to the APIs&lt;/a&gt;
 you want to use.&lt;/p&gt;</description></item><item><title>Why Java 8 is a Ticking Time Bomb Hiding Within Your Organization</title><link>https://foojayio.github.io/website/today/why-java-8-is-a-ticking-time-bomb-hiding-within-your-organization/</link><pubDate>Fri, 15 Nov 2024 11:16:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-java-8-is-a-ticking-time-bomb-hiding-within-your-organization/</guid><description>&lt;p&gt;When I spoke to developers at Devoxx in Belgium in October, I was surprised to learn how many of them are maintaining systems that are still running on Java 8 (released in 2014). One of them even still has a Java 5 application in production, with a runtime of 20 years old!&lt;/p&gt;
&lt;p&gt;I know I&amp;rsquo;m biased, as I experiment extensively with the latest Java versions to learn what improvements they bring. But it hurts my heart to think of all those developers maintaining old systems, missing out on all the coding and performance improvements that newer versions offer. In this post, I want to highlight some of the many reasons why staying on Java 8 is a ticking time bomb&amp;hellip;&lt;/p&gt;</description></item><item><title>Spring Boot: Java Template Engine (JTE)</title><link>https://foojayio.github.io/website/today/spring-boot-java-template-engine-jte/</link><pubDate>Wed, 13 Nov 2024 09:03:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-java-template-engine-jte/</guid><description>&lt;h3 id="h3-0-hello-to-all-java-and-spring-enthusiasts-i-am-the-java-template-engine-a-fresh-newcomer-to-the-spring-initializer-ecosystem"&gt;Hello to all Java and Spring enthusiasts. I am the Java Template Engine, a fresh newcomer to the Spring Initializer Ecosystem.&lt;/h3&gt;
&lt;p&gt;I have gained popularity as a template engine for developing user interface applications that use Java syntax within Spring Boot applications, alongside other engines such as Freemarker, Thymeleaf, Mustache, and Velocity. Many developers widely use Spring Boot, a framework that simplifies Java application development, and incorporating a template engine like mine streamlines the process of creating dynamic and responsive user interfaces.&lt;/p&gt;</description></item><item><title>How we almost missed a plane, but OpenJDK could have saved us.</title><link>https://foojayio.github.io/website/today/how-we-almost-missed-a-plane-in-kazakhstan-but-openjdk-could-have-saved-us/</link><pubDate>Sun, 03 Nov 2024 08:01:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-we-almost-missed-a-plane-in-kazakhstan-but-openjdk-could-have-saved-us/</guid><description>&lt;p&gt;&lt;strong&gt;A family vacation as a topic for a Foojay blog post? Really? Yes, because, very unexpectedly, it was influenced by a change in the OpenJDK project&amp;hellip;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-traveling-to-kazakhstan"&gt;Traveling to Kazakhstan&lt;/h2&gt;
&lt;p&gt;In August, our family vacation brought us to Kazakhstan. An important trip, as it is the birth country of our (now) 14 year old son. It was over 13 years that we had been there, and we planned to go back earlier, but some stupid virus messed up everyone&amp;rsquo;s life a few years ago&amp;hellip;&lt;/p&gt;</description></item><item><title>JDK 23: Module Design Pattern with JEP-476</title><link>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-module-design-pattern-with-jep-476/</link><pubDate>Thu, 31 Oct 2024 09:41:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-module-design-pattern-with-jep-476/</guid><description>&lt;p&gt;Although the module design pattern can be implemented in many different ways, the main motivation behind using it remains the same. This is the isolation of a specific section into small building blocks, which are the so-called modules. Therefore, the module design pattern belongs to the structural design pattern family.&lt;/p&gt;
&lt;p&gt;Before Java 9, each project using the module design pattern at any level was a bit difficult and many times broken. Such a situation had a direct impact on source code maintainability and event extensibility, as it was very easy to break module boundaries. Many times this state has been called a bit like &amp;ldquo;classpath hell&amp;rdquo;. In order to avoid such a situation, it was necessary to preserve the coding discipline.&lt;/p&gt;</description></item><item><title>Java Tips # 01 -  Writing Shebang Scripts in Pure Java</title><link>https://foojayio.github.io/website/today/java-tips-01-writing-shebang-scripts-in-pure-java/</link><pubDate>Tue, 29 Oct 2024 17:06:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-tips-01-writing-shebang-scripts-in-pure-java/</guid><description>&lt;p&gt;&lt;strong&gt;Did you know you can write a CLI script in Java just as easily as you would in a bash script, and run it directly from the shell?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is commonly called a shebang script, though we are mostly familiar with writing them in bash. Bash scripts are great, but they can be obscure to developers who aren&amp;rsquo;t familiar with the syntax. As a Java developer, you&amp;rsquo;d likely prefer to get things done the Java way. Well, since Java 11, you can do exactly that!&lt;/p&gt;</description></item><item><title>Just-Write-And-Run prototyping with JEP-477</title><link>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-just-write-and-run-prototyping-with-jep-477-not-only-for-beginners/</link><pubDate>Wed, 23 Oct 2024 09:37:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-just-write-and-run-prototyping-with-jep-477-not-only-for-beginners/</guid><description>&lt;h3 id="h3-0-it-seems-like-it-s-never-been-easier-to-start-writing-a-simple-program-that-can-be-turned-into-a-more-advanced-one-as-development-progresses-let-s-explore-possibilities-delivered-by-jdk-23-release"&gt;It seems like it&amp;rsquo;s never been easier to start writing a simple program that can be turned into a more advanced one as development progresses. Let&amp;rsquo;s explore possibilities delivered by JDK 23 release.&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;From the early days, Java may have struggled with a relatively verbose and sometimes strikingly complicated process of creating a small program. A small program just to validate an idea or assumption. Let&amp;rsquo;s call that Just-Write-And-Run feature. For example, it&amp;rsquo;s required to create a trivial solution for reading and parsing data, Oh now what&amp;hellip;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Book Review: Mastering the Java Virtual Machine</title><link>https://foojayio.github.io/website/today/book-review-mastering-the-java-virtual-machine/</link><pubDate>Fri, 18 Oct 2024 13:54:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/book-review-mastering-the-java-virtual-machine/</guid><description>&lt;p&gt;&lt;strong&gt;Otávio Santana&amp;rsquo;s&lt;/strong&gt; &lt;strong&gt;&amp;ldquo;Mastering the Java Virtual Machine&amp;rdquo;&lt;/strong&gt; takes readers on an insightful journey through the inner workings of the JVM. As I read this book, I found myself reconnecting with the fundamentals of Java programming while also discovering new depths of understanding.&lt;/p&gt;
&lt;p&gt;The book strikes a perfect balance between nostalgia and innovation. It reminded me of my early programming days, while also introducing cutting-edge concepts that are crucial for modern Java development. Santana uses clever technical metaphors to make complex JVM internals more accessible, bridging the gap between theory and practical application.&lt;/p&gt;</description></item><item><title>Deep dive into bits, bytes, shorts, ints, longs, signed, and unsigned with Java</title><link>https://foojayio.github.io/website/today/deep-dive-into-bits-bytes-shorts-ints-longs-signed-and-unsigned-with-java/</link><pubDate>Fri, 18 Oct 2024 13:54:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/deep-dive-into-bits-bytes-shorts-ints-longs-signed-and-unsigned-with-java/</guid><description>&lt;p&gt;On the Pi4J discussion list, someone recently asked what the &lt;a href="https://github.com/Pi4J/pi4j-v2/discussions/379" target="_blank" rel="noopener noreferrer"&gt;best and easiest way is in Java to convert a byte value&lt;/a&gt;
. In Java, there is no distinction between signed and unsigned bytes, which can be confusing. My book &lt;a href="https://webtechie.be/books/" target="_blank" rel="noopener noreferrer"&gt;&amp;ldquo;Getting Started with Java on the Raspberry Pi&amp;rdquo;&lt;/a&gt;
 contains an explanation about this, and I am happy to share it in this post with some more info and code examples&amp;hellip;&lt;/p&gt;</description></item><item><title>Changes Included in Release 24.08 of Azul Zing Builds of OpenJDK</title><link>https://foojayio.github.io/website/today/changes-included-in-release-24-08-of-azul-zing-builds-of-openjdk/</link><pubDate>Fri, 18 Oct 2024 13:53:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/changes-included-in-release-24-08-of-azul-zing-builds-of-openjdk/</guid><description>&lt;p&gt;Azul Zing Builds of OpenJDK, the optimized Java runtime within &lt;a href="https://www.azul.com/products/prime" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;
, has reached the release of the 24.08 Stable Release line. Zing builds are available in two versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stream Builds&lt;/strong&gt; : Fast-moving monthly releases (end of the month) that include the latest features and changes in PSU releases. These are &lt;strong&gt;free for development and evaluation&lt;/strong&gt;. Using Stream Builds in production requires an active subscription. Their version number is based on year and month. For instance, &amp;ldquo;24.07.0.0&amp;rdquo; is the July Stream Build of 2024.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stable Builds&lt;/strong&gt; : Builds that incorporate only CPUs, PSUs, and Azul Zing critical fixes and do not uptake new features and non-critical enhancements from Stream Builds. Stable Builds are our primary vehicle for delivering time-sensitive bug fixes to customers and are &lt;strong&gt;only available to Azul customers&lt;/strong&gt;. Their version number is based on the Stream Build they originated from. For instance, &amp;ldquo;23.08.500.0&amp;rdquo; was derived from the August Stream Build of 2023 but already had multiple updates, as the 500 number indicates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As stream builds happen in a fixed schedule, all changes are included in the &lt;a href="https://docs.azul.com/prime/release-notes" target="_blank" rel="noopener noreferrer"&gt;release notes&lt;/a&gt;
. Twice a year (in February and August), a Stream build becomes the new Stable build, providing a new version with many more improvements. In this post, we want to give you an overview of all the combined improvements in the 24.08 Stable Line.
&lt;img src="https://foojayio.github.io/website/today/changes-included-in-release-24-08-of-azul-zing-builds-of-openjdk/Azul-Prime-Stable-2308-1024x400.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Gatherers upgrades pipeline design pattern JEP-461</title><link>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-gatherers-upgrades-pipeline-design-pattern-jep-461/</link><pubDate>Tue, 15 Oct 2024 06:18:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-gatherers-upgrades-pipeline-design-pattern-jep-461/</guid><description>&lt;p&gt;Source-code flexibility goes hand in hand with maintainability and testability. The Java language benefits not only from its maturity but also from the fact that it is strongly typed. This may initiate possible discussion topics, as each defined variable requires its type to be known, which can lead to unnecessary verbosity in the source code (reduced by JEP-286: local variable type inference[4]).&lt;/p&gt;
&lt;p&gt;Since the introduction of the Stream API in Java 8, developers have benefited from the ability to create complex transformations inside pipelines. The Stream API allows a lazily evaluated definition of how a pipeline (Example 1.- 1) should be transformed through one or multiple intermediate functions (Example 1.- 2). The sequence of intermediate functions must be terminated by a terminal function that materializes the output (Example 1.- 3).&lt;/p&gt;</description></item><item><title>Builder Pattern Simplicity with JEP-455 Primitive Types</title><link>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-builder-pattern-simplicity-with-jep-455-primitive-types-in-patterns-instanceof-and-switch-preview/</link><pubDate>Thu, 10 Oct 2024 10:54:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-builder-pattern-simplicity-with-jep-455-primitive-types-in-patterns-instanceof-and-switch-preview/</guid><description>&lt;p&gt;&lt;strong&gt;The runtime initiation of any program requires allocating a given memory and after many additional steps the first object could be created.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In a &lt;a href="https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-factory-pattern-with-flexible-constructor-bodies-with-jep-482/"&gt;previous post&lt;/a&gt;
, we explored how to improve maintainability of complex creation processes by using the factory creational pattern[4] and JEP-482, flexible constructor bodies.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The factory design may be a good fit for many cases but it may also create obstacles due to the pattern code centralized nature.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Null object pattern to avoid null pointer exception with JEP-455</title><link>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-null-object-pattern-to-avoid-null-pointer-exception-with-jep-455/</link><pubDate>Fri, 04 Oct 2024 06:19:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-null-object-pattern-to-avoid-null-pointer-exception-with-jep-455/</guid><description>&lt;p&gt;&lt;strong&gt;The newest release JDK 23 [2] comes with a neat extension to pattern matching for switch and instanceof statements, JEP-455: Primitive Types in Patterns, instanceof and switch [1]. While the introduction of pattern matching can be considered a crucial element in moving the Java platform into a functional paradigm, it introduced several limitations.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using reference object types or objects only for switch and instanceof statements slightly reduced the possibilities of its utilization. This has had an impact on its use in building code based on design patterns, including refactoring.&lt;/p&gt;</description></item><item><title>SQL Best Practices Every Java Engineer Must Know</title><link>https://foojayio.github.io/website/today/sql-best-practices-every-java-engineer-must-know/</link><pubDate>Tue, 01 Oct 2024 17:52:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/sql-best-practices-every-java-engineer-must-know/</guid><description>&lt;p&gt;In the world of software development, best practices for SQL optimization are a critical skill that every Java engineer must master. Efficient database interactions can significantly enhance the performance of your applications, leading to faster response times and a better user experience.&lt;/p&gt;
&lt;p&gt;This comprehensive guide dives into the best practices for SQL query optimization, tailored specifically for Java engineers. From understanding the importance of indexes to mastering joins and leveraging connection pooling, this article covers all the essential techniques you need to write efficient and performant SQL queries and best practices for SQL.&lt;/p&gt;</description></item><item><title>Foojay Podcast #58: How Java Developers Can Secure Their Code</title><link>https://foojayio.github.io/website/today/foojay-podcast-58/</link><pubDate>Mon, 30 Sep 2024 07:43:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-58/</guid><description>&lt;p&gt;Three years after Log4Shell caused a significant security issue, we still struggle with insecure dependencies and injection problems.&lt;/p&gt;
&lt;p&gt;In this podcast, we&amp;rsquo;ll discuss how developers can secure their code.&lt;/p&gt;
&lt;p&gt;I talked with three authors who posted a security and code quality post on Foojay.io.&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/sRVcqILDuSo?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>Azul Brings Java from Edge to Cloud</title><link>https://foojayio.github.io/website/today/azul-brings-java-from-edge-to-cloud/</link><pubDate>Fri, 27 Sep 2024 11:30:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/azul-brings-java-from-edge-to-cloud/</guid><description>&lt;p&gt;In Part 1 of this series, &amp;ldquo;&lt;a href="https://foojayio.github.io/website/today/a-fresh-look-at-embedded-java/"&gt;A Fresh Look at Embedded Java&lt;/a&gt;
,&amp;rdquo; we explored the use of Java for embedded use cases.&lt;/p&gt;
&lt;p&gt;Azul and its Zulu Build of OpenJDK (Zulu) are the ideal partners in this part of the software world.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s expand and look at the cloud part of a typical end-to-end solution with sensors, edge devices, client applications, and cloud services.
&lt;img src="https://foojayio.github.io/website/today/azul-brings-java-from-edge-to-cloud/edge-diagram.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;h2 id="Azul-Platform-Core-for-Edge-Devices-and-Client-Applications"&gt;Azul Platform Core for edge devices and client applications&lt;/h2&gt;
&lt;p&gt;Because Java delivers fast development speed thanks to its amazing methods and tools and its impressive performance in handling massive amounts of data, it&amp;rsquo;s the ideal programming language for building applications for edge devices that collect data from various sensors.&lt;/p&gt;</description></item><item><title>JDK 23: Factory Pattern with Flexible Constructor Bodies</title><link>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-factory-pattern-with-flexible-constructor-bodies-with-jep-482/</link><pubDate>Wed, 25 Sep 2024 11:14:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-factory-pattern-with-flexible-constructor-bodies-with-jep-482/</guid><description>&lt;p&gt;Since the introduction of the new JDK release cadence, we have seen an incredible amount of new enhancements added to each JDK cycle, kicking the Java platform back on track compared to other languages.&lt;/p&gt;
&lt;p&gt;Source code maintainability plays a very important role as complexity of nowadays projects increases. Yes, design patterns, spelled forward and backward many times, but forgotten at the same time due to various reasons.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s take a look at one particular brand new preview feature added to the latest JDK release 23 [2], JEP-482: Flexible Constructor Bodies [1] in its second iteration.&lt;/p&gt;</description></item><item><title>A Short History of AJAX and SSR</title><link>https://foojayio.github.io/website/today/a-short-history-of-ajax-and-ssr/</link><pubDate>Mon, 23 Sep 2024 06:57:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-short-history-of-ajax-and-ssr/</guid><description>&lt;p&gt;&lt;strong&gt;My journey in programming began over two decades ago, a time when JavaScript was a far cry from its current state, and developers were primarily focused on Microsoft Internet Explorer. One of my proudest achievements back then was writing a few lines of code that allowed users to add and remove table rows entirely on the client side. We called it . Many developers today have forgotten about it&amp;mdash;or never knew it existed.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Java 23 Has Arrived, And It Brings a Truckload of Changes</title><link>https://foojayio.github.io/website/today/java-23-has-arrived-and-it-brings-a-truckload-of-changes/</link><pubDate>Tue, 17 Sep 2024 06:45:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-23-has-arrived-and-it-brings-a-truckload-of-changes/</guid><description>&lt;p&gt;Java 23 has arrived! It&amp;rsquo;s been six months since Java 22 was released, so it&amp;rsquo;s time for a fresh truckload of JEPs.&lt;/p&gt;
&lt;p&gt;In this article, we take you on a tour of everything that is part of this release, giving you a brief introduction to each of them.&lt;/p&gt;
&lt;p&gt;Where applicable the differences with Java 22 are highlighted and a few typical use cases are provided, so that you&amp;rsquo;ll be more than ready to start using these features after reading this.&lt;/p&gt;</description></item><item><title>Foojay Podcast #57: Welcome to OpenJDK 23</title><link>https://foojayio.github.io/website/today/foojay-podcast-57/</link><pubDate>Mon, 16 Sep 2024 11:34:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-57/</guid><description>&lt;p&gt;OpenJDK (Java) 23 is (almost) here!&lt;/p&gt;
&lt;p&gt;OpenJDK 23 introduces three new features to the language and runtime and many bug fixes, small improvements, and a longer list of preview features.&lt;/p&gt;
&lt;p&gt;What are the most important facts about this release? 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/7PGOhbiPoRY?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>A Fresh Look at Embedded Java</title><link>https://foojayio.github.io/website/today/a-fresh-look-at-embedded-java/</link><pubDate>Wed, 11 Sep 2024 07:37:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-fresh-look-at-embedded-java/</guid><description>&lt;p&gt;&lt;strong&gt;Since its inception, Java has promised to &amp;ldquo;Write Once, Run Anywhere.&amp;rdquo; In its early days, the main focus of Java was embedded devices, such as set-top boxes and televisions.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;But soon, it became one of the leading programming languages powering high-scale business applications that can handle massive amounts of transactions with high throughput.&lt;/p&gt;
&lt;p&gt;Because those use cases are very visible and there are a lot of job opportunities within that area, we tend to forget that Java on embedded is also still very much alive and kicking!
&lt;img src="https://foojayio.github.io/website/today/a-fresh-look-at-embedded-java/fresh-look-embedded-java-1024x400.png" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Top Security Flaws hiding in your code right now</title><link>https://foojayio.github.io/website/today/top-security-flaws-hiding-in-your-code-right-now-and-how-to-fix-them/</link><pubDate>Thu, 05 Sep 2024 16:41:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/top-security-flaws-hiding-in-your-code-right-now-and-how-to-fix-them/</guid><description>&lt;h3 id="h3-0-recent-years-have-seen-numerous-injection-attacks-causing-significant-damage-including-a-2019-sql-injection-breach-in-the-fortnite-video-game-and-a-2018-attack-on-tesla-s-systems"&gt;Recent years have seen numerous injection attacks causing significant damage, including a 2019 SQL injection breach in the Fortnite video game and a 2018 attack on Tesla&amp;rsquo;s systems.&lt;/h3&gt;
&lt;p&gt;Other serious incidents involve the Log4Shell logging injection and a deserialization attack on Atlassian Jira. These examples show that various code vulnerabilities can affect any organization. This article will examine the three most common attack types&amp;mdash;SQL injection, Deserialization Injection, and Logging Injection&amp;mdash;and discuss ways to prevent them.&lt;/p&gt;</description></item><item><title>Java 23: What’s New? | Foojay.io today</title><link>https://foojayio.github.io/website/today/java-23-whats-new/</link><pubDate>Wed, 04 Sep 2024 09:19:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-23-whats-new/</guid><description>&lt;p&gt;&lt;strong&gt;As soon as Java 23 is out, it&amp;rsquo;ll be time to walk through all the functionalities that this version bring to us as developers.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;First of all, something has happened that, to my knowledge, has never happened before in a Java release: a preview feature has been removed! The String Templates feature, which appeared as a preview feature in Java 21, has been removed. A global redesign of this feature will be carried out, as it had given rise to much debate and didn&amp;rsquo;t seem to meet the community&amp;rsquo;s expectations.&lt;/p&gt;</description></item><item><title>Get recognized for your cloud-native Java development skills</title><link>https://foojayio.github.io/website/today/get-recognized-for-your-cloud-native-java-development-skills-with-this-new-badge/</link><pubDate>Thu, 29 Aug 2024 16:08:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/get-recognized-for-your-cloud-native-java-development-skills-with-this-new-badge/</guid><description>&lt;p&gt;&lt;strong&gt;In a world where in-demand skills are critical for job success, security, and progression, it&amp;rsquo;s vital that we, as developers, ensure we are showcasing our skills to the wider world. This can include qualifications, courses, and badges, all of which help us to advertise our skills and highlight our professional experiences and expertise.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So, to help make this easier (and free!) for Java developers, the Open Liberty team created the first-ever Liberty badge: &lt;a href="https://ibm.biz/FooJayLibertyDeveloperEssentialsBadge" title="Liberty Developer Essentials" target="_blank" rel="noopener noreferrer"&gt;Liberty Developer Essentials&lt;/a&gt;
!&lt;/p&gt;</description></item><item><title>IBM Semeru Runtimes for Java includes FIPS 140-3 certified cryptography</title><link>https://foojayio.github.io/website/today/ibm-semeru-java-fips140-3-cryptographic-standard/</link><pubDate>Tue, 27 Aug 2024 08:55:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/ibm-semeru-java-fips140-3-cryptographic-standard/</guid><description>&lt;p&gt;&lt;strong&gt;IBM® Semeru Runtimes™ for Java™ 11, 17, 21+ now includes FIPS 140-3 cryptography (&lt;a href="https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4755" title="certified by the U.S. National Institute of Standards and Technology (NIST)" target="_blank" rel="noopener noreferrer"&gt;certified by the U.S. National Institute of Standards and Technology; NIST&lt;/a&gt;
) and is production-ready for Java deployments. FIPS 140-3 is also available in IBM SDK, Java Technology Edition, V8.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;IBM first made FIPS 140-3 cryptography available as a technology preview more than a year ago, and users responded with helpful feedback on usage and configuration so that the IBM development team could improve its usability. With NIST certification, this capability is now generally available for production deployments on most platforms (with more to come).&lt;/p&gt;</description></item><item><title>Spring: Internals of @ComponentScan</title><link>https://foojayio.github.io/website/today/spring-internals-of-componentscan/</link><pubDate>Tue, 20 Aug 2024 14:48:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-internals-of-componentscan/</guid><description>&lt;p&gt;&lt;strong&gt;The &lt;code&gt;@ComponentScan&lt;/code&gt; annotation, which is an interface located within the &lt;code&gt;org.springframework.context.annotation&lt;/code&gt; package, facilitates component scanning in a Spring application. This allows the Spring Container to automatically detect beans.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Spring automatically identifies Java classes that developers mark with stereotypes like &lt;code&gt;@Configuration, @Component, @Service, @Controller, and @Repository&lt;/code&gt;. Developers can annotate the component scan with or without parameters.&lt;/p&gt;
&lt;p&gt;You can designate either &lt;code&gt;basePackageClasses() or basePackages()&lt;/code&gt; (or its equivalent &lt;code&gt;value()&lt;/code&gt;) to identify the specific packages that need to be scanned.&lt;/p&gt;</description></item><item><title>Are Critical Vulnerabilities Lurking in Your Java Ecosystem?</title><link>https://foojayio.github.io/website/today/are-critical-vulnerabilities-lurking-in-your-java-ecosystem/</link><pubDate>Mon, 19 Aug 2024 12:57:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/are-critical-vulnerabilities-lurking-in-your-java-ecosystem/</guid><description>&lt;p&gt;Java, the popular object-oriented language renowned for its portability, performance, and security, is often the preferred choice for organisations building everything from enterprise and cloud-native applications to Android apps.&lt;/p&gt;
&lt;p&gt;However, despite these strengths, Java&amp;rsquo;s popularity and the complex ecosystem of third-party libraries it relies upon have also made it a prime target for malicious actors to exploit vulnerabilities. According to the Datadog &amp;ldquo;State of DevSecOps&amp;rdquo;[1] report, a staggering 90% of Java services are susceptible to one or more critical or high-severity vulnerabilities, often stemming from external dependencies, compared to an average of 47% for other technologies. This discrepancy is concerning and points to inherent issues within the Java ecosystem.&lt;/p&gt;</description></item><item><title>Run AI-enabled JakartaEE/MicroProfile apps with LangChain4j</title><link>https://foojayio.github.io/website/today/run-ai-enabled-jakarta-ee-and-microprofile-applications-with-langchain4j-and-open-liberty/</link><pubDate>Mon, 12 Aug 2024 22:14:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/run-ai-enabled-jakarta-ee-and-microprofile-applications-with-langchain4j-and-open-liberty/</guid><description>&lt;p&gt;&lt;strong&gt;Artificial Intelligence (AI) is an exciting and disruptive field that is already transforming businesses, and even entire industries, by enabling automation, improving decision-making and unlocking new insights from data.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With the rise in large language models (LLMs) such as ChatGPT, there is a significant shift in the performance of AI and its potential to drive enterprise value. So, how will this impact on software development and the creation of cloud-native Java applications for enterprises?&lt;/p&gt;</description></item><item><title>Allocation Profiling in Java</title><link>https://foojayio.github.io/website/today/get-started-with-allocation-profiling/</link><pubDate>Fri, 09 Aug 2024 08:44:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/get-started-with-allocation-profiling/</guid><description>&lt;p&gt;&lt;strong&gt;Read in other languages&lt;/strong&gt; : &lt;a href="https://flounder.dev/zh/posts/allocation-profiling/" target="_blank" rel="noopener noreferrer"&gt;中文&lt;/a&gt;
 &lt;a href="https://flounder.dev/es/posts/allocation-profiling/" target="_blank" rel="noopener noreferrer"&gt;Español&lt;/a&gt;
 &lt;a href="https://flounder.dev/pt/posts/allocation-profiling/" target="_blank" rel="noopener noreferrer"&gt;Português&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We often find ourselves in situations when code is not working properly, and we have no idea where to even begin investigating.&lt;/p&gt;
&lt;p&gt;Can&amp;rsquo;t we just stare at the code until the solution eventually comes to us? Sure, but this method probably won&amp;rsquo;t work without deep knowledge of the project and a lot of mental effort. A smarter approach would be to use the tools you have at hand. They can point you in the right direction.&lt;/p&gt;</description></item><item><title>JUG PH: 1H 2024 Meetups</title><link>https://foojayio.github.io/website/today/jug-ph-1h-2024-meetups/</link><pubDate>Fri, 02 Aug 2024 07:59:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/jug-ph-1h-2024-meetups/</guid><description>&lt;p&gt;Summary of the meetups done in the 1st half of 2024. We discussed a variety of topics which was useful to our Java enthusiasts and members.&lt;/p&gt;
&lt;h2 id="h2-0-2024-meetup-kickoff"&gt;2024 Meetup Kickoff&lt;/h2&gt;
&lt;p&gt;We kicked-off the Java meetup in partnership with Angular Philippines. The meetup had 2 sessions which was demonstrated by Mark Montealto and Eric Martin.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/jug-ph-1h-2024-meetups/jugph-angular-2024-1-700x467.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;h3 id="h3-1-progressive-web-app-using-angular-framework"&gt;Progressive Web App using Angular Framework&lt;/h3&gt;
&lt;p&gt;A 1 hour session by Mark Montealto talking about how to make a Progressive Web aplication using Angular Framework. He started with the concepts and performed a live-coding.&lt;/p&gt;</description></item><item><title>JUG PH: 1-Day Modern Java Development Bootcamp</title><link>https://foojayio.github.io/website/today/jug-ph-1-day-modern-java-development-bootcamp/</link><pubDate>Fri, 02 Aug 2024 07:53:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/jug-ph-1-day-modern-java-development-bootcamp/</guid><description>&lt;p&gt;&lt;strong&gt;A 1-Day Modern Java Bootcamp for students, early professionals and career shifters with minimal Java programming or general programming experience.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Java User Group Philippines (JUG PH) in partnership with Developer Connect (DEVCON) Philippines/Manila executed its 1st Modern Java Development Bootcamp.&lt;/p&gt;
&lt;p&gt;The bootcamp was organized by the JUG Leaders and Volunteers and DEVCON Volunteers.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/jug-ph-1-day-modern-java-development-bootcamp/java-bootcamp-2024-1-510x510.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;h2 id="h2-0-registration"&gt;Registration&lt;/h2&gt;
&lt;p&gt;The bootcamp received an overwhelming &lt;strong&gt;110+ registrations&lt;/strong&gt; but 50 was only accomodated due to the slots of the venue.&lt;/p&gt;</description></item><item><title>Client-server application in Java: Easy with FEPCOS-J – Video.</title><link>https://foojayio.github.io/website/today/fuchs-2024-video-fepcos_j-client-server-application-in-java/</link><pubDate>Tue, 30 Jul 2024 11:51:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/fuchs-2024-video-fepcos_j-client-server-application-in-java/</guid><description>&lt;p&gt;&lt;strong&gt;This is a result of the &lt;a href="http://fepcos.info" target="_blank" rel="noopener noreferrer"&gt;FEPCOS-Project&lt;/a&gt;
, aka @FepcosInfo; #FepcosJ_blog5.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;See how FEPCOS-J relieves developers of the network programming required to implement a client-server application in Java.&lt;br&gt;
&lt;a href="https://youtu.be/qtPP7kZbriQ" target="_blank" rel="noopener noreferrer"&gt;&lt;img src="https://foojayio.github.io/website/today/fuchs-2024-video-fepcos_j-client-server-application-in-java/fuchs2024FepcosJ_video1-512x512-1.png" alt="Link to video: Easy Implementation of a Client-Server Application in Java with FEPCOS-J.
#FepcosJ_video1, #FepcosJ." loading="lazy"&gt;
&lt;/a&gt;
 &lt;strong&gt;External link to&lt;/strong&gt; : G. Fuchs: &lt;em&gt;Video: Easy Implementation of a Client-Server Application in Java with FEPCOS-J&lt;/em&gt;; On: YouTube, FEPCOS-Project (@FepcosInfo); 29-July-2024; &lt;a href="https://youtu.be/qtPP7kZbriQ" target="_blank" rel="noopener noreferrer"&gt;https://youtu.be/qtPP7kZbriQ&lt;/a&gt;
.&lt;br&gt;
&lt;img src="https://foojayio.github.io/website/today/fuchs-2024-video-fepcos_j-client-server-application-in-java/fuchs-2024-implementing-a-service-with-fepcos-j-1024x576.png" alt="FEPCOS-J provides annotations for programming a client-server application in Java." loading="lazy"&gt;
 &lt;strong&gt;Impression of the above-linked video&lt;/strong&gt;: FEPCOS-J provides annotations like @AYSpec, @In, @Out, and @Behavior for programming a client-server application in Java. Watch the video for a complete example application of FEPCOS-J.&lt;/p&gt;</description></item><item><title>Creating a Command Line Tool with JBang and PicoCLI to Generate Release Notes</title><link>https://foojayio.github.io/website/today/creating-a-command-line-tool-with-jbang-and-picocli-to-generate-release-notes/</link><pubDate>Wed, 24 Jul 2024 09:44:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-a-command-line-tool-with-jbang-and-picocli-to-generate-release-notes/</guid><description>&lt;p&gt;Lately, I have been playing with JBang and PicoCLI, and I am pretty amazed at what we can do with these tools. I needed to create a script that would go to a specified repository on GitHub, check the commit range, and verify if any tickets were associated with them. Additionally, I wanted to check if the ticket is accepted and if the commit was approved or not. The idea was to integrate this script along with the CI/CD pipeline.&lt;/p&gt;</description></item><item><title>Effective Java Logging</title><link>https://foojayio.github.io/website/today/effective-java-logging/</link><pubDate>Mon, 22 Jul 2024 11:39:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/effective-java-logging/</guid><description>&lt;p&gt;Effective Logging is an essential aspect of any Java application, providing insights into its operational state. It is especially crucial in production environments, where it aids in debugging, monitoring, and incident response. In this comprehensive guide, we will explore the effective practices for using SLF4J with Logback, ensuring a reliable and maintainable logging strategy.&lt;/p&gt;
&lt;p&gt;By following these best practices, developers and operations teams can leverage SLF4J and Logback to turn logs into strategic resources for application management and incident resolution. Embracing these guidelines will lead to improved observability, quicker troubleshooting, and a deeper understanding of system behavior, establishing a solid foundation for application reliability and performance.&lt;/p&gt;</description></item><item><title>Structured Concurrency is More Than ShutdownOnFailure</title><link>https://foojayio.github.io/website/today/structured-concurrency-is-more-than-shutdownonfailure/</link><pubDate>Thu, 11 Jul 2024 16:34:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/structured-concurrency-is-more-than-shutdownonfailure/</guid><description>&lt;p&gt;&lt;strong&gt;Since Java 21, structured concurrency has been added as a preview feature. Structured concurrency is a way to manage sub-tasks that are run in parallel within a given scope.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve ever seen a presentation about &lt;a href="https://docs.oracle.com/en/java/javase/21/core/structured-concurrency.html" target="_blank" rel="noopener noreferrer"&gt;structured concurrency&lt;/a&gt;
, you&amp;rsquo;ve probably seen the use of the &lt;code&gt;ShutdownOnSuccess&lt;/code&gt; or &lt;code&gt;ShutdownOnFailure&lt;/code&gt; classes.&lt;/p&gt;
&lt;p&gt;These classes will stop the scope and the still running sub-tasks within that scope when one of the sub-task succeeds or fails.&lt;/p&gt;</description></item><item><title>Java's Unsafe is Finally Going Away</title><link>https://foojayio.github.io/website/today/unsafe-is-finally-going-away-embracing-safer-memory-access-with-jep-471/</link><pubDate>Thu, 11 Jul 2024 07:52:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/unsafe-is-finally-going-away-embracing-safer-memory-access-with-jep-471/</guid><description>&lt;p&gt;Java, being a safe language, doesn&amp;rsquo;t usually allow direct low-level access. Memory is primarily managed on the heap, so developers don&amp;rsquo;t typically deal with memory directly. However, library developers are occasionally required to manipulate memory outside the heap for performance or specific use cases. This is where the controversial &lt;a href="https://github.com/openjdk/jdk/blob/master/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java" target="_blank" rel="noopener noreferrer"&gt;&lt;strong&gt;sun.misc.Unsafe&lt;/strong&gt;&lt;/a&gt;
 comes in.&lt;/p&gt;
&lt;p&gt;While undeniably powerful, &lt;strong&gt;sun.misc.Unsafe&lt;/strong&gt; is a double-edged sword. Its improper use can lead to severe consequences, including memory leaks, crashes due to invalid memory access, and even security vulnerabilities like buffer overflows. As the name suggests, it&amp;rsquo;s inherently unsafe.&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>The Best Way to Handle Phone Numbers</title><link>https://foojayio.github.io/website/today/the-best-way-to-handle-phone-numbers/</link><pubDate>Fri, 05 Jul 2024 07:00:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-best-way-to-handle-phone-numbers/</guid><description>&lt;p&gt;Processing phone numbers seems complicated at first glance because of the many different formats. In this post, I&amp;rsquo;ll show you that with libphonenumber, it becomes child&amp;rsquo;s play. I&amp;rsquo;ll also recommend how to store the phone number in the database.&lt;/p&gt;
&lt;h2 id="h2-0-introduction-google-s-libphonenumber"&gt;Introduction Google&amp;rsquo;s libphonenumber&lt;/h2&gt;
&lt;p&gt;According to the GitHub repository &lt;a href="https://github.com/google/libphonenumber/" target="_blank" rel="noopener noreferrer"&gt;https://github.com/google/libphonenumber/&lt;/a&gt;
 libphone number is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;br /&gt;
&lt;p&gt;Google&amp;rsquo;s common Java, C++ and JavaScript library for parsing, formatting, and validating international phone numbers. The Java version is optimized for running on smartphones, and is used by the Android framework since 4.0 (Ice Cream Sandwich).&lt;/p&gt;</description></item><item><title>Java: Demystifying The Stream API</title><link>https://foojayio.github.io/website/today/java-demystifying-the-stream-api-part-3/</link><pubDate>Fri, 05 Jul 2024 06:57:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-demystifying-the-stream-api-part-3/</guid><description>&lt;p&gt;In our earlier articles &lt;a href="https://foojayio.github.io/website/today/java-functional-programming/"&gt;part1&lt;/a&gt;
 and &lt;a href="https://foojayio.github.io/website/today/java-functional-programming-fx-part2"&gt;part2&lt;/a&gt;
, we have previously explored the significance of functional programming, Lambda Calculus, as well as various features such as Functional Interfaces, Lambda Expressions, and Method References.&lt;/p&gt;
&lt;p&gt;This article delves into a crucial aspect, namely the Stream API, which JDK1.8 incorporated. It also covers how to utilize Lambda Expressions, Method References, and Functional Interfaces within Stream API functions.&lt;/p&gt;
&lt;p&gt;So,&lt;/p&gt;
&lt;p&gt;Succinctly, In Java, &lt;strong&gt;a Stream is a collection of data that developers can process on in a declarative and functional approach&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>A Beginner's Guide to IntelliJ Profiler</title><link>https://foojayio.github.io/website/today/beginners-guide-to-java-profiler/</link><pubDate>Thu, 04 Jul 2024 06:26:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/beginners-guide-to-java-profiler/</guid><description>&lt;p&gt;Read in other languages: &lt;a href="https://flounder.dev/zh/posts/get-started-with-profiling/" target="_blank" rel="noopener noreferrer"&gt;中文&lt;/a&gt;
 &lt;a href="https://flounder.dev/es/posts/get-started-with-profiling/" target="_blank" rel="noopener noreferrer"&gt;Español&lt;/a&gt;
 &lt;a href="https://flounder.dev/pt/posts/get-started-with-profiling/" target="_blank" rel="noopener noreferrer"&gt;Português&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Sometimes your app works, but you want to increase performance by boosting its throughput or reducing latency. Other times, you just want to know how code behaves at runtime, determine where the hot spots are, or figure out how a framework operates under the hood.&lt;/p&gt;
&lt;p&gt;This is a perfect use case for profilers. They offer a bird&amp;rsquo;s eye view of arbitrarily large execution chunks, which helps you see problems at scale.&lt;/p&gt;</description></item><item><title>Foojay Podcast #55: Embedded Java, Part 2</title><link>https://foojayio.github.io/website/today/foojay-podcast-55/</link><pubDate>Mon, 01 Jul 2024 08:21:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-55/</guid><description>&lt;p&gt;As a backend developer, you may not realize that Java was initially born on embedded devices like set-top boxes and gateways. We discussed this topic for the first time almost three years ago in &lt;a href="https://foojayio.github.io/website/today/foojay-podcast-2/"&gt;Foojay Podcast #2 with James Gosling, Johan Vos, Erik Costlow, and Frank Delporte&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;In this episode #55, we look into the history of the Java Micro Edition and how things evolved. Nowadays, with processors becoming increasingly powerful, we can run the exact same Java runtime on any Linux system, from the biggest cloud servers to the smallest Raspberry Pi Zero.&lt;/p&gt;</description></item><item><title>Exploring New Features in JDK 23: Simplifying Java with Module Import Declarations with JEP 476</title><link>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-simplifying-java-with-module-import-declarations-with-jep-476/</link><pubDate>Thu, 20 Jun 2024 16:14:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-simplifying-java-with-module-import-declarations-with-jep-476/</guid><description>&lt;p&gt;As Java evolves, simplifying code and improving developer productivity remain priorities.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://openjdk.org/jeps/476" target="_blank" rel="noopener noreferrer"&gt;JEP 476&lt;/a&gt;
 introduces a new feature in JDK 23: Module Import Declarations.&lt;/p&gt;
&lt;p&gt;This feature aims to streamline the process of importing multiple packages from a module, enhancing code readability and reducing boilerplate.&lt;/p&gt;
&lt;h3 id="h3-0-what-is-jep-476"&gt;&lt;strong&gt;What is JEP 476?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;JEP 476 proposes the ability to import all packages exported by a module with a single declaration. This is particularly useful for developers who frequently use multiple packages from the same module, as it eliminates the need for numerous individual import statements.&lt;/p&gt;</description></item><item><title>Java on Visual Studio Code May 2024 Update - New AI Feature, Spring Updates</title><link>https://foojayio.github.io/website/today/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/</link><pubDate>Tue, 18 Jun 2024 10:42:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/</guid><description>&lt;p&gt;Hi everyone, welcome to the May update for Visual Studio Code for Java!&lt;/p&gt;
&lt;p&gt;In this articlem we are going to share an exciting new AI related feature for Java developers on Visual Studio Code.&lt;/p&gt;
&lt;p&gt;In addition, there will be several important Spring updates, so let&amp;rsquo;s get started.&lt;/p&gt;
&lt;h3 id="h3-0-rewriting-your-java-code-with-copilot-based-suggestions"&gt;Rewriting your Java code with Copilot-based suggestions&lt;/h3&gt;
&lt;p&gt;As our code undergoes updates and iterations, our business logic continues to grow in complexity. Meanwhile, Java versions are constantly evolving. Often, our older code can be replaced with newer, more efficient alternatives, not only improving their performance but also making the code more elegant, concise and secure. Previously, these tasks may have been done manually, but with the power of AI, many tasks can now be handled automatically.&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>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>Be a Better Java Developer: 19 Tips for Staying Ahead in 2024</title><link>https://foojayio.github.io/website/today/become-a-better-java-developer-19-tips-for-staying-ahead-in-2024/</link><pubDate>Tue, 11 Jun 2024 12:31:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/become-a-better-java-developer-19-tips-for-staying-ahead-in-2024/</guid><description>&lt;p&gt;Recently I reached out to one of my fellow Java developers who is very experienced and has been working in the industry forever and asked for his thoughts about the observability improvements in JDK 21 and Spring Boot 3.2 and if he has already migrated from 17 to 21 and to Spring Boot 3.2.&lt;/p&gt;
&lt;p&gt;This is the reply I got from him:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;Lately, I&amp;rsquo;ve been feeling quite rusty, my current job has me solely focused on building an IntelliJ plugin, it&amp;rsquo;s been almost two years now. And I&amp;rsquo;m concerned I&amp;rsquo;m not keeping up to date. I&amp;rsquo;ve promised myself to take a tutorial and learn everything from Java versions 17 to 21. With Java 22 nearly released and Spring 3.2 out, I&amp;rsquo;m not familiar with all the improvements. I&amp;rsquo;ve already heard about the exciting new features of Java 22 like the non-Java interop and access to important libraries like LAPACK and BLAS. These libraries power significant Python libraries like NumPy, offering new opportunities for Java.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Foojay Podcast #52 from JCON in Cologne!</title><link>https://foojayio.github.io/website/today/foojay-podcast-52/</link><pubDate>Mon, 10 Jun 2024 09:32:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-52/</guid><description>&lt;p&gt;This is part 4 of the JCON interviews!&lt;/p&gt;
&lt;p&gt;In this episode, we have 5 new guests for you.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We start with garbage collectors and Intelligence Cloud, a tool created by Azul to find out which of your code is actually used in production and which dependencies are known to have vulnerabilities. My colleague Gerrit Grunwald was at JCON to give a talk about these subjects.&lt;/li&gt;
&lt;li&gt;With Balkrishna Rawool we dove into Virtual Threads, a very interesting topic as concurrency and threads can be challenging&amp;hellip;&lt;/li&gt;
&lt;li&gt;Piotr Przybyl came to JCON to give a talk about Test Containers and how to test your application in an environment that is similar to your production environment. Another important topic related to testing is Flaky Tests. How do you handle tests that only fail from time to time and make your whole test report unreliable?&lt;/li&gt;
&lt;li&gt;François Martin had a talk about this subject, and he came to the conference together with Annelore Egger, who was one of the many volunteers.&lt;/li&gt;
&lt;/ul&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/9q7kSibmVBA?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>Exploring New Features in JDK 23: Simplifying Java with Primitive Type Patterns with JEP 455</title><link>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-simplifying-java-with-primitive-type-patterns-with-jep-455/</link><pubDate>Thu, 06 Jun 2024 10:37:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-simplifying-java-with-primitive-type-patterns-with-jep-455/</guid><description>&lt;p&gt;&lt;strong&gt;Java continues to evolve, introducing features that streamline coding practices and improve readability. &lt;a href="https://openjdk.org/jeps/455" target="_blank" rel="noopener noreferrer"&gt;JEP 455&lt;/a&gt;
 is one such proposal that enhances the switch statement, making it more versatile and expressive.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This article delves into how JEP 455 can be utilized to handle complex decision-making scenarios more efficiently. We&amp;rsquo;ll examine a practical example to illustrate the benefits of this feature.&lt;/p&gt;
&lt;h3 id="h3-0-what-s-new-in-jep-455"&gt;&lt;strong&gt;What&amp;rsquo;s New in JEP 455?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;This JEP introduces the following key features:&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>Five Java Developer Must-Haves For Ultra-Fast Startup Solutions</title><link>https://foojayio.github.io/website/today/five-java-developer-must-haves/</link><pubDate>Wed, 29 May 2024 20:15:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/five-java-developer-must-haves/</guid><description>&lt;p&gt;&lt;strong&gt;Faster Java startup must not compromise developer experience, throughput performance, or security. We discuss how we achieved this with Liberty InstantOn.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;By Vijay Sundaresan, Thomas Watson, Laura Cowen&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Many solutions that promise ultra-fast startup times for serverless Java apps force you to compromise on developer experience, throughput performance, or security. We&amp;rsquo;ll show you how to get ultra-fast startup of your Java apps without these compromises.&lt;/p&gt;
&lt;p&gt;Say, for example, you&amp;rsquo;re writing a Java web service that provides a catalog of items that your business sells. At quiet times, your application needs to stop all unneeded instances of the catalog service so that your business is not paying unnecessary cloud bills; at busy times, your application needs to rapidly spin up more instances so that your customers get instantaneous response times on your website. This is &amp;ldquo;scale-to-zero,&amp;rdquo; and your application needs to do it fast.&lt;/p&gt;</description></item><item><title>Top 7 Java Microservices Frameworks</title><link>https://foojayio.github.io/website/today/top-7-java-microservices-frameworks/</link><pubDate>Wed, 29 May 2024 08:58:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/top-7-java-microservices-frameworks/</guid><description>&lt;h3 id="h3-0-history-of-microservices"&gt;&lt;strong&gt;History of Microservices&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The concept of microservices has its roots in Service Oriented Architecture (SOA), which was prominent in the early 2000s. However, the term &amp;ldquo;microservices&amp;rdquo; itself didn&amp;rsquo;t appear until around 2012, when it started being discussed at software architecture events and on software architecture blogs.&lt;/p&gt;
&lt;p&gt;Early pioneers of microservices include companies like Netflix, Amazon, and eBay. For instance, in 2009, Netflix started to transition from a monolithic architecture to a microservices architecture to better handle their rapidly scaling customer base. Other major companies followed, realizing that the monolithic architecture model had limitations when dealing with large-scale, complex systems.&lt;/p&gt;</description></item><item><title>Exploring Cost-Effective Solutions for Stateful Rest Services</title><link>https://foojayio.github.io/website/today/exploring-cost-effective-solutions-for-stateful-rest-services/</link><pubDate>Mon, 27 May 2024 13:13:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-cost-effective-solutions-for-stateful-rest-services/</guid><description>&lt;h2 id="h2-0-a-case-study-with-ibm-cloud-code-engine-eclipsestore-and-ibm-cloud-object-storage"&gt;A Case Study with IBM Cloud Code Engine, EclipseStore, and IBM Cloud Object Storage&lt;/h2&gt;
&lt;p&gt;In the dynamic realm of cloud computing, finding cost-effective solutions for stateful rest services that don&amp;rsquo;t necessarily require scaling can be a nuanced challenge.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll take a pragmatic look at a use case leveraging &lt;a href="https://www.ibm.com/products/code-engine" title="IBM Cloud Code Engine" target="_blank" rel="noopener noreferrer"&gt;IBM Cloud Code Engine&lt;/a&gt;
, &lt;a href="https://eclipsestore.io/" title="EclipseStore" target="_blank" rel="noopener noreferrer"&gt;EclipseStore&lt;/a&gt;
, and &lt;a href="https://www.ibm.com/products/cloud-object-storage" title="IBM Cloud Object Storage (COS)" target="_blank" rel="noopener noreferrer"&gt;IBM Cloud Object Storage (COS)&lt;/a&gt;
. The goal is to shed light on how this can be a practical and economical alternative, particularly when scalability is not a primary concern.&lt;/p&gt;</description></item><item><title>Foojay Podcast #50: JCON Report, Part 2 - Maven, Software Security, Code Quality</title><link>https://foojayio.github.io/website/today/foojay-podcast-50/</link><pubDate>Mon, 27 May 2024 08:07:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-50/</guid><description>&lt;p&gt;This is part 2 of the interviews we recorded at the JCON conference earlier this month in Germany. In this episode, you get two main topics: &lt;strong&gt;Maven and Code Quality&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In the first part, you&amp;rsquo;ll hear Karl Heinz Marbaise and Steve Poole discuss the Maven project, the repository, Sonaytype, and the security impact of dependencies.&lt;/p&gt;
&lt;p&gt;But next to security, we developers are also responsible for creating readable and maintainable code. Miro Wengner, Marit van Dijk, and Hinse ter Schuur dive into this topic, in the second part!&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>Task scheduler in Java: background job processing with JobRunr</title><link>https://foojayio.github.io/website/today/getting-started-with-jobrunr-a-powerful-task-scheduler-in-ja/</link><pubDate>Wed, 22 May 2024 11:05:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/getting-started-with-jobrunr-a-powerful-task-scheduler-in-ja/</guid><description>&lt;h2 id="h2-0-what-is-jobrunr"&gt;What is JobRunr&lt;/h2&gt;
&lt;h3 id="h3-1-task-scheduler-in-java"&gt;Task scheduler in Java&lt;/h3&gt;
&lt;p&gt;JobRunr is an open-source Java library for &lt;strong&gt;task scheduling&lt;/strong&gt; and &lt;strong&gt;distributed background job&lt;/strong&gt; processing. It offers an effortless way to &lt;strong&gt;perform background tasks using only Java 8 lambdas&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Whether it is a &lt;strong&gt;fire-and-forget&lt;/strong&gt; , &lt;strong&gt;scheduled&lt;/strong&gt; or &lt;strong&gt;recurring job&lt;/strong&gt; , JobRunr analyzes the lambda and stores the metadata needed to process the job in a database. This simple architecture, with a few other mechanisms, allows a job to be &lt;strong&gt;executed on any available server&lt;/strong&gt; running your application (👋 k8s).&lt;/p&gt;</description></item><item><title>JManc Unconference 2024</title><link>https://foojayio.github.io/website/today/jmanc-unconference-2024/</link><pubDate>Tue, 21 May 2024 14:08:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/jmanc-unconference-2024/</guid><description>&lt;p&gt;&lt;a href="https://foojayio.github.io/website/www.jmanc.org" title="JManc Unconferece"&gt;&lt;img src="https://jmanc.org/assets/images/jmanc-logo.png" alt="JManc Unconferece" title="JManc Unconferece" loading="lazy"&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Manchester Java Community are delighted to announce the return of JManc Unconference on Friday 28th June 2024!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s been a few years since we last hosted JManc, and a lot has changed in the world, but one thing we&amp;rsquo;ve learned in the Manchester Java Community is that in-person events are what we love the most. JManc provides another opportunity for us to get together with like-minded people from the Java community.&lt;/p&gt;</description></item><item><title>Calling Microservices in Java: Part 1</title><link>https://foojayio.github.io/website/today/calling-microservices-in-java/</link><pubDate>Fri, 17 May 2024 19:41:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/calling-microservices-in-java/</guid><description>&lt;p&gt;&lt;strong&gt;When building applications that need to call other parts of the system (&lt;a href="https://mezocode.com/microservices-soa-introduction-part1/" title="microservices" target="_blank" rel="noopener noreferrer"&gt;microservices&lt;/a&gt;
), Java programmers have access to a variety of tools and techniques that they can use for their development tasks.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This article guides you through different ways of calling Microservices in Java, from basic methods to more advanced ones, and will share tips on best practices and common mistakes.&lt;/p&gt;
&lt;h3 id="h3-0-1-basic-http-requests-with-httpurlconnection"&gt;1. Basic HTTP Requests with HttpURLConnection&lt;/h3&gt;
&lt;p&gt;The simplest way to calling a microservice in Java is using the &lt;code&gt;HttpURLConnection&lt;/code&gt; class. This lets your application send HTTP requests and receive responses directly.&lt;/p&gt;</description></item><item><title>A Modern Approach to Middleware with Chronicle</title><link>https://foojayio.github.io/website/today/a-modern-approach-to-middleware-with-chronicle/</link><pubDate>Fri, 17 May 2024 09:46:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-modern-approach-to-middleware-with-chronicle/</guid><description>&lt;p&gt;&lt;strong&gt;Financial institutions today face significant challenges in updating their legacy middleware systems which are crucial for supporting millions of lines of code serving critical business functions. Prior to multicast support in modern switching hardware that became prevalent in the early 2000s, message middleware was largely done via proprietary protocols that converged onto TCP/IP. IBM&amp;rsquo;s Websphere MQ was a leader in this space.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Point to point middleware based on TCP/IP requires extra processing power and network bandwidth proportional to the number of consumers, and unreliable or slow consumers can negatively impact performance of the publisher. To combat these challenges, software vendors utilized IP multicast to create messaging platforms that supported topic based publish/subscribe networks.&lt;/p&gt;</description></item><item><title>Building a Simple Home Assistant using Langchain4j and Raspberry Pi</title><link>https://foojayio.github.io/website/today/building-simple-home-assistant-langchain4j-raspberry-pi/</link><pubDate>Sun, 12 May 2024 05:31:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-simple-home-assistant-langchain4j-raspberry-pi/</guid><description>&lt;p&gt;&lt;strong&gt;Many believe that the future of IoT is AI. Building a Smart Home Assistant is less complex today than ever before. AI has become so accessible that you only need an internet connection and a computer to connect to an API.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;While training specialized deep learning models or using commercial APIs to harness machine learning for specific deterministic use cases is still an option, it is now more common and accessible to use LLMs. Today, you can effortlessly utilize numerous LLMs from various providers through an LLM orchestration framework like &lt;a href="https://github.com/langchain4j/langchain4j" target="_blank" rel="noopener noreferrer"&gt;Langchain4j&lt;/a&gt;
. This framework not only allows the use of LLMs but also provides components that simplify the creation of AI applications such as chatbots and question-answering systems. With these tools, anyone can assemble a Generative AI-powered app in minutes.&lt;/p&gt;</description></item><item><title>Spring AI: How to Write GenAI Applications with Java</title><link>https://foojayio.github.io/website/today/spring-ai-how-to-write-genai-applications-with-java/</link><pubDate>Thu, 09 May 2024 18:46:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-ai-how-to-write-genai-applications-with-java/</guid><description>&lt;p&gt;Generative AI (GenAI) is currently a hot topic in the tech world. It&amp;rsquo;s a subset of artificial intelligence that focuses on creating new content, such as text, images, or music. One popular type of GenAI component is the Large Language Model (LLM), which can generate human-like text based on a prompt.&lt;/p&gt;
&lt;p&gt;Retrieval-Augmented Generation (RAG) is a technique that enhances the accuracy and reliability of generative AI models by grounding them in external knowledge sources. While most GenAI applications and related content are centered around Python and its ecosystem, what if you want to write a GenAI application in Java?&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>Remotely Recording a JFR Log from a Container (Without Using the Command Line)</title><link>https://foojayio.github.io/website/today/remotely-recording-a-jfr-log-from-a-container-without-using-the-command-line/</link><pubDate>Tue, 07 May 2024 04:32:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/remotely-recording-a-jfr-log-from-a-container-without-using-the-command-line/</guid><description>&lt;p&gt;Java Flight Recorder (JFR) is the go-to technology for recording and viewing JVM and system metrics.&lt;/p&gt;
&lt;p&gt;JFR records JFR logs which reveal much about the running application, the health of the JVM and the stability of the system. JFR logs are easily obtained by simply going into the command line / terminal and entering a few commands.&lt;/p&gt;
&lt;p&gt;But what if you don&amp;rsquo;t have access to the command line or terminal directly on the system where the JVM is running, like when the JVM is running in a container?&lt;/p&gt;</description></item><item><title>Let's Replace the synchronized Keyword</title><link>https://foojayio.github.io/website/today/lets-replace-the-synchronized-keyword/</link><pubDate>Tue, 07 May 2024 04:26:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/lets-replace-the-synchronized-keyword/</guid><description>&lt;p&gt;&lt;strong&gt;Let&amp;rsquo;s see in this article different ways to replace the synchronized keyword to make our code more virtual threads friendly.&lt;/strong&gt;&lt;br&gt;
&lt;img src="https://foojayio.github.io/website/today/lets-replace-the-synchronized-keyword/synchronized-loc.png" alt="" loading="lazy"&gt;
 Lines of code of the different solutions discussed in this article&lt;/p&gt;
&lt;h2 id="h2-0-synchronized-and-pinning-threads"&gt;Synchronized and pinning threads&lt;/h2&gt;
&lt;p&gt;Since Java 21, we can enjoy virtual threads and have more than 1 million threads in Java.&lt;/p&gt;
&lt;p&gt;But it has a condition, the virtual thread shouldn&amp;rsquo;t be pinned to the OS thread.&lt;/p&gt;
&lt;p&gt;Pinning means that a virtual thread is blocking the OS thread from being used by any other virtual threads.&lt;/p&gt;</description></item><item><title>Writing a Data Orchestrator in Java</title><link>https://foojayio.github.io/website/today/writing-a-data-orchestrator-in-java/</link><pubDate>Thu, 02 May 2024 19:43:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/writing-a-data-orchestrator-in-java/</guid><description>&lt;p&gt;&lt;strong&gt;A data orchestrator is a platform to schedule, organize, and monitor data-oriented workflows. A workflow is a set of tasks, most data orchestrators come with built-in tasks for a wide range of technologies and provide support for custom processing via a scripting language. A data orchestrator can have multiple types of triggers to start a workflow.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Most Data orchestrators are written in Python.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Most Data orchestrators mandate that &lt;strong&gt;you&lt;/strong&gt; write Python code.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Crowd-Publishing the 10x Java Dev Book</title><link>https://foojayio.github.io/website/today/crowd-publishing-the-10x-java-dev-book/</link><pubDate>Thu, 02 May 2024 07:17:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/crowd-publishing-the-10x-java-dev-book/</guid><description>&lt;p&gt;&lt;strong&gt;Java transformed the world of software development as we know it and continues to evolve as a platform and language. Nevertheless, the &amp;ldquo;&lt;a href="https://github.com/devoxx/JavaRoadmap" target="_blank" rel="noopener noreferrer"&gt;enlightenment roadmap&lt;/a&gt;
&amp;rdquo; of a Java developer can be scary. How do you become the 10x Java Developer you always dreamed of becoming?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the question Steve Poole and Olimpiu Pop embarked on to respond. And, what better way to achieve it than to tap into the best resource Java has: its community!&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>The High Availability Features of Microservices using Chronicle Services</title><link>https://foojayio.github.io/website/today/the-high-availability-features-of-microservices-using-chronicle-services/</link><pubDate>Thu, 25 Apr 2024 13:36:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-high-availability-features-of-microservices-using-chronicle-services/</guid><description>&lt;p&gt;&lt;strong&gt;In low-latency microservices, ensuring system resilience without compromising performance is vital.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This article explores how &lt;a href="https://chronicle.software/services/" title="Chronicle Services" target="_blank" rel="noopener noreferrer"&gt;Chronicle Services&lt;/a&gt;
, a Java-based framework optimised for low-latency microservices, meets these critical requirements by integrating HA, performance, and data persistence.&lt;/p&gt;
&lt;h2 id="h2-0-stateful-and-stateless-services"&gt;Stateful and Stateless Services&lt;/h2&gt;
&lt;p&gt;A &lt;a href="https://chronicle.software/services/" title="Chronicle Service" target="_blank" rel="noopener noreferrer"&gt;Chronicle Service&lt;/a&gt;
 application consists of a number of processing units known as Services, which interact with each other using events posted on &lt;a href="https://chronicle.software/queue-enterprise/" title="Chronicle Queues" target="_blank" rel="noopener noreferrer"&gt;Chronicle Queues&lt;/a&gt;
. The Chronicle Queue is an extremely fast shared memory inter-process communication; it also has an enterprise version that facilitates replication of queues over the network.&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>Smarter Logging in Spring Boot with AOP</title><link>https://foojayio.github.io/website/today/smarter-logging-in-spring-boot-with-aop/</link><pubDate>Tue, 16 Apr 2024 06:25:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/smarter-logging-in-spring-boot-with-aop/</guid><description>&lt;p&gt;Hey &lt;strong&gt;AOP&lt;/strong&gt; fan, after explaining the basics of AOP in &lt;em&gt;&lt;strong&gt;&lt;a href="https://foojayio.github.io/website/today/aspect-oriented-programming-aop/"&gt;Part 1&lt;/a&gt;
&lt;/strong&gt;&lt;/em&gt;, we will dive deeper and demonstrate hands-on how to implement smart logging in Spring Boot using AOP.&lt;/p&gt;
&lt;p&gt;The complete example can be found on &lt;em&gt;&lt;strong&gt;&lt;a href="https://github.com/mezocode/healthcare-management-system/blob/main/src/main/java/com/mezocode/healthcare/shared/aop/LoggingAspect.java" target="_blank" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="h2-0-the-problem-with-logging-everywhere"&gt;&lt;strong&gt;The Problem with Logging Everywhere&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;As software developers, we know the importance of logging 📝. But scattering log statements everywhere comes with drawbacks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Code duplication as the same logs show up in multiple places&lt;/p&gt;</description></item><item><title>Getting Started with bld</title><link>https://foojayio.github.io/website/today/getting-started-with-bld/</link><pubDate>Mon, 15 Apr 2024 18:31:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/getting-started-with-bld/</guid><description>&lt;p&gt;&lt;strong&gt;bld is an up-and-coming build tool for the Java ecosystem. This article guides you through getting set up to use it in your own projects.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-what-is-bld"&gt;What is &lt;code&gt;bld&lt;/code&gt;?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;bld&lt;/code&gt; is a build tool for the Java ecosystem.&lt;/p&gt;
&lt;h2 id="h2-1-why-use-bld"&gt;Why use &lt;code&gt;bld&lt;/code&gt;?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;bld&lt;/code&gt; is a very simple build tool.&lt;/p&gt;
&lt;p&gt;Unlike its contemporaries &lt;code&gt;Maven&lt;/code&gt; and &lt;code&gt;Gradle&lt;/code&gt;, which concern themselves with abstract models of a project, lifecycles, declarative DSLs, and avoiding repeated work, &lt;code&gt;bld&lt;/code&gt; just runs Java code.&lt;/p&gt;</description></item><item><title>Free Foojay.io Tickets for JCON EUROPE, Cologne!</title><link>https://foojayio.github.io/website/today/free-foojay-io-tickets-for-jcon-europe-cologne/</link><pubDate>Sun, 14 Apr 2024 20:00:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/free-foojay-io-tickets-for-jcon-europe-cologne/</guid><description>&lt;p&gt;&lt;a href="https://2024.europe.jcon.one/" target="_blank" rel="noopener noreferrer"&gt;Welcome to JCON EUROPE&lt;/a&gt;
 (May 13 - 16, 2024) - a conference and unique platform to come together with Java developers from all over the world to network, learn from each other and develop your personal skills. At JCON EUROPE, we create room for complex topics to unfold. Literally, hosted in a multiplex movie theater, Java code, concepts and programming are brought to life on impressively large cinema screens.
&lt;a href="https://2024.europe.jcon.one/" target="_blank" rel="noopener noreferrer"&gt;&lt;img src="https://foojayio.github.io/website/today/free-foojay-io-tickets-for-jcon-europe-cologne/image-1024x263.png" alt="" loading="lazy"&gt;
&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>JUG Munich hosts the JCP Executive Committee meeting to 25th anniversary of JCP</title><link>https://foojayio.github.io/website/today/jug-munich-hosts-the-jcp-executive-committee-meeting-to-25th-anniversary-of-jcp/</link><pubDate>Sun, 14 Apr 2024 19:40:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/jug-munich-hosts-the-jcp-executive-committee-meeting-to-25th-anniversary-of-jcp/</guid><description>&lt;p&gt;&lt;strong&gt;The Java Community Process (JCP) was established in 1998 to formalize the development process of the Java platform, where all interested parties can openly participate in the development of specification standards.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For many reasons, the JCP process [1] has decided to organize at least two face-to-face meetings of the Java Executive Committee per year. These meetings not only contain a very warm exchange of ideas, but are also very helpful in identifying future challenges. These meetings bring executives from all interested parties very close to the Java Community, as their feedback is very important to future platform development.&lt;/p&gt;</description></item><item><title>Ensuring the right usage of the Java 21 new features</title><link>https://foojayio.github.io/website/today/ensuring-the-right-usage-of-java-21-new-features/</link><pubDate>Sun, 14 Apr 2024 16:16:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/ensuring-the-right-usage-of-java-21-new-features/</guid><description>&lt;p&gt;&lt;strong&gt;Last September 2023 a new version of Java was released as the latest LTS (Long Time Support). This 21st version &lt;a href="https://www.sonarsource.com/blog/the-new-jdk-lts-is-out-long-live-jdk-21/" title="brought lots of new features" target="_blank" rel="noopener noreferrer"&gt;brought lots of new features&lt;/a&gt;
 that will improve performance and clarity in our code base.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;But taking advantage of these changes and new features, which we are not used to including in our code, can be a tough task. Also, it can lead to improper use or poor uptake, bugs, or basically not taking full advantage of new improvements.&lt;/p&gt;</description></item><item><title>Calling Gemma with Ollama, TestContainers, and LangChain4j</title><link>https://foojayio.github.io/website/today/calling-gemma-with-ollama-testcontainers-and-langchain4j/</link><pubDate>Fri, 12 Apr 2024 13:55:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/calling-gemma-with-ollama-testcontainers-and-langchain4j/</guid><description>&lt;p&gt;&lt;strong&gt;Lately, for my Generative AI powered Java apps, I&amp;rsquo;ve used the &lt;a href="https://deepmind.google/technologies/gemini/#introduction" target="_blank" rel="noopener noreferrer"&gt;Gemini&lt;/a&gt;
 multimodal large language model from Google. But there&amp;rsquo;s also &lt;a href="https://blog.google/technology/developers/gemma-open-models/" target="_blank" rel="noopener noreferrer"&gt;Gemma&lt;/a&gt;
, its little sister model.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Gemma is a family of lightweight, state-of-the-art open models built from the same research and technology used to create the Gemini models.&lt;/p&gt;
&lt;p&gt;Gemma is available in two sizes: 2B and 7B. Its weights are freely available, and its small size means you can run it on your own, even on your laptop. So I was curious to give it a run with &lt;a href="https://docs.langchain4j.dev/" target="_blank" rel="noopener noreferrer"&gt;LangChain4j&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>IntelliJ IDEA and Open Liberty - Effective Java app development</title><link>https://foojayio.github.io/website/today/effective-cloud-native-java-app-development-with-open-liberty-in-intellij-idea/</link><pubDate>Fri, 12 Apr 2024 13:36:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/effective-cloud-native-java-app-development-with-open-liberty-in-intellij-idea/</guid><description>&lt;p&gt;&lt;strong&gt;See how you can use Liberty Tools for IntelliJ IDEA to enable rapid, easy, and efficient development of cloud-native Java applications with Open Liberty and WebSphere Liberty&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When it comes to integrated development environments, within the Java community, IntelliJ IDEA is the most popular IDE amongst professional developers. It is the preferred IDE of choice by two-fifths of developers, making up the biggest majority of IDE users in this community, according to JRebel&amp;rsquo;s &lt;a href="https://www.jrebel.com/resources/java-developer-productivity-report-2023" target="_blank" rel="noopener noreferrer"&gt;2023 Java Developer Productivity Report&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Search in Documentation with a JavaFX LangChain4j Chat</title><link>https://foojayio.github.io/website/today/search-in-documentation-with-a-javafx-chat-langchain4j-application/</link><pubDate>Wed, 10 Apr 2024 18:09:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/search-in-documentation-with-a-javafx-chat-langchain4j-application/</guid><description>&lt;p&gt;At the Fosdem conference in Brussels on February 3rd, I gave a presentation about using an existing documentation set as the data for a ChatGPT-like application, created with JavaFX and LangChain4J.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://webtechie.be/post/2024-02-02-links-presentation-experiment-ai-llm-chat-with-docs/" target="_blank" rel="noopener noreferrer"&gt;video and links of that presentation are available here&lt;/a&gt;
, and this post is a more detailed explanation of that application.&lt;/p&gt;
&lt;h2 id="h2-0-what-is-langchain4j"&gt;What is LangChain4j&lt;/h2&gt;
&lt;p&gt;The goal of LangChain4j is to simplify the integration of AI and LLM capabilities into Java applications. The &lt;a href="https://github.com/langchain4j/langchain4j/" target="_blank" rel="noopener noreferrer"&gt;project lives on GitHub&lt;/a&gt;
, and has a separate &lt;a href="https://github.com/langchain4j/langchain4j-examples" target="_blank" rel="noopener noreferrer"&gt;repository with demo applications&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Debugging Streams with Peek</title><link>https://foojayio.github.io/website/today/debugging-streams-with-peek/</link><pubDate>Fri, 05 Apr 2024 08:05:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-streams-with-peek/</guid><description>&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#understanding-java-streams"&gt;Understanding Java Streams&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#a-simple-stream-example"&gt;A Simple Stream Example&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#what-is-the-raw-peek-endraw-method"&gt;What is the &lt;code&gt;peek()&lt;/code&gt; Method?&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#debugging-with-raw-peek-endraw-"&gt;Debugging with &lt;code&gt;peek()&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#uncovering-common-bugs-with-raw-peek-endraw-"&gt;Uncovering Common Bugs with &lt;code&gt;peek()&lt;/code&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#filtering-issues"&gt;Filtering Issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#large-data-sets"&gt;Large Data Sets&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#addressing-side-effects"&gt;&lt;strong&gt;Addressing Side Effects&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#limitations-and-pitfalls"&gt;Limitations and Pitfalls&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#potential-for-misuse-in-production-code"&gt;Potential for Misuse in Production Code&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#performance-overhead"&gt;Performance Overhead&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#side-effects-and-functional-purity"&gt;Side Effects and Functional Purity&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-right-tool-for-the-job"&gt;The Right Tool for the Job&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#navigating-the-pitfalls"&gt;Navigating the Pitfalls&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-thoughts"&gt;Final Thoughts&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I blogged about &lt;a href="https://debugagent.com/debugging-streams-and-collections" target="_blank" rel="noopener noreferrer"&gt;Java Stream debugging&lt;/a&gt;
 in the past but I skipped an important method that&amp;rsquo;s worthy of a post of its own: peek.&lt;/p&gt;</description></item><item><title>Changes Included in Release 24.02 of Azul Zing Builds of OpenJDK</title><link>https://foojayio.github.io/website/today/changes-included-in-release-24-02-of-azul-zing-builds-of-openjdk/</link><pubDate>Wed, 03 Apr 2024 20:25:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/changes-included-in-release-24-02-of-azul-zing-builds-of-openjdk/</guid><description>&lt;p&gt;&lt;a href="https://www.azul.com/products/prime" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;
 is a Java platform with a modern, TCK-compliant JVM, Azul Zing, based on OpenJDK.&lt;/p&gt;
&lt;p&gt;Zing provides low, consistent response latency of your Java workloads, higher total throughput and carrying capacity, faster warm-up, and infrastructure savings, achieved thanks to the &lt;a href="https://www.azul.com/products/components/pgc/" target="_blank" rel="noopener noreferrer"&gt;C4 pauseless garbage collector&lt;/a&gt;
, &lt;a href="https://www.azul.com/products/components/falcon-jit-compiler/" target="_blank" rel="noopener noreferrer"&gt;Falcon JIT compiler&lt;/a&gt;
 and other technologies created by Azul.&lt;/p&gt;
&lt;p&gt;Zing Builds are available in two versions, either for evaluation or production use:&lt;/p&gt;</description></item><item><title>Records for Cleaner and More Expressive Parameterized Tests in JUnit 5</title><link>https://foojayio.github.io/website/today/records-for-cleaner-and-more-expressive-parameterized-tests-in-junit-5/</link><pubDate>Wed, 03 Apr 2024 09:00:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/records-for-cleaner-and-more-expressive-parameterized-tests-in-junit-5/</guid><description>&lt;h3 id="h3-0-introduction"&gt;&lt;strong&gt;Introduction&lt;/strong&gt;:&lt;/h3&gt;
&lt;p&gt;Parameterized testing in JUnit 5 is a potent technique for executing the same test logic with various inputs. While you can use a variety of data structures, such as custom classes, arrays, or collections, Java records offer a compelling advantage in readability, type safety, and expressiveness.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s examine how to leverage Java records for parameterized tests through a concrete example &amp;ndash; testing an expression evaluator.&lt;/p&gt;
&lt;h3 id="h3-1-the-expression-evaluator-scenario"&gt;The Expression Evaluator Scenario&lt;/h3&gt;
&lt;p&gt;Consider a simple expression evaluator capable of handling the following:&lt;/p&gt;</description></item><item><title>Aspect-Oriented Programming (AOP) Made Easy With Java</title><link>https://foojayio.github.io/website/today/aspect-oriented-programming-aop/</link><pubDate>Thu, 28 Mar 2024 06:58:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/aspect-oriented-programming-aop/</guid><description>&lt;p&gt;Aspect-oriented programming (AOP) is a programming paradigm that seeks to increase modularity by separating cross-cutting concerns from core application logic.&lt;/p&gt;
&lt;p&gt;Cross-cutting concerns refer to functionality like logging, security, and transactions that span across multiple areas of an application.&lt;/p&gt;
&lt;p&gt;AOP allows these concerns to be encapsulated in reusable modules called aspects.&lt;/p&gt;
&lt;p&gt;This improves modularity and makes the codebase easier to maintain.&lt;/p&gt;
&lt;p&gt;In large-scale Java applications, AOP is invaluable for avoiding code duplication and keeping the core code focused on business goals.&lt;/p&gt;</description></item><item><title>Tips for reading code</title><link>https://foojayio.github.io/website/today/tips-for-reading-code/</link><pubDate>Tue, 26 Mar 2024 11:46:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/tips-for-reading-code/</guid><description>&lt;p&gt;&lt;strong&gt;As developers, we read code more than we write it. When adding new features or fixing bugs, we first need to understand existing code, so we can make the right changes in the right place.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When reading code inside the IDE, &lt;a href="https://www.jetbrains.com/idea/" target="_blank" rel="noopener noreferrer"&gt;IntelliJ IDEA&lt;/a&gt;
 helps us to read and understand code by providing helpful features like syntax highlighting and inlay hints. But there are more features to help us understand a piece of code.&lt;/p&gt;</description></item><item><title>Spring Framework – Internals of RestClient</title><link>https://foojayio.github.io/website/today/spring-internals-of-restclient/</link><pubDate>Mon, 25 Mar 2024 11:32:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-internals-of-restclient/</guid><description>&lt;p&gt;&lt;strong&gt;As a developer and architect, my constant pursuit is to achieve simplicity and elegance when constructing resilient and intricate enterprise applications. With my affinity for the Spring Framework, I have witnessed firsthand the simplicity and modernization it brings to the Spring Ecosystem.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This framework enables the creation of complex enterprise applications in a more streamlined and refined manner, boasting a sophisticated diffusion and transformer architecture.&lt;/p&gt;
&lt;img fetchpriority="high" decoding="async" class="size-medium wp-image-103465" src="RestClient_1-700x394.jpg" alt="Spring RestClient" width="700" height="394"&gt;
&lt;p&gt;Spring RestClient&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a href="https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.2-Release-Notes#restclient-support" title="Spring Boot 3.2" target="_blank" rel="noopener noreferrer"&gt;Spring Boot 3.2&lt;/a&gt;
 launched and introduced a range of captivating functionalities. Notably, the release includes the RestClient feature, which offers a contemporary approach to developing REST endpoints.&lt;/p&gt;</description></item><item><title>Multithreaded server in Java: That's easy with FEPCOS-J.</title><link>https://foojayio.github.io/website/today/fuchs-2024-fepcos-j-multithreaded-server/</link><pubDate>Thu, 21 Mar 2024 08:38:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/fuchs-2024-fepcos-j-multithreaded-server/</guid><description>&lt;p&gt;&lt;strong&gt;FEPCOS-J prototypically implements a Java language extension that allows the realization of a multithreaded TCP/IP server in Java without thread or network programming.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Please help me to make FEPCOS-J a Free/Libre and Open-Source Software (FLOSS).&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;FEPCOS-J &lt;a href="#references"&gt;[1]&lt;/a&gt;
 is a Java development tool that prototypes a Java language extension for declarative programming of networked systems. See my previous posts for details &lt;a href="#references"&gt;[2, 3, 4]&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Firstly, this post briefly defines &lt;a href="#what"&gt;the term &amp;ldquo;multithreaded TCP/IP server&amp;rdquo;&lt;/a&gt;
. It then describes &lt;a href="#how"&gt;how FEPCOS-J supports programming a multithreaded TCP/IP server in Java&lt;/a&gt;
. Further, the post explains &lt;a href="#look"&gt;what implementing the server with FEPCOS-J looks like&lt;/a&gt;
 and provides an &lt;a href="#example"&gt;example&lt;/a&gt;
. Finally, the post draws a &lt;a href="#conclusion"&gt;conclusion&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>How to improve your spring boot skills</title><link>https://foojayio.github.io/website/today/how-to-improve-your-spring-boot-skills/</link><pubDate>Wed, 20 Mar 2024 15:10:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-improve-your-spring-boot-skills/</guid><description>&lt;p&gt;&lt;strong&gt;Does anyone else ever feel overwhelmed by Spring Boot? With a rich set of options and eco-system libraries on the one hand, and a very opinionated framework on the other, I often spend considerable time deciphering the &amp;ldquo;Spring Way&amp;rdquo; of doing things. I&amp;rsquo;ve been working with &lt;a href="https://digma.ai/10-spring-boot-performance-best-practices/" target="_blank" rel="noopener noreferrer"&gt;Spring Boot&lt;/a&gt;
 for over three years, yet there are moments when I sense I&amp;rsquo;m not fully harnessing the capabilities of this remarkable framework and that I need to improve my Spring Boot skills.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Java 22 Is Here, And It's Ready To Rock</title><link>https://foojayio.github.io/website/today/java-22-is-here-and-its-ready-to-rock/</link><pubDate>Tue, 19 Mar 2024 13:56:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-22-is-here-and-its-ready-to-rock/</guid><description>&lt;p&gt;Java 22 is here!&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s been six months since Java 21 was released, so it&amp;rsquo;s time for another fresh set of Java features.&lt;/p&gt;
&lt;p&gt;In this article, you&amp;rsquo;ll go on a tour of the JEPs that are part of this release, giving you a brief introduction to each of them.&lt;/p&gt;
&lt;p&gt;Where applicable, the differences with Java 21 are highlighted and a few typical use cases are provided, so that you&amp;rsquo;ll be more than ready to use these features after reading this!&lt;/p&gt;</description></item><item><title>Java 22: What’s New?</title><link>https://foojayio.github.io/website/today/java-22-whats-new/</link><pubDate>Mon, 18 Mar 2024 14:10:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-22-whats-new/</guid><description>&lt;p&gt;As soon as Java 22 is out, it&amp;rsquo;ll be time to walk through all the functionalities that this version bring to us as developers.&lt;/p&gt;
&lt;h2 id="h2-0-jep-461-stream-gatherers-preview"&gt;JEP 461 - Stream Gatherers (Preview)&lt;/h2&gt;
&lt;p&gt;Enhances the Stream API with support for custom intermediate operations. This is a preview API.&lt;/p&gt;
&lt;p&gt;The Stream API provides a fixed set of intermediate and terminal operations. It allows terminal operations to be extended via the &lt;code&gt;Stream::collect(Collector)&lt;/code&gt; method, but does not allow intermediate operations to be extended. Some operations are missing or others are possible via a set of operations or via an operation that doesn&amp;rsquo;t fully match what&amp;rsquo;s needed.&lt;/p&gt;</description></item><item><title>Foojay Podcast #45: Welcome to Java 22</title><link>https://foojayio.github.io/website/today/foojay-podcast-45/</link><pubDate>Mon, 18 Mar 2024 10:31:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-45/</guid><description>&lt;p&gt;Last September, we got Java 21, a Long Term Support (LTS) version with eight new big features and seven incubator or preview features.&lt;/p&gt;
&lt;p&gt;Does Java 22 also bring that much innovation, or is it just a bug-fix release?&lt;/p&gt;
&lt;p&gt;And what needs to be done to get such a release published on time? 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/_NYuuoCQgO8?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>More readability &amp; less complexity with Java's Pattern Matching.</title><link>https://foojayio.github.io/website/today/increase-readability-and-reduce-complexity-with-javas-pattern-matching/</link><pubDate>Thu, 14 Mar 2024 13:29:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/increase-readability-and-reduce-complexity-with-javas-pattern-matching/</guid><description>&lt;p&gt;&lt;strong&gt;Increase readability, reduce cognitive complexity, and avoid bugs that are hard to spot with Java&amp;rsquo;s Pattern Matching.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I bet you don&amp;rsquo;t like writing ugly but necessary boilerplate code or reading it. But, sometimes we need to create logic that has to deal with an object of unknown type and follow different paths depending on the type. This code is prone to be too verbose, is complex to understand, and may involve some hidden errors hard to spot due to intermediate assignments.&lt;/p&gt;</description></item><item><title>Run JavaFX on the Windows Subsystem for Linux and More!</title><link>https://foojayio.github.io/website/today/javafx-on-wsl/</link><pubDate>Tue, 12 Mar 2024 16:11:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/javafx-on-wsl/</guid><description>&lt;p&gt;&lt;strong&gt;What does it take to run standalone JavaFX applications on exotic Linux systems like the Windows Subsystem for Linux or some embedded systems? As you will see, not a lot! Familiarizing yourself with the native libraries required by JavaFX and the font loading process is all that is needed. Then, JavaFX applications can run on them out of the box if you set everything up correctly.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Most graphical Linux systems will automatically come with all the native libraries that are required by Java(FX) as these are pretty standard. Running a standalone Java(FX) application, which has been created with jlink or jpackage for example, on these systems works without having to put in any thought about possible dependencies. However, there are systems where this is not the case.&lt;/p&gt;</description></item><item><title>Why I moved my blog to RIFE2 after 23 years?</title><link>https://foojayio.github.io/website/today/why-i-moved-my-blog-to-rife2-after-23-years/</link><pubDate>Tue, 05 Mar 2024 06:42:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-i-moved-my-blog-to-rife2-after-23-years/</guid><description>&lt;p&gt;In April 2023, I decided to move &lt;a href="https://erik.thauvin.net/blog/" title="my blog" target="_blank" rel="noopener noreferrer"&gt;my blog&lt;/a&gt;
 to &lt;a href="https://rife2.com/" target="_blank" rel="noopener noreferrer"&gt;RIFE2&lt;/a&gt;
, a full-stack framework. It was previously built &lt;a href="https://erik.thauvin.net/blog/stories//15/behind-this-blog" target="_blank" rel="noopener noreferrer"&gt;using my own custom JSP tag library&lt;/a&gt;
, which ran non-stop for 23 years. At one point in time, it was handling close to 5 connections per second, or around 12 million a month, on a single Apache/Tomcat instance.&lt;/p&gt;
&lt;p&gt;Over the years, I tried many frameworks, and the features never made up for the bloat. I&amp;rsquo;ve also never been a big fan of the MVC approach, and I wanted it to be very lean. RIFE2 no-dependencies approach immediately appealed to me, but I wasn&amp;rsquo;t sure the features passed muster.&lt;/p&gt;</description></item><item><title>Builders, Withers, and Records - Java’s path to immutability</title><link>https://foojayio.github.io/website/today/builders-withers-and-records-javas-path-to-immutability/</link><pubDate>Wed, 28 Feb 2024 12:19:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/builders-withers-and-records-javas-path-to-immutability/</guid><description>&lt;p&gt;&lt;strong&gt;We know that immutable objects are easier to maintain, lead to fewer errors, and are multi-thread friendly. In this article, I will talk about two different approaches in Java to creating objects: Builders and Withers, typically used in the context of immutable objects, along with a new type of immutable object in Java: Records.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When it comes to creating objects in Java, we can use fluent approaches, especially for complex objects containing lots of fields, that will increase readability and also adaptability allowing us to evolve the code with lower impact on the existing code. And we want to because fluent code is both easier to read and easier to write.&lt;/p&gt;</description></item><item><title>foojay – 12 Lessons Learned From Doing The 1BRC Challenge</title><link>https://foojayio.github.io/website/today/12-lessons-learned-from-doing-the-one-billion-row-challenge/</link><pubDate>Thu, 22 Feb 2024 10:44:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/12-lessons-learned-from-doing-the-one-billion-row-challenge/</guid><description>&lt;p&gt;The One Billion Row Challenge or 1BRC or 1️⃣🐝🏎 was a challenge to read a CSV file of one billion rows with &amp;ldquo;station name;temperature&amp;rdquo; data and compute the min/average/max temperature per weather station as fast as possible.&lt;/p&gt;
&lt;p&gt;If you want to know what is the fastest algorithm, you can go the the &lt;a href="https://github.com/gunnarmorling/1brc" target="_blank" rel="noopener noreferrer"&gt;1BRC page&lt;/a&gt;
. But the real answer is &amp;ldquo;&lt;strong&gt;it depends&lt;/strong&gt;&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;It depends:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The machine you&amp;rsquo;re running it on&lt;/li&gt;
&lt;li&gt;How far are you ready to use hacks in your code&lt;/li&gt;
&lt;li&gt;The JVM&lt;/li&gt;
&lt;li&gt;The data in the file&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-0-it-works-on-my-machine"&gt;It works on my machine&lt;/h2&gt;
&lt;p&gt;or to be more precise, it&amp;rsquo;s faster on my machine.&lt;/p&gt;</description></item><item><title>Java top most detected issues</title><link>https://foojayio.github.io/website/today/top-most-detected-issues-in-java-projects/</link><pubDate>Wed, 14 Feb 2024 09:49:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/top-most-detected-issues-in-java-projects/</guid><description>&lt;p&gt;&lt;strong&gt;Using the telemetry from SonarLint after analyzing thousands of projects, these are the top most raised issues in Java projects.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We know that having clean code in our projects is important, and every developer would agree on that. But, according to what SonarLint telemetry shows, there are still lots of issues that appear in the huge list of analyzed projects.&lt;/p&gt;
&lt;p&gt;From the SonarLint telemetry for the last 2 years, with more than 2.5 million issues, I have taken the top most common issues happening in Java projects, from the +600 rules covering the language, considering quality and security to see how we can avoid them and align our code a bit more towards having a consistent, intentional, adaptable, and responsible code.&lt;/p&gt;</description></item><item><title>foojay – Sorting Text in Java</title><link>https://foojayio.github.io/website/today/sorting-text-in-java-how-complicated-can-it-be/</link><pubDate>Wed, 07 Feb 2024 08:41:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/sorting-text-in-java-how-complicated-can-it-be/</guid><description>&lt;p&gt;&lt;strong&gt;Sorting text should be easy as String implements the &lt;em&gt;Comparable&lt;/em&gt; interface. In this article, we&amp;rsquo;ll see that it can be more complicated than that.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Text is represented by the &lt;em&gt;String&lt;/em&gt; class in Java. In this article we&amp;rsquo;ll explore how to sort String, the advantages and drawbacks of each possibility.&lt;/p&gt;
&lt;h2 id="h2-0-level-1-comparable"&gt;Level 1: Comparable&lt;/h2&gt;
&lt;p&gt;The class String implements &lt;em&gt;Comparable&lt;/em&gt; so sorting a list of String is as simple as&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;List&amp;lt;String&amp;gt; textList = new ArrayList&amp;lt;&amp;gt;(List.of("test","test11","test2","Test4","test3","test5","tést2","test2","3test","testa","test2a","test4a","test2b"));
Collections.sort(textList);&lt;/pre&gt;
&lt;p&gt;=&amp;gt; &lt;strong&gt;[3test, Test4, test, test11, test2, test2, test2a, test2b, test3, test4a, test5, testa, tést2]&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Migrate to Spring Boot 3.2 with OpenRewrite</title><link>https://foojayio.github.io/website/today/openrewrite-migrate-to-spring-boot-3-2/</link><pubDate>Tue, 06 Feb 2024 08:17:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/openrewrite-migrate-to-spring-boot-3-2/</guid><description>&lt;p&gt;&lt;strong&gt;As a developer, we frequently face the challenges of migrating to newer versions of frameworks and refactoring code. However, we can effortlessly achieve these tasks with the assistance of &lt;a href="https://docs.openrewrite.org/" target="_blank" rel="noopener noreferrer"&gt;OpenRewrite&lt;/a&gt;
. OpenRewrite provides a stack of recipes specifically designed for migration purposes. By utilizing the appropriate recipes and integrating with the rewrite plugin, we can effectively migrate our code.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Two months ago, the Spring Boot 3.2 version released, bringing numerous changes to the framework. If you are involved in multiple projects and require migrating to the latest version, developers may find manually updating all the code repositories with the necessary upgrade changes a challenging task.&lt;/p&gt;</description></item><item><title>Hello eBPF: Recording data in event buffers (3)</title><link>https://foojayio.github.io/website/today/hello-ebpf-recording-data-in-event-buffers-3/</link><pubDate>Fri, 02 Feb 2024 14:45:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/hello-ebpf-recording-data-in-event-buffers-3/</guid><description>&lt;p&gt;&lt;strong&gt;Welcome back to my article series on eBPF. Last week, I showed you how the &lt;a href="https://foojayio.github.io/website/today/hello-ebpf-recording-data-in-basic-ebpf-maps-2/"&gt;eBPF program and Java application can communicate using eBPF maps&lt;/a&gt;
. This allowed us to write an application that counts the number of &lt;code&gt;execve&lt;/code&gt; calls per user.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This week, I&amp;rsquo;ll show you briefly how to use another kind of eBPF maps, the perf event buffer, and run tests with docker and &lt;a href="https://junit.org/junit5/docs/current/user-guide/" target="_blank" rel="noopener noreferrer"&gt;JUnit 5&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This article is shorter than the previous one as I&amp;rsquo;m preparing for the OpenJDK committers workshop in Brussels and my &lt;a href="https://fosdem.org/2024/schedule/speaker/WS77F8/" target="_blank" rel="noopener noreferrer"&gt;Python and Java DevRoom talks&lt;/a&gt;
 at FOSDEM. I&amp;rsquo;m happy to meet my readers; say hi when you&amp;rsquo;re there.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Video: Spring Boot Docker Compose Support</title><link>https://foojayio.github.io/website/today/video-spring-boot-docker-compose-support/</link><pubDate>Wed, 31 Jan 2024 07:50:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/video-spring-boot-docker-compose-support/</guid><description>&lt;p&gt;In Spring Boot 3.1, Docker Compose support was added to simplify local development with external resources.&lt;/p&gt;
&lt;p&gt;In this video, I show you how this works and how to use it!&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/BQkvCxmaiqU?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;br /&gt;
&lt;br /&gt;</description></item><item><title>Where do you get your Java?</title><link>https://foojayio.github.io/website/today/where-do-you-get-your-java/</link><pubDate>Tue, 16 Jan 2024 14:19:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/where-do-you-get-your-java/</guid><description>&lt;p&gt;Today&amp;rsquo;s Java is vastly different, although it is still true to its root principles of robustness, portability, and ease of programming. Your options for where to get your Java have similarly evolved.&lt;/p&gt;
&lt;p&gt;If you download Java directly, you might think that you can only get an official version from Oracle. This is no longer the case. In fact, there are a number of vendors that now provide their own Java distributions that are 100% compatible with the official Java specification.&lt;/p&gt;</description></item><item><title>Interview with Gokul Chandrasekaran, the creator of JDoodle</title><link>https://foojayio.github.io/website/today/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/</link><pubDate>Mon, 08 Jan 2024 12:08:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/JDoodle-Gokul.png" alt="" loading="lazy"&gt;
&lt;br&gt;
In two previous posts, we &lt;a href="https://foojayio.github.io/website/today/integrate-executable-java-code-in-your-blog-posts/"&gt;explained how you can add executable Java code to your posts here on Foojay&lt;/a&gt;
, including &lt;a href="https://foojayio.github.io/website/today/integrate-executable-java-code-in-your-blog-posts-part-2-how-to-use-dependencies/"&gt;code with dependencies&lt;/a&gt;
, by using JDoodle.&lt;/p&gt;
&lt;p&gt;To achieve this full integration, we got &lt;a href="https://www.linkedin.com/in/gokulchandrasekaran-jdoodle/" target="_blank" rel="noopener noreferrer"&gt;Gokul Chandrasekaran&lt;/a&gt;
&amp;rsquo;s support to use the plugin version, and he also gave us some insight into the history and development of JDoodle.&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Thanks, Gokul for your support in bringing&lt;/strong&gt;&lt;/em&gt; an online Java editor to Foojay! Can you introduce yourself,&lt;em&gt;&lt;strong&gt;please?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>(Semantic) Versioning your Java libraries</title><link>https://foojayio.github.io/website/today/semantic-versioning-your-java-libraries/</link><pubDate>Wed, 03 Jan 2024 15:10:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/semantic-versioning-your-java-libraries/</guid><description>&lt;p&gt;&lt;strong&gt;There are a lot of ways to version your library but the &lt;a href="https://semver.org/lang/nl/" target="_blank" rel="noopener noreferrer"&gt;semantic versioning scheme&lt;/a&gt;
 is the most used and for a good reason, by looking at the version change you can already defer if you can upgrade the dependency without any problems or if you might have to do some refactoring. Semantic versioning proposes a simple set of rules and requirements that dictate how version numbers are assigned and incremented.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Book Review: Modern Frontends with htmx</title><link>https://foojayio.github.io/website/today/book-review-modern-frontends-with-htmx/</link><pubDate>Sun, 24 Dec 2023 10:07:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/book-review-modern-frontends-with-htmx/</guid><description>&lt;p&gt;&lt;strong&gt;People who follow me probably know I have a big love for user interface development with JavaFX (for desktop), and Vaadin (for browser). But as always, there are different solutions for every challenge, and building a web user interface with Java can be done with other frameworks.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;htmx seems to be one of those hot new rising stars, and I already wanted to dive deeper into it, but didn&amp;rsquo;t find the time yet.&lt;/p&gt;</description></item><item><title>Writing C Code in Java</title><link>https://foojayio.github.io/website/today/writing-c-code-in-java/</link><pubDate>Wed, 20 Dec 2023 09:21:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/writing-c-code-in-java/</guid><description>&lt;p&gt;&lt;img src="https://mostlynerdless.de/wp-content/uploads/2023/12/panama-2000x981.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Foreign Function &amp;amp; Memory API (also called Project Panama) has come a long way since it started. You can find the latest version implemented in JDK 21 as a preview feature (use &lt;code&gt;--enable-preview&lt;/code&gt; to enable it) which is specified by the &lt;a href="https://openjdk.org/jeps/454" target="_blank" rel="noopener noreferrer"&gt;JEP 454&lt;/a&gt;
:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By efficiently invoking foreign functions (i.e., code outside the JVM), and by safely accessing foreign memory (i.e., memory not managed by the JVM), the API enables Java programs to call native libraries and process native data without the brittleness and danger of JNI.
&lt;a href="https://openjdk.org/jeps/454" target="_blank" rel="noopener noreferrer"&gt;JEP 454&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>FEPCOS-J: Native executables of Java-coded networked systems</title><link>https://foojayio.github.io/website/today/fuchs-2023-fepcos-j-03-native-executables/</link><pubDate>Wed, 13 Dec 2023 12:13:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/fuchs-2023-fepcos-j-03-native-executables/</guid><description>&lt;p&gt;&lt;strong&gt;FEPCOS-J prototypically enables Java developers to realize networked systems without low-level network programming and to automatically build native executables by means of GraalVM. &lt;strong&gt;This post introduces the concept and gives you an example by rebuilding the source code explained in my previous posts.&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Please help me to make FEPCOS-J a Free/Libre and Open-Source Software (FLOSS).&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;FEPCOS-J&lt;/strong&gt; &lt;a href="#references"&gt;[1]&lt;/a&gt;
 enables a Java developer to declaratively program networked systems and compose them like building blocks &lt;a href="#references"&gt;[2]&lt;/a&gt;
. For this purpose, FEPCOS-J provides Java modules and generates code to free a Java developer from network programming &lt;a href="#references"&gt;[3]&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Couch to fully-observed code with Spring Boot 3.2, Micrometer Tracing, and Digma</title><link>https://foojayio.github.io/website/today/couch-to-fully-observed-code-with-spring-boot-3-2-micrometer-tracing-and-digma/</link><pubDate>Wed, 06 Dec 2023 10:42:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/couch-to-fully-observed-code-with-spring-boot-3-2-micrometer-tracing-and-digma/</guid><description>&lt;p&gt;&lt;strong&gt;Collecting important data about your code in dev and test has become trivial, it&amp;rsquo;s now also getting easier to put that data to use.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;{#more-103351}&lt;/p&gt;
&lt;h2 id="h2-0-tracing-debugging"&gt;Tracing &amp;gt; Debugging&lt;/h2&gt;
&lt;p&gt;There are many benefits to being able to follow what your Spring Boot code is doing using tracing. When used effectively, traces can reveal a lot about the inner workings of complex systems, or provide early feedback when you make mistakes in introducing new code changes.&lt;/p&gt;</description></item><item><title>Video: Vaadin Drag &amp; Drop Support. It's so easy!</title><link>https://foojayio.github.io/website/today/video-vaadin-drag-drop-support-its-so-easy/</link><pubDate>Fri, 01 Dec 2023 13:24:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/video-vaadin-drag-drop-support-its-so-easy/</guid><description>&lt;p&gt;In this video I show how simple it can be to add drag and drop to a Vaadin application! Drag and Drop can be helpful in many situations, but often it&amp;rsquo;s complicated to implement. That&amp;rsquo;s not the case with Vaadin. Vaadin makes it easy to have drag-and-drop support for all components.&lt;/p&gt;
&lt;p&gt;More information about drag and drop can be found in the &lt;a href="https://vaadin.com/docs/latest/create-ui/dnd" target="_blank" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;
.&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/WIyT9PqhbqA?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;br /&gt;</description></item><item><title>Strategies for Managing State in Chronicle Services</title><link>https://foojayio.github.io/website/today/strategies-for-managing-state-in-chronicle-services/</link><pubDate>Fri, 01 Dec 2023 08:41:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/strategies-for-managing-state-in-chronicle-services/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In distributed, microservice-based applications, the management of state is one of the most important, yet difficult aspects of design.&lt;/p&gt;
&lt;p&gt;Ensuring the accuracy and consistency of state without introducing excessive complexity that affects performance or flexibility to support evolving requirements requires careful thought.&lt;/p&gt;
&lt;p&gt;This article discusses issues around state management and shows how the &lt;a href="https://chronicle.software/services/" title="Chronicle Services" target="_blank" rel="noopener noreferrer"&gt;Chronicle Services&lt;/a&gt;
 framework provides support to deal with these in ways that maintain a resilient and high performing microservices architecture.&lt;/p&gt;</description></item><item><title>SpringBoot 3.2 + CRaC</title><link>https://foojayio.github.io/website/today/springboot-3-2-crac/</link><pubDate>Tue, 28 Nov 2023 13:04:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/springboot-3-2-crac/</guid><description>&lt;p&gt;Last week Spring 6.1 and &lt;a href="https://spring.io/blog/2023/11/23/spring-boot-3-2-0-available-now" title="SpringBoot 3.2" target="_blank" rel="noopener noreferrer"&gt;SpringBoot 3.2&lt;/a&gt;
 were released and they both came with full support for CRaC (Coordinated Restore at Checkpoint).&lt;/p&gt;
&lt;p&gt;If you want to learn more about CRaC, feel free to read about it &lt;a href="https://docs.azul.com/core/crac/crac-introduction" title="here" target="_blank" rel="noopener noreferrer"&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CRaC is an &lt;a href="https://wiki.openjdk.org/display/crac" title="OpenJDK project" target="_blank" rel="noopener noreferrer"&gt;OpenJDK project&lt;/a&gt;
 that can &amp;ldquo;snapshot&amp;rdquo; a running JVM (Java Virtual Machine) and store its state, including your application, to disk. Then, at another point in time, you can restore the JVM from the saved checkpoint back to memory. With this, one can start an application, warm it up, and create a checkpoint. Restoring from the saved checkpoint back to memory mainly relies on disk I/O, which means it is really fast (in the range of milliseconds).&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Java for desktop applications: Tips and Tricks (Part 1)</title><link>https://foojayio.github.io/website/today/java-for-desktop-applications-part-1/</link><pubDate>Fri, 24 Nov 2023 09:18:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-for-desktop-applications-part-1/</guid><description>&lt;p&gt;&lt;strong&gt;As desktop applications have kind of become a niche topic, it&amp;rsquo;s getting harder to find information about up-to-date best practices for desktop development.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Since I have been doing this for many years now, I hope that I can share some of the lessons learned with other fellow desktop developers. Most items that are discussed here are taken straight from &lt;a href="https://github.com/xpipe-io/xpipe" target="_blank" rel="noopener noreferrer"&gt;XPipe&lt;/a&gt;
, the application I am working on right now. So if you&amp;rsquo;re skeptical or are interested in more details, you can take a look at the actual source code or try them in action yourself in the actual application.&lt;/p&gt;</description></item><item><title>Announcing the Build Server for Gradle Open-Source Repository</title><link>https://foojayio.github.io/website/today/announcing-the-bsp-repo/</link><pubDate>Tue, 21 Nov 2023 10:08:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/announcing-the-bsp-repo/</guid><description>&lt;h3 id="h3-0-build-server-for-gradle"&gt;Build Server for Gradle&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;In September, we shared that Microsoft and Gradle &lt;a href="https://devblogs.microsoft.com/java/new-build-server-for-gradle/" target="_blank" rel="noopener noreferrer"&gt;have joined forces&lt;/a&gt;
 to explore a novel approach to Gradle project import and building, based on the &lt;a href="https://build-server-protocol.github.io/" target="_blank" rel="noopener noreferrer"&gt;Build Server Protocol (BSP)&lt;/a&gt;
. The objective is address the existing Gradle issues on Visual Studio Code and improve support for Gradle projects.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Build Server for Gradle, developed in collaboration with Gradle, will delegate build tasks to the Gradle build tool, which will be responsible for compiling and generating code directly. This ensures that the results of building in Visual Studio Code will be consistent with the output obtained by running Gradle build commands.&lt;/p&gt;</description></item><item><title>Preserving Software Continuity: Empowering Failover Strategies for Uninterrupted Operations</title><link>https://foojayio.github.io/website/today/preserving-software-continuity/</link><pubDate>Thu, 16 Nov 2023 07:53:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/preserving-software-continuity/</guid><description>&lt;p&gt;In today&amp;rsquo;s ever-changing and fast-paced digital landscape, maintaining uninterrupted business continuity is of utmost importance.&lt;/p&gt;
&lt;p&gt;Enter &lt;a href="https://chronicle.software/services/" title="Chronicle Service" target="_blank" rel="noopener noreferrer"&gt;Chronicle Services&lt;/a&gt;
, a robust mechanism dedicated to upholding application integrity even in the face of service disruptions.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s examine the world of failover strategies and explore how they safeguard software continuity.&lt;/p&gt;
&lt;h3 id="h3-0-stateless-vs-stateful-services"&gt;Stateless vs. Stateful Services&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s important to appreciate the difference between stateless and stateful services. Your choice of failover approach is highly influenced by this understanding, especially if the aim is to resume services seamlessly from where they were interrupted.&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>Live (re)compile, (re)load, (re)execute Java code in 100 LoC</title><link>https://foojayio.github.io/website/today/live-recompile-reload-reexecute-java-code-in-100-loc/</link><pubDate>Wed, 15 Nov 2023 16:22:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/live-recompile-reload-reexecute-java-code-in-100-loc/</guid><description>&lt;p&gt;Writing your first program in Java can have quite a learning curve.&lt;/p&gt;
&lt;p&gt;Java has been trying in recent releases to make it easier to write the &lt;a href="https://openjdk.org/projects/amber/design-notes/on-ramp" target="_blank" rel="noopener noreferrer"&gt;first simple program&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Here are some changes that simplify your first Java program:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://openjdk.org/jeps/222" target="_blank" rel="noopener noreferrer"&gt;JEP 222&lt;/a&gt;
: jshell: The Java Shell (Read-Eval-Print Loop) in JDK 9&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openjdk.org/jeps/330" target="_blank" rel="noopener noreferrer"&gt;JEP 330&lt;/a&gt;
: Launch Single-File Source-Code Programs in JDK 11&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openjdk.org/jeps/445" target="_blank" rel="noopener noreferrer"&gt;JEP 445&lt;/a&gt;
: Unnamed Classes and Instance Main Methods in preview in JDK 21&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openjdk.org/jeps/458" target="_blank" rel="noopener noreferrer"&gt;JEP 458&lt;/a&gt;
: Launch Multi-File Source-Code Programs. Not released yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll write a program (&lt;strong&gt;The Reloader&lt;/strong&gt;) to easily play with Java code without the need to know how to compile or run the code or print the result.&lt;/p&gt;</description></item><item><title>Loom is just HyperThreading in Java</title><link>https://foojayio.github.io/website/today/loom-is-just-hyperthreading-in-java/</link><pubDate>Tue, 14 Nov 2023 10:54:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/loom-is-just-hyperthreading-in-java/</guid><description>&lt;p&gt;While sitting in &lt;a href="https://horstmann.com/unblog/2023-09-19/index.html" target="_blank" rel="noopener noreferrer"&gt;Cay Horstmann&lt;/a&gt;
&amp;rsquo;s &lt;a href="https://baselone.ch/speech.html?id=BEB1A232-BA37-4619-A7F9-33802755DFEB" target="_blank" rel="noopener noreferrer"&gt;&amp;ldquo;Looming Changes in Java Concurrency&amp;rdquo; talk at BaselOne&lt;/a&gt;
, I had an epiphany: Aren&amp;rsquo;t virtual threads with Loom just a version of HyperThreading on the JVM?&lt;br&gt;
&lt;img src="https://mostlynerdless.de/wp-content/uploads/2023/10/ht_vs_vt_pyramid-1-2000x1125.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Both try to utilize a computation resource fully, be it hardware core or platform thread, by multiplexing multiple tasks onto it, despite many tasks waiting regularly for IO operations to complete:
&lt;img src="https://mostlynerdless.de/wp-content/uploads/2023/10/ht_vs_vt_interleaving-2000x560.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;When one task waits, another can be scheduled, improving overall throughput. This works especially well when longer IO operations follow short bursts of computation.&lt;/p&gt;</description></item><item><title>Payara Platform Surpasses 150,000 Monthly Users</title><link>https://foojayio.github.io/website/today/payara-platform-reaches-150000-monthly-users/</link><pubDate>Fri, 10 Nov 2023 11:42:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/payara-platform-reaches-150000-monthly-users/</guid><description>&lt;p&gt;&lt;a href="https://www.payara.fish/" title="Payara Services" target="_blank" rel="noopener noreferrer"&gt;Payara Services&lt;/a&gt;
, the leading provider of open source &lt;a href="https://jakarta.ee/" title="Jakarta EE" target="_blank" rel="noopener noreferrer"&gt;Jakarta EE&lt;/a&gt;
 application server software, is proud to announce a significant milestone in the global adoption of Payara Platform.&lt;/p&gt;
&lt;p&gt;Designed for mission-critical systems in production and containerized Jakarta EE and &lt;a href="https://microprofile.io/" title="MicroProfile" target="_blank" rel="noopener noreferrer"&gt;MicroProfile&lt;/a&gt;
 applications, with over 150,000 users globally relying on Payara Platform every month, Payara has firmly established itself as a preferred choice among developers, as well as companies and institutions worldwide.&lt;/p&gt;</description></item><item><title>How to find dead code in your Java services</title><link>https://foojayio.github.io/website/today/how-to-find-dead-code-in-your-java-services/</link><pubDate>Tue, 07 Nov 2023 10:40:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-find-dead-code-in-your-java-services/</guid><description>&lt;p&gt;&lt;strong&gt;When building solutions, the code we write can last many years. While casually browsing legacy code, we might wonder; is this still used? The missing documentation or outdated tests do not help us answer this. When asking around, nobody really knows. Let&amp;rsquo;s try to delete it, shall we? Then, chaos ensues: it turns out it is still used to support some legacy users, in case of emergency, or by that one forgotten integration everyone still uses.&lt;/strong&gt;{#2406}&lt;/p&gt;</description></item><item><title>Controlling JIT Compiler Overhead to Avoid CPU Autoscaling</title><link>https://foojayio.github.io/website/today/controlling-jit-compiler-overhead-to-avoid-cpu-autoscaling/</link><pubDate>Wed, 01 Nov 2023 07:54:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/controlling-jit-compiler-overhead-to-avoid-cpu-autoscaling/</guid><description>&lt;p&gt;&lt;strong&gt;Today&amp;rsquo;s modern, containerized, elastically scaling Java clusters often rely on CPU utilization as the main trigger for scaling out new instances. Imperfect as this metric may be, it is ubiquitous to scale out new instances based on CPU utilization going over some limit. Often that limit is surprisingly low, somewhere around 40 to 50%.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.azul.com/products/prime/" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;
 replaces OpenJDK&amp;rsquo;s HotSpot C2 compiler with the Falcon JIT compiler. &lt;a href="https://docs.azul.com/prime/Falcon-Compiler" target="_blank" rel="noopener noreferrer"&gt;Falcon&lt;/a&gt;
 generates much faster code than OpenJDK, allowing you to handle more transactions in a container before hitting your CPU utilization limit. And, Prime&amp;rsquo;s smoother and more consistent execution allows you to safely raise your CPU utilization to 60-70%, resulting in massive gains in carrying capacity for each container and lower overall cloud costs to handle your total Java workload.&lt;/p&gt;</description></item><item><title>Patterns For The Design Of Microservices – Part 2</title><link>https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-2/</link><pubDate>Mon, 30 Oct 2023 08:58:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-2/</guid><description>&lt;p&gt;In the &lt;a href="https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-1/" title="previous article"&gt;previous article&lt;/a&gt;
, we discussed some of the design patterns employed in the creation of microservices. In this subsequent article, we will delve into the remaining patterns that are commonly utilized in the realm of microservices.&lt;/p&gt;
&lt;img fetchpriority="high" decoding="async" class="size-medium wp-image-102866" src="MSPatterns-700x394.png" alt="Microservice Architecture" width="700" height="394"&gt;
&lt;p&gt;Database Patterns&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;There are seven distinct patterns that further categorize the data management.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Database per Service&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shared Database&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Saga Pattern&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Command-Query Responsiblity Segregation (CQRS)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API Composition&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Domain Event&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Event Sourcing&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the next section, let&amp;rsquo;s discuss each pattern individually.&lt;/p&gt;</description></item><item><title>Navigating Behaviour with Events</title><link>https://foojayio.github.io/website/today/navigating-behaviour-with-events/</link><pubDate>Wed, 25 Oct 2023 15:04:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/navigating-behaviour-with-events/</guid><description>&lt;h2 id="h2-0-two-approaches"&gt;Two Approaches&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s little doubt that modern software architectures lean towards asynchronous models for communication between distributed components (where &amp;ldquo;distributed&amp;rdquo; means components that are not part of the same process, be they on the same or on different physical machines). Synchronous models such as Remote Procedure Call (RPC) are now largely discredited [&lt;a href="https://www.researchgate.net/profile/Ellen-Isaacs/publication/220168963_Why_do_users_like_video/links/02e7e5186b67219c70000000/Why-do-users-like-video.pdf#page=89" title="Waldo" target="_blank" rel="noopener noreferrer"&gt;Waldo&lt;/a&gt;
, &lt;a href="http://steve.vinoski.net/blog/2008/07/01/convenience-over-correctness/" title="Vinoski" target="_blank" rel="noopener noreferrer"&gt;Vinoski&lt;/a&gt;
]; even asynchronous variants of these are not seen as desirable.&lt;/p&gt;
&lt;p&gt;When we strip away the layers that present the illusion that RPC is really just the same as Local Procedure Call (i.e. a normal method invocation), we find sitting above the transport some form of messaging protocol. And these days, the APIs seem more willing to expose developers to these lower-level details, making it clear to programmers that communication with a remote component is inherently more complex than making a simple procedure call.&lt;/p&gt;</description></item><item><title>Java 21 - JEP 445 - Unnamed Classes and Instance Main Methods</title><link>https://foojayio.github.io/website/today/java-21-jep-445-unnamed-classes-and-instance-main-methods/</link><pubDate>Wed, 25 Oct 2023 09:25:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-21-jep-445-unnamed-classes-and-instance-main-methods/</guid><description>&lt;p&gt;Java 21, released on September 19th, 2023, brings many new features, 8 which are fully integrated and 7 which are incubator or preview.&lt;/p&gt;
&lt;p&gt;In this article, I want to highlight one of those preview features: &lt;a href="https://openjdk.org/jeps/445" target="_blank" rel="noopener noreferrer"&gt;Java Enhancement Proposal (JEP) 445: &amp;ldquo;Unnamed Classes and Instance Main Methods&amp;rdquo;&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It&amp;rsquo;s a preview feature, meaning you need extra flags to use it. The goal of JEP 445 is to make it easier to get started with Java, as it&amp;rsquo;s all about reducing the number of keywords when you write, for instance, your very first HelloWorld Java code.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>The Files in JDK 21</title><link>https://foojayio.github.io/website/today/the-files-in-jdk-21/</link><pubDate>Tue, 17 Oct 2023 07:21:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-files-in-jdk-21/</guid><description>&lt;p&gt;As Java developers, we all have it installed on our computer: the Java Development Kit, also known as the JDK. I remember putting the first version on a few floppy disks back in 1995. Since then it has grown multiple times. In this article, we&amp;rsquo;ll explore the files of the JDK.&lt;/p&gt;
&lt;p&gt;For this article, Eclipse Temurin &lt;a href="https://foojayio.github.io/website/today/java-21-is-available-today-and-its-quite-the-update/"&gt;JDK 21&lt;/a&gt;
 for Windows has been used.&lt;/p&gt;
&lt;h2 id="h2-0-files"&gt;Files&lt;/h2&gt;
&lt;h3 id="h3-1-the-statistics"&gt;The statistics&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Total size: 325 MB&lt;/li&gt;
&lt;li&gt;Number of files: 572&lt;/li&gt;
&lt;li&gt;Number of files including in zip files: 47,629&lt;/li&gt;
&lt;li&gt;Largest file: lib/modules with 134 MB&lt;/li&gt;
&lt;li&gt;Number of class files: 27,929 (was 27,064 in JDK 20)&lt;/li&gt;
&lt;li&gt;Number of Java files (in src.zip): 15,404 (was 15,044 in JDK 20)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/the-files-in-jdk-21/jdk21-all-files.png" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>FEPCOS-J (2) – Declaratively compose networked systems in Java</title><link>https://foojayio.github.io/website/today/fuchs-2023-fepcos-j-02/</link><pubDate>Fri, 13 Oct 2023 06:07:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/fuchs-2023-fepcos-j-02/</guid><description>&lt;p&gt;&lt;strong&gt;FEPCOS-J implements a model-based Java language extension that provides the annotation &lt;em&gt;@Part&lt;/em&gt;, which enables a developer to declaratively compose networked systems. This post introduces the concept and gives you an example of how to use it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Please help me to make FEPCOS-J a Free/Libre and Open-Source Software (FLOSS).&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;FEPCOS-J arises in the frame of the FEPCOS-Project &lt;a href="#references"&gt;[1]&lt;/a&gt;
, which aims to simplify the programming of composed networked systems.&lt;/p&gt;
&lt;p&gt;FEPCOS-J implements a domain-specific Java language extension whose semantic domain is based on the FEPCOS-Model &lt;a href="#references"&gt;[2]&lt;/a&gt;
, which extends the composite design pattern &lt;a href="#references"&gt;[3]&lt;/a&gt;
 to include networking aspects.&lt;/p&gt;</description></item><item><title>State of the Software Supply Chain Report: Key Takeaways for Java Developers</title><link>https://foojayio.github.io/website/today/evolving-landscape-software-supply-chains-java-developers/</link><pubDate>Thu, 12 Oct 2023 08:19:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/evolving-landscape-software-supply-chains-java-developers/</guid><description>&lt;p&gt;&lt;strong&gt;Sonatype have just released the 9th edition of their &lt;a href="https://www.sonatype.com/state-of-the-software-supply-chain/introduction" target="_blank" rel="noopener noreferrer"&gt;State of the Software Supply Chain Report&lt;/a&gt;
. It delves into the landscape of open source, software development, and software supply chain security. I thought I&amp;rsquo;d pull out some highlights for Java Developers!&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-software-supply-chains-and-open-source"&gt;Software Supply Chains and Open Source&lt;/h2&gt;
&lt;h4 id="maven-central-hits-1-trillion-downloads"&gt;Maven Central hits 1 Trillion downloads&lt;/h4&gt;
&lt;p&gt;Open source adoption continues to grow, with Java (Maven) being a significant ecosystem.&lt;/p&gt;
&lt;p&gt;The report indicates that Java projects and their versions have seen substantial growth. a 28% year-over-year increase in total projects available on Maven Central - hitting the amazing 1 Trillion download number.&lt;/p&gt;</description></item><item><title>Changes Included in the Stable release 23.08 of Azul Zulu Prime Builds of OpenJDK</title><link>https://foojayio.github.io/website/today/changes-included-in-the-stable-release-23-08-of-azul-zulu-prime-builds-of-openjdk/</link><pubDate>Wed, 11 Oct 2023 07:03:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/changes-included-in-the-stable-release-23-08-of-azul-zulu-prime-builds-of-openjdk/</guid><description>&lt;p&gt;&lt;em&gt;The latest Long Term Support (LTS) version of OpenJDK was released on September 19, 2023. Below is an overview of all the combined improvements in the latest Azul Prime Builds of OpenJDK, stable release, 23.08.01.0.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.azul.com/products/prime/" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;
 is a modern, TCK-compliant Java platform based on OpenJDK. It provides consistently low response latency of your Java workloads, higher total throughput and carrying capacity, faster warmup, and infrastructure savings, achieved thanks to the &lt;a href="https://www.azul.com/products/components/pgc/" target="_blank" rel="noopener noreferrer"&gt;C4 pauseless garbage collector&lt;/a&gt;
, &lt;a href="https://www.azul.com/products/components/falcon-jit-compiler/" target="_blank" rel="noopener noreferrer"&gt;Falcon JIT compiler&lt;/a&gt;
, and other technologies created by Azul. Prime Builds are available in two versions, either for evaluation or production use:&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>Diagnose and Mitigate Pinning in Java's Virtual Thread Execution</title><link>https://foojayio.github.io/website/today/how-to-diagnose-and-mitigate-pinning-in-javas-virtual-thread-execution/</link><pubDate>Tue, 10 Oct 2023 09:08:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-diagnose-and-mitigate-pinning-in-javas-virtual-thread-execution/</guid><description>&lt;p&gt;&lt;strong&gt;In &lt;a href="https://foojayio.github.io/website/today/web-crawling-in-java-a-tale-of-classical-threads-and-virtual-threads/"&gt;our last article&lt;/a&gt;
, we highlighted the impressive performance gains achieved through the use of virtual threads. However, upon diving deeper into the code, we discovered an issue caused by the jsoup library: a phenomenon known as pinning. But before we delve into solutions, let&amp;rsquo;s take a moment to understand what pinning actually is.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-what-is-pinning"&gt;What is Pinning?&lt;/h2&gt;
&lt;p&gt;In the context of virtual threads, pinning refers to the condition where a virtual thread is &amp;ldquo;stuck&amp;rdquo; to its carrier thread (the platform thread on which it runs).&lt;/p&gt;</description></item><item><title>Java 21 and Jakarta EE 11: A New Era of Cloud Native Java</title><link>https://foojayio.github.io/website/today/java-21-and-the-upcoming-jakarta-ee-11-a-new-era-of-cloud-native-java/</link><pubDate>Fri, 06 Oct 2023 08:28:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-21-and-the-upcoming-jakarta-ee-11-a-new-era-of-cloud-native-java/</guid><description>&lt;p&gt;&lt;strong&gt;With Java 21 released and Jakarta EE 11 slated for release in Q1 of 2024, the landscape for Java development is evolving rapidly, particularly in the cloud-native space. Although these two are not being developed together, they are intrinsically linked: Jakarta EE 11 will have Java 21 as its base Java SE version. This blog post will explore what these two significant releases bring to the table individually and how they can collectively enhance cloud native Java development.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Contributing to Foojay's Java Community Certification</title><link>https://foojayio.github.io/website/today/how-to-participate-in-the-foojay-community-certification-project/</link><pubDate>Wed, 04 Oct 2023 07:12:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-participate-in-the-foojay-community-certification-project/</guid><description>&lt;h3 id="h3-0-the-recent-announcement-of-foojay-s-intention-to-create-a-community-driven-certification-exam-for-java-software-development-has-spurred-a-lot-of-interest-this-article-explains-how-any-member-of-the-java-community-can-participate-in-the-creation-of-tasks-for-the-certification"&gt;&lt;em&gt;&lt;strong&gt;The recent announcement of Foojay&amp;rsquo;s intention to create a community-driven certification exam for Java software development has spurred a lot of interest. This article explains how any member of the Java community can participate in the creation of tasks for the certification.&lt;/strong&gt;&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;In the &lt;a href="https://foojayio.github.io/website/today/foojay-developer-certification-measure-skills/" title="previous article"&gt;previous article&lt;/a&gt;
 about the Foojay Developer Certification, we introduced the need for an objective way to measure the skills of Java developers. While there are many assessments and certifications that test the theoretical knowledge of a developer, very few measure the practical ability to write code, find and fix bugs and apply proper design principles. As a community, we have a large collection of de facto best practices and common sense about what makes a developer good at their job. That is why we need your help in creating a certificate that actually communicates a Developer&amp;rsquo;s skill.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Book Review: Get Your Hands Dirty on Clean Architecture</title><link>https://foojayio.github.io/website/today/book-review-get-your-hands-dirty-on-clean-architecture/</link><pubDate>Sat, 23 Sep 2023 12:00:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/book-review-get-your-hands-dirty-on-clean-architecture/</guid><description>&lt;p&gt;&lt;strong&gt;I recently completed reading &amp;ldquo;Get Your Hands Dirty on Clean Architecture&amp;rdquo; authored by Tom Hombergs and I deem it an indispensable resource for developers aspiring to produce clean code and implement the Hexagonal Architecture. Consequently, I have resolved to compose a review to aid numerous individuals who harbor a fervent interest in technology!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Title:&lt;/strong&gt; Get Your Hands Dirty on Clean Architecture&lt;br&gt;
&lt;strong&gt;Author:&lt;/strong&gt; Tom Hombergs&lt;br&gt;
&lt;strong&gt;Genre:&lt;/strong&gt; Technical, Software Architecture&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/book-review-get-your-hands-dirty-on-clean-architecture/GetYourHandsDirtyOnCleanArchitecture.jpg" alt="CleanArchitecture" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;In the constantly changing realm of software development, architectural principles hold a crucial position in determining the triumph and sustainability of a project. The book authored by Tom Hombergs, titled &amp;ldquo;Get Your Hands Dirty on Clean Architecture: A hands-on guide to creating clean web applications with code examples in Java,&amp;rdquo; is an exceptional guide that illuminates the importance of clean architecture, while also offering practical perspectives on its implementation through the Java programming language.&lt;/p&gt;</description></item><item><title>New FXComponents Library Released</title><link>https://foojayio.github.io/website/today/new-fxcomponents-library-released/</link><pubDate>Fri, 22 Sep 2023 10:15:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/new-fxcomponents-library-released/</guid><description>&lt;p&gt;&lt;strong&gt;A new library for Java / JavaFX has just been released. The library&amp;rsquo;s name is FXComponents and it is a Java library that contains a collection of new controls to be used in JavaFX applications.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As of the time of writing, FXComponents is being built using Java 17 and JavaFX 20.&lt;/p&gt;
&lt;p&gt;Below is a brief description of the controls currently present in this library (more coming soon). If you want to know more, head on over to the &lt;a href="https://pixelduke.com/2023/09/04/fxcomponents-library-released/" target="_blank" rel="noopener noreferrer"&gt;documentation page&lt;/a&gt;
 for more detailed information about this library and how to start using it.&lt;/p&gt;</description></item><item><title>Using JLink to create smaller Docker images for Spring Boot apps</title><link>https://foojayio.github.io/website/today/using-jlink-to-create-smaller-docker-images-for-your-spring-boot-java-application/</link><pubDate>Thu, 21 Sep 2023 11:33:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/using-jlink-to-create-smaller-docker-images-for-your-spring-boot-java-application/</guid><description>&lt;p&gt;&lt;strong&gt;Containers bring new flexibility and agility to software development and deployment. However, they also introduce a new attack surface that malicious actors can exploit. A compromised container can give an attacker access to other containers and even the host system. Smaller images that contain fewer artifacts are already a great help in achieving a smaller attack surface.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll present an in-depth exploration of utilizing JLink to optimize Docker image sizes, enhancing application security and performance. We&amp;rsquo;ll showcase how to use JLink and integrate it with Docker to efficiently deploy your Spring Boot or general Java applications.&lt;/p&gt;</description></item><item><title>Monkey-patching in Java</title><link>https://foojayio.github.io/website/today/monkey-patching-in-java/</link><pubDate>Thu, 21 Sep 2023 07:34:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/monkey-patching-in-java/</guid><description>&lt;p&gt;The JVM is an excellent platform for monkey-patching.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Monkey patching is a technique used to dynamically update the behavior of a piece of code at run-time. A monkey patch (also spelled monkey-patch, MonkeyPatch) is a way to extend or modify the runtime code of dynamic languages (&lt;em&gt;e.g.&lt;/em&gt; Smalltalk, JavaScript, Objective-C, Ruby, Perl, Python, Groovy, etc.) without altering the original source code.&lt;/p&gt;
&lt;p&gt;&amp;ndash; &lt;a href="https://en.wikipedia.org/wiki/Monkey_patch" target="_blank" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I want to demo several approaches for monkey-patching in Java in this post.&lt;/p&gt;</description></item><item><title>Manage Different Java Versions on Your Machine with SDKMan!</title><link>https://foojayio.github.io/website/today/easily-manage-different-java-versions-on-your-machine-with-sdkman/</link><pubDate>Wed, 20 Sep 2023 07:05:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/easily-manage-different-java-versions-on-your-machine-with-sdkman/</guid><description>&lt;p&gt;&lt;strong&gt;So, you&amp;rsquo;re a Java developer, or maybe you&amp;rsquo;re aspiring to be one. Either way, you&amp;rsquo;ve probably faced the challenge of managing multiple versions of Java on your machine. One project requires Java 8, but another needs Java 11, yet another requires Java 17. The open-source library you&amp;rsquo;re keen on contributing to needs yet another version. What do you do? You start juggling environment variables, and before you know it, your system is a tangled mess of configurations. Not fun, right?&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Exploring the Impact of Stack Size on JVM Thread Creation: A Myth Debunked</title><link>https://foojayio.github.io/website/today/exploring-the-impact-of-stack-size-on-jvm-thread-creation-a-myth-debunked/</link><pubDate>Wed, 20 Sep 2023 06:59:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-the-impact-of-stack-size-on-jvm-thread-creation-a-myth-debunked/</guid><description>&lt;p&gt;&lt;strong&gt;Among Java developers, a prevailing assumption is that the number of native threads that can be created within the Java Virtual Machine (JVM) is linked to the stack size. To scrutinize this widespread notion, an experiment was conducted. The results revealed that stack size plays a less significant role in native thread creation than previously thought.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-the-experiment"&gt;&lt;strong&gt;The Experiment&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;The experiment utilized the following Java program, which continuously creates threads and counts them using an &lt;a href="https://download.java.net/java/early_access/jdk21/docs/api/java.base/java/util/concurrent/atomic/AtomicInteger.html" target="_blank" rel="noopener noreferrer"&gt;AtomicInteger&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Java 21 Is Available Today, And It's Quite The Update</title><link>https://foojayio.github.io/website/today/java-21-is-available-today-and-its-quite-the-update/</link><pubDate>Tue, 19 Sep 2023 05:31:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-21-is-available-today-and-its-quite-the-update/</guid><description>&lt;p&gt;&lt;strong&gt;Today&amp;rsquo;s the first day of Java 21&amp;rsquo;s availability! It&amp;rsquo;s been six months since Java 20 was released, so it&amp;rsquo;s time for another fresh wave of Java features. This post takes you on a tour of the JEPs that are associated with this release and it gives you a brief introduction to each of them, and &lt;a href="https://foojayio.github.io/website/today/foojay-podcast-28/"&gt;check out the Java 21 podcast here&lt;/a&gt;
. Where applicable the differences with Java 20 are highlighted and a few typical use cases are provided, so that you&amp;rsquo;ll be more than ready to use these features after reading this!&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Foojay Podcast #28: Java 21 Has Arrived!</title><link>https://foojayio.github.io/website/today/foojay-podcast-28/</link><pubDate>Tue, 19 Sep 2023 05:27:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-28/</guid><description>&lt;p&gt;Since 2018, we get a new version of Java every 6 months.&lt;/p&gt;
&lt;p&gt;And &lt;a href="https://foojayio.github.io/website/today/java-21-is-available-today-and-its-quite-the-update/"&gt;version 21, released during today, is a long-term support version&lt;/a&gt;
 that can be used for many years.&lt;/p&gt;
&lt;p&gt;It also brings a lot of new features and improvements in both the language and the runtime.&lt;/p&gt;
&lt;p&gt;Actually, there are so many that we&amp;rsquo;ll probably not get all of them discussed in this podcast!&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s see what our experts find the most important facts we need to know about Java 21.&lt;/p&gt;</description></item><item><title>Exposing your data using Spring GraphQL</title><link>https://foojayio.github.io/website/today/exposing-your-data-using-spring-graphql/</link><pubDate>Tue, 19 Sep 2023 05:25:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/exposing-your-data-using-spring-graphql/</guid><description>&lt;p&gt;&lt;strong&gt;In this article, we&amp;rsquo;ll take an introductory look at how we can use Spring GraphQL in our Java applications.&lt;/strong&gt; &lt;strong&gt;GraphQL is a query language (hence the QL) that in conjunction with a framework such as &lt;code&gt;Spring GraphQL&lt;/code&gt; can be used to efficiently manage our data, and even reuse existing services.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It has 2 core concepts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;queries: used to define which data should be fetched, and which fields thereof should be included&lt;/li&gt;
&lt;li&gt;mutations: used to manage our dataset&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&amp;rsquo;s an alternative to REST, SOAP, or gRPC, and supports calls over HTTP, WebSocket and RSocket.&lt;/p&gt;</description></item><item><title>Building Real-Time Applications to Process Wikimedia Streams</title><link>https://foojayio.github.io/website/today/building-real-time-applications-to-process-wikimedia-streams-using-kafka-and-hazelcast/</link><pubDate>Fri, 15 Sep 2023 14:33:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-real-time-applications-to-process-wikimedia-streams-using-kafka-and-hazelcast/</guid><description>&lt;p&gt;&lt;strong&gt;In this tutorial, developers, solution architects, and data engineers can learn how to build high-performance, scalable, and fault-tolerant applications that react to real-time data using Kafka and Hazelcast.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We will be using Wikimedia as a real-time data source. Wikimedia provides various streams and APIs (Application Programming Interfaces) to access real-time data about edits and changes made to their projects.&lt;/p&gt;
&lt;p&gt;For example, this source provides a continuous stream of updates on recent changes, such as new edits or additions to Wikipedia articles. Developers and solution architects often use such streams to monitor and analyze the activity on Wikimedia projects in real-time or to build applications that rely on this data, like this tutorial.&lt;/p&gt;</description></item><item><title>Extending availability of IBM Semeru Runtimes V11 beyond Oct 2024</title><link>https://foojayio.github.io/website/today/semeru-v11-beyond-oct-2024/</link><pubDate>Thu, 14 Sep 2023 14:17:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/semeru-v11-beyond-oct-2024/</guid><description>&lt;p&gt;&lt;strong&gt;IBM has extended the availability of IBM Semeru Runtimes V11 from Oct 2024 to Nov 2026. Semeru Runtimes is IBM&amp;rsquo;s build of OpenJDK with Eclipse OpenJ9 technology. The &lt;a href="https://www.ibm.com/support/pages/semeru-runtimes-support/" title="IBM Semeru Runtimes support page" target="_blank" rel="noopener noreferrer"&gt;IBM Semeru Runtimes support page&lt;/a&gt;
 (which includes downloads) is now updated to reflect this additional two years of availability for Version 11.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-what-is-ibm-semeru-runtimes"&gt;What is IBM Semeru Runtimes?&lt;/h2&gt;
&lt;p&gt;IBM Semeru Runtimes is a free distribution of production-ready binaries built with the OpenJDK class libraries and the Eclipse OpenJ9 JVM.&lt;/p&gt;</description></item><item><title>ArchUnit - test your architecture</title><link>https://foojayio.github.io/website/today/archunit-testing-your-architecture/</link><pubDate>Thu, 14 Sep 2023 14:09:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/archunit-testing-your-architecture/</guid><description>&lt;p&gt;&lt;a href="https://www.archunit.org/" target="_blank" rel="noopener noreferrer"&gt;ArchUnit&lt;/a&gt;
 is a library that allows us to test our architecture (layering/slicing/(naming) conventions, and more).&lt;/p&gt;
&lt;p&gt;Why does this matter? It&amp;rsquo;s all about leaving a legacy and safeguarding it. During the lifecycle of a project, people might shift roles, join the team, &amp;hellip; And might not be aware of the conventions within the team/organization.&lt;/p&gt;
&lt;p&gt;Testing your architecture is both an aid to ascertain that the architecture is being implemented consistently and also makes it easier for people onboarding to get a grasp of what that agreed architecture is.&lt;/p&gt;</description></item><item><title>OpenRewrite: Automatic Code Refactoring and More - Part 2</title><link>https://foojayio.github.io/website/today/openrewrite-automatic-code-refactoring-and-maintenance-part-2/</link><pubDate>Thu, 14 Sep 2023 06:56:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/openrewrite-automatic-code-refactoring-and-maintenance-part-2/</guid><description>&lt;p&gt;In the &lt;a href="https://foojayio.github.io/website/today/openrewrite-automatic-code-refactoring-and-maintenance/"&gt;previous article&lt;/a&gt;
, we outlined the significance of the OpenRewrite Library and its integration at an elevated level.&lt;/p&gt;
&lt;p&gt;This article explains how to improve, refactor, and move a Spring Boot application with OpenRewrite.&lt;br&gt;
&lt;img src="https://foojayio.github.io/website/today/openrewrite-automatic-code-refactoring-and-maintenance-part-2/OpenRewrite.gif" alt="Open Rewrite" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Source: OpenReWrite{#caption-attachment-102151}&lt;/p&gt;
&lt;p&gt;Before proceeding, we shall understand the various goals in the &lt;strong&gt;Maven or Gradle plugin&lt;/strong&gt; &lt;strong&gt;configuration&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;OpenRewrite Maven&lt;/strong&gt; offers the following goals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mvn rewrite:cyclonedx&lt;/code&gt; - This will generate a &lt;a href="https://cyclonedx.org/" target="_blank" rel="noopener noreferrer"&gt;Cyclonedx&lt;/a&gt;
 bill of materials describing the application/project dependencies, including &lt;a href="https://en.wikipedia.org/wiki/Transitive_dependency" target="_blank" rel="noopener noreferrer"&gt;transitive dependencies&lt;/a&gt;
.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mvn rewrite:discover&lt;/code&gt; - Generate a report detailing the recipes that are currently available within the classpath.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mvn rewrite:dryRun&lt;/code&gt; - This precautionary command will generate a set of differences solely for the modifications made within the &lt;code&gt;/target/rewrite&lt;/code&gt; directory, which will be saved in the &lt;code&gt;rewrite.patch&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mvn rewrite:dryRunNoFork&lt;/code&gt; - This precautionary command will generate a set of differences solely for the modifications made within the &lt;code&gt;/target/rewrite&lt;/code&gt; directory, which will be saved in the &lt;code&gt;rewrite.patch&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mvn rewrite:run&lt;/code&gt;- This command runs the configured recipes and applies the changes locally.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mvn rewrite:runNoFork&lt;/code&gt; -This command runs the configured recipes and applies the changes locally.&lt;/li&gt;
&lt;li&gt;For &lt;code&gt;runForFork:&lt;/code&gt; This different way of doing things doesn&amp;rsquo;t split up the Maven process and could work better when using Rewrite with other Maven tasks in a continuous integration (CI) system.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;strong&gt;OpenRewrite Gradle&lt;/strong&gt; offers the following goals:&lt;/p&gt;</description></item><item><title>The DiscoAPI Helps You To Find Any OpenJDK Distribution</title><link>https://foojayio.github.io/website/today/disco-api-helping-you-to-find-any-openjdk-distribution/</link><pubDate>Tue, 12 Sep 2023 03:42:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/disco-api-helping-you-to-find-any-openjdk-distribution/</guid><description>&lt;p&gt;&lt;strong&gt;Did you know Foojay is not only a human-readable OpenJDK knowledge base but also provides the Disco API that lets you search all OpenJDK distributions? And even if you didn&amp;rsquo;t know, you probably already are using it, as it&amp;rsquo;s integrated into &lt;a href="https://sdkman.io/" target="_blank" rel="noopener noreferrer"&gt;SDKMAN!&lt;/a&gt;
, &lt;a href="https://jreleaser.org/" target="_blank" rel="noopener noreferrer"&gt;JReleaser&lt;/a&gt;
, &lt;a href="https://www.jbang.dev/" target="_blank" rel="noopener noreferrer"&gt;JBang!&lt;/a&gt;
, &lt;a href="https://docs.gradle.org/current/userguide/toolchains.html" target="_blank" rel="noopener noreferrer"&gt;Gradle toolchain&lt;/a&gt;
, &lt;a href="https://paketo.io/docs/howto/java/" target="_blank" rel="noopener noreferrer"&gt;Paketo buildpacks&lt;/a&gt;
,and more.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Disco API (i.e., the short name for the Universal OpenJDK Discovery API) is a database and API with all the available OpenJDK versions from all distributors, like Corretto, Liberica, Oracle, Temurin, Zulu, and many others. In total, there are now 89352 different packages at the end of August 2023.&lt;/p&gt;</description></item><item><title>New JavaFX theme library "Transit" released</title><link>https://foojayio.github.io/website/today/new-javafx-theme-library-transit-released/</link><pubDate>Tue, 12 Sep 2023 02:56:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/new-javafx-theme-library-transit-released/</guid><description>&lt;p&gt;&lt;strong&gt;A new Java (JavaFX) theme has been released. This is a new theme called &amp;ldquo;Transit&amp;rdquo; and it builds upon the lessons learned while developing JMetro. The code is hosted on &lt;a href="https://github.com/dukke/Transit" target="_blank" rel="noopener noreferrer"&gt;Github&lt;/a&gt;
.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It is not meant to be JMetro 2, it will be an entirely new theme.&lt;/p&gt;
&lt;h2 id="h2-0-strengths-and-key-principles"&gt;Strengths and Key Principles&lt;/h2&gt;
&lt;p&gt;This theme follows some of the design principles and has some of the key strengths of JMetro:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Modern look and feel;&lt;/li&gt;
&lt;li&gt;Zero tight coupling with this library:
&lt;ul&gt;
&lt;li&gt;No new controls. &amp;ldquo;Pluggable&amp;rdquo; theme. Functionality is added &amp;ldquo;behind the curtains&amp;rdquo; to existing JavaFX controls through the Skin API (FXSkins library);&lt;/li&gt;
&lt;li&gt;Setting and unsetting is seamless and easy (only 1 line of code) even on already existing apps that don&amp;rsquo;t use this theme;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Looks integrated on Windows (80%/90% of desktop users use Windows) also works well on other OSes;&lt;/li&gt;
&lt;li&gt;Light and Dark versions;&lt;/li&gt;
&lt;li&gt;Easily override and customize colors by overriding JavaFX CSS variables;&lt;/li&gt;
&lt;li&gt;Only relies on JavaFX CSS, JavaFX API and Java code (no other &amp;ldquo;foreign technologies&amp;rdquo;);&lt;/li&gt;
&lt;li&gt;Samples and theme tester app on &lt;a href="https://github.com/dukke/Transit/tree/main/transit-samples" target="_blank" rel="noopener noreferrer"&gt;samples sub-project&lt;/a&gt;
;&lt;/li&gt;
&lt;li&gt;Lots of real world, recognized Java apps already using it (NASA&amp;rsquo;s applications, applications used in the White House, etc, etc) (JMetro and Transit) &amp;ndash; check the documentation page for more real world examples;&lt;/li&gt;
&lt;li&gt;Leverages lessons learned developing JMetro theme;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I like to use the term Michael Paus (&lt;a href="https://twitter.com/MichaelPaus" target="_blank" rel="noopener noreferrer"&gt;@MichaelPaus&lt;/a&gt;
) coined when he was referring to JMetro: this is a &amp;ldquo;pluggable&amp;rdquo; JavaFX theme (like JMetro).&lt;/p&gt;</description></item><item><title>A Look at Sealed Classes, Pattern Matching, Functional Paradigms</title><link>https://foojayio.github.io/website/today/embracing-modernity-a-comprehensive-look-at-sealed-classes-pattern-matching-and-functional-paradigms-in-java/</link><pubDate>Mon, 11 Sep 2023 08:42:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/embracing-modernity-a-comprehensive-look-at-sealed-classes-pattern-matching-and-functional-paradigms-in-java/</guid><description>&lt;h3 id="h3-0-introduction"&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The introduction of Sealed Classes in Java and the combination with pattern matching in switch statements has sparked a debate among software developers.&lt;/p&gt;
&lt;p&gt;The argument in question raises concerns about the real-life use cases for Sealed Classes and suggests that pattern matching with switch might promote poor coding practices.&lt;/p&gt;
&lt;p&gt;This article aims to counter these assertions by examining the principles and practical applications of Sealed Classes and pattern matching.&lt;/p&gt;</description></item><item><title>Spring's new JdbcClient API for performing database operations</title><link>https://foojayio.github.io/website/today/the-new-jdbcclient-introduced-in-spring-framework-6-1/</link><pubDate>Fri, 08 Sep 2023 06:45:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-new-jdbcclient-introduced-in-spring-framework-6-1/</guid><description>&lt;p&gt;&lt;strong&gt;Spring framework 6.1 introduced a new JdbcClient API, which is a wrapper on top of JdbcTemplate, for performing database operations using a fluent API.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Spring Boot 3.2 is going to include Spring framework 6.1, so let&amp;rsquo;s take a quick look at&lt;/p&gt;
&lt;p&gt;how we can use &lt;strong&gt;JdbcClient&lt;/strong&gt; to implement various database operations in a simplified manner.&lt;/p&gt;
&lt;p&gt;First, let&amp;rsquo;s go to &lt;a href="https://start.spring.io/" target="_blank" rel="noopener noreferrer"&gt;https://start.spring.io/&lt;/a&gt;
 and create a Spring Boot application by selecting&lt;br&gt;
&lt;strong&gt;Spring JDBC&lt;/strong&gt; , &lt;strong&gt;PostgreSQL Driver&lt;/strong&gt; , &lt;strong&gt;Flyway Migration&lt;/strong&gt; , and &lt;strong&gt;Testcontainers&lt;/strong&gt; starters.&lt;/p&gt;</description></item><item><title>OpenRewrite: Automatic Code Refactoring and Maintenance</title><link>https://foojayio.github.io/website/today/openrewrite-automatic-code-refactoring-and-maintenance/</link><pubDate>Tue, 05 Sep 2023 17:05:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/openrewrite-automatic-code-refactoring-and-maintenance/</guid><description>&lt;p&gt;As software engineers and architects, we often face the challenge of upgrading dependencies, security patches, and framework upgrades to the latest versions. Enterprise organizations often have legacy code developed and maintained for a long time.&lt;/p&gt;
&lt;p&gt;Updating dependency versions in the build file in many build files in the software projects, and implementing large framework upgrades can be a daunting task for developers, who must manually inspect and modify class files, properties, and the build files such as &lt;code&gt;pom.xml&lt;/code&gt; or &lt;code&gt;build.gradle&lt;/code&gt; or any other build files.&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>Create a Spring Boot Application to Retrieve Data from Evernote</title><link>https://foojayio.github.io/website/today/how-to-create-a-spring-boot-application-to-retrieve-data-from-evernote/</link><pubDate>Mon, 28 Aug 2023 11:06:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-create-a-spring-boot-application-to-retrieve-data-from-evernote/</guid><description>&lt;p&gt;I recently started work on a joint project with my colleague, &lt;a href="https://twitter.com/jalakoo" target="_blank" rel="noopener noreferrer"&gt;Jason Koo&lt;/a&gt;
. For this project, we want to import data from second brain apps (such as Obsidian, Notion, Evernote, etc) to Neo4j.&lt;/p&gt;
&lt;p&gt;Since I use Evernote, I was tasked with getting my notes out of Evernote.&lt;/p&gt;
&lt;p&gt;In this article, I will show you how to use the Evernote API and SDK in a Spring Boot application to retrieve data from Evernote.&lt;/p&gt;</description></item><item><title>AI-based Images generation with Quarkus and OpenAI DALL.E</title><link>https://foojayio.github.io/website/today/images-generation-with-quarkus-and-openai/</link><pubDate>Mon, 21 Aug 2023 07:38:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/images-generation-with-quarkus-and-openai/</guid><description>&lt;p&gt;&lt;strong&gt;In this article, we explore how to integrate OpenAI API with Quarkus. We will create a Quarkus application using the new REST Client Reactive to invoke the OpenAI DALL.E API for images generation.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-openai-api-overview"&gt;OpenAI API Overview&lt;/h2&gt;
&lt;p&gt;Before jumping into the code, let&amp;rsquo;s explore the OpenAI &lt;a href="https://platform.openai.com/docs/api-reference/images/create" target="_blank" rel="noopener noreferrer"&gt;Create Image&lt;/a&gt;
 API and how it works.&lt;/p&gt;
&lt;h3 id="h3-1-create-image-request"&gt;Create Image Request&lt;/h3&gt;
&lt;p&gt;The body request is made of the following parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;prompt&lt;/strong&gt;: the only required parameter is the description of the desired image (max 1000 characters)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;n&lt;/strong&gt;: number of desired images (from 1 to 10)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;size&lt;/strong&gt; : the size of a generated image (default 1024x1024, also admitted 256x256, 512x512)&lt;br&gt;
other parameters are:&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;response_format&lt;/strong&gt;: to specify the response image format (default url, also admitted b64_json)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;user&lt;/strong&gt;: identifier to track user activities.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To authenticate with the API, we&amp;rsquo;ll generate an &lt;a href="https://platform.openai.com/account/api-keys" target="_blank" rel="noopener noreferrer"&gt;API key&lt;/a&gt;
. We&amp;rsquo;ll set this key in the Authorization header while calling the API.&lt;/p&gt;</description></item><item><title>Taming the Bias: Unbiased Safepoint-Based Stack Walking</title><link>https://foojayio.github.io/website/today/taming-the-bias-unbiased-safepoint-based-stack-walking/</link><pubDate>Thu, 17 Aug 2023 14:00:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/taming-the-bias-unbiased-safepoint-based-stack-walking/</guid><description>&lt;p&gt;&lt;strong&gt;Walking only at safepoints has advantages. The main one is that you aren&amp;rsquo;t walking the stack in a signal handler but synchronously to the executed program. Therefore you can allocate memory, acquire locks and rematerialize virtual thread / Loom frames. The latter is significant because virtual threads are &lt;em&gt;the&lt;/em&gt; new Java feature that cannot support using signal-handler-based APIs like AsyncGetCallTrace.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This article is based on the ideas of Erik Österlund, and the second one is related to these new ideas. The first one is &lt;a href="https://mostlynerdless.de/blog/2023/08/07/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/" target="_blank" rel="noopener noreferrer"&gt;AsyncGetCallTrace Reworked: Frame by Frame with an Iterative Touch!&lt;/a&gt;
, which you should read before continuing with this post. For a refresher on safepoints, please read &lt;a href="https://mostlynerdless.de/blog/2023/07/31/the-inner-workings-of-safepoints/" target="_blank" rel="noopener noreferrer"&gt;The Inner Workings of Safepoints&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Building High-Performance Java Microservices with EDA</title><link>https://foojayio.github.io/website/today/6-considerations-when-building-high-performance-java-microservices-with-eda/</link><pubDate>Wed, 16 Aug 2023 21:34:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/6-considerations-when-building-high-performance-java-microservices-with-eda/</guid><description>&lt;p&gt;&lt;strong&gt;Event-Driven Architecture (EDA) is a design principle focused on the creation, detection, and reaction to events.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Renowned for its resilience and low latency, EDA is a reliable choice for developing robust, high-performing microservices.&lt;/p&gt;
&lt;p&gt;Moreover, this method can be helpful in improving productivity and making the process of cloud migration smoother.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/6-considerations-when-building-high-performance-java-microservices-with-eda/Screenshot-2023-08-10-at-5.13.36-PM-1024x607.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;In this article we will outline 6 key considerations and tactics for developing such services.&lt;/p&gt;
&lt;h3 id="h3-0-1-crafting-event-based-microservices"&gt;1) Crafting Event-Based Microservices&lt;/h3&gt;
&lt;p&gt;Within EDA, microservices interact with each other through events. An event is simply an immutable indication that something has happened. Microservices register their interest in a subset of events and perform their processing by reacting to these events when they occur. On completion of handling of an event, microservices will usually post one or more events reflecting the result of this processing, which will trigger further downstream microservices.&lt;/p&gt;</description></item><item><title>Pi4J Operating System for Java development on Raspberry Pi</title><link>https://foojayio.github.io/website/today/pi4j-operating-system-for-java-development-on-raspberry-pi/</link><pubDate>Fri, 11 Aug 2023 10:19:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/pi4j-operating-system-for-java-development-on-raspberry-pi/</guid><description>&lt;p&gt;&lt;strong&gt;Yes, the Raspberry Pi Operating System is awesome! But the Pi4J project made it even more awesome by adding &amp;ldquo;goodies&amp;rdquo; for Java developers! Pi4J OS is not yet another OS, but the official Raspberry Pi OS, with additional tools and preconfigurations to make it the ideal OS for any Java and JavaFX developer who wants to use a Raspberry Pi.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The project is shared on &lt;a href="https://github.com/Pi4J/pi4j-os" target="_blank" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
 and documented on &lt;a href="https://pi4j.com/pi4j-os/" target="_blank" rel="noopener noreferrer"&gt;the Pi4J website&lt;/a&gt;
. The zip-compressed archives of released versions can be downloaded from &lt;a href="https://pi4j-download.com" target="_blank" rel="noopener noreferrer"&gt;pi4j-download.com&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>AsyncGetCallTrace Reworked: Frame by Frame Iterative Touch!</title><link>https://foojayio.github.io/website/today/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/</link><pubDate>Thu, 10 Aug 2023 09:43:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/</guid><description>&lt;p&gt;&lt;strong&gt;AsyncGetCallTrace is an API to obtain the top &lt;code&gt;n&lt;/code&gt; Java frames of a thread asynchronously in a signal handler.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This API is widely used but has its problems, see JEP 435 &lt;a href="https://foojayio.github.io/website/today/author/johannes-bechberger/"&gt;and my various articles on Foojay.io&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;My original approach with my JEP proposal was to build a replacement of the API, which could be used as a drop-in for AsyncGetCallTrace. Still a single method that populates a preallocated frame list:&lt;br&gt;
&lt;img src="https://mostlynerdless.de/wp-content/uploads/2023/08/asgct_asgst-2000x1125.png" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Preparing for JDK 21: A Comprehensive Overview of Key Features and Enhancements</title><link>https://foojayio.github.io/website/today/preparing-for-jdk-21-a-comprehensive-overview-of-key-features-and-enhancements/</link><pubDate>Wed, 02 Aug 2023 10:46:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/preparing-for-jdk-21-a-comprehensive-overview-of-key-features-and-enhancements/</guid><description>&lt;p&gt;&lt;strong&gt;As we inch closer to the release of JDK 21 in September (next month!), it&amp;rsquo;s crucial to familiarize ourselves with the transformative features and improvements this version is poised to bring to the Java ecosystem.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s embark on a comprehensive tour of the noteworthy changes and enhancements in JDK 21.&lt;/p&gt;
&lt;h2 id="h2-0-revising-the-balance-of-serviceability-and-performance-with-jep-451"&gt;Revising the Balance of Serviceability and Performance with JEP 451&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s begin with JEP 451, &amp;ldquo;Prepare to Disallow the Dynamic Loading of Agents.&amp;rdquo; Graduating to Completed status in preparation for JDK 21, this proposal doesn&amp;rsquo;t ban the dynamic loading of agents into a running JVM outright. Instead, it issues warnings when such loading happens, preparing the terrain for a future JDK release that will disallow such loading by default.&lt;/p&gt;</description></item><item><title>Are You New Yo Java? Here Are Some Resources</title><link>https://foojayio.github.io/website/today/new-to-java-some-resources/</link><pubDate>Fri, 30 Apr 2021 07:16:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/new-to-java-some-resources/</guid><description>&lt;p&gt;In &lt;a href="https://twitter.com/helenjoscott/status/1372477062263496704?s=21" target="_blank" rel="noopener noreferrer"&gt;this tweet&lt;/a&gt;
, I was asked if I had a list of resources for developers who are new to Java. I didn&amp;rsquo;t at the time, but I&amp;rsquo;ve spent some time researching and here is that list.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve listed content that is both free and paid. It&amp;rsquo;s not that one type is superior; it&amp;rsquo;s just to give you plenty of choices. These are the resources that I&amp;rsquo;ve used and do still use to re-learn Java. So, if you&amp;rsquo;re new to Java or looking to pick it up again after a break, this article is for you.&lt;/p&gt;</description></item><item><title>How to Change a Field's Type in Recent JDKs</title><link>https://foojayio.github.io/website/today/changing-field-type-recent-jdks/</link><pubDate>Thu, 08 Apr 2021 07:40:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/changing-field-type-recent-jdks/</guid><description>&lt;p&gt;A couple of years ago, I attended a talk by my former colleague (but still friend) &lt;a href="https://twitter.com/volker_simonis" target="_blank" rel="noopener noreferrer"&gt;Volker Simonis&lt;/a&gt;
. It gave me the idea to dig a bit into the subject of how to secure the JVM. From the material, I created a &lt;a href="https://blog.frankel.ch/focus/jvm-security/" target="_blank" rel="noopener noreferrer"&gt;series of blog posts&lt;/a&gt;
 as well as &lt;a href="https://www.youtube.com/watch?v=Bgo7dcCbqV8" target="_blank" rel="noopener noreferrer"&gt;a talk&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;From that point on, I submitted the talk at meetups and conferences, where it was well-received. Because I like to explore different areas, I stopped to submit other proposals. Still, the talk is in my portfolio, and it was requested again in 2021. I have already presented it twice since the beginning of the year at the time of this writing.&lt;/p&gt;</description></item><item><title>Seven Ways to Contribute to the OpenJDK</title><link>https://foojayio.github.io/website/today/7-ways-to-contribute-to-openjdk/</link><pubDate>Wed, 18 Nov 2020 08:49:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/7-ways-to-contribute-to-openjdk/</guid><description>&lt;p&gt;A great many developers today are employed working with OpenJDK. If OpenJDK is the background source for your livelihood, you might want to contribute to future development of the OpenJDK.&lt;/p&gt;
&lt;p&gt;There are many ways you can do this. In this article I outline 7 possibilities, ranging from minimal work (because you&amp;rsquo;re too busy to do much, but you&amp;rsquo;d like to do something) to intensive work (participating on OpenJDK development is everything you want to do, it&amp;rsquo;s more than a hobby, you want to contribute to the maximum extent possible).&lt;/p&gt;</description></item><item><title>What do you think was the reason that Java was invented?</title><link>https://foojayio.github.io/website/today/the-reason-java-was-invented/</link><pubDate>Mon, 05 Oct 2020 06:14:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-reason-java-was-invented/</guid><description>&lt;p&gt;In my &lt;a href="https://foojayio.github.io/website/blog/compiling-java-code-executing-bytecode/"&gt;last post&lt;/a&gt;
 I described the timing differences between executing &lt;code&gt;javac&lt;/code&gt; to create Java bytecode and running the actual bytecode. Some readers noticed that, obviously, the &lt;code&gt;javac&lt;/code&gt; operation will automatically take more time than the execution of the byte code will take, and wondered why I took the time to write the post. Why would we even have &lt;code&gt;javac&lt;/code&gt; if it didn&amp;rsquo;t improve runtime performance? In fact, why would Java have even been invented if we couldn&amp;rsquo;t use &lt;code&gt;javac&lt;/code&gt; to create fast-running bytecode?&lt;/p&gt;</description></item><item><title>Java, C, and Python: Today's Most Used Program Languages?</title><link>https://foojayio.github.io/website/today/why-java-c-and-python-are-todays-most-utilized-programming-languages/</link><pubDate>Fri, 21 Aug 2020 04:41:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-java-c-and-python-are-todays-most-utilized-programming-languages/</guid><description>&lt;p&gt;Looking at the latest &lt;a href="https://www.tiobe.com/tiobe-index/" target="_blank" rel="noopener noreferrer"&gt;TIOBE Programming Community Index&lt;/a&gt;
, we see that Java has recently surpassed C in the TIOBE ratings index, while Python is holding steady in the third position:
&lt;img src="https://foojayio.github.io/website/today/why-java-c-and-python-are-todays-most-utilized-programming-languages/tiobe_20200820.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Back in 2014, I wrote an analysis of the TIOBE data at that time period, claiming that: &lt;a href="https://community.oracle.com/blogs/editor/2014/04/23/tiobes-unintentionally-misleading-truth-interest-java-surging" target="_blank" rel="noopener noreferrer"&gt;TIOBE Is (Unintentionally) Misleading; in Truth, Interest in Java Is Surging&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;My point back then was that, since the TIOBE index is compiled at least in part based on internet searches that include that language&amp;rsquo;s name, it might be misleading to assume that simply because searches involving the word &amp;ldquo;Java&amp;rdquo; were somewhat declining, that would indicate that the usage of Java was actually in decline. My logic then was that newer languages would likely receive more search engine searches than older languages simply because they were newer languages; therefore less documentation was readily available, hence more searches, hence a higher TIOBE rating.&lt;/p&gt;</description></item></channel></rss>