<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tutorials on foojay.io - Friends of OpenJDK</title><link>https://foojayio.github.io/website/today/category/tutorials/</link><description>Recent content in Tutorials on foojay.io - Friends of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 10 Jul 2026 08:54:25 +0000</lastBuildDate><atom:link href="https://foojayio.github.io/website/today/category/tutorials/index.xml" rel="self" type="application/rss+xml"/><item><title>Getting Started with Exposed: Kotlin ORM Made Simple</title><link>https://foojayio.github.io/website/today/exposed-kotlin-orm-complete-guide/</link><pubDate>Mon, 06 Jul 2026 03:39:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/exposed-kotlin-orm-complete-guide/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;For quite some time, I have been a huge fan of and fascinated by JetBrains products, tools, and libraries because of their masterful craftsmanship in product creation and their pristine focus on building high-quality developer tools.&lt;/p&gt;
&lt;p&gt;Even more excitingly, JetBrains Java Annotated Monthly newsletters have featured most of the technical articles I wrote for Foojay on topics such as Java, Spring, Spring Boot 4, and OpenRewrite.&lt;/p&gt;
&lt;p&gt;Recently, one Kotlin Domain-Specific Language (DSL) library caught my attention. I immediately tried converting my existing Spring Boot 4 application from Java to Kotlin using Exposed, an ORM framework for Kotlin.
&lt;img src="https://foojayio.github.io/website/today/exposed-kotlin-orm-complete-guide/Exposed-1024x683.png" alt="Exposed" loading="lazy"&gt;
 Kotlin SQL Libary&lt;/p&gt;</description></item><item><title>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>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>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>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>BoxLang AI Deep Dive — Part 7 of 7: MCP — The Protocol That Connects Everything</title><link>https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-7-of-7-mcp-the-protocol-that-connects-everything/</link><pubDate>Thu, 07 May 2026 21:51:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-7-of-7-mcp-the-protocol-that-connects-everything/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-7-of-7-mcp-the-protocol-that-connects-everything/bxai-series-cover-07-700x368.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;BoxLang AI 3.0 Series · Part 7 of 7&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The AI ecosystem has a tool problem. Every framework has its own way of defining tools, every agent has its own way of calling them, and every integration requires custom code on both sides. An agent built in Python can&amp;rsquo;t easily use tools built in Java. An MCP server written for Claude Desktop can&amp;rsquo;t easily be consumed by a BoxLang agent without a custom adapter.&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>BoxLang AI Deep Dive — Part 6 of 7: Memory Systems &amp; RAG — Building AI That Remembers</title><link>https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-6-of-7-memory-systems-rag-building-ai-that-remembers/</link><pubDate>Tue, 05 May 2026 15:10:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-6-of-7-memory-systems-rag-building-ai-that-remembers/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-ai-deep-dive-part-6-of-7-memory-systems-rag-building-ai-that-remembers/bxai-series-cover-06-700x368.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;BoxLang AI 3.0 Series · Part 6 of 7&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A chatbot with no memory isn&amp;rsquo;t a conversation &amp;mdash; it&amp;rsquo;s a series of isolated queries. Every message starts from scratch. The user has to re-explain who they are, what they&amp;rsquo;re working on, and what was just said. It&amp;rsquo;s exhausting, and it signals that the AI isn&amp;rsquo;t really listening.&lt;/p&gt;
&lt;p&gt;Memory is what separates a useful AI application from a toy. BoxLang AI ships with one of the most comprehensive memory systems in any AI framework &amp;mdash; 20+ memory types across two major categories, vector embedding support for semantic retrieval, 30+ document loaders for RAG pipelines, and a per-call identity routing system that makes multi-tenant applications safe by default.&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>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>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>JC-AI Newsletter #15</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-15/</link><pubDate>Fri, 20 Mar 2026 07:56:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-15/</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 leaving. It is here to stay, and understanding its evolution is essential from many perspectives.&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>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>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>From “Crypto AI” to general AI: Do AI agents dream of electric langoustines?</title><link>https://foojayio.github.io/website/today/from-crypto-ai-to-general-ai-do-ai-agents-dream-of-electric-langoustines/</link><pubDate>Mon, 23 Feb 2026 18:11:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/from-crypto-ai-to-general-ai-do-ai-agents-dream-of-electric-langoustines/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/from-crypto-ai-to-general-ai-do-ai-agents-dream-of-electric-langoustines/daydreams-2-scaled.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;A Blade Runner riff for a world where the lobster ships paid endpoints while humans still argue about the roadmap.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="h2-0-the-shift-that-matters-for-agent-commerce-from-crypto-ai-to-general-ai"&gt;The shift that matters for agent commerce - From &amp;ldquo;Crypto AI&amp;rdquo; to general AI&lt;/h2&gt;
&lt;p&gt;Today, you can search the web all day and never see an invoice.&lt;/p&gt;
&lt;p&gt;That happens because you are not the paying client.&lt;/p&gt;
&lt;p&gt;The commerce runs through ads, affiliate deals, and platform incentives, so results often optimize for who pays, not for what you asked for.&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>JC-AI Newsletter #13</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-13/</link><pubDate>Thu, 05 Feb 2026 21:12:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-13/</guid><description>&lt;p&gt;Two weeks have passed, and it is time to present a new collection of readings that may shape developments, utilization or ideas in the field of artificial intelligence in 2026.&lt;/p&gt;
&lt;p&gt;While significant activity characterizes the AI field, many unresolved research, design, and implementation challenges continue to impact progress. Future advancement depends heavily on understanding the nature of these challenges to approach probabilistic problems from the appropriate directions. This JC-AI newsletter features insightful interviews with key figures in the field, enabling readers to ask the right questions and compare visions of an &amp;lsquo;uncertain future&amp;rsquo; against current capabilities to maintain a grounded perspective.&lt;/p&gt;</description></item><item><title>Bootstrapping a Java File System</title><link>https://foojayio.github.io/website/today/bootstrapping-a-java-file-system/</link><pubDate>Thu, 29 Jan 2026 01:44:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/bootstrapping-a-java-file-system/</guid><description>&lt;p&gt;So what does &lt;em&gt;file system&lt;/em&gt; mean to you? Most think of file systems as directories and files accessed via your computer: local disk, remotely shared via &lt;a href="https://en.wikipedia.org/wiki/Network_File_System" target="_blank" rel="noopener noreferrer"&gt;NFS&lt;/a&gt;
 or &lt;a href="https://en.wikipedia.org/wiki/Server_Message_Block" target="_blank" rel="noopener noreferrer"&gt;SMB&lt;/a&gt;
, thumb drives, something else. Sufficient for those who require basic file access, nothing more nothing less.&lt;/p&gt;
&lt;p&gt;That perspective of file systems is too limited: &lt;a href="https://www.atlassian.com/git/tutorials/what-is-version-control" target="_blank" rel="noopener noreferrer"&gt;VCS&lt;/a&gt;
 repositories, &lt;a href="https://en.wikipedia.org/wiki/Archive_file" target="_blank" rel="noopener noreferrer"&gt;archive files&lt;/a&gt;
 (zip/jar), remote systems can be viewed as file systems, potentially accessed via the same APIs used to for local file access while still maintaining security and data requirements. Or how about a file system which automatically &lt;a href="https://www.dacast.com/blog/what-is-transcoding/" target="_blank" rel="noopener noreferrer"&gt;transcodes&lt;/a&gt;
 videos to different formats or extracts audio metadata for vector searches? Wouldn&amp;rsquo;t it be cool to use standard APIs rather than create something customized? Definitely!&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>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>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>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>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>JC-AI Newsletter: Easy Access to Expanding Challenges</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-easy-access-to-expanding-challenges/</link><pubDate>Tue, 04 Nov 2025 18:13:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-easy-access-to-expanding-challenges/</guid><description>&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt; few months ago, I launched the &lt;a href="https://foojayio.github.io/website/today/category/jc-ai-newsletter/"&gt;AI Newsletter&lt;/a&gt;
 to provide a minimally biased perspective on the growing challenges surrounding artificial intelligence.&lt;/p&gt;
&lt;p&gt;My primary motivation was and remains to be serving the community not only by showing how to use and access specific services for utilizing Large Language Models, but also by support a deeper understanding of the broader artificial intelligence landscape.&lt;/p&gt;
&lt;p&gt;Many of the core challenges that have emerged around LLMs have not been and still not properly addressed, often omitted due to their uncomfortable implications.&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>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>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>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>Agent Memory with Spring AI &amp; Redis</title><link>https://foojayio.github.io/website/today/agent-memory-with-spring-ai-redis/</link><pubDate>Wed, 23 Jul 2025 16:34:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/agent-memory-with-spring-ai-redis/</guid><description>&lt;h3 id="h3-0-you-re-building-an-ai-agent-with-memory-using-spring-ai-and-redis-unlike-traditional-chatbots-that-forget-previous-interactions-memory-enabled-agents-can-recall-past-conversations-and-facts-it-works-by-storing-two-types-of-memory-in-redis-short-term-conversation-history-and-long-term-facts-and-experiences-as-vectors-allowing-agents-to-provide-personalized-context-aware-responses"&gt;&lt;strong&gt;You&amp;rsquo;re building an AI agent with memory using Spring AI and Redis.&lt;/strong&gt; &lt;strong&gt;Unlike traditional chatbots that forget previous interactions, memory-enabled agents can recall past conversations and facts.&lt;/strong&gt; &lt;strong&gt;It works by storing two types of memory in Redis: short-term (conversation history) and long-term (facts and experiences as vectors), allowing agents to provide personalized, context-aware responses.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;LLMs respond to each message in isolation, treating every interaction as if it&amp;rsquo;s the first time they&amp;rsquo;ve spoken with a user. They lack the ability to remember previous conversations, preferences, or important facts.&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>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>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>How to Deploy a Vaadin Application as a WAR on Tomcat 11</title><link>https://foojayio.github.io/website/today/how-to-deploy-a-vaadin-application-as-a-war-on-tomcat-11/</link><pubDate>Mon, 19 May 2025 07:40:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-deploy-a-vaadin-application-as-a-war-on-tomcat-11/</guid><description>&lt;p&gt;&lt;strong&gt;If you want to run a Vaadin application on an external servlet container like Apache Tomcat 11, you need to package your application as a WAR (Web Application Archive) instead of the usual executable JAR.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this post, I&amp;rsquo;ll show you step-by-step how I did it.&lt;/p&gt;
&lt;h2 id="h2-0-step-1-download-tomcat-11"&gt;Step 1: Download Tomcat 11&lt;/h2&gt;
&lt;p&gt;First, download Tomcat 11 from the &lt;a href="https://tomcat.apache.org/download-11.cgi" target="_blank" rel="noopener noreferrer"&gt;official Apache Tomcat website&lt;/a&gt;
. After extracting it to a local folder, you have a clean Tomcat installation ready to use.&lt;/p&gt;</description></item><item><title>Building a Real-Time AI Fraud Detection System with Spring Kafka and MongoDB</title><link>https://foojayio.github.io/website/today/building-a-real-time-ai-fraud-detection-system-with-spring-kafka-and-mongodb/</link><pubDate>Wed, 14 May 2025 14:30:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-a-real-time-ai-fraud-detection-system-with-spring-kafka-and-mongodb/</guid><description>&lt;p&gt;In this tutorial, we&amp;rsquo;ll build a real-time fraud detection system using MongoDB Atlas Vector Search, Apache Kafka, and AI-generated embeddings. We&amp;rsquo;ll demonstrate how MongoDB Atlas Vector Search can be used to detect anomalies in a stream of financial transactions by analyzing a user&amp;rsquo;s transaction history and identifying suspicious behavior based on LLM-generated embeddings.&lt;/p&gt;
&lt;p&gt;Our solution will monitor MongoDB Change Streams using the Java synchronous driver, triggering vector searches on each new transaction to detect potential fraud. While this approach works well for our demo, and for many use cases, we&amp;rsquo;ll also discuss its limitations. Throughout the tutorial, I&amp;rsquo;ll cover alternative strategies to optimize performance, whether you need higher transaction throughput, faster fraud detection, or a more scalable architecture.&lt;/p&gt;</description></item><item><title>Supercharge Your Jakarta EE Skills with These Must-Read Guides</title><link>https://foojayio.github.io/website/today/supercharge-your-jakarta-ee-skills-with-these-must-read-guides/</link><pubDate>Wed, 30 Apr 2025 09:49:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/supercharge-your-jakarta-ee-skills-with-these-must-read-guides/</guid><description>&lt;p&gt;If you&amp;rsquo;re working with Jakarta EE &amp;mdash; or just starting to explore the power of enterprise Java &amp;mdash; there&amp;rsquo;s never been a better time to level up your skills. Whether you&amp;rsquo;re building your first servlet, designing secure REST APIs, or diving deep into dependency injection, the Jakarta EE community has been busy crafting an outstanding collection of &lt;a href="https://jakarta.ee/learn/starter-guides/" target="_blank" rel="noopener noreferrer"&gt;starter&lt;/a&gt;
 and &lt;a href="https://jakarta.ee/learn/specification-guides/" target="_blank" rel="noopener noreferrer"&gt;specification&lt;/a&gt;
 guides to help you get up to speed.&lt;/p&gt;
&lt;p&gt;At &lt;strong&gt;Omnifish&lt;/strong&gt;, we&amp;rsquo;re proud supporters of the open-source enterprise Java ecosystem, and we&amp;rsquo;re constantly pointing developers toward the best resources. So we&amp;rsquo;ve gathered up some of the most practical and insightful Jakarta EE guides to help you go from &amp;ldquo;Hello, World&amp;rdquo; to production-ready applications with confidence.&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>Clean your Memory: From Finalize to Cleaner</title><link>https://foojayio.github.io/website/today/clean-memory-from-finalize-to-cleaner/</link><pubDate>Mon, 31 Mar 2025 12:30:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/clean-memory-from-finalize-to-cleaner/</guid><description>&lt;p&gt;Garbage collection in Java takes care of memory management, but it does not clean up non-memory resources like sockets or file handles.&lt;/p&gt;
&lt;p&gt;Resource leaks may occur without proper management, leading to performance degradation or crashes.&lt;/p&gt;
&lt;p&gt;Java&amp;rsquo;s &lt;a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/ref/Cleaner.html" target="_blank" rel="noopener noreferrer"&gt;Cleaner API&lt;/a&gt;
, introduced in Java 9, provides a modern and efficient mechanism for resource cleanup when objects are no longer reachable.&lt;/p&gt;
&lt;p&gt;It addresses the shortcomings of the deprecated finalize() method, offering a predictable and efficient way to manage non-memory resources: so let&amp;rsquo;s take a short trip on clean memory from finalize to Cleaner API.&lt;/p&gt;</description></item><item><title>Extending Java APIs - Add Missing Features Without the Hassle</title><link>https://foojayio.github.io/website/today/extending-java-apis-add-missing-features-without-the-hassle/</link><pubDate>Fri, 07 Mar 2025 12:03:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/extending-java-apis-add-missing-features-without-the-hassle/</guid><description>&lt;p&gt;The Java API is vast. That&amp;rsquo;s great, but sometimes a missing method or capability can be frustrating. With Manifold, developers can solve this problem without having to wait for Java to add a feature in a later version. Even more importantly, Manifold provides many such extensions out of the box, making Java better for developers. In this post, we will discuss the extension capability. It lets us change classes in the Java API in a compatible way without risk. If Java adds these APIs later then we can seamlessly switch to them.&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>Front End Debugging Part 3: Networking</title><link>https://foojayio.github.io/website/today/front-end-debugging-part-3-networking/</link><pubDate>Thu, 27 Feb 2025 16:34:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/front-end-debugging-part-3-networking/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#network-debugging-powerhouse"&gt;&lt;strong&gt;Network Debugging Powerhouse&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#reissuing-and-modifying-requests"&gt;&lt;strong&gt;Re-Issuing and Modifying Requests&lt;/strong&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#curl-and-postman"&gt;cURL and Postman&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#throttling-and-debugging-race-conditions"&gt;&lt;strong&gt;Throttling and Debugging Race Conditions&lt;/strong&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#why-throttling-matters"&gt;Why Throttling Matters:&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-to-use"&gt;How to Use&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#managing-state-with-storage-tools"&gt;&lt;strong&gt;Managing State with Storage Tools&lt;/strong&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#challenges-of-state-management"&gt;Challenges of State Management&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#analyzing-request-and-response-headers"&gt;&lt;strong&gt;Analyzing Request and Response Headers&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#debugging-in-incognito-mode-limitations-and-best-practices"&gt;&lt;strong&gt;Debugging in Incognito Mode: Limitations and Best Practices&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#connecting-the-frontend-to-the-database"&gt;&lt;strong&gt;Connecting the Front-End to the Database&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Debugging network communication issues is a critical skill for any front-end developer. While tools like &lt;a href="https://debugagent.com/wireshark-tcpdump-a-debugging-power-couple" target="_blank" rel="noopener noreferrer"&gt;Wireshark&lt;/a&gt;
 provide low-level insight into network traffic, modern browsers like Chrome and Firefox offer developer tools with powerful features tailored for web development. In this post we will discuss using browser-based tools to debug network communication issues effectively. This is a far better approach than using Wireshark for the vast majority of simple cases.&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>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>My first steps with Playwright</title><link>https://foojayio.github.io/website/today/my-first-steps-with-playwright/</link><pubDate>Thu, 30 Jan 2025 11:58:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/my-first-steps-with-playwright/</guid><description>&lt;p&gt;&lt;strong&gt;In my previous company, I developed a batch job that tracked metrics across social media, such as Twitter, LinkedIn, Mastodon, Bluesky, Reddit, etc. Then I realized I could duplicate it for my own &amp;ldquo;persona&amp;rdquo;. The problem is that some media don&amp;rsquo;t provide an HTTP API for the metrics I want.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here are &lt;a href="https://www.linkedin.com/dashboard/" target="_blank" rel="noopener noreferrer"&gt;the metrics&lt;/a&gt;
 I want on LinkedIn:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/my-first-steps-with-playwright/linkedin-dashboard.jpg" alt="LinkedIn metrics dashboard" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;I searched for a long time but found no API access for the metrics above. I scraped the metrics manually every morning for a long time and finally decided to automate this tedious task. Here&amp;rsquo;s what I learned.&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>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>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>Front End Debugging Part 2: Console.log() to the Max</title><link>https://foojayio.github.io/website/today/front-end-debugging-part-2-console-log-to-the-max/</link><pubDate>Tue, 03 Dec 2024 16:28:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/front-end-debugging-part-2-console-log-to-the-max/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#understanding-frontend-logging-vs-backend-logging"&gt;&lt;strong&gt;Understanding Front-End Logging vs. Back-End Logging&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#leveraging-console-log-levels"&gt;&lt;strong&gt;Leveraging Console Log Levels&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#customizing-console-output-with-css"&gt;&lt;strong&gt;Customizing Console Output with CSS&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#stack-tracing-with-consoletrace"&gt;&lt;strong&gt;Stack Tracing with console.trace()&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#assertions-for-designbycontract"&gt;&lt;strong&gt;Assertions for Design-by-Contract&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#printing-tables-for-clearer-data-visualization"&gt;&lt;strong&gt;Printing Tables for Clearer Data Visualization&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#copying-objects-to-the-clipboard"&gt;&lt;strong&gt;Copying Objects to the Clipboard&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#inspecting-with-consoledir-and-dirxml"&gt;&lt;strong&gt;Inspecting with console.dir() and dirxml()&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#counting-function-calls"&gt;&lt;strong&gt;Counting Function Calls&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#organizing-logs-with-groups"&gt;&lt;strong&gt;Organizing Logs with Groups&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#chromespecific-debugging-features"&gt;&lt;strong&gt;Chrome-Specific Debugging Features&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;&lt;strong&gt;Final Word&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/front-end-debugging-part-1-not-just-console-log/"&gt;my previous article&lt;/a&gt;
, I talked about why &lt;code&gt;Console.log()&lt;/code&gt; isn&amp;rsquo;t the most effective debugging tool. In this installment, we will do a bit of an about-face and discuss the ways in which &lt;code&gt;Console.log()&lt;/code&gt; is fantastic. Let&amp;rsquo;s break down some essential concepts and practices that can make your debugging life much easier and more productive.&lt;/p&gt;</description></item><item><title>strace Revisited: Simple is Beautiful</title><link>https://foojayio.github.io/website/today/strace-revisited-simple-is-beautiful/</link><pubDate>Tue, 26 Nov 2024 14:58:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/strace-revisited-simple-is-beautiful/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#understanding-strace-and-its-origins"&gt;Understanding strace and its Origins&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#a-look-back-strace-and-dtrace"&gt;&lt;strong&gt;A Look Back: strace and dtrace&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#originating-from-sun-microsystems"&gt;&lt;strong&gt;Originating from Sun Microsystems&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#technical-functioning-of-strace"&gt;Technical Functioning of strace&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-role-of-ptrace-in-strace"&gt;&lt;strong&gt;The Role of ptrace in strace&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#comparing-with-dtrace"&gt;&lt;strong&gt;Comparing with DTrace&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#practical-usage-and-advantages"&gt;Practical Usage and Advantages&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#ease-of-use-and-accessibility"&gt;&lt;strong&gt;Ease of Use and Accessibility&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#favored-in-linux-environments"&gt;&lt;strong&gt;Favored in Linux Environments&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#strace-in-action-a-closer-look-at-system-calls"&gt;strace in Action: A Closer Look at System Calls&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#basic-usage-and-output-analysis"&gt;&lt;strong&gt;Basic Usage and Output Analysis&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#interpreting-system-calls-for-debugging"&gt;&lt;strong&gt;Interpreting System Calls for Debugging&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#advanced-features-and-tips"&gt;Advanced Features and Tips&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#filtering-system-calls-for-efficiency"&gt;&lt;strong&gt;Filtering System Calls for Efficiency&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#exploring-a-variety-of-system-calls"&gt;&lt;strong&gt;Exploring a Variety of System Calls&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#strace-and-java-a-special-case"&gt;strace and Java: A Special Case&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#strace-with-the-jvm"&gt;&lt;strong&gt;strace with the JVM&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#allocations-and-threading-in-java"&gt;&lt;strong&gt;Allocations and Threading in Java&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-0-in-the-realm-of-system-debugging-particularly-on-linux-platforms-strace-stands-out-as-a-powerful-and-indispensable-tool-its-simplicity-and-efficacy-make-it-the-go-to-solution-for-diagnosing-and-understanding-system-level-operations-especially-when-working-with-servers-and-containers"&gt;In the realm of system debugging, particularly on Linux platforms, strace stands out as a powerful and indispensable tool. Its simplicity and efficacy make it the go-to solution for diagnosing and understanding system-level operations, especially when working with servers and containers.&lt;/h3&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll delve into the nuances of strace, from its history and technical functioning to practical applications and advanced features. Whether you&amp;rsquo;re a seasoned developer or just starting out, this exploration will enhance your diagnostic toolkit and provide deeper insights into the workings of Linux systems.&lt;/p&gt;</description></item><item><title>Langchain4J Musings</title><link>https://foojayio.github.io/website/today/langchain4j-musings/</link><pubDate>Sat, 23 Nov 2024 13:57:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/langchain4j-musings/</guid><description>&lt;p&gt;I&amp;rsquo;m coming relatively late to the LLM party, but I rarely come very early in the hype cycle.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://upload.wikimedia.org/wikipedia/commons/9/94/Gartner_Hype_Cycle.svg" alt="Gartner hype cycle" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;For example, I never bought into blockchain, the solution still searching for problems to solve, nor in microservices, the latest in the cargo cult IT trends. Despite my late arrival at the LLM party, I have been a regular user of LLMs. I use OpenAI for non-controversial questions outside my cone of knowledge, &lt;em&gt;e.g&lt;/em&gt;., linguistics or legal; I use GitHub Copilot in my IDE to improve my code.&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>Front End Debugging Part 1: Not just Console Log</title><link>https://foojayio.github.io/website/today/front-end-debugging-part-1-not-just-console-log/</link><pubDate>Tue, 05 Nov 2024 14:01:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/front-end-debugging-part-1-not-just-console-log/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#instant-debugging-with-the-raw-debugger-endraw-keyword"&gt;&lt;strong&gt;Instant Debugging with the&lt;/strong&gt; &lt;code&gt;debugger&lt;/code&gt; Keyword&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#triggering-debugging-from-the-console"&gt;&lt;strong&gt;Triggering Debugging from the Console&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#dom-breakpoints-monitoring-dom-changes"&gt;&lt;strong&gt;DOM Breakpoints: Monitoring DOM Changes&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#xhr-breakpoints-uncovering-hidden-network-calls"&gt;&lt;strong&gt;XHR Breakpoints: Uncovering Hidden Network Calls&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#simulating-environments-for-debugging"&gt;&lt;strong&gt;Simulating Environments for Debugging&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#debugging-layout-and-style-issues"&gt;&lt;strong&gt;Debugging Layout and Style Issues&lt;/strong&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;As a Java developer, most of my focus is on the backend side of debugging. Front-end debugging poses different challenges and has sophisticated tools of its own. Unfortunately, print-based debugging has become the norm in front-end. To be fair, it makes more sense there as the cycles are different and the problem is always a single user problem. But even if you choose to use &lt;code&gt;Console.log&lt;/code&gt;, there&amp;rsquo;s a lot of nuance to pick up there.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>The Art of Full Stack Debugging</title><link>https://foojayio.github.io/website/today/the-art-of-full-stack-debugging/</link><pubDate>Fri, 25 Oct 2024 07:24:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-art-of-full-stack-debugging/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#full-stack-development-a-shifting-definition"&gt;Full Stack Development, A Shifting Definition&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-full-stack-debugging-approach"&gt;The Full Stack Debugging Approach&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#frontend-debugging-tools-and-techniques"&gt;Frontend Debugging: Tools and Techniques&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#it-isnt-just-consolelog"&gt;It isn&amp;rsquo;t &amp;ldquo;Just Console.log&amp;rdquo;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-power-of-developer-tools"&gt;The Power of Developer Tools&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#tackling-code-obfuscation"&gt;Tackling Code Obfuscation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#debugging-across-layers"&gt;Debugging Across Layers&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#isolating-issues-across-the-stack"&gt;Isolating Issues Across the Stack&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-importance-of-systemlevel-debugging"&gt;The Importance of System-Level Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#embracing-complexity"&gt;Embracing Complexity&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-0-full-stack-development-is-often-likened-to-an-intricate-balancing-act-where-developers-are-expected-to-juggle-multiple-responsibilities-across-the-frontend-backend-database-and-beyond-as-the-definition-of-full-stack-development-continues-to-evolve-so-too-does-the-approach-to-debugging"&gt;Full stack development is often likened to an intricate balancing act, where developers are expected to juggle multiple responsibilities across the frontend, backend, database, and beyond. As the definition of full stack development continues to evolve, so too does the approach to debugging.&lt;/h3&gt;
&lt;p&gt;Full stack debugging is an essential skill for developers, as it involves tracking issues through multiple layers of an application, often navigating domains where one&amp;rsquo;s knowledge may only be cursory. In this blog post I aim to explore the nuances of full stack debugging, offering practical tips and insights for developers navigating the complex web of modern software development.&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>Unleashing the Power of Git Bisect</title><link>https://foojayio.github.io/website/today/unleashing-the-power-of-git-bisect/</link><pubDate>Tue, 08 Oct 2024 08:15:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/unleashing-the-power-of-git-bisect/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-essence-of-debugging-with-git"&gt;The Essence of Debugging with Git&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#setting-the-stage-for-debugging"&gt;Setting the Stage for Debugging&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#initiating-bisect-mode"&gt;Initiating Bisect Mode&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#marking-the-known-good-revision"&gt;Marking the Known Good Revision&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#marking-the-known-bad-revision"&gt;Marking the Known Bad Revision&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#bisecting-to-find-the-culprit"&gt;Bisecting to Find the Culprit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#expected-output"&gt;Expected Output&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#reset-and-analysis"&gt;Reset and Analysis&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#advanced-usage-and-tips"&gt;Advanced Usage and Tips&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#script-automation-for-precision-and-efficiency"&gt;Script Automation for Precision and Efficiency&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#handling-flaky-tests-with-strategy"&gt;Handling Flaky Tests with Strategy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#skipping-commits-with-care"&gt;Skipping Commits with Care&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#unraveling-a-regression-mystery"&gt;Unraveling a Regression Mystery&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We don&amp;rsquo;t usually think of Git as a debugging tool. Surprisingly, Git shines not just as a version control system but also as a potent debugging ally when dealing with the tricky matter of regressions.&lt;/p&gt;</description></item><item><title>TornadoVM for RISC-V Accelerators</title><link>https://foojayio.github.io/website/today/tornadovm-for-risc-v-accelerators/</link><pubDate>Thu, 19 Sep 2024 07:50:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/tornadovm-for-risc-v-accelerators/</guid><description>&lt;h2 id="h2-0-takeaways"&gt;Takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;RISC-V is an open standard instruction set architecture that anyone can use to build new processors and accelerators, for example, for AI.&lt;/li&gt;
&lt;li&gt;oneAPI Construction Kit (OCK) is a new framework that allows software developers and system designers to bridge the gap between hardware accelerators and open standards, by enabling a programming system to implement domain specific instructions for modern hardware such as RISC-V accelerators and custom processors.&lt;/li&gt;
&lt;li&gt;TornadoVM, a parallel programming framework for Java, can take advantage of OCK to offload and accelerate Java workloads on RISC-V chips. This post shows how to run on RISC-V CPUs with vector extensions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-1-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://riscv.org/" title="RISC-V" target="_blank" rel="noopener noreferrer"&gt;RISC-V&lt;/a&gt;
 is an open standard instruction set architecture (ISA) based on the principles of reduced instruction sets (RISC). RISC-V is freely available under open licences, allowing anyone to design, modify and implement RISC-V processors.&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>Debugging Kubernetes - Troubleshooting Guide</title><link>https://foojayio.github.io/website/today/debugging-kubernetes-troubleshooting-guide/</link><pubDate>Mon, 26 Aug 2024 16:45:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-kubernetes-troubleshooting-guide/</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="#identifying-configuration-issues"&gt;Identifying Configuration Issues&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#common-causes-and-solutions"&gt;Common Causes and Solutions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#detailed-investigation-steps"&gt;Detailed Investigation Steps&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#dealing-with-image-pull-errors"&gt;Dealing with Image Pull Errors&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#troubleshooting-steps"&gt;Troubleshooting Steps&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#handling-node-issues"&gt;Handling Node Issues&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#preventive-measures"&gt;Preventive Measures&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#managing-missing-configuration-keys-or-secrets"&gt;Managing Missing Configuration Keys or Secrets&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#utilizing-buildg-for-interactive-debugging"&gt;Utilizing Buildg for Interactive Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;As Kubernetes continues to revolutionize the way we manage and deploy applications, understanding its intricacies becomes essential for developers and operations teams alike. If you don&amp;rsquo;t have a dedicated DevOps team you probably shouldn&amp;rsquo;t be working with Kubernetes.&lt;/strong&gt;&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>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>Failure is Required: Understanding Fail-Safe &amp; Fail-Fast Strategies</title><link>https://foojayio.github.io/website/today/failure-is-required-understanding-fail-safe-and-fail-fast-strategies/</link><pubDate>Tue, 30 Jul 2024 08:08:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/failure-is-required-understanding-fail-safe-and-fail-fast-strategies/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#failfast"&gt;Fail-Fast&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#failsafe"&gt;Fail-Safe&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#choosing-between-failfast-and-failsafe"&gt;Choosing Between Fail-Fast and Fail-Safe&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#balancing-both"&gt;Balancing Both&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#consistent-layer-behavior"&gt;Consistent Layer Behavior&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#retrys-are-not-failsafe"&gt;Retry&amp;rsquo;s Are not Fail-Safe&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#redefining-failure"&gt;Redefining Failure&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#data-corruption"&gt;Data Corruption&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#dont-fix-the-bug"&gt;Don&amp;rsquo;t Fix the Bug&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#debugging-failure"&gt;Debugging Failure&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#avoiding-cascading-failure"&gt;Avoiding Cascading Failure&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#hybrid-in-production"&gt;Hybrid in Production&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Failures in software systems are inevitable. How these failures are handled can significantly impact system performance, reliability, and the business&amp;rsquo;s bottom line.&lt;/p&gt;
&lt;p&gt;In this article, I want to discuss the upside of failure. Why you should seek failure, why failure is good and why avoiding failure can reduce the reliability of your application. We will start with the discussion of fail-fast vs. fail-safe, this will take us to the second discussion about failures in general.&lt;/p&gt;</description></item><item><title>Mastering Serverless Debugging</title><link>https://foojayio.github.io/website/today/mastering-serverless-debugging/</link><pubDate>Mon, 29 Jul 2024 10:14:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/mastering-serverless-debugging/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#introduction-to-serverless-computing"&gt;Introduction to Serverless Computing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#challenges-of-serverless-debugging"&gt;Challenges of Serverless Debugging&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#disconnected-environments"&gt;Disconnected Environments&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#lack-of-standardization"&gt;Lack of Standardization&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#limited-debugging-tools"&gt;Limited Debugging Tools&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#concurrency-and-scale"&gt;Concurrency and Scale&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#effective-strategies-for-serverless-debugging"&gt;Effective Strategies for Serverless Debugging&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#local-debugging-with-ide-remote-capabilities"&gt;Local Debugging with IDE Remote Capabilities&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#using-feature-flags-for-debugging"&gt;Using Feature Flags for Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#staged-rollouts-and-canary-deployments"&gt;Staged Rollouts and Canary Deployments&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#comprehensive-logging"&gt;Comprehensive Logging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#embracing-idempotency"&gt;Embracing Idempotency&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#debugging-a-lambda-application-locally-with-aws-sam"&gt;Debugging a Lambda Application Locally with AWS SAM&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#setting-up-the-local-environment"&gt;Setting Up the Local Environment&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#running-the-hello-world-application-locally"&gt;Running the Hello World Application Locally&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#configuring-remote-debugging"&gt;Configuring Remote Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#handling-debugger-timeouts"&gt;Handling Debugger Timeouts&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Serverless computing has emerged as a transformative approach to deploying and managing applications. The theory is that by abstracting away the underlying infrastructure, developers can focus solely on writing code.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Continuous Feedback Free Udemy Course: Additional Coupons Available</title><link>https://foojayio.github.io/website/today/continuous-feedback-free-udemy-course-additional-coupons-available/</link><pubDate>Thu, 18 Jul 2024 08:24:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/continuous-feedback-free-udemy-course-additional-coupons-available/</guid><description>&lt;p&gt;We&amp;rsquo;ve added extra coupons for our free Continuous Feedback Udemy course! We&amp;rsquo;re glad to see it&amp;rsquo;s been valuable for some of you.&lt;/p&gt;
&lt;h2 id="h2-0-introduction-to-continuous-feedback"&gt;Introduction to Continuous Feedback&lt;/h2&gt;
&lt;p&gt;What do you know about the code changes that were just introduced into the codebase?&lt;/p&gt;
&lt;p&gt;When will you notice if something goes wrong?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.digma.ai/digma-developer-guide/what-is-a-continuous-feedback-platform" title="Continuous Feedback focuses" target="_blank" rel="noopener noreferrer"&gt;Continuous Feedback focuses&lt;/a&gt;
 on analyzing observability data, namely logs, traces, and metrics. It emphasizes continuous aggregation and processing to detect anomalies, changes, and provide actionable insights for developers.&lt;/p&gt;</description></item><item><title>Wireshark &amp; tcpdump: A Debugging Power Couple</title><link>https://foojayio.github.io/website/today/wireshark-tcpdump-a-debugging-power-couple/</link><pubDate>Mon, 08 Jul 2024 14:51:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/wireshark-tcpdump-a-debugging-power-couple/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#introduction-to-wireshark"&gt;Introduction to Wireshark&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#browser-network-monitors"&gt;Browser Network Monitors&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#installation-and-getting-started"&gt;Installation and Getting Started&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#navigating-through-noise-with-filters"&gt;Navigating Through Noise with Filters&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#deep-dive-into-data-analysis"&gt;Deep Dive into Data Analysis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#beyond-basic-usage"&gt;Beyond Basic Usage&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-basics-of-https-encryption"&gt;The Basics of HTTPS Encryption&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#methods-for-decrypting-https-in-wireshark"&gt;Methods for Decrypting HTTPS in Wireshark&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#premaster-secret-key-logging"&gt;&lt;strong&gt;Pre-Master Secret Key Logging&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#using-a-proxy"&gt;&lt;strong&gt;Using a Proxy&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="#integrating-tcpdump-with-wireshark-for-enhanced-network-analysis"&gt;Integrating tcpdump with Wireshark for Enhanced Network Analysis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-role-of-tcpdump-in-network-troubleshooting"&gt;The Role of tcpdump in Network Troubleshooting&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#key-scenarios-for-tcpdump-usage"&gt;Key Scenarios for tcpdump Usage&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#using-tcpdump-effectively"&gt;Using tcpdump Effectively&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#challenges-and-considerations"&gt;Challenges and Considerations&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wireshark, the free open-source packet sniffer and network protocol analyzer, has cemented itself as an indispensable tool in network troubleshooting, analysis, and security (on both sides).&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>Step up your coding with Continuous Feedback: Free Udemy Course</title><link>https://foojayio.github.io/website/today/step-up-your-coding-with-continuous-feedback-free-udemy-course/</link><pubDate>Tue, 02 Jul 2024 06:57:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/step-up-your-coding-with-continuous-feedback-free-udemy-course/</guid><description>&lt;p&gt;What do you know about the code changes that were just introduced into the codebase? When will you notice if something goes wrong?&lt;/p&gt;
&lt;h2 id="h2-0-what-is-continuous-feedback"&gt;What is Continuous Feedback?&lt;/h2&gt;
&lt;p&gt;First, let me explain Continuous Feedback. It&amp;rsquo;s a new dev practice that aims to make practical usage of code runtime data to shorten the feedback loop during development.&lt;/p&gt;
&lt;p&gt;OpenTelemetry makes it possible with great library support and a standard spec for tracing, metrics, and more. I truly feel that practicing CF can enhance your development experience, and we decided to share with Foojay the course for free.&lt;/p&gt;</description></item><item><title>Master Your Journey in the School of OpenJDK Migration</title><link>https://foojayio.github.io/website/today/master-your-journey-in-the-school-of-openjdk-migration/</link><pubDate>Sun, 30 Jun 2024 09:46:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/master-your-journey-in-the-school-of-openjdk-migration/</guid><description>&lt;p&gt;Azul has led so many OpenJDK migrations, we could write a book. Like, seriously, &lt;a href="https://www.azul.com/openjdk-migration-for-dummies/" target="_blank" rel="noopener noreferrer"&gt;we wrote the book&lt;/a&gt;
. If you prefer more a more visual, immersive experience, welcome to the School of OpenJDK Migration!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.azul.com/school-of-open-jdk-migration/" target="_blank" rel="noopener noreferrer"&gt;The School of OpenJDK Migration&lt;/a&gt;
 is your ultimate resource for mastering OpenJDK migration. Dive into our rich collection of webinars, where OpenJDK experts divulge their secrets, from foundational knowledge to advanced tactics, derived from industry knowledge and professional experience. You&amp;rsquo;ll leave the course with a blueprint to navigate the complexities of OpenJDK migration with confidence and ease.&lt;/p&gt;</description></item><item><title>Why is Kubernetes Debugging so Problematic?</title><link>https://foojayio.github.io/website/today/why-is-kubernetes-debugging-so-problematic/</link><pubDate>Thu, 20 Jun 2024 06:37:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-is-kubernetes-debugging-so-problematic/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-immutable-nature-of-containers"&gt;The Immutable Nature of Containers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-limitations-of-raw-kubectl-exec-endraw-"&gt;The Limitations of &lt;code&gt;kubectl exec&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#avoiding-direct-modifications"&gt;Avoiding Direct Modifications&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#enter-ephemeral-containers"&gt;Enter Ephemeral Containers&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#using-raw-kubectl-debug-endraw-"&gt;Using &lt;code&gt;kubectl debug&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#practical-application-of-ephemeral-containers"&gt;Practical Application of Ephemeral Containers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#security-considerations"&gt;Security Considerations&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#interlude-the-role-of-observability"&gt;Interlude: The Role of Observability&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#command-line-debugging"&gt;Command Line Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#connecting-a-standard-ide-for-remote-debugging"&gt;Connecting a Standard IDE for Remote Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Debugging application issues in a Kubernetes cluster can often feel like navigating a labyrinth. Containers are ephemeral by design, intended to be immutable once deployed.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This presents a unique challenge when something goes wrong and we need to dig into the issue. Before diving into the debugging tools and techniques, it&amp;rsquo;s essential to grasp the core problem: why modifying container instances directly is a bad idea.&lt;/p&gt;</description></item><item><title>Hack a Java application with the debugger</title><link>https://foojayio.github.io/website/today/debugger-godmode-hacking-a-jvm-application-with-the-debugger/</link><pubDate>Thu, 13 Jun 2024 04:58:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugger-godmode-hacking-a-jvm-application-with-the-debugger/</guid><description>&lt;p&gt;Read in other languages: &lt;a href="https://flounder.dev/zh/posts/debugger-god-mode/" target="_blank" rel="noopener noreferrer"&gt;中文&lt;/a&gt;
 &lt;a href="https://flounder.dev/es/posts/debugger-god-mode/" target="_blank" rel="noopener noreferrer"&gt;Español&lt;/a&gt;
 &lt;a href="https://flounder.dev/pt/posts/debugger-god-mode/" target="_blank" rel="noopener noreferrer"&gt;Português&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Back in the day, computer games were different. Not only have graphics and mechanics evolved since, but there&amp;rsquo;s also one characteristic that doesn&amp;rsquo;t seem very common in games today: nearly all of them had cheat codes.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cheat codes were sequences of keys that would give you something extraordinary, such as infinite ammo or the ability to walk through walls. The most common and powerful of them was &amp;lsquo;god mode&amp;rsquo; &amp;ndash; it made you invincible.&lt;/p&gt;</description></item><item><title>Java: Functional Programming f(x) – Part2</title><link>https://foojayio.github.io/website/today/java-functional-programming-fx-part2/</link><pubDate>Mon, 03 Jun 2024 17:05:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-functional-programming-fx-part2/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/java-functional-programming/"&gt;the preceding article&lt;/a&gt;
, we explored the significance of &lt;strong&gt;Functional Programming, Lambda Calculus&lt;/strong&gt;, and other related concepts.&lt;/p&gt;
&lt;p&gt;In this article, we delve deeper into the essential aspects of Functional Programming, such as&amp;hellip;​&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Lambda Expressions
2. Method References
3. Functional Interfaces&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And we will discuss about the relationship between each of the features.&lt;/p&gt;
&lt;p&gt;JSR 335 has greatly facilitated programming in a multicore environment by introducing Lambda Expressions/closures/anonymous method, and related features.&lt;/p&gt;</description></item><item><title>The TornadoVM Programming Model Explained</title><link>https://foojayio.github.io/website/today/the-tornadovm-programming-model-explained/</link><pubDate>Tue, 28 May 2024 11:01:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-tornadovm-programming-model-explained/</guid><description>&lt;h2 id="h2-0-key-takeaways"&gt;Key Takeaways&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://raw.githubusercontent.com/jjfumero/jjfumero.github.io/master/files/blog/24-02-prog-model/back.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/beehive-lab/TornadoVM/" target="_blank" rel="noopener noreferrer"&gt;TornadoVM&lt;/a&gt;
 offers an API for parallel programming on modern hardware that tackles data parallel, task parallel and pipeline parallel applications.&lt;/li&gt;
&lt;li&gt;TornadoVM offers different abstractions to developers to be able to express parallel applications in Java, identify the methods to offload, and dispatch the application on the corresponding accelerators.&lt;/li&gt;
&lt;li&gt;Task-Graphs and Execution Plans are the main building blocks of TornadoVM applications, allowing developers to compose complex graphs of computations and interact with the TornadoVM runtime to enable/disable profiling, enable debugging, or enable dynamic reconfiguration to select the best possible accelerators for the compute graphs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this blog post, I will explain how developers can start programming with TornadoVM and interact with the TornadoVM runtime.&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>Software Testing as a Debugging Tool</title><link>https://foojayio.github.io/website/today/software-testing-as-a-debugging-tool/</link><pubDate>Wed, 15 May 2024 07:43:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/software-testing-as-a-debugging-tool/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-intersection-of-debugging-and-testing"&gt;The Intersection of Debugging and Testing&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#unit-tests"&gt;Unit Tests&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#integration-tests"&gt;Integration Tests&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#coverage"&gt;Coverage&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-debugfix-cycle"&gt;The Debug-Fix Cycle&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#composing-tests-with-debuggers"&gt;Composing Tests with Debuggers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#testdriven-development"&gt;Test-Driven Development&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Debugging is not just about identifying errors&amp;mdash;it&amp;rsquo;s about instituting a reliable process for ensuring software health and longevity. In this post we discuss the role of software testing in debugging, including foundational concepts and how they converge to improve software quality.&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/yap509UZz6M?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;As a side note, if you like the content of this and the other posts in this series check out my &lt;a href="https://www.amazon.com/dp/1484290410/" target="_blank" rel="noopener noreferrer"&gt;Debugging book&lt;/a&gt;
 that covers &lt;strong&gt;t&lt;/strong&gt; his subject. If you have friends that are learning to code I&amp;rsquo;d appreciate a reference to my &lt;a href="https://www.amazon.com/Java-Basics-Practical-Introduction-Full-Stack-ebook/dp/B0CCPGZ8W1/" target="_blank" rel="noopener noreferrer"&gt;Java Basics book.&lt;/a&gt;
 If you want to get back to Java after a while check out my &lt;a href="https://www.amazon.com/Java-21-Explore-cutting-edge-features/dp/9355513925/" target="_blank" rel="noopener noreferrer"&gt;Java 8 to 21 book&lt;/a&gt;
&lt;strong&gt;.&lt;/strong&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>Debugging Using JMX Revisited</title><link>https://foojayio.github.io/website/today/debugging-using-jmx-revisited/</link><pubDate>Thu, 18 Apr 2024 13:02:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-using-jmx-revisited/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-need-for-advanced-management-tools-in-development"&gt;The Need for Advanced Management Tools in Development&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#introduction-to-jmx-java-management-extensions"&gt;Introduction to JMX (Java Management Extensions)&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#understanding-mbeans"&gt;&lt;strong&gt;Understanding MBeans&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#spring-and-management-beans"&gt;Spring and Management Beans&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#tooling-for-jmx-management"&gt;Tooling for JMX Management&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#getting-started-with-jmxterm"&gt;Getting Started with JMXTerm&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#leveraging-jmx-in-debugging-and-management"&gt;Leveraging JMX in Debugging and Management&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#exposing-mbeans-in-spring-boot"&gt;Exposing MBeans in Spring Boot&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#understanding-spring-boot-jmx-support"&gt;Understanding Spring Boot JMX Support&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#expose-an-mbean-in-spring-boot"&gt;Expose an MBean in Spring Boot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#example-exposing-a-simple-configuration-mbean"&gt;Example: Exposing a Simple Configuration MBean&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Debugging effectively requires a nuanced approach, similar to using tongs that tightly grip the problem from both sides.&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>Localize applications with AI</title><link>https://foojayio.github.io/website/today/localize-apps-with-ai/</link><pubDate>Wed, 20 Mar 2024 08:50:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/localize-apps-with-ai/</guid><description>&lt;p&gt;Read in other languages: &lt;a href="https://flounder.dev/zh/posts/localize-apps-with-ai/" target="_blank" rel="noopener noreferrer"&gt;中文&lt;/a&gt;
 &lt;a href="https://flounder.dev/es/posts/localize-apps-with-ai/" target="_blank" rel="noopener noreferrer"&gt;Español&lt;/a&gt;
 &lt;a href="https://flounder.dev/pt/posts/localize-apps-with-ai/" target="_blank" rel="noopener noreferrer"&gt;Português&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ever wondered if AI can localize an entire project? In this article, we follow the process end-to-end using the Spring Petclinic as an example. We prepare the project for localization, automate the translation using Python and DeepL, and analyze the results&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Whether you are thinking of localizing your project or just learning how to do that, AI might help you. It offers a cost-efficient entry point for experiments and automations.&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>DTrace Revisited: Advanced Debugging Techniques</title><link>https://foojayio.github.io/website/today/dtrace-revisited-advanced-debugging-techniques/</link><pubDate>Tue, 13 Feb 2024 07:46:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/dtrace-revisited-advanced-debugging-techniques/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#dtrace-overview"&gt;DTrace Overview&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#understanding-dtraces-capabilities"&gt;Understanding DTrace&amp;rsquo;s Capabilities&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#system-monitoring-and-analysis"&gt;System Monitoring and Analysis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#process-and-performance-analysis"&gt;Process and Performance Analysis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#customizability-and-flexibility"&gt;Customizability and Flexibility&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#real-world-applications"&gt;Real-World Applications&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#performance-and-compatibility-of-dtrace"&gt;Performance and Compatibility of DTrace&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#cross-platform-compatibility"&gt;&lt;strong&gt;Cross-Platform Compatibility&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#compatibility-challenges-on-macos"&gt;&lt;strong&gt;Compatibility Challenges on MacOS&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#customizability-and-flexibility-of-dtrace"&gt;Customizability and Flexibility of DTrace&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#adaptability-to-various-scenarios"&gt;&lt;strong&gt;Adaptability to Various Scenarios&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#examples-of-customizable-probes"&gt;&lt;strong&gt;Examples of Customizable Probes&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#real-world-applications-of-dtrace"&gt;Real-World Applications of DTrace&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#final-words"&gt;Final Words&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When we think of debugging, we think of breakpoints in IDEs, stepping over, inspecting variables, etc.&lt;/p&gt;
&lt;p&gt;However, there are instances where stepping outside the conventional confines of an IDE becomes essential to track and resolve complex issues. This is where tools like DTrace come into play, offering a more nuanced and powerful approach to debugging than traditional methods.&lt;/p&gt;</description></item><item><title>API Versioning</title><link>https://foojayio.github.io/website/today/api-versioning/</link><pubDate>Mon, 22 Jan 2024 09:00:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/api-versioning/</guid><description>&lt;p&gt;&lt;strong&gt;In my previous article &lt;a href="https://blog.frankel.ch/evolve-apis/" target="_blank" rel="noopener noreferrer"&gt;Evolving your APIs&lt;/a&gt;
, I mention the main API versioning approaches. During the talk of the same name, I sometimes get some questions on the subject. In this article, I&amp;rsquo;ll detail each of them.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I assume readers know the reasons behind versioning, semantic versioning, and product lifecycle. If not, I encourage you to read a bit about these themes; in particular, chapter 24 of the excellent &lt;a href="https://blog.frankel.ch/api-design-patterns/" target="_blank" rel="noopener noreferrer"&gt;API Design Patterns&lt;/a&gt;
 book focuses on them.&lt;/p&gt;</description></item><item><title>Integrate executable Java code in your blog posts, part 2: How to use dependencies</title><link>https://foojayio.github.io/website/today/integrate-executable-java-code-in-your-blog-posts-part-2-how-to-use-dependencies/</link><pubDate>Fri, 15 Dec 2023 10:07:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/integrate-executable-java-code-in-your-blog-posts-part-2-how-to-use-dependencies/</guid><description>&lt;p&gt;In a previous post, 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;
, by using JDoodle. In this post, you will learn how you can extend this with one or more libraries.&lt;/p&gt;
&lt;h2 id="h2-0-define-dependencies"&gt;Define Dependencies&lt;/h2&gt;
&lt;p&gt;To integrate Java code in your post or page that needs dependencies, you need to specify them in the initial &lt;code&gt;div&lt;/code&gt; with &lt;code&gt;data-libs&lt;/code&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;&amp;lt;div data-pym-src='https://www.jdoodle.com/plugin' 
 data-language="java" 
 data-version-index="4"
 data-client-id="34d6e81ae45d88cdb9fb98fed1415b81" 
 data-libs="mavenlib1,mavenlib2"&amp;gt;
 &amp;lt;div data-type="script"&amp;gt;&amp;lt;xmp&amp;gt;

 // This is the place to put your Java code

 &amp;lt;/xmp&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;script src="https://www.jdoodle.com/assets/jdoodle-pym.min.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;data-client-id&lt;/code&gt; can only be used for the Foojay website! Create your own &lt;a href="https://www.jdoodle.com" target="_blank" rel="noopener noreferrer"&gt;account on the JDoodle site&lt;/a&gt;
 if you want to use this functionality on another website.&lt;/p&gt;</description></item><item><title>Creating Executables For JavaFX Applications</title><link>https://foojayio.github.io/website/today/creating-executables-for-javafx-applications/</link><pubDate>Fri, 08 Dec 2023 13:46:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-executables-for-javafx-applications/</guid><description>&lt;p&gt;Here on Foojay, you can already find some great articles on how to create native executables from your JavaFX code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/"&gt;Native Applications for Multiple Devices from a Single JavaFX Project with Gluon Mobile and GitHub Actions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/javafx-templates-for-desktop-applications/"&gt;JavaFX Templates for Desktop Applications&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&amp;rsquo;s take a look in this article at the current state of what can be done with &lt;code&gt;jpackage&lt;/code&gt; and GitHub Actions.&lt;/p&gt;
&lt;p&gt;All the sources and workflow files used here &lt;a href="https://github.com/heshanthenura/JavaPackageDemo" target="_blank" rel="noopener noreferrer"&gt;can be found in the &lt;code&gt;JavaPackageDemo&lt;/code&gt; repository&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>The Theory of Debugging</title><link>https://foojayio.github.io/website/today/the-theory-of-debugging/</link><pubDate>Mon, 04 Dec 2023 09:18:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-theory-of-debugging/</guid><description>&lt;p&gt;&lt;strong&gt;In the landscape of software development, bugs are an inevitable part of the journey, and debugging, albeit frustrating at times, is an integral part of the process. There&amp;rsquo;s no escaping this truth, and the sooner we embrace it, the sooner we can master the art of debugging.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the next few posts in this series, I will explain the little-known &amp;ldquo;theory&amp;rdquo; behind debugging. We all know the practice of debugging (to some degree) but there is also a theoretical underpinning that most of us never learned in University (I sure as hell didn&amp;rsquo;t). Understanding this theory will help you apply a more methodical approach to problem resolution and will improve your understanding of your code.&lt;/p&gt;</description></item><item><title>Feedback from calling Rust from Python</title><link>https://foojayio.github.io/website/today/feedback-from-calling-rust-from-python/</link><pubDate>Wed, 22 Nov 2023 10:32:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/feedback-from-calling-rust-from-python/</guid><description>&lt;p&gt;I got plenty of feedback on my post about &lt;a href="https://blog.frankel.ch/rust-from-python/" target="_blank" rel="noopener noreferrer"&gt;Calling Rust from Python&lt;/a&gt;
:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=37811953" target="_blank" rel="noopener noreferrer"&gt;Hacker News&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/Python/comments/1733gl6/calling_rust_from_python/" target="_blank" rel="noopener noreferrer"&gt;/r/python&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/rust/comments/1733gsb/calling_rust_from_python/" target="_blank" rel="noopener noreferrer"&gt;/r/rust&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Many comments mentioned &lt;code&gt;pyo3&lt;/code&gt;, and I should use it instead of cooking my own. Thanks to the authors, I checked: in this post, I explain what it is and how I migrated my code.&lt;/p&gt;
&lt;h2 id="h2-0-what-is-pyo3"&gt;What is pyo3?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Rust bindings for Python, including tools for creating native Python extension modules. Running and interacting with Python code from a Rust binary is also supported.&lt;/p&gt;</description></item><item><title>Explore project structure with IntelliJ IDEA's Dependency Matrix</title><link>https://foojayio.github.io/website/today/explore-project-structure-with-intellij-ideas-dependency-matrix/</link><pubDate>Mon, 20 Nov 2023 10:28:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/explore-project-structure-with-intellij-ideas-dependency-matrix/</guid><description>&lt;p&gt;In this tutorial, we&amp;rsquo;ll look at exploring project structure with &lt;a href="https://www.jetbrains.com/idea/" target="_blank" rel="noopener noreferrer"&gt;IntelliJ IDEA&lt;/a&gt;
&amp;rsquo;s Dependency Matrix.&lt;/p&gt;
&lt;p&gt;When working with large, complex software projects, we need to understand the dependencies between components in your projects. IntelliJ IDEA has a feature called &lt;strong&gt;Dependency Structure Matrix&lt;/strong&gt; (&lt;strong&gt;DSM&lt;/strong&gt; ), or &lt;strong&gt;Dependency Matrix&lt;/strong&gt;, that can help us with this.&lt;/p&gt;
&lt;p&gt;When you are new to a project, the Dependency Matrix can help you get an overview of the dependencies in the project. The Dependency Matrix can also help us get an idea of how hard it will be to split a project, based on the dependencies between components. Finally, it can help us find and untangle cyclic dependencies.&lt;/p&gt;</description></item><item><title>Integrate executable Java code in your blog posts</title><link>https://foojayio.github.io/website/today/integrate-executable-java-code-in-your-blog-posts/</link><pubDate>Tue, 07 Nov 2023 14:49:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/integrate-executable-java-code-in-your-blog-posts/</guid><description>&lt;p&gt;While developing the &lt;a href="https://foojayio.github.io/website/java-quick-start/"&gt;Foojay Quickstart Java Tutorial&lt;/a&gt;
, I was looking for an easy way to integrate runnable Java code examples into the Foojay pages and blogs. That&amp;rsquo;s when I discovered &lt;a href="https://www.jdoodle.com/" target="_blank" rel="noopener noreferrer"&gt;jdoodle.com&lt;/a&gt;
. I started by using their online editor, but with this blog I want to show you an even easier method to integrate runnable code here on Foojay.&lt;/p&gt;
&lt;h2 id="h2-0-integration-examples"&gt;Integration examples&lt;/h2&gt;
&lt;h3 id="h3-1-single-file-code"&gt;Single file code&lt;/h3&gt;
&lt;p&gt;To integrate &amp;ldquo;plain&amp;rdquo; Java code in your post or page, use the following syntax and add it as &amp;ldquo;Custom HTML&amp;rdquo; widget:&lt;/p&gt;</description></item><item><title>Python "magic" methods - part 2</title><link>https://foojayio.github.io/website/today/python-magic-methods-part-2/</link><pubDate>Fri, 03 Nov 2023 09:15:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/python-magic-methods-part-2/</guid><description>&lt;p&gt;Let&amp;rsquo;s continue our exploration of Python&amp;rsquo;s magic methods in this second part of the series. This part will focus on numbers and containers, &lt;em&gt;i.e.&lt;/em&gt; , collections. You can read the first part &lt;a href="https://foojayio.github.io/website/today/python-magic-methods-part-1/"&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;h2 id="h2-0-container-related-methods"&gt;Container-related methods&lt;/h2&gt;
&lt;p&gt;Python provides the usual containers, &lt;em&gt;e.g.&lt;/em&gt;, lists, sets, and dictionaries. You can use the following methods when you want to implement your own.&lt;/p&gt;
&lt;h3 id="h3-1-common-methods"&gt;Common methods&lt;/h3&gt;
&lt;p&gt;Containers have a size. Python defines two methods to implement to return the number of items in a container: &lt;code&gt;object.__len__(self)&lt;/code&gt; for the exact size and &lt;code&gt;object.__length_hint__(self)&lt;/code&gt; for an approximation. You should use the latter when getting the exact size is computationally expensive.&lt;/p&gt;</description></item><item><title>Python "magic" methods - part 1</title><link>https://foojayio.github.io/website/today/python-magic-methods-part-1/</link><pubDate>Fri, 03 Nov 2023 09:08:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/python-magic-methods-part-1/</guid><description>&lt;p&gt;Java was the first language I used professionally and is the scale by which I measure other languages I learned afterward. It&amp;rsquo;s an statically-typed language. Hence, Python feels a bit weird because of its dynamic typing approach.&lt;/p&gt;
&lt;p&gt;For example, &lt;code&gt;Object&lt;/code&gt; offers methods &lt;code&gt;equals()&lt;/code&gt;, &lt;code&gt;hashCode()&lt;/code&gt;, and &lt;code&gt;toString()&lt;/code&gt;. Because all other classes inherit from &lt;code&gt;Object&lt;/code&gt;, directly or indirectly, all objects have these methods by definition.&lt;/p&gt;
&lt;p&gt;Conversely, Python was not initially built on OOP principles and is dynamically typed. Yet, any language needs cross-cutting features on unrelated objects. In Python, these are specially-named methods: methods that the runtime interprets in a certain way but that you need to know about. You can call them magic methods.&lt;/p&gt;</description></item><item><title>Not a Single Trace</title><link>https://foojayio.github.io/website/today/not-a-single-trace/</link><pubDate>Fri, 20 Oct 2023 07:06:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/not-a-single-trace/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-limiting-factor"&gt;The Limiting Factor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#strength-in-numbers"&gt;Strength in Numbers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#example"&gt;Example&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#magical-apis"&gt;Magical APIs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your team celebrates a success story where a trace identified a pesky latency issue in your application&amp;rsquo;s authentication service. A fix was swiftly implemented, and we all celebrated a quick win in the next team meeting. But the celebrations are short-lived. Just days later, user complaints surged about a related payment gateway timeout. It turns out that the fix we made did improve performance at one point but created a situation in which key information was never cached. Other parts in the software react badly to the fix and we need to revert the whole thing.&lt;/p&gt;</description></item><item><title>Debugging Tips and Tricks: A Comprehensive Guide</title><link>https://foojayio.github.io/website/today/debugging-tips-and-tricks-a-comprehensive-guide/</link><pubDate>Mon, 09 Oct 2023 07:12:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-tips-and-tricks-a-comprehensive-guide/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#rubber-ducking-the-art-of-talking-it-out"&gt;&lt;strong&gt;Rubber Ducking: The Art of Talking it Out&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#moving-the-goalposts-redefining-the-bug"&gt;&lt;strong&gt;Moving the Goalposts: Redefining the Bug&lt;/strong&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-evolution-of-a-bug"&gt;The Evolution of a Bug&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-process-of-redefinition"&gt;The Process of Redefinition&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#flipping-the-direction-multiple-angles-of-attack"&gt;&lt;strong&gt;Flipping the Direction: Multiple Angles of Attack&lt;/strong&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-linear-approach-to-debugging"&gt;The Linear Approach to Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#disruptive-environments-exposing-hidden-bugs"&gt;&lt;strong&gt;Disruptive Environments: Exposing Hidden Bugs&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#leveraging-debugging-extensions-and-tools"&gt;&lt;strong&gt;Leveraging Debugging Extensions and Tools&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#disconnect-and-reconnect-the-power-of-a-fresh-mindset"&gt;&lt;strong&gt;Disconnect and Reconnect: The Power of a Fresh Mindset&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#embrace-the-challenge-finding-joy-in-debugging"&gt;&lt;strong&gt;Embrace the Challenge: Finding Joy in Debugging&lt;/strong&gt;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#strategies-to-embrace-the-debugging-challenge"&gt;Strategies to Embrace the Debugging Challenge&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#use-a-process"&gt;&lt;strong&gt;Use a Process&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Debugging is an integral part of software development.&lt;/p&gt;</description></item><item><title>The Systemic Process of Debugging</title><link>https://foojayio.github.io/website/today/the-systemic-process-of-debugging/</link><pubDate>Thu, 28 Sep 2023 07:06:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-systemic-process-of-debugging/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-importance-of-issue-tracking"&gt;The Importance of Issue Tracking&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#avoiding-parallel-work-on-the-same-bug"&gt;Avoiding Parallel Work on the Same Bug&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-value-of-issue-over-pull-requests"&gt;The Value of Issue Over Pull Requests&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#communication-issue-tracker-vs-ephemeral-channels"&gt;Communication: Issue Tracker vs. Ephemeral Channels&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#why-we-sometimes-avoid-the-issue-tracker"&gt;Why We Sometimes Avoid the Issue Tracker&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-role-of-daily-meetings"&gt;The Role of Daily Meetings&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-role-of-testing-in-debugging"&gt;The Role of Testing in Debugging&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#starting-with-unit-tests"&gt;Starting with Unit Tests&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#unit-tests-vs-integration-tests"&gt;Unit Tests vs. Integration Tests&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Debugging is an integral part of software development. However, as projects grow in size and complexity, the process of debugging requires more structure and collaboration. This process is probably something you already do as this process is deeply ingrained into most teams.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Eliminating Bugs Using the Tong Motion Approach</title><link>https://foojayio.github.io/website/today/eliminating-bugs-using-the-tong-motion-approach/</link><pubDate>Fri, 22 Sep 2023 14:53:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/eliminating-bugs-using-the-tong-motion-approach/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#understanding-the-process-of-elimination-in-debugging"&gt;Understanding the Process of Elimination in Debugging&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-basics"&gt;The Basics&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#using-external-tools"&gt;Using External Tools&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-power-of-unit-tests-in-debugging"&gt;The Power of Unit Tests in Debugging&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#benefits-of-mocking-frameworks"&gt;Benefits of Mocking Frameworks&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-challenges-with-flaky-issues"&gt;The Challenges with Flaky Issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-concept-of-the-tong-motion"&gt;The Concept of the &amp;lsquo;Tong Motion&amp;rsquo;&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#applying-the-tong-motion-to-debugging"&gt;Applying the Tong Motion to Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#an-illustrative-case-debugging-a-server-performance-issue"&gt;An Illustrative Case: Debugging a Server Performance Issue&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#wrapping-up"&gt;Wrapping Up&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Software debugging can often feel like a never-ending maze. Just when you think you&amp;rsquo;re on the right track, you hit a dead-end. But, by employing the age-old technique of the process of elimination, and using the analogy of the &amp;lsquo;Tong Motion,&amp;rsquo; we can navigate this maze more effectively.&lt;/strong&gt;&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>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>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>The Evolution of Bugs</title><link>https://foojayio.github.io/website/today/the-evolution-of-bugs/</link><pubDate>Tue, 12 Sep 2023 03:34:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-evolution-of-bugs/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#memory-management-the-past-and-the-present"&gt;Memory Management: The Past and The Present&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-classic-challenges-memory-leaks-and-corruption"&gt;The Classic Challenges: Memory Leaks and Corruption&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#enter-garbage-collection-a-mixed-blessing"&gt;Enter Garbage Collection: A Mixed Blessing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#memory-profiling-the-contemporary-solution"&gt;Memory Profiling: The Contemporary Solution&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#concurrency-a-double-edged-sword"&gt;Concurrency: A Double-Edged Sword&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-bright-side-predictable-threading"&gt;The Bright Side: Predictable Threading&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-murky-waters-multi-container-concurrency"&gt;The Murky Waters: Multi-Container Concurrency&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#reproducing-the-elusive-threading-bugs"&gt;Reproducing The Elusive: Threading Bugs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#race-conditions-the-ever-present-ghost"&gt;Race Conditions: The Ever-Present Ghost&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-pervasiveness-of-state-bugs"&gt;The Pervasiveness of State Bugs&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-are-state-bugs"&gt;What Are State Bugs?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#from-simple-variables-to-complex-data-structures"&gt;From Simple Variables to Complex Data Structures&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#interactions-and-events-where-timing-matters"&gt;Interactions and Events: Where Timing Matters&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#persistence-when-bugs-linger"&gt;Persistence: When Bugs Linger&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#concurrency-compounds-state-issues"&gt;Concurrency Compounds State Issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#tools-and-strategies-to-combat-state-bugs"&gt;Tools and Strategies to Combat State Bugs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#exceptions-the-noisy-neighbor"&gt;Exceptions: The Noisy Neighbor&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-are-exceptions"&gt;What Are Exceptions?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-informative-nature-of-exceptions"&gt;The Informative Nature of Exceptions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#causes-of-exceptions"&gt;Causes of Exceptions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#handling-exceptions-a-delicate-balance"&gt;Handling Exceptions: A Delicate Balance&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#proactive-prevention"&gt;Proactive Prevention&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#faults-beyond-the-surface"&gt;Faults: Beyond the Surface&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-constitutes-a-fault"&gt;What Constitutes a Fault?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#origins-of-faults"&gt;Origins of Faults&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#detecting-and-isolating-faults"&gt;Detecting and Isolating Faults&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#addressing-faults"&gt;Addressing Faults&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-value-of-learning-from-faults"&gt;The Value of Learning from Faults&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#thread-bugs-unraveling-the-knot"&gt;Thread Bugs: Unraveling the Knot&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#a-glimpse-into-thread-bugs"&gt;A Glimpse into Thread Bugs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-common-culprits-behind-thread-bugs"&gt;The Common Culprits Behind Thread Bugs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#diagnosing-the-tangle"&gt;Diagnosing the Tangle&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#untangling-the-knot"&gt;Untangling the Knot&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#race-conditions-always-a-step-ahead"&gt;Race Conditions: Always a Step Ahead&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-exactly-is-a-race-condition"&gt;What Exactly is a Race Condition?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#why-are-race-conditions-so-tricky"&gt;Why are Race Conditions so Tricky?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#guarding-against-the-unpredictable"&gt;Guarding Against the Unpredictable&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#testing-for-races"&gt;Testing for Races&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#performance-pitfalls-monitor-contention-and-resource-starvation"&gt;Performance Pitfalls: Monitor Contention and Resource Starvation&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#monitor-contention-a-bottleneck-in-disguise"&gt;Monitor Contention: A Bottleneck in Disguise&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#why-its-problematic"&gt;Why It&amp;rsquo;s Problematic&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#mitigation-strategies"&gt;Mitigation Strategies&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#resource-starvation-the-silent-performance-killer"&gt;Resource Starvation: The Silent Performance Killer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-impact"&gt;The Impact&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#solutions-to-counteract-starvation"&gt;Solutions to Counteract Starvation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-bigger-picture"&gt;The Bigger Picture&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Programming, regardless of the era, has been riddled with bugs that vary in nature but often remain consistent in their basic problems. Whether we&amp;rsquo;re talking about mobile, desktop, server, or different operating systems and languages, bugs have always been a constant challenge. Here&amp;rsquo;s a dive into the nature of these bugs and how we can tackle them effectively.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Load testing - shoot your application with Gatling</title><link>https://foojayio.github.io/website/today/load-testing-shoot-your-application-with-gatling/</link><pubDate>Wed, 06 Sep 2023 09:32:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/load-testing-shoot-your-application-with-gatling/</guid><description>&lt;h2 id="_what_is_load_testing"&gt;What is load testing?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Load testing entails testing how our application performs under a significant load so we can be certain it behaves as expected when there&amp;rsquo;s an influx of users.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Or at least so we know what it can cope it, and at what point we might potentially need to take action.&lt;/p&gt;
&lt;p&gt;After all, it might not (only) be the code that&amp;rsquo;s the issue.&lt;/p&gt;
&lt;p&gt;This is a process that requires quite a bit of cooperation between testers, developers, and those using it to properly determine the scenarios, and a smooth &amp;amp; swift feedback loop is important to make sure our solutions work properly. And it will likely be some of the most expensive tests given both the people involved and the need for a testing environment that&amp;rsquo;s representative of the production configuration.&lt;/p&gt;</description></item><item><title>Spring Boot Configuration for Docker Images with Azul Zulu</title><link>https://foojayio.github.io/website/today/configuring-spring-boot-to-build-a-docker-image-with-azul-zulu-and-debug-options/</link><pubDate>Wed, 30 Aug 2023 16:14:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/configuring-spring-boot-to-build-a-docker-image-with-azul-zulu-and-debug-options/</guid><description>&lt;p&gt;&lt;em&gt;The Spring Boot Maven Plugin makes creating a Docker image from your application very easy! In this article, we give you some extra tips and examples for configuring Spring Boot to define the Java runtime used in such a Spring Boot Docker image and explain how to add additional environmental options to ease debugging.&lt;/em&gt;
&lt;img src="https://foojayio.github.io/website/today/configuring-spring-boot-to-build-a-docker-image-with-azul-zulu-and-debug-options/azul-zulu-springboot-docker-1024x400.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3 id="h3-0-for-this-post-i-got-the-help-of-dashaun-carter-spring-developer-advocate-who-immediately-jumped-in-when-i-raised-some-questions-about-these-configuration-options-thanks-dashaun"&gt;For this post, I got the help of &lt;a href="https://twitter.com/dashaun" target="_blank" rel="noopener noreferrer"&gt;DaShaun Carter&lt;/a&gt;
, Spring Developer Advocate, who immediately jumped in when I raised some questions about these configuration options. Thanks, DaShaun!&lt;/h3&gt;
&lt;/blockquote&gt;
&lt;h2 id="h-spring-boot-petclinic-project"&gt;Spring Boot Petclinic Project&lt;/h2&gt;
&lt;p&gt;To illustrate our approach, we&amp;rsquo;ll use the Spring Boot Petclinic project, a Spring Boot application built using Maven or Gradle, to demonstrate how a Spring Boot project is set up fully and how the code is structured and must be packaged.&lt;/p&gt;</description></item><item><title>Debugging as a Process of Isolating Assumptions</title><link>https://foojayio.github.io/website/today/debugging-as-a-process-of-isolating-assumptions/</link><pubDate>Wed, 23 Aug 2023 08:16:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-as-a-process-of-isolating-assumptions/</guid><description>&lt;p&gt;&lt;strong&gt;Debugging is an integral part of any software development process.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It&amp;rsquo;s a systematic hunt for bugs and mistakes that may be hidden in the intricate lines of your code.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Much like a hunter and its prey, it requires a precise method and a set of specific tools.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Let&amp;rsquo;s delve deeper into the fascinating process of isolating assumptions to effectively debug your code.&lt;/strong&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/Qw6coM798AE?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;Before I proceed with this week&amp;rsquo;s post if you have friends who are learning to code&amp;hellip; I &lt;a href="https://www.amazon.com/Java-Basics-Practical-Introduction-Full-Stack-ebook/dp/B0CCPGZ8W1/" target="_blank" rel="noopener noreferrer"&gt;published a new book for Java beginners&lt;/a&gt;
 with no prior knowledge (for learning programming from scratch). Each chapter also has an accompanying video and I think there&amp;rsquo;s no book quite like it for beginners. I would appreciate spreading the word on this.&lt;/p&gt;</description></item><item><title>Exploring File Storage Solutions in Spring Boot</title><link>https://foojayio.github.io/website/today/exploring-file-storage-solutions-in-spring-boot-database-local-systems-cloud-services-and-beyond/</link><pubDate>Wed, 23 Aug 2023 08:07:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-file-storage-solutions-in-spring-boot-database-local-systems-cloud-services-and-beyond/</guid><description>&lt;p&gt;&lt;strong&gt;When building a web application, managing file uploads properly is a common requirement. After receiving, files can be stored in several places: in a file system, in a database or, more commonly, in a cloud storage service.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In this article, we will cover how to store files in a database using Spring Boot and discuss some alternatives.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-introduction"&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Recently, a fellow developer who I helped in past reached out to me on Slack seeking assistance with handling file uploads in a Spring Boot application. After providing some guidance, I decided to compile this article to assist others facing similar challenges.&lt;/p&gt;</description></item><item><title>Introduction to the Tower Library</title><link>https://foojayio.github.io/website/today/introduction-tower/</link><pubDate>Tue, 22 Aug 2023 08:28:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/introduction-tower/</guid><description>&lt;p&gt;One of the components of my &lt;a href="https://github.com/nfrankel/opentelemetry-tracing" target="_blank" rel="noopener noreferrer"&gt;OpenTelemetry demo&lt;/a&gt;
 is a Rust application built with the Axum web framework. In its description, &lt;code&gt;axum&lt;/code&gt; mentions:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;axum&lt;/code&gt; doesn&amp;rsquo;t have its own middleware system but instead uses &lt;code&gt;tower::Service&lt;/code&gt;. This means &lt;code&gt;axum&lt;/code&gt; gets timeouts, tracing, compression, authorization, and more, for free. It also enables you to share middleware with applications written using &lt;code&gt;hyper&lt;/code&gt; or &lt;code&gt;tonic&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&amp;ndash; &lt;a href="https://github.com/tokio-rs/axum" target="_blank" rel="noopener noreferrer"&gt;axum README&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;So far, I was happy to let this cryptic explanation lurk in the corner of my mind, but today is the day I want to understand what it means. Like many others, this post aims to explain to me and others how to do this.&lt;/strong&gt;&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>Pitest: Do You Test Your Tests?</title><link>https://foojayio.github.io/website/today/pitest-do-you-test-your-tests/</link><pubDate>Tue, 15 Aug 2023 14:32:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/pitest-do-you-test-your-tests/</guid><description>&lt;h2 id="_what_is_pitest"&gt;What is Pitest?&lt;/h2&gt;
&lt;p&gt;Pitest is a library that helps us do mutation testing.&lt;/p&gt;
&lt;p&gt;Mutation testing is a process in which random variations of the code under test are generated.&lt;/p&gt;
&lt;p&gt;Hence, our tests will run against variants of the code that we&amp;rsquo;re intending to test.&lt;/p&gt;
&lt;p&gt;If the test fails, the mutation is killed, if it still passes it lives. So in subsequent runs, you will see this mutation once again. Surviving mutations may indicate issues with our test set since application code changes should lead to different end results, and thus to failing tests. So to further reduce the survivors we will need to enhance our test cases and/or add extra.&lt;/p&gt;</description></item><item><title>Can't Reproduce a Bug?</title><link>https://foojayio.github.io/website/today/cant-reproduce-a-bug/</link><pubDate>Mon, 14 Aug 2023 07:09:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/cant-reproduce-a-bug/</guid><description>&lt;p&gt;The phrase &amp;ldquo;it works on my machine&amp;rdquo; can be a source of amusement, but it also represents a prevailing attitude in the world of development - an attitude that often forces users to prove bugs before we&amp;rsquo;re willing to investigate them. But in reality, we need to take responsibility and chase the issue, regardless of where it takes us.&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/qGasKz-YsiU?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-a-two-pronged-approach-to-bug-solving"&gt;A Two-Pronged Approach to Bug Solving&lt;/h2&gt;
&lt;p&gt;Solving bugs requires a two-pronged approach. Initially, we want to replicate the environment where the issue is occurring; it could be something specific to the user&amp;rsquo;s machine. Alternatively, we may need to resort to remote debugging or use logs from the user&amp;rsquo;s machine, asking them to perform certain actions on our behalf.&lt;/p&gt;</description></item><item><title>Working with GitLab Merge Requests in IntelliJ IDEA</title><link>https://foojayio.github.io/website/today/working-with-gitlab-merge-requests-in-intellij-idea/</link><pubDate>Thu, 10 Aug 2023 09:57:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/working-with-gitlab-merge-requests-in-intellij-idea/</guid><description>&lt;p&gt;&lt;strong&gt;In this tutorial, we will take a look at working with GitLab Merge Requests inside IntelliJ IDEA.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When reviewing Merge Requests in a web interface, we don&amp;rsquo;t have the same support that our IDE gives us, like syntax highlighting and the context within which the code was written.&lt;/p&gt;
&lt;p&gt;IntelliJ IDEA has support for reviewing and merging GitLab Merge Requests. These features are available if the IntelliJ IDEA project has a remote that points to GitLab.&lt;/p&gt;</description></item><item><title>Sealed Interfaces &amp; Pattern Matching: Java's Modern Capabilities</title><link>https://foojayio.github.io/website/today/sealed-interfaces-and-pattern-matching-a-quick-dive-into-javas-modern-capabilities/</link><pubDate>Wed, 09 Aug 2023 07:01:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/sealed-interfaces-and-pattern-matching-a-quick-dive-into-javas-modern-capabilities/</guid><description>&lt;p&gt;&lt;strong&gt;Sealed classes in Java are a new feature that provides a way to restrict the classes that can inherit from a superclass or extend an interface. This new language feature enhances the encapsulation and provides more control to developers over their codebase.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this tutorial, we will explore sealed classes, how to use them to find all subclasses, and how to apply pattern matching in a practical context.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with a basic interface definition named &lt;code&gt;Shape&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Starting Apache Kafka on Java 8, Win 10</title><link>https://foojayio.github.io/website/today/starting-apache-kafka-java-producer-consumer-windows-10/</link><pubDate>Mon, 07 Aug 2023 09:39:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/starting-apache-kafka-java-producer-consumer-windows-10/</guid><description>&lt;p&gt;This is part 2 of a two part series on Starting Apache Kafka Server, Configuring Kafka Topic, and Creating a Core Java Based Kafka Consumer, as also a Core Java Based Kafka Producer.&lt;/p&gt;
&lt;p&gt;All this is demonstrated in step-by-step examples. All of this is for Java v8.0, Apache Kafka v3.4 on Windows 10. &lt;a href="https://foojayio.github.io/website/today/starting-apache-kafka-on-windows-10-kafka-v3-4/"&gt;Part 1&lt;/a&gt;
 focused on Kafka Consumer and Kafka Producer from the Command Line. This article focuses on the Core Java counterparts. It is important that the reader reads part 1 and completes the example so that the reader has a basic foundation in Kafka.&lt;/p&gt;</description></item><item><title>Temperature, humidity, and pressure in BME280 Sensors with Java</title><link>https://foojayio.github.io/website/today/reading-the-temperature-humidity-and-pressure-from-a-bme280-sensor-with-java-pi4j-i2c-spi-and-jbang/</link><pubDate>Thu, 03 Aug 2023 07:16:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/reading-the-temperature-humidity-and-pressure-from-a-bme280-sensor-with-java-pi4j-i2c-spi-and-jbang/</guid><description>&lt;p&gt;To make it as easy as possible to get started with Java on the Raspberry Pi to interact with electronic components, I started a &lt;a href="https://pi4j.com/examples/jbang/" target="_blank" rel="noopener noreferrer"&gt;new section on the Pi4J website with JBang examples&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In this tutorial, I want to show you how you can read the temperature, humidity, and pressure from a BME280 Sensor.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-what-is-used"&gt;What Is Used?&lt;/h2&gt;
&lt;p&gt;As explained on the websites of each project:&lt;/p&gt;
&lt;h3 id="h3-1-pi4j"&gt;Pi4J&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;A friendly object-oriented I/O API and implementation libraries for Java Programmers to access the full I/O capabilities of the Raspberry Pi platform. This project abstracts the low-level native integration and interrupt monitoring to enable Java programmers to focus on implementing their application business logic.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Starting Apache Kafka v3.4 on Win 10</title><link>https://foojayio.github.io/website/today/starting-apache-kafka-on-windows-10-kafka-v3-4/</link><pubDate>Sat, 29 Jul 2023 07:43:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/starting-apache-kafka-on-windows-10-kafka-v3-4/</guid><description>&lt;h3 id="h3-0-introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;This is part one of a two part articles series on Running Apache Kafka Server, Configuring Kafka Topics, and Creating a Kafka Consumer and Kafka Producer.&lt;/p&gt;
&lt;p&gt;All this is demonstrated step-by-step example that works from the Command Line.&lt;/p&gt;
&lt;p&gt;All of this is for Apache Kafka v3.4 on Windows 10.&lt;/p&gt;
&lt;h3 id="h3-1-pre-requisites"&gt;Pre-Requisites&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Install Java ( v8.0 is used in this Example )&lt;/li&gt;
&lt;li&gt;Install Apache Kafka v3.4.0 from the Given Link&lt;/li&gt;
&lt;li&gt;Set Java Classpath &amp;gt; Set JAVA_HOME Correctly&lt;/li&gt;
&lt;li&gt;UnZIP/UnTAR Apache Kafka Downloaded in (2)&lt;/li&gt;
&lt;li&gt;Use a Text Editor like [ Notepad++ ] for Editing&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://blogger.googleusercontent.com/img/a/AVvXsEhDK7xTGu-H4ZyFHWetkwEfKxIEjdMZuqYwimNrD-hIblKuBYqaW1Fttr8V_f19Q73z0MS09mNQYEhjuX8noY92cQ0dy4koVTnEmGSV76byHwHgM2uJ9ePcLSQYwFlcqBiWRI4QgXHE1nZYNsFPV3v0Nf2ozGkGc91DE3aKxOrDZV2IsPGlzFEKpNB8txrF" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Building for Failure: Best Practices for Easy Production Debugging</title><link>https://foojayio.github.io/website/today/building-for-failure-best-practices-for-easy-production-debugging/</link><pubDate>Fri, 21 Jul 2023 15:29:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-for-failure-best-practices-for-easy-production-debugging/</guid><description>&lt;p&gt;&lt;strong&gt;Before going into the content of this post, check out&lt;/strong&gt; &lt;a href="https://www.amazon.com/Java-21-Explore-cutting-edge-features-ebook/dp/B0C9WW8PFL/" target="_blank" rel="noopener noreferrer"&gt;&lt;strong&gt;my new book&lt;/strong&gt;&lt;/a&gt;
 &lt;strong&gt;which launched last week!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Quite a few years ago I was maintaining a database-driven system and ran into a weird production bug.&lt;/p&gt;
&lt;p&gt;The column I was reading from had a null value, but this wasn&amp;rsquo;t allowed in the code and there was no place where that value could have been null.&lt;/p&gt;
&lt;p&gt;The database was corrupt in a bad way and we didn&amp;rsquo;t have anything to go on.&lt;/p&gt;</description></item><item><title>How to Create an Open Source Pull Request (PR)</title><link>https://foojayio.github.io/website/today/creating-an-open-source-pull-request/</link><pubDate>Wed, 19 Jul 2023 11:26:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-an-open-source-pull-request/</guid><description>&lt;p&gt;&lt;strong&gt;In this tutorial, we are going to take a look at contributing to Open Source Software, specifically how to do a pull request (PR).&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We will look at forking and cloning the project, making the changes, committing and pushing these changes, creating the pull request, the review and hopefully merge of your PR.&lt;/p&gt;
&lt;p&gt;The same process may apply when making contributions to a project at work that you don&amp;rsquo;t own. In this example, the project is on GitHub. Other Git code repositories may use a similar process.&lt;/p&gt;</description></item><item><title>Dive into the OpenJDK: Top 10 Reads on Foojay.io</title><link>https://foojayio.github.io/website/today/dive-into-the-openjdk-top-10-reads-on-foojay-io/</link><pubDate>Wed, 19 Jul 2023 07:45:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/dive-into-the-openjdk-top-10-reads-on-foojay-io/</guid><description>&lt;p&gt;Foojay.io is a community platform dedicated to the needs of Java developers (and beyond, e.g., Kotlin) who use OpenJDK and related technologies.&lt;/p&gt;
&lt;p&gt;It serves as a central hub for sharing knowledge, resources, and tools related to Java and OpenJDK.&lt;/p&gt;
&lt;p&gt;The platform offers a wide range of content, including articles, tutorials, and insights from industry experts and Java enthusiasts.&lt;/p&gt;
&lt;p&gt;Whether you&amp;rsquo;re a seasoned developer or a beginner in the world of Java, Foojay.io provides valuable information and a supportive community to help you navigate and excel in your Java development journey.&lt;/p&gt;</description></item><item><title>GraphQL, JavaScript, Preprocessor, SQL and more in Manifold</title><link>https://foojayio.github.io/website/today/graphql-javascript-preprocessor-sql-and-more-in-manifold/</link><pubDate>Mon, 17 Jul 2023 12:42:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/graphql-javascript-preprocessor-sql-and-more-in-manifold/</guid><description>&lt;p&gt;We reached the final installment of our Manifold series but not the end of its remarkable capabilities.&lt;/p&gt;
&lt;p&gt;Throughout this series, we have delved into various aspects of Manifold, highlighting its unique features and showcasing how it enhances Java development.&lt;/p&gt;
&lt;p&gt;In this article, we will cover some of the remaining features of Manifold, including its support for GraphQL, integration with JavaScript, and the utilization of a preprocessor.&lt;/p&gt;
&lt;p&gt;By summarizing these features and reflecting on the knowledge gained throughout the series, I hope to demonstrate the power and versatility of Manifold.&lt;/p&gt;</description></item><item><title>How to Share Your Work With a Video or Podcast</title><link>https://foojayio.github.io/website/today/how-to-share-your-work-with-a-video-or-podcast/</link><pubDate>Fri, 14 Jul 2023 09:22:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-share-your-work-with-a-video-or-podcast/</guid><description>&lt;p&gt;Season 2 of the &lt;a href="https://foojayio.github.io/website/today/category/podcast/"&gt;Foojay Podcast&lt;/a&gt;
 has come to an end. Since September of &amp;lsquo;22, 22 episodes where published here on Foojay.&lt;/p&gt;
&lt;p&gt;In this article, we want to share some of the experiences of creating such podcasts, but also more generally, how you can share your work in a video with a small (or bigger) budget&amp;hellip;&lt;/p&gt;
&lt;h2 id="h2-0-audio"&gt;Audio&lt;/h2&gt;
&lt;p&gt;There is one fundamental rule for the audio: &amp;ldquo;Garbage in = Garbage out.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Yes, you can apply many filters and effects in a later phase, but you can&amp;rsquo;t make a bad recording sound good. &lt;strong&gt;You need a clear and good recording as a starting point&lt;/strong&gt;!&lt;/p&gt;</description></item><item><title>Reactive Programming Made Easy</title><link>https://foojayio.github.io/website/today/reactive-programming-made-easy/</link><pubDate>Fri, 14 Jul 2023 08:47:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/reactive-programming-made-easy/</guid><description>&lt;p&gt;This article discusses essential features and tools in IntelliJ IDEA for Reactor developers. These include live templates, a dedicated debug mode, and a couple of inspections.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve got all of the project Reactor adepts and enthusiasts out there covered! Whether you&amp;rsquo;re a seasoned pro or just taking your first steps in the field, IntelliJ IDEA will make reactive coding a breeze. It simplifies the complexities of Reactive Streams, ensuring a smooth and efficient experience for all skill levels.&lt;/p&gt;</description></item><item><title>Enterprise Java Applications With Jakarta EE and Vaadin</title><link>https://foojayio.github.io/website/today/enterprise-java-application-development-with-jakarta-ee-and-vaadin/</link><pubDate>Wed, 12 Jul 2023 09:26:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/enterprise-java-application-development-with-jakarta-ee-and-vaadin/</guid><description>&lt;p&gt;&lt;strong&gt;Watch this webinar recording to get an overview of the &lt;a href="https://vaadin.com/" target="_blank" rel="noopener noreferrer"&gt;Vaadin framework&lt;/a&gt;
 and learn how to use it to build modern web applications on the Jakarta EE Platform in pure Java, without any frontend framework.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Find out more about the core features of Jakarta EE, like its dependency injection (Jakarta CDI) and persistence (Jakarta Persistence) APIs. Additionally, you will learn how to use Vaadin and Jakarta EE to build responsive web applications that can run on different devices and browsers.&lt;/p&gt;</description></item><item><title>Understanding Security Vulnerabilities: Preventing Attacks</title><link>https://foojayio.github.io/website/today/understanding-security-vulnerabilities-a-first-step-in-preventing-attacks/</link><pubDate>Thu, 06 Jul 2023 12:49:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/understanding-security-vulnerabilities-a-first-step-in-preventing-attacks/</guid><description>&lt;p&gt;When I was a teenager, our local telephone company introduced a new service - the premium phone calls (AKA 1-900 numbers).&lt;/p&gt;
&lt;p&gt;The fun part was that we discovered a workaround to these charges by dialing the sequential local numbers which these 1-900 numbers would redirect to.&lt;/p&gt;
&lt;p&gt;If the &amp;ldquo;support number&amp;rdquo; for the 1-900 was 555-555 we would dial every number between 555-455 and 555-655 until we hit the jackpot&amp;hellip;&lt;/p&gt;
&lt;p&gt;Hours were spent dialing these numbers, leading us to make numerous calls for free. This attack is still prevalent today, and it&amp;rsquo;s called Insecure Direct Object References (IDOR).&lt;/p&gt;</description></item><item><title>Billions of Messages Per Minute Over TCP/IP</title><link>https://foojayio.github.io/website/today/billions-of-messages-tcp-ip/</link><pubDate>Wed, 05 Jul 2023 21:05:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/billions-of-messages-tcp-ip/</guid><description>&lt;h3 id="h3-0-key-takeaways"&gt;Key Takeaways&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Data consistency is critical when communicating between software components on different machines to ensure information remains in tact.&lt;/li&gt;
&lt;li&gt;Low-latency data exchange requires a different approach than common formats.&lt;/li&gt;
&lt;li&gt;Chronicle&amp;rsquo;s open-source Wire library provides a highly efficient means of marshalling and unmarshalling data for transmission to and from Chronicle Queue.&lt;/li&gt;
&lt;li&gt;Recent additions to the library extend its use with TCP/IP communications channels, offering extremely high throughput.&lt;/li&gt;
&lt;li&gt;Using Wire across TCP/IP opens up the possibility of Cloud Native deployment of Chronicle-based applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-1-introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;One of the most important issues when building distributed applications is that of data representation. We must ensure that data sent by a component to a &amp;ldquo;remote&amp;rdquo; component (i.e. one that is part of a different process) is received correctly, with the same values. This may seem straightforward but remember that the communicating components may have been written in completely different languages.&lt;/p&gt;</description></item><item><title>Upgrade to Jakarta EE 10 and GlassFish 7: Easier Than You Think!</title><link>https://foojayio.github.io/website/today/how-to-upgrade-to-jakarta-ee-10-and-glassfish-7-its-much-easier-than-you-think/</link><pubDate>Tue, 27 Jun 2023 07:29:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-upgrade-to-jakarta-ee-10-and-glassfish-7-its-much-easier-than-you-think/</guid><description>&lt;p&gt;Upgrading to Jakarta EE 10 from an older version of Jakarta EE or Java EE can be a bit tricky and may require some extra attention to detail. But don&amp;rsquo;t worry, we&amp;rsquo;ve got you covered!&lt;/p&gt;
&lt;p&gt;In this series of articles, we&amp;rsquo;ll explain everything you need to know before upgrading to Jakarta EE 10 and guide you to complete the upgrade successfully and in almost no time.&lt;/p&gt;
&lt;h2 id="h2-0-types-of-challenges"&gt;Types of challenges&lt;/h2&gt;
&lt;p&gt;The challenges with upgrading to Jakarta EE 10 or to Eclipse GlassFish 7 fall into these 3 main categories:&lt;/p&gt;</description></item><item><title>Introducing the Foojay.io Calendar API</title><link>https://foojayio.github.io/website/today/foojay-calendar-api/</link><pubDate>Thu, 22 Jun 2023 06:40:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-calendar-api/</guid><description>&lt;p&gt;We are excited to share that Foojay is growing and offering additional resources to bring the Java and OpenJDK community together on a global scale.&lt;/p&gt;
&lt;p&gt;Several months ago, we launched the &lt;a href="https://foojayio.github.io/website/calendar"&gt;Foojay Calendar&lt;/a&gt;
, an interactive platform that allows individuals to propose Java-related and Kotlin-related and any other OpenJDK-related events and add them to the calendar.&lt;/p&gt;
&lt;p&gt;All Foojay members are welcome to submit their events. Once reviewed, the event will be included in the calendar.
&lt;img src="https://foojayio.github.io/website/today/foojay-calendar-api/calendar_preview-1024x535.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Building Custom Solutions vs. Buy-and-Build Software</title><link>https://foojayio.github.io/website/today/building-custom-solutions-vs-buy-and-build-software/</link><pubDate>Wed, 21 Jun 2023 14:41:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-custom-solutions-vs-buy-and-build-software/</guid><description>&lt;h3 id="h3-0-the-challenges-of-building-a-fix-engine"&gt;The Challenges of Building a FIX Engine&lt;/h3&gt;
&lt;p&gt;The first day I was introduced to &lt;a href="https://en.wikipedia.org/wiki/Financial_Information_eXchange" target="_blank" rel="noopener noreferrer"&gt;Financial Information eXchange (FIX)&lt;/a&gt;
 was when I worked at an investment bank in London as a developer.&lt;/p&gt;
&lt;p&gt;I was told to write a feed handler to retrieve market data.&lt;/p&gt;
&lt;p&gt;Bear in mind that at this time, I knew nothing about FIX, apart from Googling it for about 10 mins on the internet.&lt;/p&gt;
&lt;p&gt;With a touch of overconfidence and slight arrogance, I set to work coding a direct socket connection to the remote FIX endpoint, &amp;ldquo;how hard could it be?&amp;rdquo;&lt;/p&gt;</description></item><item><title>Exploring Java 21's Intriguing Additions (Part 1)</title><link>https://foojayio.github.io/website/today/exploring-java-21s-intriguing-additions-unveiling-new-features-part-1/</link><pubDate>Tue, 20 Jun 2023 13:40:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-java-21s-intriguing-additions-unveiling-new-features-part-1/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction:&lt;/h2&gt;
&lt;p&gt;Java 21 is going to introduce several intriguing additions that enhance the language&amp;rsquo;s capabilities.&lt;/p&gt;
&lt;p&gt;This article aims to discuss a few notable features that stand out, providing an overview of their functionalities and potential use cases.&lt;/p&gt;
&lt;br /&gt;
&lt;h2 id="h2-1-character-enhancements"&gt;Character Enhancements:&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Character.isEmoji(int codePoint)&lt;/code&gt;: This method determines whether a character is considered an emoji based on its Unicode properties defined in Unicode Emoji (&lt;a href="https://unicode.org/reports/tr51/#Emoji_Properties_and_Data_Files" target="_blank" rel="noopener noreferrer"&gt;Unicode Emoji Technical Standard #51&lt;/a&gt;
). For example, executing &lt;code&gt;Character.isEmoji(9203)&lt;/code&gt; would return &lt;code&gt;true&lt;/code&gt; for the character ⏳, which has the code point 9203.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Character.isEmojiPresentation(int codePoint)&lt;/code&gt;: Similar to &lt;code&gt;isEmoji()&lt;/code&gt;, this method checks if a character has the Emoji Presentation property. It helps identify characters that display as emojis when rendered.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Example:&lt;/p&gt;</description></item><item><title>Manifold vs. Lombok: Enhancing Java with Property Support</title><link>https://foojayio.github.io/website/today/manifold-vs-lombok-enhancing-java-with-property-support/</link><pubDate>Mon, 19 Jun 2023 18:04:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/manifold-vs-lombok-enhancing-java-with-property-support/</guid><description>&lt;p&gt;Today, we&amp;rsquo;ll explore an intriguing aspect of Manifold: its property support.&lt;/p&gt;
&lt;p&gt;In comparison, we&amp;rsquo;ll also examine Lombok, a popular library that offers similar features.&lt;/p&gt;
&lt;p&gt;By analyzing the differences between these two projects, we can gain insight into their core philosophies and advantages.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s dive in and discover how Manifold&amp;rsquo;s property support stands out.&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/z-9jSMq_Yk8?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;As always, you can find the code examples and additional resources for this post on my &lt;a href="https://github.com/shai-almog/java-book/" target="_blank" rel="noopener noreferrer"&gt;GitHub page&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Operator Overloading in Java</title><link>https://foojayio.github.io/website/today/operator-overloading-in-java/</link><pubDate>Sat, 10 Jun 2023 12:19:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/operator-overloading-in-java/</guid><description>&lt;p&gt;In this article, we&amp;rsquo;ll delve into the fascinating world of operator overloading in Java.&lt;/p&gt;
&lt;p&gt;Although Java doesn&amp;rsquo;t natively support operator overloading, we&amp;rsquo;ll discover how Manifold can extend Java with that functionality.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll explore its benefits, limitations, and use cases, particularly in scientific and mathematical code.&lt;/p&gt;
&lt;p&gt;We will also explore three powerful features provided by Manifold that enhance the default Java type safety while enabling impressive programming techniques.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll discuss unit expressions, type-safe reflection coding, and fixing methods like equals during compilation.&lt;/p&gt;</description></item><item><title>Java String Templates Today</title><link>https://foojayio.github.io/website/today/java-string-templates-today/</link><pubDate>Fri, 02 Jun 2023 16:28:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-string-templates-today/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/revolutionize-json-parsing-in-java-with-manifold/"&gt;our last article&lt;/a&gt;
, we introduced you to the &lt;a href="http://manifold.systems/" target="_blank" rel="noopener noreferrer"&gt;Manifold&lt;/a&gt;
 project and how it offers a revolutionary set of language extensions for Java, including the ability to parse and process JSON files seamlessly in Java.&lt;/p&gt;
&lt;p&gt;Today, we will take a look at another exciting feature of the Manifold project: &lt;strong&gt;string templates&lt;/strong&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/ite6a5y50yQ?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;But before we get to that, some of the feedback I got from the previous post was that I was unclear about Manifold. Manifold is a combination of an IDE plugin and plugins to Maven or Gradle.&lt;/p&gt;</description></item><item><title>Java is Very Fast, If You Don’t Create Many Objects</title><link>https://foojayio.github.io/website/today/java-is-very-fast/</link><pubDate>Thu, 01 Jun 2023 04:45:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-is-very-fast/</guid><description>&lt;p&gt;This article looks at a benchmark passing events over TCP/IP at 4 billion events per minute using the net.openhft.chronicle.wire.channel package in &lt;a href="https://chronicle.software/wire/?utm_source=article&amp;amp;amp;utm_medium=foojay&amp;amp;amp;utm_campaign=java-is-fast" title="Chronicle Wire" target="_blank" rel="noopener noreferrer"&gt;Chronicle Wire&lt;/a&gt;
 and why we aim to avoid object allocations.&lt;/p&gt;
&lt;p&gt;One of the key optimisations is creating almost no garbage. Allocation is supposed to be a very cheap operation and garbage collection of very short lived objects is also very cheap.&lt;/p&gt;
&lt;p&gt;Does not allocating really make such a difference? What difference does one small object per event (44 bytes) make to the performance in a throughput test where GC pauses are amortised?&lt;/p&gt;</description></item><item><title>Boosting Similarity Search with Real-time Stream Processing</title><link>https://foojayio.github.io/website/today/boosting-similarity-search-with-real-time-stream-processing/</link><pubDate>Tue, 30 May 2023 12:42:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/boosting-similarity-search-with-real-time-stream-processing/</guid><description>&lt;p&gt;The goal of similarity search and vector databases is to find similar results to the search query for unstructured data, such as text, images and videos. The unstructured data first is vectorised, and stored in a vector format. There are publicly available tools to create vectors from unstructured data, similarly, there are vector databases to store and perform similarity searches. This is important because of the rising popularity of Large Language Models (LLMs) and their combination with vector databases.&lt;/p&gt;</description></item><item><title>Revolutionize JSON Parsing in Java with Manifold</title><link>https://foojayio.github.io/website/today/revolutionize-json-parsing-in-java-with-manifold/</link><pubDate>Fri, 26 May 2023 17:39:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/revolutionize-json-parsing-in-java-with-manifold/</guid><description>&lt;p&gt;Java developers have often envied JavaScript for its ease of parsing JSON.&lt;/p&gt;
&lt;p&gt;Although Java offers more robustness, it tends to involve more work and boilerplate code.&lt;/p&gt;
&lt;p&gt;Thanks to the Manifold project, Java now has the potential to outshine JavaScript in parsing and processing JSON files.&lt;/p&gt;
&lt;p&gt;Manifold is a revolutionary set of language extensions for Java that completely changes the way we handle JSON (and much more&amp;hellip;).&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/AoBnGZ7q6rk?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-getting-started-with-manifold"&gt;Getting Started with Manifold&lt;/h2&gt;
&lt;p&gt;The code for this tutorial can be found on my &lt;a href="https://github.com/shai-almog/java-book/" target="_blank" rel="noopener noreferrer"&gt;GitHub page&lt;/a&gt;
. Manifold is relatively young but already vast in its capabilities. You can learn more about the project on their website and Slack channel.&lt;/p&gt;</description></item><item><title>Rolling Binary Trees: A Guide to Common Design Patterns in Java</title><link>https://foojayio.github.io/website/today/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/</link><pubDate>Wed, 24 May 2023 12:55:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Binary trees are fundamental data structures, ubiquitous in computer science and software engineering. We use them to represent hierarchical data and implement more complex data structures, such as search trees, syntax trees, cryptographic hash trees, space partitioning trees, heaps, and so on. Common binary tree operations include insertion, deletion, traversal, and rotation.&lt;/p&gt;
&lt;p&gt;A relatively uncommon and unexplored operation is &lt;strong&gt;roll&lt;/strong&gt; , which modifies the structure of a binary tree in such a way that, when visualized, the newly obtained structure appears to be rolled at a 90-degree angle, either clockwise or counterclockwise. This gives us two variants of the roll operation &amp;mdash; &lt;strong&gt;clockwise roll&lt;/strong&gt; (CR) and &lt;strong&gt;counterclockwise roll&lt;/strong&gt; (CCR).&lt;/p&gt;</description></item><item><title>Enriching Kafka Applications with Contextual Data</title><link>https://foojayio.github.io/website/today/enriching-kafka-applications-with-contextual-data/</link><pubDate>Thu, 18 May 2023 15:11:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/enriching-kafka-applications-with-contextual-data/</guid><description>&lt;p&gt;Developing high-performance large-stream processing applications is a challenging task.&lt;/p&gt;
&lt;p&gt;Choosing the right tool(s) is crucial to get the job done; as developers, we tend to focus on performance, simplicity, and cost.&lt;/p&gt;
&lt;p&gt;However, the cost becomes relatively high if we end up with two or more tools to do the same task.&lt;/p&gt;
&lt;p&gt;Simply put, you need to multiply development time, deployment time, and maintenance costs by the number of tools.&lt;/p&gt;
&lt;h2 id="h2-0-kafka"&gt;Kafka&lt;/h2&gt;
&lt;p&gt;Kafka is great for event streaming architectures, continuous data integration (ETL), and messaging systems of record (database).&lt;/p&gt;</description></item><item><title>Monitoring Event Loops for Blockages</title><link>https://foojayio.github.io/website/today/monitoring-event-loops-for-blockages/</link><pubDate>Mon, 15 May 2023 16:42:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/monitoring-event-loops-for-blockages/</guid><description>&lt;p&gt;Chronicle&amp;rsquo;s open source &lt;a href="https://github.com/OpenHFT/Chronicle-Threads" title="Chronicle Threads " target="_blank" rel="noopener noreferrer"&gt;Chronicle Threads&lt;/a&gt;
library has a little known feature which is one of the first tools I get from my bag if a client reports that they are seeing latency outliers.&lt;/p&gt;
&lt;p&gt;The usual way that a developer will measure their system for latency hotspots is to use a profiler, and modern profilers are amazing; there are numerous commercially available, but I generally find myself using Java Flight Recorder, async-profiler, or honest-profiler. These three are engineered to avoid the &lt;a href="https://stackoverflow.com/questions/17839933/what-are-safe-points-and-safe-point-polling-in-context-of-profiling" title="safepoint bias" target="_blank" rel="noopener noreferrer"&gt;safepoint bias&lt;/a&gt;
, and thus give very accurate results.&lt;/p&gt;</description></item><item><title>Analyzing dependencies in IntelliJ IDEA</title><link>https://foojayio.github.io/website/today/analyzing-dependencies-in-intellij-idea/</link><pubDate>Thu, 11 May 2023 09:33:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/analyzing-dependencies-in-intellij-idea/</guid><description>&lt;p&gt;If you&amp;rsquo;re working on a real world project, you&amp;rsquo;re probably using external dependencies.&lt;/p&gt;
&lt;p&gt;You might need to analyze which dependencies your application uses.&lt;/p&gt;
&lt;p&gt;For example, you may want to find out how a particular version of a dependency ended up in your application.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s take a look at how IntelliJ IDEA can help you to analyze dependencies.&lt;/p&gt;
&lt;p&gt;We can view our dependencies in the Maven or Gradle tool window.&lt;/p&gt;
&lt;p&gt;Here, we can expand dependencies to show their transitive dependencies, or collapse them again.&lt;/p&gt;</description></item><item><title>Spring Boot Debugging with Aspect-Oriented Programming (AOP)</title><link>https://foojayio.github.io/website/today/spring-boot-debugging-with-aspect-oriented-programming-aop/</link><pubDate>Fri, 05 May 2023 08:19:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-debugging-with-aspect-oriented-programming-aop/</guid><description>&lt;p&gt;Aspect-Oriented Programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns.&lt;/p&gt;
&lt;p&gt;In simple terms, it helps you keep your code clean, modular, and easy to maintain.&lt;/p&gt;
&lt;p&gt;We can leverage AOP to debug Spring Boot applications more effectively and seamlessly.&lt;/p&gt;
&lt;p&gt;In this post, we will explore how to use AOP to debug a Spring Boot application effectively.&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/6kxpkcEqssw?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-aop-concepts"&gt;AOP Concepts&lt;/h2&gt;
&lt;p&gt;Before diving into debugging with AOP, it is essential to understand the core concepts. AOP lets us write code that executes before or after a method. It includes the following common terms:&lt;/p&gt;</description></item><item><title>Creating Scalable OpenAI GPT Applications in Java</title><link>https://foojayio.github.io/website/today/creating-scalable-openai-gpt-applications-in-java/</link><pubDate>Thu, 27 Apr 2023 14:18:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-scalable-openai-gpt-applications-in-java/</guid><description>&lt;p&gt;One of the more notable aspects of ChatGPT is its engine, which not only powers the web-based chatbot but can also be integrated into your Java applications.&lt;/p&gt;
&lt;p&gt;Whether you prefer reading or watching, let&amp;rsquo;s review how to start using the OpenAI GPT engine in your Java projects in a scalable way, by sending prompts to the engine only when necessary:&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/8bpIXrz7xJw?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;Imagine you want to visit a city and have a specific budget in mind. How should you spend the money and make your trip memorable? This is an excellent question to delegate to the OpenAI engine.&lt;/p&gt;</description></item><item><title>Relearning Java Thread Primitives</title><link>https://foojayio.github.io/website/today/relearning-java-thread-primitives/</link><pubDate>Tue, 25 Apr 2023 05:26:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/relearning-java-thread-primitives/</guid><description>&lt;p&gt;I&amp;rsquo;ve coded in Java since the first beta, even back then threads were at the top of my list of favorite features.&lt;/p&gt;
&lt;p&gt;Java was the first language to introduce thread support in the language itself, it was a controversial decision back then.&lt;/p&gt;
&lt;p&gt;In the past decade, every language raced to include async/await and &lt;a href="https://github.com/awaitility/awaitility" target="_blank" rel="noopener noreferrer"&gt;even Java had some third-party support for that&lt;/a&gt;
&amp;hellip;&lt;/p&gt;
&lt;p&gt;But Java zigged instead of zagging and introduced the far superior &lt;a href="https://www.youtube.com/watch?v=4mf24mzm0ks" target="_blank" rel="noopener noreferrer"&gt;virtual threads (project Loom)&lt;/a&gt;
. This article isn&amp;rsquo;t about that.&lt;/p&gt;</description></item><item><title>Hidden Beauties of Java Enums</title><link>https://foojayio.github.io/website/today/hidden-beauties-of-java-enums/</link><pubDate>Tue, 11 Apr 2023 07:02:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/hidden-beauties-of-java-enums/</guid><description>&lt;p&gt;Let&amp;rsquo;s take a look at the power and beauty of what Java Enums can provide&amp;hellip;&lt;/p&gt;
&lt;p&gt;I also created a video describing the same topics based on this article, so you can follow along combining both the video and this post.&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/U09ZQ3kjuqM?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-what-is-an-enum"&gt;What is an Enum?&lt;/h2&gt;
&lt;p&gt;Enums are the preferred way to define fixed values you want to use in your code. They are a special type of Java class and contain a group of unchangeable variables.&lt;/p&gt;</description></item><item><title>Cherry-Pick: Move a Commit to a Different Branch</title><link>https://foojayio.github.io/website/today/cherry-pick-move-a-commit-to-a-different-branch/</link><pubDate>Wed, 05 Apr 2023 13:53:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/cherry-pick-move-a-commit-to-a-different-branch/</guid><description>&lt;p&gt;There are several reasons why you might want to move a commit to a different branch.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s take a look at some of them.&lt;/p&gt;
&lt;h2 id="h2-0-committed-to-the-wrong-branch"&gt;Committed to the wrong branch&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;re working on a new feature, but an urgent bug came in.&lt;/p&gt;
&lt;p&gt;You fixed the bug and committed the fix, but oops&amp;hellip; you forgot to create a new branch for the bugfix!&lt;/p&gt;
&lt;p&gt;Now this bugfix is on the wrong branch. How do we fix this?
&lt;img src="https://foojayio.github.io/website/today/cherry-pick-move-a-commit-to-a-different-branch/CommitOnWrongBranch-1024x575.png" alt="IntelliJ IDEA Git log window showing a bugfix commit on a new-feature branch" loading="lazy"&gt;
 Bugfix commit is on the wrong branch&lt;/p&gt;</description></item><item><title>DevOps For Developers: Continuous Integration, GitHub Actions</title><link>https://foojayio.github.io/website/today/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/</link><pubDate>Tue, 04 Apr 2023 07:35:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/</guid><description>&lt;p&gt;I first ran into the concept of Continuous Integration (CI) when the Mozilla project launched.&lt;/p&gt;
&lt;p&gt;It included a rudimentary build server as part of the process and this was revolutionary at the time.&lt;/p&gt;
&lt;p&gt;I was maintaining a C++ project that took 2 hours to build and link.&lt;/p&gt;
&lt;p&gt;We rarely went through a clean build which created compounding problems as bad code was committed into the project.&lt;/p&gt;
&lt;p&gt;A lot has changed since those old days.&lt;/p&gt;</description></item><item><title>Writing a Profiler in 240 Lines of Pure Java</title><link>https://foojayio.github.io/website/today/writing-a-profiler-in-240-lines-of-pure-java/</link><pubDate>Thu, 30 Mar 2023 07:14:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/writing-a-profiler-in-240-lines-of-pure-java/</guid><description>&lt;p&gt;A few months back, I started writing a profiler from scratch, and the code since became the base of my profiler validation tools.&lt;/p&gt;
&lt;p&gt;The only problem with this project: I wanted to write a proper non-safepoint-biased profiler from scratch.&lt;/p&gt;
&lt;p&gt;This is a noble effort, but it requires lots C/C++/Unix programming which is finicky, and not everyone can read C/C++ code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;For people unfamiliar with safepoint bias: A safepoint is a point in time where the JVM has a known defined state, and all threads have stopped. The JVM itself needs safepoints to do major garbage collections, Class definitions, method deoptimizations, and more. Threads are regularly checking whether they should get into a safepoint, for example, at method entry, exit, or loop backjumps. A profiler that only profiles at a safepoint have an inherent bias because it only includes frames from the locations inside methods where Threads check for a safepoint. The only advantage is that the stack-walking at safepoints is slightly less error-prone, as there are fewer mutations of heap and stack.&lt;/em&gt; &lt;em&gt;For more information, consider reading the excellent article &lt;a href="https://seethawenner.medium.com/java-safepoint-and-async-profiling-cdce0818cd29" target="_blank" rel="noopener noreferrer"&gt;Java Safepoint and Async Profiling&lt;/a&gt;
 by Seetha Wenner, the &lt;a href="http://Why%20JVM%20modern%20profilers%20are%20still%20safepoint%20biased?" target="_blank" rel="noopener noreferrer"&gt;more technical one by JP Bempel&lt;/a&gt;
, or the classic article &lt;a href="http://psy-lob-saw.blogspot.com/2015/12/safepoints.html" target="_blank" rel="noopener noreferrer"&gt;Safepoints: Meaning, Side Effects and Overheads&lt;/a&gt;
 by Nitsan Wakart. To conclude: Safepoint-biased profilers don&amp;rsquo;t give you a holistic view of your application, but can still be helpful to analyze major performance issues where you look at the bigger picture.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Watch Area and Renderers</title><link>https://foojayio.github.io/website/today/watch-area-and-renderers/</link><pubDate>Sat, 25 Mar 2023 07:25:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/watch-area-and-renderers/</guid><description>&lt;p&gt;This is it. The &lt;a href="https://www.amazon.com/dp/1484290410/" target="_blank" rel="noopener noreferrer"&gt;debugging book is live&lt;/a&gt;
. I would really appreciate reviews and feedback!&lt;/p&gt;
&lt;p&gt;I also finished recording and editing the &lt;a href="https://course.debugagent.com/" target="_blank" rel="noopener noreferrer"&gt;entire course&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;There are 50 total videos which total in 7 hours&amp;hellip; I also recorded additional videos for the two other free courses &lt;a href="https://www.youtube.com/watch?v=1Bum2gYETUQ&amp;amp;amp;list=PL8GhfcywW9YMucwRw2IbpeCp1FBMEgsmk" target="_blank" rel="noopener noreferrer"&gt;for beginners&lt;/a&gt;
 and for &lt;a href="https://www.youtube.com/watch?v=3oNT_VRrfqE&amp;amp;amp;list=PL8GhfcywW9YNuNHrG0FAg5xiprfYcYyuL" target="_blank" rel="noopener noreferrer"&gt;modern Java&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;So keep an eye on those!&lt;/p&gt;
&lt;h2 id="h2-0-renderers"&gt;Renderers&lt;/h2&gt;
&lt;p&gt;In today&amp;rsquo;s video we discuss one of my favorite obscure IDE features: renderers. Very few people are aware of them. I explained them in the past but I feel I didn&amp;rsquo;t properly explain why they are so much better than any other alternative. This time I think I got the explanation right.&lt;/p&gt;</description></item><item><title>How to Build and Deploy a Real-time Cloud-based Logging System</title><link>https://foojayio.github.io/website/today/how-to-build-and-deploy-a-real-time-cloud-based-logging-system/</link><pubDate>Fri, 24 Mar 2023 15:04:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-build-and-deploy-a-real-time-cloud-based-logging-system/</guid><description>&lt;p&gt;Logs and traces generated by applications are valuable sources of information that can help detect issues and improve performance.&lt;/p&gt;
&lt;p&gt;However, they are often treated separately from other data, even though they are no different from the data an application works with.&lt;/p&gt;
&lt;p&gt;In this tutorial, we will explore a different approach: treating logs and traces as part of a scalable cloud storage repository that can be analysed with the same techniques used for big data.&lt;/p&gt;</description></item><item><title>5 Great Reasons to use jOOQ</title><link>https://foojayio.github.io/website/today/5-great-reasons-to-use-jooq/</link><pubDate>Wed, 22 Mar 2023 14:45:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/5-great-reasons-to-use-jooq/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Hi, I&amp;rsquo;m &lt;a href="https://twitter.com/lukaseder" title="Lukas" target="_blank" rel="noopener noreferrer"&gt;Lukas&lt;/a&gt;
. I was invited to talk about the business behind jOOQ on Foojay.io and as a short introduction to &lt;a href="https://www.jooq.org/" title="jOOQ" target="_blank" rel="noopener noreferrer"&gt;jOOQ&lt;/a&gt;
, I&amp;rsquo;d like to highlight 5 great reasons to use it.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Before discussing those reasons:&lt;/p&gt;
&lt;h2 id="h2-0-what-is-jooq"&gt;What is jOOQ&lt;/h2&gt;
&lt;p&gt;jOOQ is an internal &lt;a href="https://en.wikipedia.org/wiki/Domain-specific_language" title="domain-specific language " target="_blank" rel="noopener noreferrer"&gt;domain-specific language&lt;/a&gt;
 (DSL) modelling the SQL language as an API directly in Java.&lt;/p&gt;
&lt;p&gt;This provides compile-time type safety to your query and enables a lot of other interesting features that I&amp;rsquo;ll show later.&lt;/p&gt;</description></item><item><title>Efficient Memory Mapping for Terabyte Sparse Files in Java</title><link>https://foojayio.github.io/website/today/efficient-memory-mapping-for-terabyte-sparse-files-in-java/</link><pubDate>Wed, 15 Mar 2023 11:50:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/efficient-memory-mapping-for-terabyte-sparse-files-in-java/</guid><description>&lt;p&gt;On Linux, you can create &lt;a href="https://en.wikipedia.org/wiki/Sparse_file" title="sparse files" target="_blank" rel="noopener noreferrer"&gt;sparse files&lt;/a&gt;
, where only the pages (of 4 KiB) that are touched utilise either memory or disk space.&lt;/p&gt;
&lt;p&gt;This allows you to memory map large virtual regions without worrying about wasted memory or disk&lt;/p&gt;
&lt;p&gt;In this program, you can see it reserves 8 TiB (8,192 GiB)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/efficient-memory-mapping-for-terabyte-sparse-files-in-java/Screen-Shot-2023-03-06-at-11.11.24-AM-1024x480.png" alt="" loading="lazy"&gt;
&lt;br&gt;
&lt;em&gt;Figure 1. Test 1: Sparse file&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Tip: x &amp;lt;&amp;lt; y means x × 2y therefore:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic"&gt;1L &amp;lt;&amp;lt; 10 = 1 KiB (1024 bytes),
1L &amp;lt;&amp;lt; 20 = 1 MiB (10242 bytes),
1L &amp;lt;&amp;lt; 30 = 1 GiB (10243 bytes),
1L &amp;lt;&amp;lt; 40 = 1 TiB etc&lt;/pre&gt;
&lt;p&gt;Using multiples of 10 for the shift makes them easier to read.&lt;/p&gt;</description></item><item><title>How Gradle Works: Inside the Daemon</title><link>https://foojayio.github.io/website/today/how-gradle-works-inside-the-daemon/</link><pubDate>Tue, 14 Mar 2023 11:27:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-gradle-works-inside-the-daemon/</guid><description>&lt;p&gt;Previously in the &lt;em&gt;How Gradle Works&lt;/em&gt;series:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/how-gradle-works-startup/"&gt;How Gradle Works: Startup&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is the second article of the series &lt;em&gt;How Gradle Works&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll explain what happens inside the &lt;code&gt;Gradle Daemon JVM&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="h2-0-why-do-we-need-gradle-daemon"&gt;Why Do We Need Gradle Daemon?&lt;/h2&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/how-gradle-works-startup/"&gt;the last article&lt;/a&gt;
, we mentioned that Gradle starts a &lt;code&gt;Gradle Daemon JVM&lt;/code&gt; (&amp;ldquo;the daemon&amp;rdquo;) to run the build.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.gradle.org/current/userguide/gradle_daemon.html" target="_blank" rel="noopener noreferrer"&gt;The userguide&lt;/a&gt;
 explains why we need the daemon.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Daemon is a long-lived background process that reduces the time it takes to run a build. The Daemon reduces build times by caching project information across builds, running in the background so every Gradle build doesn&amp;rsquo;t have to wait for JVM startup, benefiting from continuous runtime optimization in the JVM, and watching the file system to calculate exactly what needs to be rebuilt before you run a build.&lt;/p&gt;</description></item><item><title>Getting Started with IntelliJ IDEA</title><link>https://foojayio.github.io/website/today/getting-started-with-intellij-idea/</link><pubDate>Mon, 13 Mar 2023 08:26:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/getting-started-with-intellij-idea/</guid><description>&lt;p&gt;First up, I have&lt;a href="https://www.jetbrains.com/idea/guide/tutorials/getting-started-intellij-idea/" target="_blank" rel="noopener noreferrer"&gt;created a tutorial on the IntelliJ IDEA Guide&lt;/a&gt;
 if you want to view the content with videos. I&amp;rsquo;ll concentrate on text-based for this article.&lt;/p&gt;
&lt;p&gt;When someone new joins your team, it can be quite an overwhelming experience.&lt;/p&gt;
&lt;p&gt;There are lots of people to meet, new technologies to learn, different processes to learn and of course, an IDE to learn!&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s helpful to remember what every new starter wants, they want to make a difference, they want to add value, they want to &lt;em&gt;move the needle&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>How to Get Started with the Hazelcast Viridian Serverless</title><link>https://foojayio.github.io/website/today/streaming-real-time-data-on-the-hazelcast-viridian-serverless/</link><pubDate>Fri, 10 Mar 2023 10:28:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/streaming-real-time-data-on-the-hazelcast-viridian-serverless/</guid><description>&lt;p&gt;In this tutorial, you&amp;rsquo;ll learn how to build real-time streaming applications with the Hazelcast Viridian Serverless using SQL.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll also learn how to build a materialized view from streaming data and contextual data in Hazelcast.&lt;/p&gt;
&lt;p&gt;Streaming data is data that is continuously generated in small sizes.&lt;/p&gt;
&lt;p&gt;Streaming data includes a wide variety of sources such as retail purchases, financial trades, or telemetry from connected vehicles.&lt;/p&gt;
&lt;p&gt;This data isn&amp;rsquo;t usually useful by itself because of its size.&lt;/p&gt;</description></item><item><title>How to Best Use Java Records as DTOs in Spring Boot 3</title><link>https://foojayio.github.io/website/today/how-to-best-use-java-records-as-dtos-in-spring-boot-3/</link><pubDate>Thu, 09 Mar 2023 17:06:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-best-use-java-records-as-dtos-in-spring-boot-3/</guid><description>&lt;p&gt;With the Spring 6 and Spring Boot 3 releases, &lt;a href="https://spring.io/blog/2022/11/16/spring-framework-6-0-goes-ga" title="Java 17&amp;#43; became the baseline framework" target="_blank" rel="noopener noreferrer"&gt;Java 17+ became the baseline framework&lt;/a&gt;
 version.&lt;/p&gt;
&lt;p&gt;So now is a great time to start using compact &lt;a href="https://docs.oracle.com/en/java/javase/14/language/records.html" title="Java Records" target="_blank" rel="noopener noreferrer"&gt;Java Records&lt;/a&gt;
 as Data Transfer Objects (&lt;a href="https://en.wikipedia.org/wiki/Data_transfer_object" title="DTOs" target="_blank" rel="noopener noreferrer"&gt;DTOs&lt;/a&gt;
) for various database and API calls.&lt;/p&gt;
&lt;p&gt;Whether you prefer reading or watching, let&amp;rsquo;s review a few approaches for using Java records as DTOs that apply to Spring Boot 3 with Hibernate 6 as the persistence provider.&lt;/p&gt;</description></item><item><title>Is it Time to go Back to the Monolith?</title><link>https://foojayio.github.io/website/today/is-it-time-to-go-back-to-the-monolith/</link><pubDate>Fri, 03 Mar 2023 15:58:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/is-it-time-to-go-back-to-the-monolith/</guid><description>&lt;p&gt;History repeats itself. Everything old is new again and I&amp;rsquo;ve been around long enough to see ideas discarded, rediscovered and return triumphantly to overtake the fad.&lt;/p&gt;
&lt;p&gt;In recent years SQL has made a tremendous comeback from the dead. We love relational databases all over again. I think the Monolith will have its space odyssey moment again. Microservices and serverless are trends pushed by the cloud vendors, designed to sell us more cloud computing resources.&lt;/p&gt;</description></item><item><title>42 Practical Java Design Patterns: Builder and More</title><link>https://foojayio.github.io/website/today/42-practical-java-design-patterns-builder-and-more/</link><pubDate>Mon, 27 Feb 2023 08:27:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/42-practical-java-design-patterns-builder-and-more/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/42-practical-java-design-patterns-builder-and-more/book_cover-414x510.jpeg" alt="Figure 1: Hone your software design skills" loading="lazy"&gt;
 &lt;strong&gt;Figure 1&lt;/strong&gt;.: Hone your software design skills&lt;/p&gt;
&lt;p&gt;The aim of the article is to introduce my newly published book &amp;ldquo;Practical Design Pattern for Java Developers&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Together, we&amp;rsquo;ll explore today&amp;rsquo;s application development challenges and dive deeper into some of Java&amp;rsquo;s new language enhancements by exploring the &lt;strong&gt;Builder&lt;/strong&gt; Design pattern in more detail.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;T&lt;/strong&gt;he days when applications were developed &amp;ldquo;ad hoc&amp;rdquo; seem to have ended only on paper.&lt;/p&gt;</description></item><item><title>How to Get Started with the Hazelcast Viridian Serverless</title><link>https://foojayio.github.io/website/today/how-to-get-started-with-the-hazelcast-viridian-serverless/</link><pubDate>Wed, 22 Feb 2023 08:13:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-get-started-with-the-hazelcast-viridian-serverless/</guid><description>&lt;p&gt;Hazelcast Serverless means that Hazelcast manages your Cloud infrastructure for you.&lt;/p&gt;
&lt;p&gt;Each Viridian Serverless cluster is an independent deployment of Hazelcast Platform in a Kubernetes container.&lt;/p&gt;
&lt;p&gt;This design guarantees resource isolation, prevents resource stealing, and provides isolated network access.&lt;/p&gt;
&lt;p&gt;Viridian Serverless clusters come in two types:1) Development: Capped storage.&lt;/p&gt;
&lt;p&gt;You can store at most 1 GiB of data; and 2) Production: Uncapped storage.&lt;/p&gt;
&lt;p&gt;The cluster scales as you add or remove data. In this tutorial, you&amp;rsquo;ll learn how to connect a client to a cluster and use SQL to query data in the cluster.&lt;/p&gt;</description></item><item><title>Web App Startup in 3ms with RIFE2 and GraalVM</title><link>https://foojayio.github.io/website/today/web-app-startup-in-3ms-with-rife2-and-graalvm/</link><pubDate>Tue, 21 Feb 2023 09:12:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/web-app-startup-in-3ms-with-rife2-and-graalvm/</guid><description>&lt;p&gt;&lt;a href="https://rife2.com" target="_blank" rel="noopener noreferrer"&gt;RIFE2&lt;/a&gt;
 applications already launch quickly with a regular JVM thanks merely calling Java methods, lambdas and doing object instantiations at startup. There are no annotations to scan for, nor any declarations or config files to parse and resolve.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/gbevin/rife2/releases/tag/1.3.0" target="_blank" rel="noopener noreferrer"&gt;RIFE2 v1.3.0 release&lt;/a&gt;
 introduced experimental support for GraalVM Ahead-Of-Time compilation with native-image, reducing the startup time of the bootstrap project from 177ms to an incredible 3ms.&lt;/p&gt;
&lt;h2 id="h2-0-try-it-out-yourself"&gt;Try it out yourself&lt;/h2&gt;
&lt;p&gt;In order to try this out, you can download the latest &lt;a href="https://www.graalvm.org/downloads/" target="_blank" rel="noopener noreferrer"&gt;GraalVM&lt;/a&gt;
 JDK 19 distribution, and follow the steps to install &lt;a href="https://www.graalvm.org/dev/reference-manual/native-image/" target="_blank" rel="noopener noreferrer"&gt;native-image&lt;/a&gt;
 on your machine.&lt;/p&gt;</description></item><item><title>What are you Missing by Debugging in VS Code?</title><link>https://foojayio.github.io/website/today/what-are-you-missing-by-debugging-in-vs-code/</link><pubDate>Fri, 17 Feb 2023 16:20:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-are-you-missing-by-debugging-in-vs-code/</guid><description>&lt;p&gt;In the first chapter of my debugging book, I discuss IDE debugging.&lt;/p&gt;
&lt;p&gt;In that chapter, I mostly talk about IntelliJ/IDEA.&lt;/p&gt;
&lt;p&gt;People often ask me why I didn&amp;rsquo;t write as much about VS Code&amp;hellip;&lt;/p&gt;
&lt;p&gt;The reason is that there isn&amp;rsquo;t much to write about. Its debugger is simpler for better and for worse. It isn&amp;rsquo;t as powerful as other IDEs. I created the following video that covers the content of this post:&lt;/p&gt;</description></item><item><title>How to Find &amp; Fix Vulnerabilities with IntelliJ IDEA Ultimate</title><link>https://foojayio.github.io/website/today/package-checker-find-fix-vulnerabilities-with-intellij-idea-ultimate/</link><pubDate>Mon, 13 Feb 2023 09:09:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/package-checker-find-fix-vulnerabilities-with-intellij-idea-ultimate/</guid><description>&lt;p&gt;In this article, we&amp;rsquo;re going to take a look at the &lt;a href="https://plugins.jetbrains.com/plugin/18337-package-checker" target="_blank" rel="noopener noreferrer"&gt;Package Checker plugin&lt;/a&gt;
, that&amp;rsquo;s bundled with &lt;a href="https://www.jetbrains.com/idea/" target="_blank" rel="noopener noreferrer"&gt;IntelliJ IDEA Ultimate&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll have a look at how to view known vulnerabilities in your Maven or Gradle projects, how to get more information about the known vulnerabilities in a specific dependency and how to remediate these vulnerabilities inside IntelliJ IDEA Ultimate if a new version with a fix is available.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://foojayio.github.io/website/plugin.png" title="Package Checker plugin"&gt;&lt;img src="https://foojayio.github.io/website/today/package-checker-find-fix-vulnerabilities-with-intellij-idea-ultimate/plugin.png" alt="Package Checker plugin" title="Package Checker plugin" loading="lazy"&gt;
&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>Remote Debugging Dangers and Pitfalls</title><link>https://foojayio.github.io/website/today/remote-debugging-dangers-and-pitfalls/</link><pubDate>Fri, 10 Feb 2023 10:14:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/remote-debugging-dangers-and-pitfalls/</guid><description>&lt;p&gt;This is the last part of the debugging series, to learn the rest you&amp;rsquo;ll need to get &lt;a href="https://www.amazon.com/dp/1484290410/" target="_blank" rel="noopener noreferrer"&gt;the book&lt;/a&gt;
 or &lt;a href="https://course.debugagent.com/" target="_blank" rel="noopener noreferrer"&gt;the course&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;One of the most frequently asked questions I receive is: can we do these things in VS Code?&lt;/p&gt;
&lt;p&gt;The answer is unfortunately no. But I elaborate on the debugging capabilities of VS Code in &lt;a href="https://www.youtube.com/watch?v=OBgLeRwjlAc" target="_blank" rel="noopener noreferrer"&gt;this video&lt;/a&gt;
. I&amp;rsquo;ll do a blog post that covers that next week.&lt;/p&gt;
&lt;p&gt;Below is the last video in the series:&lt;/p&gt;</description></item><item><title>How Gradle Works: Startup</title><link>https://foojayio.github.io/website/today/how-gradle-works-startup/</link><pubDate>Thu, 09 Feb 2023 08:45:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-gradle-works-startup/</guid><description>&lt;p&gt;This is the first article of a series &lt;em&gt;How Gradle Works&lt;/em&gt;, which includes the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How Gradle starts up&lt;/li&gt;
&lt;li&gt;How many JVMs are involved in a Gradle build&lt;/li&gt;
&lt;li&gt;What happens in each JVM during the build&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;rsquo;ll explain the first topic &lt;em&gt;How Gradle Starts Up&lt;/em&gt; in this blog.&lt;/p&gt;
&lt;p&gt;Before reading on, we assume you are familiar with basic JVM/Gradle concepts (jar, classpath, wrapper, daemon, project, task, etc.).&lt;/p&gt;
&lt;h2 id="h2-0-how-gradle-starts-up"&gt;How Gradle Starts Up&lt;/h2&gt;
&lt;p&gt;There are many ways to start a Gradle build:&lt;/p&gt;</description></item><item><title>Debugging Threads and Asynchronous Code</title><link>https://foojayio.github.io/website/today/debugging-threads-and-asynchronous-code/</link><pubDate>Fri, 03 Feb 2023 10:07:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-threads-and-asynchronous-code/</guid><description>&lt;p&gt;I&amp;rsquo;m doing a community interview in the &lt;a href="https://coderanch.com/f/157/Cloud-Virtualization" target="_blank" rel="noopener noreferrer"&gt;Code Ranch&lt;/a&gt;
 drop by and ask a question to win a free book!&lt;/p&gt;
&lt;p&gt;This week we&amp;rsquo;ll discuss one of the harder problems in programming: threading. For many cases threading issues aren&amp;rsquo;t as difficult to debug. At least not in higher abstractions.&lt;/p&gt;
&lt;p&gt;Asynchronous programming is supposed to simplify the threading model but oftentimes it makes a bad situation worse by detaching us from the core context.&lt;/p&gt;</description></item><item><title>Real-time Stream Processing with Hazelcast and StreamNative</title><link>https://foojayio.github.io/website/today/real-time-stream-processing-with-hazelcast-and-streamnative/</link><pubDate>Wed, 01 Feb 2023 09:09:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/real-time-stream-processing-with-hazelcast-and-streamnative/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;One of the most useful features of real-time stream processing is to combine the strengths and advantages of various technologies to provide a unique developer experience and an efficient way of processing data in real time at scale.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hazelcast&lt;/strong&gt; is a real-time distributed computation and storage platform for consistently low latency queries, aggregation and stateful computation against real-time event streams and traditional data sources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apache Pulsar&lt;/strong&gt; is a real-time multitenant geo-replicated distributed pub-sub messaging and streaming platform for real-time workloads handling millions of events per hour.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, real-time stream processing is not an easy task, especially when combining multiple live streams with large volumes of data stored in external data storages to provide context and instant results.&lt;/p&gt;</description></item><item><title>How Java Litters Beyond the Heap: Solid-State Drives</title><link>https://foojayio.github.io/website/today/how-java-litters-beyond-the-heap-part-3-solid-state-drives/</link><pubDate>Fri, 27 Jan 2023 10:54:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-java-litters-beyond-the-heap-part-3-solid-state-drives/</guid><description>&lt;p&gt;A Java application dutifully executes your logic, leaving behind footprints in the Java heap in the form of dead objects.&lt;/p&gt;
&lt;p&gt;A garbage collector will then step in and clean out the memory for the new data. This cycle repeats until the app is stopped. This is well known.&lt;/p&gt;
&lt;p&gt;But, the Java heap is one of many places where your app can generate garbage.&lt;/p&gt;
&lt;p&gt;The application can also litter other parts of the software stack. It&amp;rsquo;s not done deliberately, but because some stack components also take advantage of garbage collection.&lt;/p&gt;</description></item><item><title>Release with JReleaser to Maven Central with GitHub Actions</title><link>https://foojayio.github.io/website/today/how-to-release-a-java-module-with-jreleaser-to-maven-central-with-github-actions/</link><pubDate>Wed, 18 Jan 2023 08:55:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-release-a-java-module-with-jreleaser-to-maven-central-with-github-actions/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This guide is outdated since 2024. There is a new version here: &lt;a href="https://foojayio.github.io/website/_wp_link_placeholder"&gt;https://foojay.io/today/how-to-publish-a-java-maven-project-to-maven-central-using-jreleaser-and-github-actions-2025-guide/&lt;/a&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;{#more-61688}&lt;/p&gt;
&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.&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;If you just want to publish your Maven project by hand, then you can follow &lt;a href="https://foojayio.github.io/website/today/how-to-publish-a-java-maven-project-to-the-maven-central-repository/" title="How to Publish a Java Maven Project to the Maven Central Repository"&gt;How to Publish a Java Maven Project to the Maven Central Repository&lt;/a&gt;
 by @&lt;a href="https://foojayio.github.io/website/today/author/tobias-briones/" title="Tobias Briones"&gt;Tobias Briones&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>JTest: Roll Out Your Own JUnit-Like Testing Framework</title><link>https://foojayio.github.io/website/today/jtest-roll-your-own-junit-like-testing-framework/</link><pubDate>Tue, 17 Jan 2023 16:11:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/jtest-roll-your-own-junit-like-testing-framework/</guid><description>&lt;p&gt;In this interactive tutorial and educational project, you&amp;rsquo;ll be helped in your understanding of the following.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A basic insight into &lt;a href="https://github.com/junit-team/junit4" target="_blank" rel="noopener noreferrer"&gt;JUnit&lt;/a&gt;
 internals.&lt;/li&gt;
&lt;li&gt;The usage of Java annotations and reflection.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You are given minimum &lt;a href="https://github.com/wlnirvana/jtest" target="_blank" rel="noopener noreferrer"&gt;starter code&lt;/a&gt;
 (~20 loc), and will have to develop a simple yet self-contained framework that can be used to write real-world unit tests.&lt;/p&gt;
&lt;p&gt;Are you ready? Let&amp;rsquo;s go! 🚀&lt;/p&gt;
&lt;h2 id="h2-0-task-0-the-big-picture"&gt;Task 0: The Big Picture&lt;/h2&gt;
&lt;p&gt;Before getting your hands dirty, it is a good idea to get a big picture of what you will code up.&lt;/p&gt;</description></item><item><title>Debugging Streams and Collections</title><link>https://foojayio.github.io/website/today/debugging-streams-and-collections/</link><pubDate>Fri, 13 Jan 2023 14:59:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-streams-and-collections/</guid><description>&lt;p&gt;I will run a book giveaway promotion on the &lt;a href="https://coderanch.com/wiki/660305/Book-Promotions-Schedule" target="_blank" rel="noopener noreferrer"&gt;Code Ranch on January 17th&lt;/a&gt;
. Be sure to be there and let your friends know. It would be great to answer your questions about debugging. I&amp;rsquo;m very excited by this and by the feedback I&amp;rsquo;m getting for &lt;a href="https://course.debugagent.com/" target="_blank" rel="noopener noreferrer"&gt;the course&lt;/a&gt;
 and new videos.&lt;/p&gt;
&lt;p&gt;I also launched a &lt;a href="https://www.youtube.com/playlist?list=PL8GhfcywW9YMucwRw2IbpeCp1FBMEgsmk" target="_blank" rel="noopener noreferrer"&gt;free new Java course for complete beginners&lt;/a&gt;
. No prior knowledge needed. This is probably not the audience for this course. But if you know someone that might be interested I&amp;rsquo;ll appreciate a share. I hope people find it useful and learn a bit about Java. I&amp;rsquo;m working on a cadence of one video per week in this beginner course.&lt;/p&gt;</description></item><item><title>Writing a Profiler from Scratch: The Profiling Loop</title><link>https://foojayio.github.io/website/today/writing-a-profiler-from-scratch-the-profiling-loop/</link><pubDate>Thu, 12 Jan 2023 15:26:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/writing-a-profiler-from-scratch-the-profiling-loop/</guid><description>&lt;br /&gt;
&lt;blockquote&gt;
&lt;p&gt;This is the second post in the series, building a profiler from scratch using AsyncGetCallTrace. Today, we&amp;rsquo;re covering wall-clock profiling and how to collect the obtain stack traces. If you&amp;rsquo;re unfamiliar with AsyncGetCallTrace, please check out my previous article in the series &lt;a href="https://foojayio.github.io/website/today/writing-a-profiler-from-scratch-introduction/"&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Our goal today is to essentially write the primary loop of a profiler and do the following every n milliseconds (where n is our chosen profiling interval):
&lt;img src="https://foojayio.github.io/website/today/writing-a-profiler-from-scratch-the-profiling-loop/diagrams3-2048x1029-1-1024x515.png" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Managing Dependencies in IntelliJ IDEA</title><link>https://foojayio.github.io/website/today/managing-dependencies-in-intellij-idea/</link><pubDate>Tue, 10 Jan 2023 15:13:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/managing-dependencies-in-intellij-idea/</guid><description>&lt;p&gt;In this tutorial, following on from &lt;a href="https://foojayio.github.io/website/today/viewing-dependencies-in-intellij-idea/"&gt;viewing dependencies&lt;/a&gt;
, we&amp;rsquo;re going to take a look at managing dependencies in IntelliJ IDEA.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll look at different ways to add dependencies to your project, and how to add, upgrade and remove dependencies using Package Search.&lt;/p&gt;
&lt;p&gt;There are several ways to add new dependencies to your project.&lt;/p&gt;
&lt;h2 id="h2-0-from-the-build-file-using-copy-paste"&gt;From the build file using copy-paste&lt;/h2&gt;
&lt;p&gt;You have probably copied a dependency from &lt;a href="https://mvnrepository.com/" target="_blank" rel="noopener noreferrer"&gt;Maven Repository&lt;/a&gt;
 (or another website) and pasted into your build file.&lt;/p&gt;</description></item><item><title>New Section Added to Foojay.io: Java Quick Start</title><link>https://foojayio.github.io/website/today/new-section-added-to-foojay-io-java-quick-start/</link><pubDate>Mon, 09 Jan 2023 09:31:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/new-section-added-to-foojay-io-java-quick-start/</guid><description>&lt;p&gt;Foojay.io aims to be the starting point for &amp;ldquo;all-things OpenJDK,&amp;rdquo; but during one of my morning walks the idea struck me that this site really needs complete beginner materials, too.&lt;/p&gt;
&lt;p&gt;As we want to spread the love for OpenJDK, i.e., Java, Kotlin, and other OpenJDK languages, the JVM, and all related technologies, we were missing an important audience: someone who is interested in an OpenJDK language, such as Java, but has no experience with it yet, and ends up on Foojay.io.&lt;/p&gt;</description></item><item><title>Spring Boot Annotation Reference-01/b</title><link>https://foojayio.github.io/website/today/spring-boot-annotation-reference-01-b/</link><pubDate>Fri, 06 Jan 2023 09:54:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-annotation-reference-01-b/</guid><description>&lt;p&gt;&lt;strong&gt;In the second part of my article series on Spring Boot Annotations, we focus on REST and Spring Stereotype Annotations.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In continuation of &lt;a href="https://foojayio.github.io/website/today/spring-boot-annotation-reference-01-a/"&gt;part 01/a of this article&lt;/a&gt;
, let&amp;rsquo;s continue our Spring Boot Annotations journey.&lt;/p&gt;
&lt;p&gt;What percentage (depth and extent) of Spring Boot Annotations do you think you really know? This includes annotations in all their glory and the power that they bring via all of their options. I am sure whatever your answer may be, you will appreciate this quote from Albert Einstein: &amp;ldquo;The more I learn, the more I realize how much I don&amp;rsquo;t know.&amp;rdquo;&lt;/p&gt;</description></item><item><title>Spring Boot Annotation Reference - 01/a</title><link>https://foojayio.github.io/website/today/spring-boot-annotation-reference-01-a/</link><pubDate>Thu, 22 Dec 2022 09:57:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-annotation-reference-01-a/</guid><description>&lt;p&gt;In 2018, I was introduced to the topic of Microservices and Spring Boot via a formal training, during my brief stint as a Senior Architect in Manila, Philippines.&lt;/p&gt;
&lt;p&gt;Though I had worked on a &amp;lsquo;similar architecture&amp;rsquo; way back in 2007-&amp;lsquo;08 while working as a Software Engineer at Symantec - I found the idea of the Uber JAR really exciting. Also, since it will now be enforced via the most popular framework brings in more possibilities.&lt;/p&gt;</description></item><item><title>Writing a Profiler from Scratch: Introduction</title><link>https://foojayio.github.io/website/today/writing-a-profiler-from-scratch-introduction/</link><pubDate>Wed, 21 Dec 2022 15:26:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/writing-a-profiler-from-scratch-introduction/</guid><description>&lt;p&gt;&lt;a href="https://github.com/jvm-profiling-tools/async-profiler" target="_blank" rel="noopener noreferrer"&gt;Async-profiler&lt;/a&gt;
 is undoubtedly one of the most used open-source Java profilers out there.&lt;/p&gt;
&lt;p&gt;Its most commonly used feature is sampling a given Java program&amp;rsquo;s stack traces and visualizing them as a flame graph. I would recommend reading the excellent &lt;a href="https://krzysztofslusarski.github.io/2022/12/12/async-manual.html" target="_blank" rel="noopener noreferrer"&gt;async-profiler manual&lt;/a&gt;
 by Krzysztof Ślusarski or taking a look at my profiling playlist on YouTube if you&amp;rsquo;re new to this tool.&lt;/p&gt;
&lt;p&gt;After using the async-profiler for a while, you might wonder: How does this tool work? And, of course, if you&amp;rsquo;re someone like me: Could I write a stripped-down versionto learn how it really works?&lt;/p&gt;</description></item><item><title>How Java Litters Beyond the Heap: Distributed Databases</title><link>https://foojayio.github.io/website/today/how-java-litters-beyond-the-heap-part-2-distributed-databases/</link><pubDate>Tue, 20 Dec 2022 11:40:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-java-litters-beyond-the-heap-part-2-distributed-databases/</guid><description>&lt;p&gt;&lt;strong&gt;Let&amp;rsquo;s create a simple Java application using a distributed database for the user data and see how the database generates litter in response to application requests.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;While the Java Virtual Machine executes our code at runtime, it generates garbage in the heap, which is dutifully collected by the garbage collector. This is a known fact.&lt;/p&gt;
&lt;p&gt;However, at the same time, Java apps don&amp;rsquo;t live in isolation and frequently communicate with services, databases, and other components. Some of those components also generate and collect garbage, while fulfilling the Java app&amp;rsquo;s requests. This is less known.&lt;/p&gt;</description></item><item><title>Foojay on Mastodon: An Update</title><link>https://foojayio.github.io/website/today/foojay-on-mastodon-an-update/</link><pubDate>Fri, 16 Dec 2022 06:45:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-on-mastodon-an-update/</guid><description>&lt;p&gt;Some weeks ago we checked here with the Java community if there was an interest to have a Java-oriented Mastodon service.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/lets-start-a-java-mastodon-community-for-friends-of-openjdk/"&gt;Let&amp;rsquo;s Start a Java Mastodon Community for Friends of OpenJDK!&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/java-mastodon-service-the-feedback/"&gt;Java Mastodon Service: The Feedback&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/foojay-mastodon-service-here-it-is"&gt;Foojay Mastodon Service: Here It Is!&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Today, Nicolas Frankel, also explained how he &lt;a href="https://foojayio.github.io/website/today/preparing-to-move-away-from-twitter/"&gt;moved from Twitter to Mastodon and has set up a cross-posting solution&lt;/a&gt;
 (automated of course, as a true good and lazy developer).&lt;/p&gt;</description></item><item><title>Debug Like a Senior Developer</title><link>https://foojayio.github.io/website/today/debug-like-a-senior-developer/</link><pubDate>Fri, 16 Dec 2022 06:34:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/debug-like-a-senior-developer/</guid><description>&lt;p&gt;My book on debugging is &lt;a href="https://www.amazon.com/dp/1484290410/" target="_blank" rel="noopener noreferrer"&gt;already on preorder&lt;/a&gt;
 and I&amp;rsquo;m super thrilled to announce I&amp;rsquo;m doing a full online course to go along with it.&lt;/p&gt;
&lt;p&gt;The course website isn&amp;rsquo;t ready yet but I already have the full outline and a lot of recorded material. I will try to drop videos at a rate of two per week in the next few months until the full course will be online.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s shaping up to be a very detailed course. I recorded the first module and half of the second module and I&amp;rsquo;m already close to 3 hours of dense recorded material!&lt;/p&gt;</description></item><item><title>What Java Version Are You Running?</title><link>https://foojayio.github.io/website/today/what-java-version-are-you-running-lets-take-a-look-under-the-hood-of-the-jdk/</link><pubDate>Thu, 15 Dec 2022 08:59:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-java-version-are-you-running-lets-take-a-look-under-the-hood-of-the-jdk/</guid><description>&lt;p&gt;From time to time, you need to check which Java version is installed on your computer or server, for instance when starting on a new project or configuring an application to run on a server.&lt;/p&gt;
&lt;p&gt;But did you know there are multiple ways you can do this and even get much more information than you might think, very quickly?&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s find out&amp;hellip;&lt;/p&gt;
&lt;h2 id="reading-the-java-version-in-the-terminal-whatjavaversionareyourunningtakingalookunderthehoodsofthejdk-readingthejavaversionintheterminal"&gt;Reading the Java Version in the Terminal {#WhatJavaversionareyourunning?TakingalookunderthehoodsoftheJDK.-ReadingtheJavaVersionintheTerminal}&lt;/h2&gt;
&lt;p&gt;Probably the easiest way to find the installed version is by using the &lt;code&gt;java -version&lt;/code&gt; terminal command:&lt;/p&gt;</description></item><item><title>Web resource caching: Server-side</title><link>https://foojayio.github.io/website/today/web-caching-server/</link><pubDate>Fri, 09 Dec 2022 15:32:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/web-caching-server/</guid><description>&lt;p&gt;The subject of Web resource caching is as old as the World Wide Web itself.&lt;/p&gt;
&lt;p&gt;However, I&amp;rsquo;d like to offer an as-exhaustive-as-possible catalog of how one can improve performance by caching.&lt;/p&gt;
&lt;p&gt;Web resource caching can happen in two different places: client-side - on the browser and server side.&lt;/p&gt;
&lt;p&gt;In the &lt;a href="https://foojayio.github.io/website/today/web-caching-client/"&gt;previous post&lt;/a&gt;
, I explained the former; this post focuses on the latter.&lt;/p&gt;
&lt;p&gt;While client-side caching works well, it has one central issue: to serve the resource locally, it must first have it in the cache. Thus, each client needs its cached resource. If the requested resource is intensive to compute, it doesn&amp;rsquo;t scale.&lt;/p&gt;</description></item><item><title>Introducing Gradle Test Suites</title><link>https://foojayio.github.io/website/today/introducing-gradle-test-suites/</link><pubDate>Tue, 06 Dec 2022 13:28:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/introducing-gradle-test-suites/</guid><description>&lt;p&gt;This article was initially published at &lt;a href="https://blog.gradle.org/introducing-test-suites" target="_blank" rel="noopener noreferrer"&gt;blog.gradle.org&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;As projects grow in size and complexity and otherwise mature, they tend to accumulate a large collection of automated tests.&lt;/p&gt;
&lt;p&gt;Testing your software at &lt;a href="https://martinfowler.com/articles/practical-test-pyramid.html" target="_blank" rel="noopener noreferrer"&gt;multiple levels of granularity&lt;/a&gt;
 is important to surface problems quickly and to increase developer productivity.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://docs.gradle.org/7.3/release-notes.html#new-features-and-usability-improvements" target="_blank" rel="noopener noreferrer"&gt;Gradle 7.3&lt;/a&gt;
, released November 2021, the Gradle team introduced a new feature called Declarative Test Suites.&lt;/p&gt;
&lt;p&gt;Using this feature makes it much easier to manage different types of tests within a single Gradle JVM project without worrying about low level &amp;ldquo;plumbing&amp;rdquo; details.&lt;/p&gt;</description></item><item><title>How Java Litters Beyond the Heap: Relational Databases</title><link>https://foojayio.github.io/website/today/how-java-litters-beyond-the-heap-relational-databases/</link><pubDate>Tue, 29 Nov 2022 19:08:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-java-litters-beyond-the-heap-relational-databases/</guid><description>&lt;p&gt;As Java developers, we&amp;rsquo;re no strangers to the concept of garbage collection. Our apps generate garbage all the time, and that garbage is meticulously cleaned out by CMS, G1, Azul C4, and other types of collectors.&lt;/p&gt;
&lt;p&gt;However, the story doesn&amp;rsquo;t end with the Java heap. In fact, it is just the beginning.&lt;/p&gt;
&lt;p&gt;In this article, we will create a simple Java application that uses a relational database for the user data and solid-state drives (SSDs) as a storage device. From here, we&amp;rsquo;ll explore how the application generates garbage at the database and SSD levels, while executing the application logic.&lt;/p&gt;</description></item><item><title>Controlling a LED Strip with Pi4J and JBang</title><link>https://foojayio.github.io/website/today/controlling-a-led-strip-with-pi4j-and-jbang/</link><pubDate>Mon, 28 Nov 2022 13:07:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/controlling-a-led-strip-with-pi4j-and-jbang/</guid><description>&lt;p&gt;In an earlier post here on Foojay.io, &lt;a href="https://foojayio.github.io/website/today/controlling-electronics-with-jbang-on-the-raspberry-pi/"&gt;JBang and Pi4J were used to control a LED and button connected to a Raspberry Pi&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;This week Robert von Burg, one of the main contributors of the Pi4J project, &lt;a href="https://mstdn.gsi.li/@eitch/109324090007015888" target="_blank" rel="noopener noreferrer"&gt;shared on Mastodon&lt;/a&gt;
 another project where a LED strip is controlled via I2C.&lt;/p&gt;
&lt;p&gt;This is the result, notice the Foojay.io startup artwork 😉&lt;/p&gt;
&lt;figure class="wp-block-embed is-type-video is-provider-vimeo wp-block-embed-vimeo wp-embed-aspect-16-9 wp-has-aspect-ratio"&gt;
 &lt;div class="wp-block-embed__wrapper"&gt;
 &lt;iframe title="Controlling a LED strip with Pi4J and JBang" src="https://player.vimeo.com/video/771087170?dnt=1&amp;amp;app_id=122963" width="500" height="281" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write"&gt;&lt;/iframe&gt;
 &lt;/div&gt;
&lt;/figure&gt;
&lt;h2 id="h2-0-wiring"&gt;Wiring&lt;/h2&gt;
&lt;p&gt;The Raspberry Pi in the video is attached to a custom PCB used by &lt;a href="https://pi4j.com/featured-projects/soft-real-time-plc-written-in-strolch/" target="_blank" rel="noopener noreferrer"&gt;Robert in medical cabinets&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Gossips: An Event-Bus in a Chatty Neighbourhood</title><link>https://foojayio.github.io/website/today/metaphorical-programming-gossips-event-bus/</link><pubDate>Thu, 24 Nov 2022 08:35:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/metaphorical-programming-gossips-event-bus/</guid><description>&lt;p&gt;In this article, we&amp;rsquo;ll tackle a common issue: &lt;em&gt;simple&lt;/em&gt; communication between system components. With a slightly controversial, themed, domain-driven design.&lt;/p&gt;
&lt;p&gt;Though this post has nothing to do with Android, we need a context where an Event-Bus is needed. And boy oh boy is it needed in Android! And we&amp;rsquo;ll use this as an excuse to write an Event-Bus.&lt;/p&gt;
&lt;p&gt;I chose an analogy for the entire thing: &lt;strong&gt;Gossips&lt;/strong&gt;;\&lt;/p&gt;
&lt;p&gt;It fits with the nature of the library, and the way it&amp;rsquo;ll be used. A global pub-sub component to enable cross-component communication.&lt;/p&gt;</description></item><item><title>Java Profiling Overview</title><link>https://foojayio.github.io/website/today/java-profiling-overview/</link><pubDate>Mon, 14 Nov 2022 09:14:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-profiling-overview/</guid><description>&lt;p&gt;When I ask Java developers whether they do profile, the answer is usually &amp;ldquo;no&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The few that profiled before usually used VisualVM as a student and maybe JProfiler or YourKit years ago at work.&lt;/p&gt;
&lt;p&gt;One of the reasons for this is a lack of available information and thus knowledge for everyday Java developers.&lt;/p&gt;
&lt;p&gt;This is a pity as profiling should be a part of the tool belt for every experienced developer (not just for Java). The problem is that most of the open-source profilers are targeted to the OpenJDK developers (or their colleagues), even if they won&amp;rsquo;t admit it. This can be seen in the lack of entry-level material on this topic and even the little that is out there is distributed across multiple conference websites, blogs, YouTube channels, and Twitter accounts.&lt;/p&gt;</description></item><item><title>Geo-routing with Apache APISIX</title><link>https://foojayio.github.io/website/today/geo-routing-with-apache-apisix/</link><pubDate>Mon, 07 Nov 2022 16:41:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/geo-routing-with-apache-apisix/</guid><description>&lt;p&gt;Apache APISIX, the Apache-led API Gateway, comes out of the box with many plugins to implement your use case.&lt;/p&gt;
&lt;p&gt;Sometimes, however, the plugin you&amp;rsquo;re looking for is not available.&lt;/p&gt;
&lt;p&gt;While creating your own is always possible, it&amp;rsquo;s sometimes necessary.&lt;/p&gt;
&lt;p&gt;Today, I&amp;rsquo;ll show you how to route users according to their location without writing a single line of Lua code.&lt;/p&gt;
&lt;h2 id="h2-0-why-geo-routing"&gt;Why geo-routing?&lt;/h2&gt;
&lt;p&gt;Geo-routing is to forward HTTP requests based on a user&amp;rsquo;s physical location, inferred from their IP. There are many reasons to do that, and here is a couple of them.&lt;/p&gt;</description></item><item><title>When Breakpoints Don't Break</title><link>https://foojayio.github.io/website/today/when-breakpoints-dont-break/</link><pubDate>Mon, 24 Oct 2022 07:24:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/when-breakpoints-dont-break/</guid><description>&lt;p&gt;I discussed tracepoints quite a bit in my blog and videos.&lt;/p&gt;
&lt;p&gt;They are wonderful, but I feel the nuance of non-breaking is a bit lost.&lt;/p&gt;
&lt;p&gt;The true power of this amazing tool is hidden due to our debugging habits and our preconceived notions about debugging. It&amp;rsquo;s indeed difficult to make the mental shift required for these tools.&lt;/p&gt;
&lt;p&gt;The payoff for that mental shift is tremendous when dealing with &amp;ldquo;weird&amp;rdquo; bugs. Especially in large systems and with concurrency related issues.&lt;/p&gt;</description></item><item><title>High-Performance Java Serialisation to Different Formats</title><link>https://foojayio.github.io/website/today/high-performance-java-serialisation/</link><pubDate>Wed, 12 Oct 2022 14:15:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/high-performance-java-serialisation/</guid><description>&lt;p&gt;Java serialisation is a popular mechanism where you are able to serialise and deserialise complex object graphs; for example where object A can contain a reference to object B, which in turn has a reference back to object A.&lt;/p&gt;
&lt;p&gt;The problem is that this rich functionality comes at a performance cost.&lt;/p&gt;
&lt;p&gt;However, if you do not need to serialise these types of recursive graphs, you can instead use an open source solution called Chronicle Wire.&lt;/p&gt;</description></item><item><title>Am I Testing the Right Way?</title><link>https://foojayio.github.io/website/today/am-i-testing-the-right-way/</link><pubDate>Tue, 04 Oct 2022 18:24:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/am-i-testing-the-right-way/</guid><description>&lt;h2 id="h2-0-two-unit-testing-approaches-explained"&gt;Two unit-testing approaches explained!&lt;/h2&gt;
&lt;p&gt;Pick any topic around testing and there will be at least two very contrary approaches that seem to be at odds.&lt;/p&gt;
&lt;p&gt;One of the many points of discussion around unit testing, and in particular TDD, are the question around what good boundaries for tests are.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So the question is: Should you unit test each method on your classes or should you only unit test the public interfaces of a given feature or component?&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Resolving Git Merge Conflicts in IntelliJ IDEA</title><link>https://foojayio.github.io/website/today/resolving-git-merge-conflicts-in-intellij-idea/</link><pubDate>Wed, 21 Sep 2022 11:04:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/resolving-git-merge-conflicts-in-intellij-idea/</guid><description>&lt;p&gt;At some point in your career, probably many points, you&amp;rsquo;ll have to resolve merge conflicts.&lt;/p&gt;
&lt;p&gt;A common cause of merge conflicts is when you&amp;rsquo;re working on a &lt;code&gt;feature&lt;/code&gt; branch while other changes have been applied to the &lt;code&gt;main&lt;/code&gt; branch.&lt;/p&gt;
&lt;h2 id="h2-0-merge-feature-branch-into-main"&gt;Merge feature branch into main&lt;/h2&gt;
&lt;p&gt;In this tutorial, we are currently on the &lt;code&gt;main&lt;/code&gt; branch, and we want to merge the &lt;code&gt;feature&lt;/code&gt; branch into &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can do this by selecting the feature branch in the &lt;em&gt;Git&lt;/em&gt; tool window which you can open with &lt;strong&gt;⌘9&lt;/strong&gt; (macOS), or &lt;strong&gt;Alt+9&lt;/strong&gt; (Windows/Linux).&lt;/p&gt;</description></item><item><title>Best Practices for Managing Java Dependencies</title><link>https://foojayio.github.io/website/today/best-practices-for-managing-java-dependencies/</link><pubDate>Thu, 15 Sep 2022 08:21:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/best-practices-for-managing-java-dependencies/</guid><description>&lt;p&gt;Creating Java applications is great, and many resources are available.&lt;/p&gt;
&lt;p&gt;To speed up development, many folks use frameworks and libraries that do some of the heavy lifting.&lt;/p&gt;
&lt;p&gt;When looking at modern Java applications, almost all of them contain dependencies from libraries developed by someone else.&lt;/p&gt;
&lt;p&gt;Dependencies take up about 80 to 90 percent of the binary &amp;mdash; so, we should take good care of them when creating a Java project.&lt;/p&gt;</description></item><item><title>Migrating Monoliths to Microservices in Practice</title><link>https://foojayio.github.io/website/today/migrating-monoliths-to-microservices-in-practice/</link><pubDate>Fri, 02 Sep 2022 14:47:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/migrating-monoliths-to-microservices-in-practice/</guid><description>&lt;p&gt;There have been amazing articles on the subjects of migrating from a monolith to a microservice architecture, e.g., &lt;a href="https://martinfowler.com/articles/break-monolith-into-microservices.html" target="_blank" rel="noopener noreferrer"&gt;this is probably one of the better examples&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The benefits and drawbacks of the architectures should be pretty clear. I want to talk about something else though: the strategy.&lt;/p&gt;
&lt;p&gt;We build monoliths since they are easier to get started with. Microservices usually rise out of necessity when our system is already in production.&lt;/p&gt;</description></item><item><title>External Debugging Tools 3: JMXTerm</title><link>https://foojayio.github.io/website/today/external-debugging-tools-3-jmxterm/</link><pubDate>Fri, 26 Aug 2022 14:52:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/external-debugging-tools-3-jmxterm/</guid><description>&lt;p&gt;When tracking a bug we need to take a two pronged approach. Similar to tongs that wrap the buggy module from both sides and squeezes to find the problematic part. Up until now we discussed tools that are very low level. Some can be used to debug system level services. Today we&amp;rsquo;ll discuss the other side of the stack but still a very advanced management tool. To understand this you need to understand the field we&amp;rsquo;re in.&lt;/p&gt;</description></item><item><title>Google Remote Procedure Call (gRPC) Example in Payara Server</title><link>https://foojayio.github.io/website/today/google-remote-procedure-call-grpc-example-in-payara-server/</link><pubDate>Thu, 25 Aug 2022 10:09:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/google-remote-procedure-call-grpc-example-in-payara-server/</guid><description>&lt;p&gt;Google Remote Procedure Call, or gRPC, is an open source Remote Procedure Call (RPC) framework focused on high performance and is portable to any environment.&lt;/p&gt;
&lt;p&gt;It is an alternative to REST, deemed by many as more efficient.&lt;/p&gt;
&lt;p&gt;After one of our customers requested it, the extension became available in our April 2022 Payara Community and Enterprise releases: 5.2022.2 and 5.38.0.&lt;/p&gt;
&lt;p&gt;After providing a brief overview of the gRPC extension in Payara in our &lt;a href="https://blog.payara.fish/whats-new-in-the-april-2022-payara-platform-release" target="_blank" rel="noopener noreferrer"&gt;April release blog,&lt;/a&gt;
 here we provide more technical details about how to use it in Payara Community, where you will build the module yourself and place it in the modules directory.&lt;/p&gt;</description></item><item><title>External Debugging Tools 1: dtrace and strace</title><link>https://foojayio.github.io/website/today/external-debugging-tools-1-dtrace-and-strace/</link><pubDate>Fri, 05 Aug 2022 13:13:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/external-debugging-tools-1-dtrace-and-strace/</guid><description>&lt;p&gt;Often when debugging, we need to step outside of the comforting embrace of the IDE to reproduce or track an issue.&lt;/p&gt;
&lt;p&gt;In this series, I&amp;rsquo;d like to go over some tools you might find useful for these cases. I&amp;rsquo;ll try to limit myself to tools that are 100% debugging tools and not those that are useful for development testing.&lt;/p&gt;
&lt;p&gt;E.g., tools like &lt;a href="https://curl.se/" target="_blank" rel="noopener noreferrer"&gt;curl&lt;/a&gt;
 or &lt;a href="https://stedolan.github.io/jq/" target="_blank" rel="noopener noreferrer"&gt;jq&lt;/a&gt;
 are remarkably useful. You can/should use them while debugging. But you probably used them while building and testing the feature. So you would already be familiar with them and should have some sense of what they do. I want to focus on tools that you would mostly reach for when debugging. In that sense, tools like &lt;a href="https://sdkman.io/" target="_blank" rel="noopener noreferrer"&gt;SDKMan&lt;/a&gt;
 etc. also make no sense here.&lt;/p&gt;</description></item><item><title>What is a Java Uber-JAR and Why Is It Useful?</title><link>https://foojayio.github.io/website/today/what-is-a-java-uber-jar-and-why-is-it-useful/</link><pubDate>Thu, 04 Aug 2022 12:53:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-is-a-java-uber-jar-and-why-is-it-useful/</guid><description>&lt;p&gt;An uber-JAR, also known as a fat JAR or JAR with dependencies, is a JAR file that contains not only a Java program but embeds its dependencies as well, and might also contain the web application that needs to be executed.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll describe the different variants of the artifact and the advantages and drawbacks it has.&lt;/p&gt;
&lt;h2 id="h2-0-what-is-an-uber-jar"&gt;What is an Uber-JAR?&lt;/h2&gt;
&lt;p&gt;As indicated, the Uber-JAR contains all the program dependencies packaged in the JAR file.&lt;/p&gt;</description></item><item><title>Understand the Root Cause of Regressions with Git Bisect</title><link>https://foojayio.github.io/website/today/understand-the-root-cause-of-regressions-with-git-bisect/</link><pubDate>Fri, 29 Jul 2022 13:18:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/understand-the-root-cause-of-regressions-with-git-bisect/</guid><description>&lt;p&gt;In this series, I cover a lot of magical tools and &lt;a href="https://git-scm.com/docs/git-bisect" target="_blank" rel="noopener noreferrer"&gt;git bisect&lt;/a&gt;
 is probably the best example of such magic.&lt;/p&gt;
&lt;p&gt;The hardest part in debugging is knowing the general area of the bug&amp;hellip; and bisect literally shines a light on the specific commit that caused it!&lt;/p&gt;
&lt;p&gt;Before we begin, let&amp;rsquo;s make one thing clear: bisect is a tool for debugging regressions. It does nothing for regular bugs. When we have a regression, we typically know that the issue used to work in a specific release, we would typically have a specific revision where the code worked. We would typically know that it doesn&amp;rsquo;t work in the current version, but which commit along the way causes the failure?&lt;/p&gt;</description></item><item><title>Debugging Java Collections Framework Issues in Production</title><link>https://foojayio.github.io/website/today/debugging-java-collections-framework-issues-in-production/</link><pubDate>Fri, 15 Jul 2022 08:49:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-java-collections-framework-issues-in-production/</guid><description>&lt;p&gt;The Java Collections Framework was a huge leap forward when it was introduced as part of Java 2 (JDK 1.2).&lt;/p&gt;
&lt;p&gt;Thanks to the included collection classes we finally moved beyond the limits of &lt;code&gt;Vector&lt;/code&gt; and &lt;code&gt;Hashtable&lt;/code&gt; to more mature and generic solutions. With the introduction of streams and functional concepts in Java 8 the framework took everything to the next level.&lt;/p&gt;
&lt;p&gt;One of the core principles underlying the framework is coding to the interface. As such you would use the List interface or a Collection interface instead of the concrete implementation. This is great engineering but it makes debugging the Java Collections far more challenging.&lt;/p&gt;</description></item><item><title>Java on Azure Tooling Update – July 2022</title><link>https://foojayio.github.io/website/today/java-on-azure-tooling-update-july-2022/</link><pubDate>Mon, 11 Jul 2022 07:21:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-on-azure-tooling-update-july-2022/</guid><description>&lt;p&gt;Hi everyone, welcome back to the July update of Java on Azure Tooling.&lt;/p&gt;
&lt;p&gt;In this update, we will introduce the brand new getting started experience with the Azure toolkit for IntelliJ.&lt;/p&gt;
&lt;p&gt;In addition, we have added support for Managed Identity Authentication.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s see what these new features are.&lt;/p&gt;
&lt;h2 id="h2-0-azure-toolkit-for-intellij-improvements"&gt;Azure Toolkit for IntelliJ Improvements&lt;/h2&gt;
&lt;h3 id="h3-1-new-guided-getting-started-experience"&gt;New Guided Getting Started Experience&lt;/h3&gt;
&lt;p&gt;In &lt;a href="https://devblogs.microsoft.com/java/azure-toolkit-for-intellij-update-april-2022/" title="April’s blog" target="_blank" rel="noopener noreferrer"&gt;April&amp;rsquo;s blog&lt;/a&gt;
, we first talked about why we needed better getting started experience. Currently, there are several challenges for a developer who is new to Azure:&lt;/p&gt;</description></item><item><title>Debugging Gson, Moshi and Jackson JSON Frameworks in Production</title><link>https://foojayio.github.io/website/today/debugging-gson-moshi-and-jackson-json-frameworks-in-production/</link><pubDate>Fri, 08 Jul 2022 07:14:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-gson-moshi-and-jackson-json-frameworks-in-production/</guid><description>&lt;p&gt;Parsing bugs are the gift that keeps on giving in the age of APIs.&lt;/p&gt;
&lt;p&gt;We use a service, it works perfectly in debugging, QA, etc.&lt;/p&gt;
&lt;p&gt;Then some user input that made its way to the web request returns a result we just can&amp;rsquo;t parse.&lt;/p&gt;
&lt;p&gt;Unfortunately, there isn&amp;rsquo;t much we can do at this stage. We need to understand why the failure occurred and how we can workaround it and fix it.&lt;/p&gt;</description></item><item><title>Available Now - gRPC for Apache Cassandra</title><link>https://foojayio.github.io/website/today/available-now-grpc-for-apache-cassandra/</link><pubDate>Thu, 07 Jul 2022 07:38:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/available-now-grpc-for-apache-cassandra/</guid><description>&lt;p&gt;&lt;strong&gt;Build microservices easily with the NoSQL standard database&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you are like most developers, you are embracing applications built using microservices and a NoSQL database. There are many good reasons: faster time to market, lower total cost of ownership, better performance, less downtime, and easy scalability.&lt;/p&gt;
&lt;p&gt;Creating cloud-native applications is hard because microservices are often written in different languages, database drivers have a maintenance burden, or familiar HTTP APIs lack the performance needed.&lt;/p&gt;</description></item><item><title>Understand Source Code – Deep into the Codebase, Locally &amp; Production</title><link>https://foojayio.github.io/website/today/understand-source-code-deep-into-the-codebase-locally-and-in-production/</link><pubDate>Fri, 01 Jul 2022 07:17:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/understand-source-code-deep-into-the-codebase-locally-and-in-production/</guid><description>&lt;p&gt;Say you have a new code base to study or picked up an open source project. You might be a seasoned developer for whom this is another project in a packed resume. Alternatively, you might be a junior engineer for whom this is the first &amp;ldquo;real&amp;rdquo; project.&lt;/p&gt;
&lt;p&gt;It doesn&amp;rsquo;t matter!&lt;/p&gt;
&lt;p&gt;With completely new source code repositories, we still know nothing&amp;hellip;&lt;/p&gt;
&lt;p&gt;The seasoned senior might have a leg up in finding some things and recognizing patterns. But none of us can read and truly follow a project with 1M+ lines of code. We look over the docs, which in my experience usually have only passing resemblance to the actual codebase. We segregate and assume about the various modules, but picking them up is hard.&lt;/p&gt;</description></item><item><title>Debugging jsoup Java Code in Production Using Lightrun</title><link>https://foojayio.github.io/website/today/debugging-jsoup-java-code-in-production-using-lightrun/</link><pubDate>Fri, 17 Jun 2022 09:35:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-jsoup-java-code-in-production-using-lightrun/</guid><description>&lt;p&gt;Scraping websites built for modern browsers is far more challenging than it was a decade ago.&lt;/p&gt;
&lt;p&gt;jsoup is a convenient API that makes scraping websites trivial via DOM traversal, CSS Selectors, JQuery-Like methods and more. But it isn&amp;rsquo;t without its caveat. Every scraping API is a ticking time bomb.&lt;/p&gt;
&lt;p&gt;Real-world HTML is flaky. It changes without notice since it isn&amp;rsquo;t a documented API. When our Java program fails in scraping, we&amp;rsquo;re suddenly stuck with a ticking time bomb.&lt;/p&gt;</description></item><item><title>Wordish with JavaFX - Part 5</title><link>https://foojayio.github.io/website/today/wordish-with-javafx-part-5/</link><pubDate>Tue, 14 Jun 2022 07:25:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/wordish-with-javafx-part-5/</guid><description>&lt;p&gt;Welcome to Part 5 and the final installment of this series.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-1/"&gt;Part 1&lt;/a&gt;
, we introduced the Wordish game with JavaFX and discussed the main UI layout.&lt;/li&gt;
&lt;li&gt;In &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-2/"&gt;Part 2&lt;/a&gt;
, we discussed look and feel enhancements. We introduced specialized Label and Button controls that use pseudo-classes for advanced CSS styling. In addition, we covered incorporating third-party font libraries and customizing Scene Builder to leverage these features.&lt;/li&gt;
&lt;li&gt;Next, in &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-3/"&gt;Part 3&lt;/a&gt;
, we explored the controller code that maintains game state and responds to user input with appropriate updates to the UI.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-4/"&gt;Part 4&lt;/a&gt;
, &lt;strong&gt;What&amp;rsquo;s in a Word, Anyway?&lt;/strong&gt;, examines how we get our words and how we determine if a submitted word is valid.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And now in Part 5, we turn to JavaFX charts, showing how to customize charts with orientation and colors and how to add nodes to the chart scene graph.&lt;/p&gt;</description></item><item><title>Java on Azure Tooling Update – June 2022</title><link>https://foojayio.github.io/website/today/java-on-azure-tooling-update-june-2022/</link><pubDate>Mon, 13 Jun 2022 07:40:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-on-azure-tooling-update-june-2022/</guid><description>&lt;p&gt;Hi everyone, welcome back to June update of Java on Azure Tooling.&lt;/p&gt;
&lt;p&gt;In this update, we will introduce the new application-centric view on Azure toolkit for IntelliJ that will make the interface more user-friendly.&lt;/p&gt;
&lt;p&gt;In addition, we have added support for more Azure services.&lt;/p&gt;
&lt;p&gt;For Gradle plugins, we have some new features for Azure Web Apps and Azure Functions.&lt;/p&gt;
&lt;p&gt;We hope you like these new features and share your feedback with us. So let us get right into it&amp;hellip;&lt;/p&gt;</description></item><item><title>Remote Debugging and Developer Observability</title><link>https://foojayio.github.io/website/today/remote-debugging-and-developer-observability/</link><pubDate>Fri, 10 Jun 2022 10:12:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/remote-debugging-and-developer-observability/</guid><description>&lt;p&gt;In this post, we&amp;rsquo;ll go over remote debugging. Debugging production with developer observability tools and debugging asynchronous code which presents its own unique challenges!&lt;/p&gt;
&lt;p&gt;This is actually material from four separate videos because I wanted to pool some ideas together into a single blog post and the asynchronous stuff got pulled in. So without further ado, these are the applicable videos&amp;hellip; Read on for the analysis and discussion:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🦆 Duckling the 15th:&lt;/p&gt;</description></item><item><title>Building Project Panama's jextract tool by yourself</title><link>https://foojayio.github.io/website/today/building-project-panamas-jextract-tool-by-yourself/</link><pubDate>Thu, 09 Jun 2022 14:22:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-project-panamas-jextract-tool-by-yourself/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Absorb what is useful, discard what is useless and add what is specifically your own. &amp;ndash; Bruce Lee&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Do you want to build Project Panama&amp;rsquo;s &lt;a href="https://github.com/openjdk/jextract" target="_blank" rel="noopener noreferrer"&gt;Jextract&lt;/a&gt;
 tool by yourself? I can show you how!&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve seen any of my past &lt;a href="https://foojayio.github.io/website/today/project-panama-for-newbies-part-3/"&gt;articles&lt;/a&gt;
 on Project Panama I&amp;rsquo;ve mentioned a really convenient tool called &lt;code&gt;jextract&lt;/code&gt; that can generate Java binding code that represents native functions or variables (symbols) from C libraries.&lt;/p&gt;
&lt;p&gt;This alleviates the developer&amp;rsquo;s need of creating binding code by hand. By passing in a C header file (.h extension) &lt;code&gt;jextract&lt;/code&gt; can generate source code or compiled Java classes.&lt;/p&gt;</description></item><item><title>Wordish with JavaFX - Part 4 : Foojay</title><link>https://foojayio.github.io/website/today/wordish-with-javafx-part-4/</link><pubDate>Tue, 07 Jun 2022 09:23:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/wordish-with-javafx-part-4/</guid><description>&lt;p&gt;Welcome to Part 4 of this five part series.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-1/"&gt;Part 1&lt;/a&gt;
, we introduced the Wordish game with JavaFX and discussed the main UI layout.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-2/"&gt;Part 2&lt;/a&gt;
, we discussed look and feel enhancements.&lt;/p&gt;
&lt;p&gt;We introduced specialized Label and Button controls that use pseudo-classes for advanced CSS styling.&lt;/p&gt;
&lt;p&gt;We covered incorporating third-party font libraries and customizing Scene Builder to leverage these features.&lt;/p&gt;
&lt;p&gt;Next, in &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-3/"&gt;Part 3&lt;/a&gt;
, we explored the controller code that maintains game state and responds to user input with appropriate updates to the UI.&lt;/p&gt;</description></item><item><title>Debugging the Java Message Service (JMS) API using Lightrun</title><link>https://foojayio.github.io/website/today/debugging-the-java-message-service-jms-api-using-lightrun/</link><pubDate>Fri, 03 Jun 2022 09:26:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-the-java-message-service-jms-api-using-lightrun/</guid><description>&lt;p&gt;The Java Message Service API (JMS) was developed by Sun Microsystems in the days of &lt;a href="https://en.wikipedia.org/wiki/Jakarta_EE" target="_blank" rel="noopener noreferrer"&gt;Java EE&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The JMS API provides us with simple messaging abstractions including Message Producer, Message Consumer, etc. Messaging APIs let us place a message on a &amp;ldquo;queue&amp;rdquo; and consume messages placed into said queue.&lt;/p&gt;
&lt;p&gt;This is immensely useful for high throughput systems &amp;ndash; instead of wasting user time by performing a slow operation in real-time, an enterprise application can send a message. This non-blocking approach enables extremely high throughput, while maintaining reliability at scale.&lt;/p&gt;</description></item><item><title>Wordish with JavaFX - Part 3</title><link>https://foojayio.github.io/website/today/wordish-with-javafx-part-3/</link><pubDate>Tue, 31 May 2022 07:23:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/wordish-with-javafx-part-3/</guid><description>&lt;p&gt;Welcome to Part 3 of this five part series.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-1/"&gt;Part 1&lt;/a&gt;
, we introduced the Wordish game with JavaFX and discussed the main UI layout.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-2/"&gt;Part 2&lt;/a&gt;
, we discussed look and feel enhancements.&lt;/p&gt;
&lt;p&gt;We introduced specialized Label and Button controls that use pseudo-classes for advanced CSS styling.&lt;/p&gt;
&lt;p&gt;We covered incorporating third-party font libraries and customizing Scene Builder to leverage these features.&lt;/p&gt;
&lt;p&gt;Now in Part 3, we&amp;rsquo;ll examine the controller code. The controller code maintains game state and responds to user input with appropriate updates to the UI.&lt;/p&gt;</description></item><item><title>Memory Debugging and Watch Annotations</title><link>https://foojayio.github.io/website/today/memory-debugging-and-watch-annotations/</link><pubDate>Fri, 27 May 2022 08:04:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/memory-debugging-and-watch-annotations/</guid><description>&lt;p&gt;Before diving into debugging memory issues and the other amazing running process, memory debugging capabilities (which are amazing)&amp;hellip; I want to discuss a point I left open in the &lt;a href="https://talktotheduck.dev/debugging-collections-streams-and-watch-renderers" target="_blank" rel="noopener noreferrer"&gt;last duckling post&lt;/a&gt;
. Back there we discussed customizing the watch renderer. This is super cool!&lt;/p&gt;
&lt;p&gt;But it&amp;rsquo;s also tedious. Before we continue, if you prefer, I cover most of these subjects in these videos:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🦆 Duckling the 11th:&lt;/p&gt;
&lt;p&gt;Did you know you can see all the objects in memory?&lt;/p&gt;</description></item><item><title>Java Panama Polyglot (Rust) Part 4</title><link>https://foojayio.github.io/website/today/java-panama-polyglot-rust-part-4/</link><pubDate>Thu, 26 May 2022 08:33:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-panama-polyglot-rust-part-4/</guid><description>&lt;p&gt;Hello and welcome to the final article of the &lt;strong&gt;&lt;a href="https://foojayio.github.io/website/today/java-panama-polyglot-part1/"&gt;Java Panama Polyglot&lt;/a&gt;
&lt;/strong&gt; series, where we are presenting quick tutorials or recipes on how to access native libraries written in other languages.&lt;/p&gt;
&lt;p&gt;In this article you will be using Project Panama to talk to the &lt;a href="https://www.rust-lang.org" target="_blank" rel="noopener noreferrer"&gt;Rust&lt;/a&gt;
 language.&lt;/p&gt;
&lt;p&gt;If you are new to Java&amp;rsquo;s Foreign Function Access APIs (&lt;a href="https://jdk.java.net/panama/" target="_blank" rel="noopener noreferrer"&gt;Project&lt;/a&gt;
&lt;a href="https://jdk.java.net/panama/" target="_blank" rel="noopener noreferrer"&gt;Panama&lt;/a&gt;
) check out &lt;a href="https://foojayio.github.io/website/today/project-panama-for-newbies-part-1/"&gt;Panama4Newbies&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/java-panama-polyglot-part-3/"&gt;Part 3&lt;/a&gt;
 you had a chance to learn about how to use Java Project Panama&amp;rsquo;s abilities to access the locally installed Python interpreter.&lt;/p&gt;</description></item><item><title>Wordish with JavaFX - Part 2</title><link>https://foojayio.github.io/website/today/wordish-with-javafx-part-2/</link><pubDate>Tue, 24 May 2022 07:50:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/wordish-with-javafx-part-2/</guid><description>&lt;h2 id="h2-0-building-games-and-having-fun-with-java-and-javafx"&gt;Building Games and Having Fun with Java and JavaFX&lt;/h2&gt;
&lt;p&gt;Welcome to Part 2 of this five part series!&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-1/"&gt;Part 1&lt;/a&gt;
, we introduced the Wordish game with JavaFX and discussed the main UI layout.&lt;/p&gt;
&lt;p&gt;In this second part, we&amp;rsquo;ll discuss some important look and feel enhancements.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll show you specialized Label and Button controls and using pseudo-classes for advanced CSS styling.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll also cover incorporating third-party font libraries and customizing Scene Builder to leverage these features.&lt;/p&gt;</description></item><item><title>Debugging Deadlocks and Race Conditions</title><link>https://foojayio.github.io/website/today/debugging-deadlocks-and-race-conditions/</link><pubDate>Fri, 20 May 2022 08:08:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-deadlocks-and-race-conditions/</guid><description>&lt;p&gt;Thread debugging has the reputation of being one of the most arduous tasks for developers. I beg to differ.&lt;/p&gt;
&lt;p&gt;Asynchronous debugging is so much worse. It&amp;rsquo;s supposed to solve the problems of threading and to some degree async helps&amp;hellip;&lt;/p&gt;
&lt;p&gt;But it doesn&amp;rsquo;t make debugging simpler. I will get into that in the next post.&lt;/p&gt;
&lt;p&gt;In the last two ducklings, I talked about threading issues:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🦆 Duckling the 13th:&lt;/p&gt;
&lt;p&gt;Debug race conditions and deadlocks easily.&lt;/p&gt;</description></item><item><title>Wordish with JavaFX - Part 1</title><link>https://foojayio.github.io/website/today/wordish-with-javafx-part-1/</link><pubDate>Tue, 17 May 2022 10:13:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/wordish-with-javafx-part-1/</guid><description>&lt;h2 id="h2-0-building-games-and-having-fun-with-java-and-javafx"&gt;Building Games and Having Fun with Java and JavaFX&lt;/h2&gt;
&lt;p&gt;Wordish is a JavaFX implementation of the game Wordle. It&amp;rsquo;s like Wordle. It is Wordle-ish. It&amp;rsquo;s Wordish.
&lt;img src="https://foojayio.github.io/website/today/wordish-with-javafx-part-1/playgame5-308x510.png" alt="" loading="lazy"&gt;
 Figure 1. Wordish main layout view&lt;/p&gt;
&lt;p&gt;Wordle is a daily online word game. You can play the official Wordle game here:&lt;a href="https://www.nytimes.com/games/wordle/index.html" target="_blank" rel="noopener noreferrer"&gt;https://www.nytimes.com/games/wordle/index.html&lt;/a&gt;
. If you haven&amp;rsquo;t played yet, go check it out.&lt;/p&gt;
&lt;p&gt;As I played Wordle, I realized how much fun it would be to create a JavaFX implementation. When you submit a word, each tile rotates to reveal how the individual letter matches &amp;ndash; or doesn&amp;rsquo;t match &amp;ndash; the target word. &lt;em&gt;(Ooh, animation!)&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Publish a Java Project to the Maven Central Repository</title><link>https://foojayio.github.io/website/today/how-to-publish-a-java-maven-project-to-the-maven-central-repository/</link><pubDate>Fri, 13 May 2022 06:22:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-publish-a-java-maven-project-to-the-maven-central-repository/</guid><description>&lt;p&gt;This guide will describe how to publish the &lt;a href="https://github.com/tobiasbriones/jdesk" target="_blank" rel="noopener noreferrer"&gt;JDesk framework&lt;/a&gt;
 to Maven Central.&lt;/p&gt;
&lt;p&gt;The project is written in Java using Maven as the build tool. So, the process will be detailed for Java projects with a &lt;code&gt;pom.xml&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;You can follow this article if you need to publish a Java Maven-based library or artifact to Maven.&lt;/p&gt;
&lt;h2 id="h2-0-get-ready-for-publishing-packages"&gt;Get Ready for Publishing Packages&lt;/h2&gt;
&lt;p&gt;Publishing a Java artifact is not as trivial as Python or JavaScript packages can be deployed.&lt;/p&gt;</description></item><item><title>Setting up and Working with Apache Tomcat in IntelliJ IDEA Ultimate</title><link>https://foojayio.github.io/website/today/setting-up-and-working-with-apache-tomcat-in-intellij-idea-ultimate/</link><pubDate>Tue, 10 May 2022 08:46:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/setting-up-and-working-with-apache-tomcat-in-intellij-idea-ultimate/</guid><description>&lt;p&gt;In this article, you will learn how to set up IntelliJ IDEA Ultimate to work with Apache Tomcat, herein referred to simply as &lt;em&gt;Tomcat&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We will create a new project that uses Tomcat and then talk about using Tomcat in IntelliJ IDEA so you can benefit from the rich integration capabilities.&lt;/p&gt;
&lt;h2 id="h2-0-downloading-apache-tomcat"&gt;Downloading Apache Tomcat&lt;/h2&gt;
&lt;p&gt;To use Tomcat with IntelliJ IDEA, it needs to be installed on your machine. If you don&amp;rsquo;t already have Tomcat installed, you can download the latest version, which at the time of writing, is &lt;a href="https://tomcat.apache.org/download-10.cgi" target="_blank" rel="noopener noreferrer"&gt;Tomcat 10&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>How To Modernize Legacy Code in Production</title><link>https://foojayio.github.io/website/today/modernize-legacy-code-in-production-rebuild-your-airplane-midflight-without-crashing/</link><pubDate>Mon, 09 May 2022 15:58:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/modernize-legacy-code-in-production-rebuild-your-airplane-midflight-without-crashing/</guid><description>&lt;p&gt;I spent over a decade as a consultant working for dozens of companies in many fields and pursuits. The diversity of each code base is tremendous. This article will try to define general rules for modernizing legacy code that would hopefully apply to all. But it comes from the angle of a Java developer.&lt;/p&gt;
&lt;p&gt;When writing this, my primary focus is on updating an old Java 6 era style J2EE code to the more modern Spring Boot/Jakarta EE code. However, I don&amp;rsquo;t want to go into the code and try to keep this generic. I discuss COBOL and similar legacy systems too. Most of the overarching guidelines should work for migrating any other type of codebase too.&lt;/p&gt;</description></item><item><title>Spring Transaction Debugging in Production with Lightrun</title><link>https://foojayio.github.io/website/today/spring-transaction-debugging-in-production-with-lightrun/</link><pubDate>Fri, 06 May 2022 15:00:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-transaction-debugging-in-production-with-lightrun/</guid><description>&lt;p&gt;Spring makes building a reliable application much easier thanks to its declarative transaction management.&lt;/p&gt;
&lt;p&gt;It also supports programmatic transaction management, but that&amp;rsquo;s not as common.&lt;/p&gt;
&lt;p&gt;In this article, I want to focus on the declarative transaction management angle, since it seems much harder to debug compared to the programmatic approach. This is partially true. We can&amp;rsquo;t put a breakpoint on a transactional annotation.&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;m getting ahead of myself!&lt;/p&gt;
&lt;h2 id="h2-0-what-is-spring-s-method-declarative-transaction-management"&gt;What is Spring&amp;rsquo;s Method Declarative Transaction Management?&lt;/h2&gt;
&lt;p&gt;When writing a spring method or class, we can use annotations to declare that a method or a bean (class) is transactional. This annotation lets us tune transactional semantics using attributes. This lets us define behavior such as:&lt;/p&gt;</description></item><item><title>Debugging Collections, Streams, and Watch Renderers</title><link>https://foojayio.github.io/website/today/debugging-collections-streams-and-watch-renderers/</link><pubDate>Fri, 29 Apr 2022 07:54:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-collections-streams-and-watch-renderers/</guid><description>&lt;p&gt;In the last two ducklings, I finished the extensive discussion on breakpoints and switched my focus to the watch area. In it, we have several amazing and lesser known tools that let us build insight into our running application. Being able to tell at a glance if something works correctly is crucial for many applications.&lt;/p&gt;
&lt;p&gt;This is very important for collections and arrays. We can have thousands or millions of elements within a collection. Debugging this is very difficult without some basic tools.&lt;/p&gt;</description></item><item><title>Exception Breakpoint that Doesn't Suck and Other Use Cases</title><link>https://foojayio.github.io/website/today/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/</link><pubDate>Fri, 22 Apr 2022 07:37:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/</guid><description>&lt;p&gt;Two weeks ago, &lt;a href="https://talktotheduck.dev/basics-of-breakpoints-you-might-not-know" target="_blank" rel="noopener noreferrer"&gt;I left this series in a &amp;ldquo;cliffhanger&amp;rdquo;&lt;/a&gt;
 of sorts. Well, as much as a programming blog can leave things in the air&amp;hellip; The big one amongst them is the premise that exception breakpoints don&amp;rsquo;t have to suck. If you used them in the past, you would know that grabbing all exceptions is ridiculous. You end up at a breakpoint every second and it doesn&amp;rsquo;t help.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a solution, and it&amp;rsquo;s discussed in duckling 6 number 7 also covers a lot of interesting ground for us and another cliffhanger on method breakpoints:&lt;/p&gt;</description></item><item><title>Fullstack IMDB Clone with a Java Backend using SparkJava and Neo4j</title><link>https://foojayio.github.io/website/today/building-a-fullstack-imdb-clone-with-a-java-backend-using-sparkjava-and-neo4j/</link><pubDate>Wed, 20 Apr 2022 07:11:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-a-fullstack-imdb-clone-with-a-java-backend-using-sparkjava-and-neo4j/</guid><description>&lt;p&gt;Our &lt;a href="https://graphacademy.neo4j.com" target="_blank" rel="noopener noreferrer"&gt;GraphAcademy&lt;/a&gt;
 is teaching folks starting out in the graph space the fundamentals of the data model, query language, and graph algorithms.&lt;/p&gt;
&lt;p&gt;And for developers, there are &lt;a href="https://graphacademy.neo4j.com/categories/developer/" target="_blank" rel="noopener noreferrer"&gt;courses for using our drivers&lt;/a&gt;
 and building the backend of a fullstack app in JavaScript, Go, Python, Java, and soon .Net.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/OzxHfAx.png" alt="OzxHfAx" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;The application is an IMDB clone based on the &lt;a href="https://github.com/neo4j-graph-examples/recommendations" target="_blank" rel="noopener noreferrer"&gt;MovieLens recommendation&lt;/a&gt;
 dataset augmented with movie and cast data from &lt;a href="https://themoviedb.org" target="_blank" rel="noopener noreferrer"&gt;themoviedb.org&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The front-end is written in vue.js and looks pretty slick.&lt;/p&gt;</description></item><item><title>Logging Best Practices: MDC, Ingestion, and Scale</title><link>https://foojayio.github.io/website/today/logging-best-practices-mdc-ingestion-and-scale/</link><pubDate>Mon, 11 Apr 2022 12:16:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/logging-best-practices-mdc-ingestion-and-scale/</guid><description>&lt;p&gt;I don&amp;rsquo;t care about religious wars over &amp;ldquo;which logger is the best&amp;rdquo;. They all have their issues. Having said that, the worst logger is probably the one built &amp;ldquo;in-house&amp;rdquo;. So yes, they suck, but re-inventing the wheel is probably far worse.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s discuss making these loggers suck less with proper usage guidelines that range from the obvious to subtle. Hopefully, you can use this post as the basis of your company&amp;rsquo;s standard for logging best practices.&lt;/p&gt;</description></item><item><title>Migrating from Java EE to Jakarta EE with IntelliJ IDEA</title><link>https://foojayio.github.io/website/today/migrating-from-java-ee-to-jakarta-ee-with-intellij-idea/</link><pubDate>Fri, 08 Apr 2022 17:02:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/migrating-from-java-ee-to-jakarta-ee-with-intellij-idea/</guid><description>&lt;p&gt;In this post, we&amp;rsquo;re going to migrate some sample code from the &lt;code&gt;javax&lt;/code&gt; namespace to &lt;code&gt;jakarta&lt;/code&gt;. If you want the history on this change, check out &lt;a href="https://blogs.oracle.com/javamagazine/post/transition-from-java-ee-to-jakarta-ee" target="_blank" rel="noopener noreferrer"&gt;this helpful blog post&lt;/a&gt;
 from Java Magazine. Fundamentally the &lt;em&gt;Java Persistence API&lt;/em&gt; was renamed to &lt;em&gt;Jakarta Persistence API&lt;/em&gt; meaning that the &lt;code&gt;javax&lt;/code&gt; namespace changed to &lt;code&gt;jakarta&lt;/code&gt; for frameworks whose APIs have moved to Jakarta EE (which is not all of them).&lt;/p&gt;
&lt;p&gt;However, Apache Tomcat recently released version 10 which updated package names from &lt;code&gt;javax&lt;/code&gt; to &lt;code&gt;jakarta&lt;/code&gt;. SpringBoot also made &lt;a href="https://spring.io/blog/2021/09/02/a-java-17-and-jakarta-ee-9-baseline-for-spring-framework-6" target="_blank" rel="noopener noreferrer"&gt;this change&lt;/a&gt;
 in version 6.&lt;/p&gt;</description></item><item><title>Java Panama Polyglot (C++) Part 1</title><link>https://foojayio.github.io/website/today/java-panama-polyglot-part1/</link><pubDate>Wed, 06 Apr 2022 15:41:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-panama-polyglot-part1/</guid><description>&lt;figure class="wp-block-image size-full is-resized"&gt;
 &lt;img fetchpriority="high" decoding="async" src="polyglot.png" alt="" class="wp-image-55283" width="469" height="112"&gt;
&lt;/figure&gt;
&lt;p&gt;Hello and welcome to the &lt;strong&gt;Java Panama Polyglot&lt;/strong&gt; series where we will be presenting quick tutorials or recipes on how to access native libraries written in other languages.&lt;/p&gt;
&lt;p&gt;For example, you will learn about Java Project Panama&amp;rsquo;s (foreign function interface) abilities to access native libraries written in C++, Swift, Python, and others.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is Polyglot?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Have you heard of polyglot as it relates to developing &lt;a href="https://en.wikipedia.org/wiki/Solution_stack" target="_blank" rel="noopener noreferrer"&gt;full stack&lt;/a&gt;
 applications? If your answer is &lt;strong&gt;yes&lt;/strong&gt;, then you probably know about the programming languages needed to build an enterprise web application.&lt;/p&gt;</description></item><item><title>Debugging JAXB Production Issues</title><link>https://foojayio.github.io/website/today/debugging-jaxb-production-issues/</link><pubDate>Mon, 04 Apr 2022 14:13:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-jaxb-production-issues/</guid><description>&lt;p&gt;Java Architecture for XML Binding (AKA JAXB API) is a popular API for marshalling XML data. It&amp;rsquo;s a framework for mapping between XML documents and Java POJOs (Plain Old Java Objects, AKA regular Java classes) almost seamlessly. The API is very easy to use and many frameworks leverage it to provide their XML support. JAXB2.0 has gained popularity both in desktop applications (Java SE) and in application server code (Spring Boot, Java EE/Jakarta EE, Microprofile etc.).&lt;/p&gt;</description></item><item><title>Increasing Event Streaming with Kafka and Azul</title><link>https://foojayio.github.io/website/today/increasing-event-streaming-with-kafka-and-azul/</link><pubDate>Tue, 29 Mar 2022 13:41:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/increasing-event-streaming-with-kafka-and-azul/</guid><description>&lt;p&gt;Welcome to getting started with &lt;a href="https://www.azul.com/products/prime/" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;
 and &lt;a href="https://www.azul.com/technologies/kafka/" target="_blank" rel="noopener noreferrer"&gt;Apache Kafka&lt;/a&gt;
!&lt;/p&gt;
&lt;p&gt;In this article you will learn how to switch between two different Java runtime environments to run an Apache Kafka instance.&lt;/p&gt;
&lt;p&gt;In later articles, this will allow you to compare runtime performance benchmarks.&lt;/p&gt;
&lt;p&gt;Before we begin, let&amp;rsquo;s supply some context on Azul&amp;rsquo;s Platform offerings and Apache Kafka.&lt;/p&gt;
&lt;h2 id="h-what-is-azul-platform-prime-and-platform-core"&gt;What is Azul Platform Prime and Platform Core?&lt;/h2&gt;
&lt;p&gt;Azul offers two Java runtime environments &lt;a href="https://www.azul.com/products/prime/" target="_blank" rel="noopener noreferrer"&gt;Platform Prime&lt;/a&gt;
 and &lt;a href="https://www.azul.com/products/core/" target="_blank" rel="noopener noreferrer"&gt;Platform Core&lt;/a&gt;
. Platform Prime (formerly known as Zing) is a high-performance implementation of the JVM (Java Virtual Machine) while Platform Core refers to Azul&amp;rsquo;s solution that includes the Zulu build of OpenJDK with dedicated support.&lt;/p&gt;</description></item><item><title>Debugging Java Equals &amp; Hashcode Performance in Production</title><link>https://foojayio.github.io/website/today/debugging-java-equals-hashcode-performance-in-production/</link><pubDate>Tue, 29 Mar 2022 06:50:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-java-equals-hashcode-performance-in-production/</guid><description>&lt;p&gt;I wrote a lot about the performance metrics of the equals method and hash code in &lt;a href="https://talktotheduck.dev/hashcode-and-equals-debugging-performance" target="_blank" rel="noopener noreferrer"&gt;this article&lt;/a&gt;
. There are many nuances that can lead to performance problems in those methods. The problem is that some of those things can be well hidden.&lt;/p&gt;
&lt;p&gt;To summarize the core problem: the hashcode method is central to the Java Collections API. Specifically, with the performance of hash tables (specifically the Map interface hash table). The same is true with the equals method. If we have anything more complex than a string object or a primitive, the overhead can quickly grow.&lt;/p&gt;</description></item><item><title>Debugging Race Conditions in Production</title><link>https://foojayio.github.io/website/today/debugging-race-conditions-in-production/</link><pubDate>Wed, 23 Mar 2022 07:45:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-race-conditions-in-production/</guid><description>&lt;p&gt;Race conditions can occur when a multithreaded application accesses a shared resource using over one thread. Unless we have guards in place, the result might depend on which thread &amp;ldquo;got there first&amp;rdquo;. This is especially problematic when the state is changed externally.&lt;/p&gt;
&lt;p&gt;A race can cause more than just incorrect behavior. It can enable a security vulnerability when the resource in question can be corrupted in the right way. A good example of race condition vulnerabilities is mangling memory. Let&amp;rsquo;s say we have an admin user name which is restricted and privileged. You can&amp;rsquo;t change your user name to admin because of validation. But you can change it to anything else&amp;hellip;&lt;/p&gt;</description></item><item><title>The Basics of Breakpoints you Might not Know</title><link>https://foojayio.github.io/website/today/the-basics-of-breakpoints-you-might-not-know/</link><pubDate>Thu, 17 Mar 2022 10:41:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-basics-of-breakpoints-you-might-not-know/</guid><description>&lt;p&gt;In episodes 4 and 5 of &amp;ldquo;140 Second Ducklings&amp;rdquo;, I got deeper into the more advanced underpinnings of breakpoints. There&amp;rsquo;s still a lot more to learn to move forward, but even at this stage it&amp;rsquo;s surprising how many things are relatively unknown in the developer community. And I&amp;rsquo;m just getting started&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🦆 Duckling the 5th:&lt;/p&gt;
&lt;p&gt;Did you know you can disable a breakpoint until you hit another breakpoint?&lt;/p&gt;
&lt;p&gt;Do you know what&amp;rsquo;s a tracepoint?&lt;/p&gt;</description></item><item><title>Java Return Value, IntelliJ Jump to Line</title><link>https://foojayio.github.io/website/today/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/</link><pubDate>Wed, 02 Mar 2022 15:33:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/</guid><description>&lt;p&gt;I just published the 3rd episode of the &amp;ldquo;140 Second Duckling&amp;rdquo; tutorial series and I&amp;rsquo;m getting into the rhythm of doing them. I posted the 2nd episode last week and in this post I&amp;rsquo;ll dig deeper into both.&lt;/p&gt;
&lt;p&gt;I tackled a lot of basic stuff about debugging but I picked two big headliners that a surprising amount of developers aren&amp;rsquo;t familiar with. E.g. How many times did you step over a return statement and cursed?&lt;/p&gt;</description></item><item><title>Project Panama for Newbies (Part 4)</title><link>https://foojayio.github.io/website/today/project-panama-for-newbies-part-4/</link><pubDate>Thu, 24 Feb 2022 08:34:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/project-panama-for-newbies-part-4/</guid><description>&lt;p&gt;&lt;strong&gt;Updated December 31, 2025:&lt;/strong&gt; This article now features Java 25 and the Foreign Function &amp;amp; Memory (FFM) API, which has been a standard feature since JDK 22.&lt;/p&gt;
&lt;p&gt;Welcome to Part 4 of Java&amp;rsquo;s Project Panama for newbies! If you&amp;rsquo;ve been following &lt;a href="https://foojayio.github.io/website/today/project-panama-for-newbies-part-1/"&gt;this&lt;/a&gt;
 &lt;a href="https://foojayio.github.io/website/today/project-panama-for-newbies-part-2/"&gt;series&lt;/a&gt;
 of &lt;a href="https://foojayio.github.io/website/today/project-panama-for-newbies-part-3/"&gt;posts&lt;/a&gt;
 on how to use Java&amp;rsquo;s Project Panama APIs you probably have noticed that all of the examples thus far demonstrate how Java code can execute C code by using the &lt;a href="https://github.com/openjdk/panama-foreign/blob/d8c0fe5918cb1c6c744eb26797ea4fa04142c237/doc/panama_ffi.md#c-linker" target="_blank" rel="noopener noreferrer"&gt;linker&lt;/a&gt;
&amp;rsquo;s &lt;code&gt;downCall()&lt;/code&gt; method.&lt;/p&gt;</description></item><item><title>Use git bisect to Pinpoint a Bug</title><link>https://foojayio.github.io/website/today/use-git-bisect-to-pinpoint-a-bug/</link><pubDate>Wed, 23 Feb 2022 14:44:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/use-git-bisect-to-pinpoint-a-bug/</guid><description>&lt;p&gt;During some recent work on Maven, I found a very specific bug. The error message wasn&amp;rsquo;t that clear, and I couldn&amp;rsquo;t make a guess what might&amp;rsquo;ve caused it.&lt;/p&gt;
&lt;p&gt;I had read about &lt;code&gt;git bisect&lt;/code&gt; a few times and figured that this time, I would use that tool to find the bug.&lt;/p&gt;
&lt;p&gt;So what does &lt;code&gt;git bisect&lt;/code&gt; do? It helps you find the exact commit that introduced a bug, using binary search.&lt;/p&gt;</description></item><item><title>Enter the Cloud Native Dojo: Blackbelt-Level Debugging</title><link>https://foojayio.github.io/website/today/enter-the-cloud-native-dojo-blackbelt-level-debugging/</link><pubDate>Tue, 22 Feb 2022 13:28:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/enter-the-cloud-native-dojo-blackbelt-level-debugging/</guid><description>&lt;p&gt;Debugging is often viewed as an art form or a craft. This is true for most engineering-related troubleshooting processes (e.g., art of motorcycle maintenance). We&amp;rsquo;re usually indoctrinated into the basic moves by a senior developer and are then thrown into the proverbial pool. As a result, even senior engineers sometimes have gaps in their debugging skills. There are very few university courses or books on the subject, so it&amp;rsquo;s really hard to blame them.&lt;/p&gt;</description></item><item><title>Playing practically with Stream API</title><link>https://foojayio.github.io/website/today/playing-practically-with-stream-api/</link><pubDate>Wed, 16 Feb 2022 00:43:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/playing-practically-with-stream-api/</guid><description>&lt;p&gt;We can find many Stream API examples on Google, but most of them don&amp;rsquo;t represent real life scenarios. Hence, it often remains a black box to understand the power of the Stream API for many rising programmers.&lt;/p&gt;
&lt;p&gt;In this article, I tried to make scenarios based problems where I have tried to make the solution with Stream API. These were initially for my personal practice purposes, and later, I added some more practice problems to demonstrate in my class at Pondit.&lt;/p&gt;</description></item><item><title>What is Debugging in 140 Seconds</title><link>https://foojayio.github.io/website/today/what-is-debugging-in-140-seconds/</link><pubDate>Mon, 14 Feb 2022 12:50:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-is-debugging-in-140-seconds/</guid><description>&lt;p&gt;&lt;strong&gt;I&amp;rsquo;m launching a new twitter video series that will focus on teaching the concepts of debugging (and other concepts) in small video bites.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is the first video in the series. I hope to publish a new video every week. It starts with the very basics of debugging and builds up. I think debugging is a powerful tool that even experienced developers don&amp;rsquo;t leverage enough.&lt;/p&gt;
&lt;p&gt;See the video here:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🦆 Duckling the 1st:&lt;/p&gt;</description></item><item><title>Detect and Fix Memory Leaks in Managed Languages</title><link>https://foojayio.github.io/website/today/debugging-ram-detect-fix-memory-leaks-in-managed-languages-heap-deep-dive-part-2/</link><pubDate>Thu, 10 Feb 2022 08:45:27 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-ram-detect-fix-memory-leaks-in-managed-languages-heap-deep-dive-part-2/</guid><description>&lt;p&gt;In the &lt;a href="https://foojayio.github.io/website/today/debugging-ram-java-garbage-collection-java-heap-deep-dive-part-1/"&gt;previous installment&lt;/a&gt;
, I talked about the Java garbage collector. In this part, I&amp;rsquo;ll discuss the most common memory issue: the memory leak. I focus on managed languages, specifically Java, but I will mention some native code tools which are interesting. A memory leak contributes to heap size, which isn&amp;rsquo;t the most pressing bug in most cases. But when left alone, memory usage can become a problem and, by that point, finding the issue is hard. Unlike a crash dump, where we get a reference to a specific line, a memory leak can remain hidden.&lt;/p&gt;</description></item><item><title>GoF Design Patterns Using Java - Part 02</title><link>https://foojayio.github.io/website/today/gof-design-patterns-using-java-part-02/</link><pubDate>Fri, 04 Feb 2022 16:46:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/gof-design-patterns-using-java-part-02/</guid><description>&lt;p&gt;&lt;a href="https://youtu.be/vq9zkZBjWkw/" target="_blank" rel="noopener noreferrer"&gt;Link to YouTube Video - Introduction to Design Patterns&lt;/a&gt;
&lt;br&gt;
&lt;a href="https://foojayio.github.io/website/today/gang-of-four-design-patterns-using-core-java-part-01/" title="Link to Article : GoF Design Patterns Using Java - Part 01"&gt;Link to Article : GoF Design Patterns Using Java - Part 01&lt;/a&gt;
&lt;br&gt;
&lt;a href="https://github.com/sumithpuri/skp-code-marathon-pattaya" title="Link to GitHub Code Samples in Core Java for this Article" target="_blank" rel="noopener noreferrer"&gt;Link to GitHub Code Samples in Core Java for this Article&lt;/a&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="h2-0-adapter-pattern-sample-code"&gt;&lt;strong&gt;Adapter Pattern [&lt;a href="https://github.com/sumithpuri/skp-code-marathon-pattaya/tree/master/src/main/java/me/sumithpuri/github/pattaya/adapter" title="Sample Code" target="_blank" rel="noopener noreferrer"&gt;Sample Code&lt;/a&gt;
]&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;What can one do if he needs to use an Asian Hairdryer in a European Country, each with different socket types? I would seek an Adapter! As in real life, when we want to plug and play with similar but incompatible interfaces we use the Adapter. The Adapter adapts the Adaptee to the desired interface, by composing the Adaptee object and inheriting the desired interface or by multiple inheritance.&lt;/p&gt;</description></item><item><title>Lights, Camera, Action: GitHub Actions with Java (Part 3)</title><link>https://foojayio.github.io/website/today/lights-camera-action-github-actions-with-java-part-3/</link><pubDate>Thu, 03 Feb 2022 15:24:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/lights-camera-action-github-actions-with-java-part-3/</guid><description>&lt;br /&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/lights-camera-action-github-actions-with-java-part-3/Spidey_GitHub_Action_disco_latest.jpg" alt="Spiderman chooses GitHub Action&amp;rsquo;s Disco API" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;The Java GitHub Action that Rules them all - Disco API{#caption-attachment-51347}&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;When we ended Part 2 of this blog series Lights, Camera, Action: GitHub Actions with Java &lt;a href="https://foojayio.github.io/website/today/github-actions-with-java-part-2" title="Part 2"&gt;Part 2&lt;/a&gt;
, I talked about the near future of GitHub Actions. Well, today the future is now, so let&amp;rsquo;s get into this!&lt;/p&gt;
&lt;p&gt;Welcome back to the series of articles on GitHub Actions with Java Part 3. If you didn&amp;rsquo;t catch Part 1 &amp;amp; 2 head over here: &lt;a href="https://foojayio.github.io/website/today/github-actions-with-java-part-1" title="Part 1"&gt;Part 1&lt;/a&gt;
 &amp;amp; &lt;a href="https://foojayio.github.io/website/today/github-actions-with-java-part-2" title="Part 2"&gt;Part 2&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>Create a CRUD UI in Pure Java</title><link>https://foojayio.github.io/website/today/create-a-crud-ui-in-pure-java/</link><pubDate>Wed, 02 Feb 2022 17:10:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/create-a-crud-ui-in-pure-java/</guid><description>&lt;p&gt;In this guide, we create a web UI that performs full CRUD (create, read, update, and delete) operations on a Spring Data JPA backend. This UI is developed entirely in pure Java using &lt;a href="https://vaadin.com/docs/latest/flow/guide/quick-start" title="Vaadin Flow" target="_blank" rel="noopener noreferrer"&gt;Vaadin Flow&lt;/a&gt;
 (no HTML or JavaScript involved). You can explore the full source code on &lt;a href="https://github.com/tarekoraby/crud-ui-tutorial" title="GitHub" target="_blank" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
.&lt;/p&gt;
&lt;h3 id="h3-0-what-you-need"&gt;What You Need&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;About 15 minutes&lt;/li&gt;
&lt;li&gt;JDK 17 or later&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-1-step-1-import-a-starter-project"&gt;Step 1: Import a Starter Project&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://start.vaadin.com/dl?preset=no-views" title="Click here to download an empty project starter" target="_blank" rel="noopener noreferrer"&gt;Click here to download an empty project starter&lt;/a&gt;
. Unpack the downloaded zip into a folder on your computer, and import the project in the IDE of your choice.&lt;/p&gt;</description></item><item><title>Debugging RAM: Java Garbage Collection - Java Heap Deep Dive (Part 1)</title><link>https://foojayio.github.io/website/today/debugging-ram-java-garbage-collection-java-heap-deep-dive-part-1/</link><pubDate>Tue, 11 Jan 2022 15:36:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-ram-java-garbage-collection-java-heap-deep-dive-part-1/</guid><description>&lt;p&gt;There are many excellent articles on Java Garbage Collection, Java Memory usage and generally Java heap. Unfortunately, they are all over the place. They mix architecture, concepts and problem solving as separate pieces. A lot of the material is out of date or doesn&amp;rsquo;t include pragmatic information for solving problems with the garbage collector. E.g. e.g. pause times, heap space usage etc.&lt;/p&gt;
&lt;p&gt;In this post I won&amp;rsquo;t go into memory leaks. They&amp;rsquo;re important but this is a different subject I would like to discuss in a post on its own.&lt;/p&gt;</description></item><item><title>Build Web Apps in Pure Java with Vaadin Flow</title><link>https://foojayio.github.io/website/today/build-web-apps-in-pure-java-with-vaadin-flow/</link><pubDate>Thu, 16 Dec 2021 09:21:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/build-web-apps-in-pure-java-with-vaadin-flow/</guid><description>&lt;p&gt;Vaadin Flow enables you to quickly build web apps in &lt;em&gt;pure Java&lt;/em&gt;, without writing any HTML or JavaScript.&lt;/p&gt;
&lt;p&gt;In this guide, you learn how to build a small but fully functional ToDo application using Vaadin Flow.&lt;/p&gt;
&lt;h3 id="h3-0-what-you-need"&gt;What You Need&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;About 5 minutes&lt;/li&gt;
&lt;li&gt;JDK 11 or higher (For example, &lt;a href="https://adoptium.net/" title="Eclipse Temurin JDK" target="_blank" rel="noopener noreferrer"&gt;Eclipse Temurin JDK&lt;/a&gt;
).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-1-step-1-download-a-vaadin-project"&gt;Step 1: Download a Vaadin Project&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://start.vaadin.com/dl?preset=flow-quickstart-tutorial" title="here" target="_blank" rel="noopener noreferrer"&gt;Click here to download an empty project starter&lt;/a&gt;
. Unpack the downloaded zip into a folder on your computer, and import the project in the IDE of your choice.&lt;/p&gt;</description></item><item><title>Java Thread Programming (Part 9)</title><link>https://foojayio.github.io/website/today/java-thread-programming-part-9/</link><pubDate>Tue, 14 Dec 2021 11:14:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-thread-programming-part-9/</guid><description>&lt;p&gt;&lt;strong&gt;In &lt;a href="https://foojayio.github.io/website/today/java-thread-programming-part-8/"&gt;our last article&lt;/a&gt;
, we discussed thread-safety in naive terms and shared a couple of ways to ensure thread safety.&lt;/strong&gt; &lt;strong&gt;We also introduced a package containing thread-safe classes, which we can confidently use without worrying much, e.g., AtomicInteger. This is because they are designed in a thread-safe way.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Today in this article, we will continue the discussion and share a few more thread-safe classes that we can use in our day-to-day coding.&lt;/p&gt;</description></item><item><title>Native-image with Quarkus</title><link>https://foojayio.github.io/website/today/native-image-quarkus/</link><pubDate>Mon, 13 Dec 2021 17:50:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/native-image-quarkus/</guid><description>&lt;p&gt;So far, we have looked at how well &lt;a href="https://foojayio.github.io/website/today/native-spring-boot/"&gt;Spring Boot&lt;/a&gt;
 and &lt;a href="https://foojayio.github.io/website/today/native-image-micronaut/"&gt;Micronaut&lt;/a&gt;
 integrate GraalVM native image extension. In this post, I&amp;rsquo;ll focus on &lt;a href="https://quarkus.io/" target="_blank" rel="noopener noreferrer"&gt;Quarkus&lt;/a&gt;
:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A Kubernetes Native Java stack tailored for OpenJDK HotSpot and GraalVM, crafted from the best of breed Java libraries and standards.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="h2-0-creating-a-new-project"&gt;Creating a new project&lt;/h2&gt;
&lt;p&gt;Just as Spring Boot and Micronaut, Quarkus provides options to create new projects:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A dedicated &lt;code&gt;quarkus&lt;/code&gt; &lt;a href="https://quarkus.io/guides/cli-tooling" target="_blank" rel="noopener noreferrer"&gt;CLI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://code.quarkus.io/" target="_blank" rel="noopener noreferrer"&gt;Web UI&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;img fetchpriority="high" decoding="async" class="aligncenter size-medium wp-image-50950" src="code-quarkus-700x477.jpg" alt="" width="700" height="477"&gt;
&lt;p&gt;Quarkus offers a definite improvement over its competitors. Every dependency has a detailed contextual menu that allows:&lt;/p&gt;</description></item><item><title>Non-blocking with Spring WebFlux, Kotlin and Coroutines</title><link>https://foojayio.github.io/website/today/build-and-test-non-blocking-web-applications-with-spring-webflux-kotlin-and-coroutines/</link><pubDate>Thu, 09 Dec 2021 14:03:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/build-and-test-non-blocking-web-applications-with-spring-webflux-kotlin-and-coroutines/</guid><description>&lt;p&gt;When a HTTP request comes in, a &amp;rsquo;normal&amp;rsquo; web application would map the request to a specific thread from the thread pool. This assigned thread stays with the request until a response can be returned to the request socket. Along the way, we might need to fetch data from some web service or database, read or write to a file or do other I/O calls, during which the thread is blocked and has to wait until it gets a response. For applications with high request rates, the thread pool can at some point become exhausted and then no new requests can be handled anymore.&lt;/p&gt;</description></item><item><title>Java Thread Programming (Part 8)</title><link>https://foojayio.github.io/website/today/java-thread-programming-part-8/</link><pubDate>Tue, 07 Dec 2021 18:15:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-thread-programming-part-8/</guid><description>&lt;p&gt;The term thread safety is a frequently and commonly pronounced word among Java developers. However, it is still one of the misunderstood terms as well. In this article, I will try to explain in a very simplified way what it is and how we can achieve it while we write our day-to-day code.&lt;/p&gt;
&lt;p&gt;The idea is, when writing a piece of code, it usually contains method and data. If we write a class, it may hold some data in terms of state. For example, if we want to write a Counter class, we will have a variable inside the counter class that holds the current count.&lt;/p&gt;</description></item><item><title>Java Thread Programming (Part 7)</title><link>https://foojayio.github.io/website/today/java-thread-programming-part-7/</link><pubDate>Tue, 23 Nov 2021 10:10:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-thread-programming-part-7/</guid><description>&lt;p&gt;&lt;strong&gt;In &lt;a href="https://foojayio.github.io/website/today/author/bazlur-rahman/"&gt;our previous Java threading articles in this series&lt;/a&gt;
, we learned a great deal about how we can create threads and how to use them while avoiding the issues that come with them. But what does this leave us with? Can we create as many threads as we want? I wish I could answer this with a straight yes or no. In this article, I will try to come up with an answer via an exercise, so bear with me!&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>SKP's Agile Cheatsheet : Part 03</title><link>https://foojayio.github.io/website/today/skps-agile-cheatsheet-part-03/</link><pubDate>Wed, 17 Nov 2021 21:18:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/skps-agile-cheatsheet-part-03/</guid><description>&lt;p&gt;SKP&amp;rsquo;s Agile Cheatsheet is a three part series of articles focused on daily agile terminology, ideal to be printed out and pinned up near your workstation. Part 1 is available &lt;a href="https://foojayio.github.io/website/today/skps-agile-cheatsheet-part-01" title="Here"&gt;here&lt;/a&gt;
 and part 2 &lt;a href="https://foojayio.github.io/website/today/skps-agile-cheatsheet-part-02" title="Here"&gt;here&lt;/a&gt;
while the PDF cheatsheet is &lt;a href="https://rebrand.ly/skp-agile-cheat-sheet-all" title="Here" target="_blank" rel="noopener noreferrer"&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src="https://imgur.com/LGzevOM.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Release Train&lt;/strong&gt;. The Agile Release Train (ART) is a long-lived team of Agile teams, which, along with other stakeholders, incrementally develops, delivers, and where applicable operates, one or more solutions in a value stream. [Type &amp;ndash; Agile Product Management]&lt;/p&gt;</description></item><item><title>Streams Set Distinct Java Code Quiz</title><link>https://foojayio.github.io/website/today/streams-set-distinct-java-code-quiz/</link><pubDate>Thu, 11 Nov 2021 09:36:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/streams-set-distinct-java-code-quiz/</guid><description>&lt;p&gt;Using Streams and Set Collection Factory methods with Java makes code easier to read and maintain.&lt;/p&gt;
&lt;p&gt;By using these features, we can also make it more difficult for bugs to remain hidden. If you can use the latest &lt;a href="https://foojayio.github.io/website/almanac/java-17/" title="LTS (Long-term support) Java version"&gt;LTS (Long-term support) Java version&lt;/a&gt;
 in your project, it&amp;rsquo;s the best scenario, so that you can use cool Java features such as Collection Factories from Java 9 onwards.&lt;/p&gt;
&lt;p&gt;Now that we know why it&amp;rsquo;s important to understand Java features well, it&amp;rsquo;s time for the Java Challenge!&lt;/p&gt;</description></item><item><title>SKP's Agile Cheatsheet: Part 02</title><link>https://foojayio.github.io/website/today/skps-agile-cheatsheet-part-02/</link><pubDate>Fri, 05 Nov 2021 07:58:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/skps-agile-cheatsheet-part-02/</guid><description>&lt;p&gt;SKP&amp;rsquo;s Agile Cheatsheet is a three part series of articles focused on daily agile terminology, ideal to be printed out and pinned up near your workstation. Part 1 of this article is available &lt;a href="https://foojayio.github.io/website/today/skps-agile-cheatsheet-part-01" title="Here"&gt;here&lt;/a&gt;
 and you can download the PDF of this cheatsheet &lt;a href="https://rebrand.ly/skp-agile-cheat-sheet-all" title="Here" target="_blank" rel="noopener noreferrer"&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://imgur.com/3Fzra1d.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;**Epic.**An epic is a large user story. [Type &amp;ndash; Agile Estimation / Agile Product Management]&lt;/p&gt;
&lt;p&gt;**Fibonacci Scale.**In Agile software development, the Fibonacci scale consists of a sequence of numbers used for estimating the relative size of user stories in points. Agile Scrum is based on the concept of working iteratively in short sprints, typically two weeks long, where the requirements and development are continuously being improved. The Fibonacci sequence consists of numbers that are the summation of the two preceding numbers, starting with [0, 1]. Agile uses the Fibonacci sequence to achieve better results by reducing complexity, effort, and doubt when determining the development time required for a task, which can range from a few minutes to several weeks. [Type &amp;ndash; Agile Estimation / Agile Product Management]&lt;/p&gt;</description></item><item><title>Debugging Tutorial 1 – Introduction: Conditional Breakpoints &amp; Set Value</title><link>https://foojayio.github.io/website/today/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/</link><pubDate>Wed, 27 Oct 2021 08:03:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/</guid><description>&lt;p&gt;In this series, I&amp;rsquo;ll walk you through the process of debugging applications and finding issues within them. As we debug, we&amp;rsquo;ll cover the techniques important for most developers. I will cover the following debuggers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IntelliJ/IDEA &amp;ndash; with Java/Kotlin&lt;/li&gt;
&lt;li&gt;PyCharm &amp;ndash; Python&lt;/li&gt;
&lt;li&gt;VSCode &amp;ndash; for JavaScript&lt;/li&gt;
&lt;li&gt;WebStorm &amp;ndash; for JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These should cover most use cases you&amp;rsquo;ll run into and some things will seem duplicate/redundant so you can just skip to the applicable section if you feel you &amp;ldquo;got the gist&amp;rdquo;.&lt;/p&gt;</description></item><item><title>GlassFish &amp; Payara Auto-Clustering for Jakarta EE Applications</title><link>https://foojayio.github.io/website/today/glassfish-payara-auto-clustering-jakarta-ee/</link><pubDate>Wed, 13 Oct 2021 13:27:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/glassfish-payara-auto-clustering-jakarta-ee/</guid><description>&lt;figure class="alignleft is-resized"&gt;
 &lt;img fetchpriority="high" decoding="async" src="https://jelastic.com/blog/wp-content/uploads/2021/09/GlassFish-and-Payara-clustering.png" alt="" class="wp-image-55851" width="400" height="216"&gt;
&lt;/figure&gt;
&lt;p&gt;Ensuring trouble-proof 24/7 service delivery is among one of the most discussed areas in cloud hosting for the last few years. And the very obvious and commonly used solution here is building a clustered infrastructure for your project.&lt;/p&gt;
&lt;p&gt;Intending to help our customers to deal with such a non-trivial task and save time for other project-related activities, we created a special high-availability solution, designed to facilitate the Jakarta EE application hosting &amp;ndash; embedded &lt;strong&gt;Auto-Clustering for GlassFish and Payara&lt;/strong&gt; application servers.&lt;/p&gt;</description></item><item><title>Debug Real World Applications using a Systemic Proven Process</title><link>https://foojayio.github.io/website/today/the-debugger-checklist-part-ii/</link><pubDate>Tue, 28 Sep 2021 08:54:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-debugger-checklist-part-ii/</guid><description>&lt;p&gt;In the &lt;a href="https://foojayio.github.io/website/today/the-debugger-checklist-part-i/"&gt;Debugger Checklist (Part I)&lt;/a&gt;
, I introduced some of the high level concepts and reviewed some of the common things you can do. In this part, we&amp;rsquo;ll get down to the process. Again, it&amp;rsquo;s important to stress that this is boiled down and concentrated!&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t want to discuss issue trackers, unit testing and proper TDD. I think there are many resources covering all of these. The focus of these posts is the debug process itself which often gets neglected as &amp;ldquo;tools&amp;rdquo;. There&amp;rsquo;s a lot of technique that separates the seasoned developer from a junior. Furthermore, there are many small advancements and changes we can&amp;rsquo;t possibly keep up with. I&amp;rsquo;d like to cover all of those things (some in future posts).&lt;/p&gt;</description></item><item><title>Thorntail Fat, Thin and Skinny Approach for Java Microservices</title><link>https://foojayio.github.io/website/today/thorntail-fat-thin-skinny-java-microservices/</link><pubDate>Wed, 22 Sep 2021 16:25:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/thorntail-fat-thin-skinny-java-microservices/</guid><description>&lt;p&gt;&lt;a href="https://thorntail.io/" target="_blank" rel="noopener noreferrer"&gt;Thorntail&lt;/a&gt;
, originally &lt;a href="https://wildfly-swarm.io/" target="_blank" rel="noopener noreferrer"&gt;WildFly Swarm&lt;/a&gt;
, is most suitable for packaging applications as &lt;em&gt;JAR&lt;/em&gt; , &lt;em&gt;WAR,&lt;/em&gt; or &lt;em&gt;EAR&lt;/em&gt; files. The most important value is in the functional agility the Thorntail provides. You can start with the stripped down version of Thorntail, adding the required parts and application code on top.&lt;/p&gt;
&lt;figure class="aligncenter is-resized"&gt;
 &lt;img fetchpriority="high" decoding="async" src="https://jelastic.com/blog/wp-content/uploads/2018/09/jvm-microservice.png" alt="microservices" class="wp-image-30149" width="329" height="411"&gt;
&lt;/figure&gt;
&lt;p&gt;Below we will describe how to build and deploy Thorntail based applications using Fat, Thin and Skinny approaches. The application will be packaged in the Jar/War format automatically with the help of &lt;a href="https://github.com/jelastic-jps/thorntail" target="_blank" rel="noopener noreferrer"&gt;Builder add-ons&lt;/a&gt;
 prepared by Jelastic. The topology will consist of Maven build node and JVM containers for running microservices.&lt;/p&gt;</description></item><item><title>Debugger Checklist: Bug Solving Process</title><link>https://foojayio.github.io/website/today/the-debugger-checklist-part-i/</link><pubDate>Tue, 21 Sep 2021 09:37:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-debugger-checklist-part-i/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/the-debugger-checklist-part-i/Blog-Header-1200x600-px1-700x350.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Win at debugging by following an organized process and leveraging the tools you already have!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m a disorganized person by nature. When I follow a process it&amp;rsquo;s by habit and intuition. But when a debugging problem keeps me up at night and gets me to that state of mind where a career of raising sheep in New Zealand seems like an attractive option&amp;hellip; That&amp;rsquo;s when I need to back off and walk through this process in an orderly fashion. This process never fails. When you walk through it, you can track any problem.&lt;/p&gt;</description></item><item><title>Project Panama for Newbies (Part 3)</title><link>https://foojayio.github.io/website/today/project-panama-for-newbies-part-3/</link><pubDate>Mon, 13 Sep 2021 08:53:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/project-panama-for-newbies-part-3/</guid><description>&lt;p&gt;&lt;strong&gt;Updated December 31, 2025:&lt;/strong&gt; This article now features Java 25 and the Foreign Function &amp;amp; Memory (FFM) API, which has been a standard feature since JDK 22 (&lt;a href="https://openjdk.java.net/jeps/454" target="_blank" rel="noopener noreferrer"&gt;JEP-454&lt;/a&gt;
).&lt;/p&gt;
&lt;figure class="wp-block-image size-full is-resized is-style-default"&gt;
 &lt;img fetchpriority="high" decoding="async" width="218" height="407" src="panama_part3.png" alt="Panama for newbies Part 3" class="wp-image-46521" style="width:140px;height:230px"&gt;
 &lt;figcaption class="wp-element-caption"&gt;
 Panama for newbies Part 3
 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Welcome to the third part of the series on Java&amp;rsquo;s Project Panama for newbies. Before jumping into this article, I want to congratulate you for getting this far, you deserve a virtual pat on the back!&lt;/p&gt;</description></item><item><title>8 Debugging Tips for IntelliJ IDEA Users You Never Knew Existed</title><link>https://foojayio.github.io/website/today/eight-debugging-tips-for-intellijidea-users-you-never-knew-existed/</link><pubDate>Thu, 09 Sep 2021 07:15:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/eight-debugging-tips-for-intellijidea-users-you-never-knew-existed/</guid><description>&lt;p&gt;As developers, we&amp;rsquo;re all familiar with debuggers. We use debugging tools on a daily basis &amp;ndash; they&amp;rsquo;re an essential part of programming. But let&amp;rsquo;s be honest. Usually, we only use the breakpoint option. If we&amp;rsquo;re feeling frisky, we might use a conditional breakpoint.&lt;/p&gt;
&lt;p&gt;But guess what, the &lt;a href="https://www.jetbrains.com/idea/" title="IntelliJ IDEA" target="_blank" rel="noopener noreferrer"&gt;IntelliJ IDEA&lt;/a&gt;
 debugger has many powerful and cutting-edge features that are useful for debugging more easily and efficiently. To help, we&amp;rsquo;ve compiled a list of tips and tricks from our very own developers here at &lt;a href="https://go.lightrun.com/request-a-demo?utm_source=blog&amp;amp;amp;utm_medium=LR_blog&amp;amp;amp;utm_campaign=eight-debugging-tips-for-intellijidea" title="Lightrun" target="_blank" rel="noopener noreferrer"&gt;Lightrun&lt;/a&gt;
. We hope these tips will help you find and resolve bugs faster.&lt;/p&gt;</description></item><item><title>Daemon Thread Java Code Quiz</title><link>https://foojayio.github.io/website/today/daemon-thread-java-code-quiz/</link><pubDate>Wed, 08 Sep 2021 07:29:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/daemon-thread-java-code-quiz/</guid><description>&lt;p&gt;When we are working with Threads, it&amp;rsquo;s important to know when to use a daemon or a non-daemon Thread.&lt;/p&gt;
&lt;p&gt;Do you know if the main Thread is a daemon or not? And do you know what a daemon Thread is?&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s what you will find out by trying out the following Java Challenge!&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s time to improve your Java skills with this Daemon Thread Challenge&amp;hellip;&lt;/p&gt;
&lt;h2 id="h2-0-daemon-thread-challenge"&gt;Daemon Thread Challenge&lt;/h2&gt;
&lt;p&gt;What will happen when running the following main method?&lt;/p&gt;</description></item><item><title>Function Calculation Java Challenge</title><link>https://foojayio.github.io/website/today/function-calculation-java-challenge/</link><pubDate>Wed, 01 Sep 2021 10:10:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/function-calculation-java-challenge/</guid><description>&lt;p&gt;Functional programming is a very powerful paradigm that makes code more concise and easier to understand.&lt;/p&gt;
&lt;p&gt;In Java, the &amp;ldquo;Function&amp;rdquo; functional interface can be used as a first-class citizen function, meaning that we can pass a function to a method and declare it as a variable, giving the developer a lot of power.&lt;/p&gt;
&lt;p&gt;And now it&amp;rsquo;s time for you now to test your abilities with lambdas and functional interfaces! Get ready!&lt;/p&gt;</description></item><item><title>Tomcat and TomEE Clustering Automation in the Cloud</title><link>https://foojayio.github.io/website/today/tomcat-tomee-clustering-automation/</link><pubDate>Mon, 30 Aug 2021 07:18:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/tomcat-tomee-clustering-automation/</guid><description>&lt;figure class="alignleft"&gt;
 &lt;img decoding="async" src="https://jelastic.com/blog/wp-content/uploads/2021/08/image11.png" alt="Tomcat TomEE Automatic Clustering"&gt;
&lt;/figure&gt;
&lt;p&gt;Apache &lt;a href="https://tomcat.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Tomcat&lt;/a&gt;
 is an open-source application server maintained by the Apache community. It is one of the most popular solutions for hosting Java applications due to its ease-of-use and lightweight yet versatile functionality. However, if you run the projects based on &lt;a href="https://jakarta.ee/" target="_blank" rel="noopener noreferrer"&gt;Jakarta EE&lt;/a&gt;
 8 (or higher), you may be interested to use &lt;a href="https://tomee.apache.org/" target="_blank" rel="noopener noreferrer"&gt;TomEE&lt;/a&gt;
 server with built-in required enterprise technology that isn&amp;rsquo;t found in Tomcat.&lt;/p&gt;
&lt;p&gt;Due to the extreme popularity of these stacks globally, and within Jelastic PaaS in particular, we&amp;rsquo;ve decided to share tips on how to install automatically clustered Tomcat and TomEE servers to get a highly available solution that can efficiently serve a large number of users, process high traffic, and be reliable.&lt;/p&gt;</description></item><item><title>Stream Limit Filter Java Challenge</title><link>https://foojayio.github.io/website/today/stream-limit-filter-java-challenge/</link><pubDate>Tue, 17 Aug 2021 07:00:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/stream-limit-filter-java-challenge/</guid><description>&lt;p&gt;To manipulate data from a collection by using a Java stream is handy and cleaner than the alternatives.&lt;/p&gt;
&lt;p&gt;When you learn how to use streams, your Java code will be much better, and knowing how to limit and filter data with streams is crucial for you to do something useful with streams in Java.&lt;/p&gt;
&lt;p&gt;Without further ado, let&amp;rsquo;s go to the next Java Challenge!&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s time to improve your Java skills with this Limit Stream Challenge.&lt;/p&gt;</description></item><item><title>Getting Started with Snyk for Secure Java Development</title><link>https://foojayio.github.io/website/today/getting-started-with-snyk-for-secure-java-development/</link><pubDate>Thu, 29 Jul 2021 06:39:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/getting-started-with-snyk-for-secure-java-development/</guid><description>&lt;p&gt;If you&amp;rsquo;re a Java developer who wants to develop your applications more securely, you&amp;rsquo;ve come to the right place. Snyk can help you with that mission.&lt;/p&gt;
&lt;p&gt;This article will explain how to begin with Snyk for &lt;a href="https://snyk.io/blog/10-java-security-best-practices/" target="_blank" rel="noopener noreferrer"&gt;secure Java development&lt;/a&gt;
 so you can be more secure from the get-go.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re new to Snyk, it&amp;rsquo;s important to know that we offer a variety of developer-focused products and tools. Some of these tools, like our CLI and some IDE integration, support multiple products. However, we can distinguish four different products within Snyk:&lt;/p&gt;</description></item><item><title>Neo Stream Search Java Challenge</title><link>https://foojayio.github.io/website/today/neo-stream-search-java-challenge/</link><pubDate>Mon, 26 Jul 2021 08:32:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/neo-stream-search-java-challenge/</guid><description>&lt;p&gt;Understanding the mechanics of the functional interface Predicate of a Stream is crucial if you want to create something meaningful with streams. On this challenge, we will explore important key methods when we work with a stream so that it becomes clear for you what they do.&lt;/p&gt;
&lt;p&gt;Without further ado, let&amp;rsquo;s go to the Java Challenge!&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s time to improve your Java skills with this Neo Stream Search Challenge&lt;/p&gt;
&lt;h2 id="_neo_stream_search_challenge"&gt;Neo Stream Search Challenge&lt;/h2&gt;
&lt;p&gt;What do you think will happen when running the following code?&lt;/p&gt;</description></item><item><title>Join The Jedi Lambda Join Java Challenge!</title><link>https://foojayio.github.io/website/today/jedi-lambda-join-java-challenge/</link><pubDate>Wed, 21 Jul 2021 08:08:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/jedi-lambda-join-java-challenge/</guid><description>&lt;p&gt;There are many concepts involved in Java Challenge! In essence, we will explore lambdas and the Function interface the most. However, we also have static methods introduced in Java 8 the private method in interfaces introduced in Java 9. In the invocation of the interface methods, we are using anonymous inner classes too!&lt;/p&gt;
&lt;p&gt;Are you ready for this Java Challenge? Less introduction, more action, try out this Java Challenge, and master Java concepts by having fun!&lt;/p&gt;</description></item><item><title>Soprano ofNullable stream Java Challenge</title><link>https://foojayio.github.io/website/today/soprano-ofnullable-stream-java-challenge/</link><pubDate>Mon, 05 Jul 2021 08:21:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/soprano-ofnullable-stream-java-challenge/</guid><description>&lt;p&gt;Since Java 9, it&amp;rsquo;s possible to use Optional with a stream when we need to manipulate values from a List.&lt;/p&gt;
&lt;p&gt;In this Java Challenge, we will explore the use of a stream in an Optional!&lt;/p&gt;
&lt;p&gt;Are you ready to solve this Java Challenge? It&amp;rsquo;s time to improve your Java skills with this Soprano ofNullable stream Challenge&amp;hellip;&lt;/p&gt;
&lt;h2 id="h2-0-soprano-ofnullable-filter-challenge"&gt;Soprano ofNullable filter Challenge&lt;/h2&gt;
&lt;p&gt;What will happen after the main method is executed as follows?&lt;/p&gt;</description></item><item><title>Method Reference VS Lambda Java Challenge</title><link>https://foojayio.github.io/website/today/method-reference-vs-lambda-java-challenge/</link><pubDate>Tue, 29 Jun 2021 19:31:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/method-reference-vs-lambda-java-challenge/</guid><description>&lt;p&gt;Do you know what the differences are between method references and lambdas?&lt;/p&gt;
&lt;p&gt;In this Java Challenge, we will explore how lambdas and method references behave so that you can really understand how they work!&lt;/p&gt;
&lt;p&gt;Now that you know the main context, it&amp;rsquo;s time for the Java Challenge!&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s time to improve your Java skills with this Method Reference VS Lambda Challenge.&lt;/p&gt;
&lt;h3 id="h3-0-method-reference-vs-lambda-challenge"&gt;Method Reference VS Lambda Challenge&lt;/h3&gt;
&lt;p&gt;What will happen when we run the following main method?&lt;/p&gt;</description></item><item><title>Introduction to Simplify Protocol Refactoring</title><link>https://foojayio.github.io/website/today/simplify-protocol-refactoring/</link><pubDate>Mon, 28 Jun 2021 13:22:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/simplify-protocol-refactoring/</guid><description>&lt;p&gt;The other day, I went grocery shopping. While waiting in line, I thought about some struggles I had in a test I wrote earlier that day. When it was my turn, the cashier scanned my items and said what I owe him. And I just gave him my whole wallet. He stared at me blankly and gave it back. A little confused for a second, I took out my card, paid, and left the store. And at that point, it hit me what was wrong with my test.&lt;/p&gt;</description></item><item><title>Creating a JavaFX World Clock from Scratch (Part 6)</title><link>https://foojayio.github.io/website/today/creating-a-javafx-world-clock-from-scratch-part-6/</link><pubDate>Fri, 25 Jun 2021 16:48:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-a-javafx-world-clock-from-scratch-part-6/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Wherever you go, no matter what the weather, always bring your own sunshine. &amp;ndash; Anthony J. D&amp;rsquo;Angelo&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hello, and welcome to the last part of this series of articles on creating a JavaFX World Clock from scratch!&lt;/p&gt;
&lt;p&gt;In this part, I will show you how to make WebService calls (RESTful) to retrieve weather data based on geographic locations.&lt;/p&gt;
&lt;p&gt;If you remember, &lt;a href="https://foojayio.github.io/website/today/creating-a-javafx-world-clock-from-scratch-part-5/"&gt;in Part 5&lt;/a&gt;
 you learned how to use the JavaFX WebView and the popular mapping library Leaflet JS enabling the user to discover geographic locations. In Part 6, I will show you how I used Java 11&amp;rsquo;s Http Client to retrieve and display weather content. If you are new to this series, you can visit Part &lt;a href="https://foojayio.github.io/website/today/creating-a-javafx-world-clock-from-scratch-part-1/" title="1"&gt;1&lt;/a&gt;
-&lt;a href="https://foojayio.github.io/website/today/creating-a-javafx-world-clock-from-scratch-part-5/" title="5"&gt;5&lt;/a&gt;
.&lt;br&gt;
&lt;img src="https://foojayio.github.io/website/today/creating-a-javafx-world-clock-from-scratch-part-6/JFX-World-Clock-Part-6.png" alt="JFX World Clock Part 6" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>How to Debug Java on the Command Line</title><link>https://foojayio.github.io/website/today/jdb/</link><pubDate>Thu, 24 Jun 2021 16:51:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/jdb/</guid><description>&lt;p&gt;Some bugs are hard to replicate on your personal computer but easily replicated on production or test machines. It is a common situation that professional Java developers deal with frequently. To debug such problems, OpenJDK provides two tools, &lt;code&gt;remote debugging&lt;/code&gt; and &lt;code&gt;jdb&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This article focuses on &lt;code&gt;jdb&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For Java applications, typical production and test machines are Linux servers without display managers, so that only command line tools are available. Here we cannot use professional IDEs like IntelliJ IDEA, Eclipse, or Apache NetBeans IDE.&lt;/p&gt;</description></item><item><title>Jakarta EE Application Deployment to Kubernetes Cluster in Jelastic PaaS</title><link>https://foojayio.github.io/website/today/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/</link><pubDate>Wed, 16 Jun 2021 06:58:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/</guid><description>&lt;p&gt;Recently, we were asked to sponsor cloud hosting of a Jakarta EE project, called &lt;a href="https://cargo-tracker.j.scaleforce.net/" target="_blank" rel="noopener noreferrer"&gt;Cargo Tracker&lt;/a&gt;
. Being a member of Jakarta EE Working Group, Jelastic wanted to support the community and thus we started to run this application at one of our service providers (&lt;a href="https://jelastic.cloud/details/scaleforce/" target="_blank" rel="noopener noreferrer"&gt;Scaleforce&lt;/a&gt;
).&lt;/p&gt;
&lt;figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"&gt;
 &lt;div class="wp-block-embed__wrapper"&gt;
 &lt;blockquote class="twitter-tweet" data-width="500" data-dnt="true"&gt;
 &lt;p lang="en" dir="ltr"&gt;Cargo Tracker is now deployed to Kubernetes on the cloud using GitHub Actions. Thanks sponsors Jelastic and Scaleforce! &lt;a target="_blank" href="https://t.co/zhnmj0TB7Z"&gt;https://t.co/zhnmj0TB7Z&lt;/a&gt; // &lt;a target="_blank" href="https://twitter.com/Jelastic?ref_src=twsrc%5Etfw"&gt;@Jelastic&lt;/a&gt;, &lt;a target="_blank" href="https://twitter.com/scaleforce?ref_src=twsrc%5Etfw"&gt;@scaleforce&lt;/a&gt; &lt;a target="_blank" href="https://t.co/BRGkwxban2"&gt;pic.twitter.com/BRGkwxban2&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Hidden Dracula Polymorphism Java Challenge</title><link>https://foojayio.github.io/website/today/hidden-dracula-polymorphism-java-challenge/</link><pubDate>Mon, 14 Jun 2021 11:26:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/hidden-dracula-polymorphism-java-challenge/</guid><description>&lt;p&gt;Polymorphism is one of the most important Java concepts. We might not even be aware we&amp;rsquo;re using it all the time but when we instantiate an &lt;code&gt;ArrayList&lt;/code&gt; and assign it to a variable of the &lt;code&gt;List&lt;/code&gt; type, we are using polymorphism. It&amp;rsquo;s a powerful concept because it helps us to decouple responsibilities, therefore, making code more flexible and easier to maintain.&lt;/p&gt;
&lt;p&gt;This Java Challenge is one of the hardest ones, are you ready for this one? Now is your time to improve your Java skills by doing this Java Challenge!&lt;/p&gt;</description></item><item><title>Asynchronous CompletableFuture Java Challenge</title><link>https://foojayio.github.io/website/today/asynchronous-completablefuture-san-francisco-adventure-java-challenge/</link><pubDate>Tue, 01 Jun 2021 07:42:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/asynchronous-completablefuture-san-francisco-adventure-java-challenge/</guid><description>&lt;p&gt;The Completable Future feature is powerful for better performance when running asynchronous methods.&lt;/p&gt;
&lt;p&gt;In Java 5, there is the Future interface, however, the Future interface doesn&amp;rsquo;t have many methods that would help us to create robust code. To solve the limitations of the Future interface, we have the CompletableFuture API with methods that will help us to build reliable high-performant software.&lt;/p&gt;
&lt;p&gt;Now that we had the intro about CompletableFuture, let&amp;rsquo;s go to the Java Challenge!&lt;/p&gt;</description></item><item><title>Creating a Simple Spring Boot Application in IntelliJ IDEA</title><link>https://foojayio.github.io/website/today/creating-a-simple-spring-boot-application-in-intellij-idea/</link><pubDate>Mon, 31 May 2021 17:06:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-a-simple-spring-boot-application-in-intellij-idea/</guid><description>&lt;p&gt;This tutorial uses IntelliJ IDEA Ultimate because we want to create a new project using Spring Initializr. This functionality is only available with IntelliJ IDEA Ultimate. It is based off &lt;a href="https://spring.io/guides/gs/spring-boot/" target="_blank" rel="noopener noreferrer"&gt;Building an Application with Spring Boot&lt;/a&gt;
.&lt;/p&gt;
&lt;h2 id="h2-0-creating-your-spring-boot-project"&gt;Creating your Spring Boot Project&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;If you&amp;rsquo;re in an IntelliJ IDEA project already, select &lt;strong&gt;File&lt;/strong&gt; &amp;gt; &lt;strong&gt;Project&lt;/strong&gt; . Alternatively click the &lt;strong&gt;New Project&lt;/strong&gt; button on the Welcome screen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Spring Initializr&lt;/strong&gt; on the left-hand side and then enter the following options:&lt;/p&gt;</description></item><item><title>Automatic WildFly Managed Domain Clustering &amp; Scaling in Containers</title><link>https://foojayio.github.io/website/today/automatic-wildfly-clustering-managed-domain-scaling-containers/</link><pubDate>Mon, 31 May 2021 08:08:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/automatic-wildfly-clustering-managed-domain-scaling-containers/</guid><description>&lt;p&gt;Nowadays it&amp;rsquo;s easy to get up and running WildFly standalone server in a container. But what if you need to enable clustering in Managed Domain mode, which is one of the key features of &lt;a href="https://jakarta.ee/" target="_blank" rel="noopener noreferrer"&gt;Jakarta EE&lt;/a&gt;
 in general? That is a not so easy task. Some people claim it&amp;rsquo;s nearly impossible in the cloud-native world, because Jakarta EE clustering was designed before the containers era. The old question at the official &lt;a href="https://developer.jboss.org/thread/249340" target="_blank" rel="noopener noreferrer"&gt;developers portal&lt;/a&gt;
 is still not answered with any adequate instructions, just proving the presence of the issue.&lt;/p&gt;</description></item><item><title>Take the Type Erasure Generics Java Challenge!</title><link>https://foojayio.github.io/website/today/type-erasure-generics-java-challenge/</link><pubDate>Tue, 25 May 2021 06:50:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/type-erasure-generics-java-challenge/</guid><description>&lt;p&gt;It&amp;rsquo;s possible to use type erasure generics in a method with Java. To know how to use generics is important because then you are able to create highly reusable code.&lt;/p&gt;
&lt;p&gt;In the following Java Challenge, you will see the generic type that will be erased by the compiler and then will be replaced by the type we defined at runtime.&lt;/p&gt;
&lt;p&gt;Note also that we are using the extends keyword which means that the generic type will extend the other type.&lt;/p&gt;</description></item><item><title>The Map, Equals, Hashcode Java Challenge</title><link>https://foojayio.github.io/website/today/map-equals-hashcode-java-challenge/</link><pubDate>Mon, 17 May 2021 08:38:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/map-equals-hashcode-java-challenge/</guid><description>&lt;p&gt;Understanding deeply how to use a Map, equals, and hashcode in Java will be a massive help for you to create high-quality code. The Map and object reference concepts are not only present in the Java language but in almost all programming languages. Therefore, if you master the concept of object references, equals and hashcode, and Maps, you can apply this in other programming languages and master them far more easily.&lt;/p&gt;</description></item><item><title>7 Functional Programming Techniques in Java: A Primer</title><link>https://foojayio.github.io/website/today/7-functional-programming-techniques-in-java-a-primer/</link><pubDate>Tue, 11 May 2021 07:34:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/7-functional-programming-techniques-in-java-a-primer/</guid><description>&lt;p&gt;&lt;img src="https://thepracticaldev.s3.amazonaws.com/i/zf8mvgix8icaz64mgj89.png" alt="header image" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;There is a lot of hype around functional programming (FP) and a lot of cool kids are doing it but it is not a silver bullet. Like other programming paradigms/styles, functional programming also has its pros and cons and one may prefer one paradigm over the other. If you are a Java developer and wants to venture into functional programming, do not worry, you don&amp;rsquo;t have to learn functional programming oriented languages like Haskell or Clojure(or even Scala or JavaScript though they are not pure functional programming languages) since Java has you covered and this post is for you.&lt;/p&gt;</description></item><item><title>Optional takeWhile dropWhile Java Challenge</title><link>https://foojayio.github.io/website/today/optional-takewhile-dropwhile-java-challenge/</link><pubDate>Mon, 10 May 2021 08:05:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/optional-takewhile-dropwhile-java-challenge/</guid><description>&lt;p&gt;The Optional concept is present in many programming languages. The main goal of the Optional class is to avoid &lt;code&gt;NullPointerException&lt;/code&gt;. It&amp;rsquo;s much easier to deal with null values when we use the concepts of an Optional.&lt;/p&gt;
&lt;p&gt;In this challenge, we will also explore the takeWhile and dropWhile methods from Java 9. Therefore you will be upgrading your knowledge with &lt;code&gt;Optional&lt;/code&gt;, &lt;code&gt;takeWhile&lt;/code&gt;, and &lt;code&gt;dropWhile&lt;/code&gt;!&lt;/p&gt;
&lt;p&gt;Are you prepared to have fun with this Java Challenge and refine your Java skills?&lt;/p&gt;</description></item><item><title>Elastic JVM: Configuring G1 GC for Automatic Vertical Memory Scaling</title><link>https://foojayio.github.io/website/today/elastic-jvm-configuring-g1-for-automatic-vertical-memory-scaling/</link><pubDate>Wed, 05 May 2021 13:45:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/elastic-jvm-configuring-g1-for-automatic-vertical-memory-scaling/</guid><description>&lt;figure class="alignleft"&gt;
 &lt;img decoding="async" src="https://jelastic.com/blog/wp-content/uploads/2018/12/elastic-jvm-e1545213859238.png" alt="Automatic Vertical Memory Scaling" class="wp-image-31447"&gt;
&lt;/figure&gt;
&lt;p&gt;Nowadays, JVM-based applications can benefit from elasticity and density of container technology. However, there are still some issues that may prevent from unleashing the full potential of Java and containers &amp;ldquo;marriage.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Releasing unused but committed Heap memory by the major JVM implementations based on OpenJDK, in most cases, is not performed automatically, or requires specific knowledge to be configured.&lt;/p&gt;
&lt;p&gt;To solve this problem and make &lt;a href="https://jelastic.com/blog/java-ram-usage-in-containers-top-5-tips-not-to-lose-your-memory/" target="_blank" rel="noopener noreferrer"&gt;Java RAM usage in containers&lt;/a&gt;
 more efficient, the Jelastic team collaborated with different experts involved in JVM development. We have periodically published articles highlighting this issue and motivating the community to help in finding a solution. As a result, attention to this topic has increased, and new improvements were introduced in different Garbage Collection implementations in order to make automatic vertical memory scaling possible.&lt;/p&gt;</description></item><item><title>Java Garbage Collection Types &amp; Settings Customization via Jelastic PaaS</title><link>https://foojayio.github.io/website/today/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/</link><pubDate>Thu, 29 Apr 2021 07:54:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/</guid><description>&lt;figure class="alignleft is-resized"&gt;
 &lt;img decoding="async" src="https://jelastic.com/blog/wp-content/uploads/2019/08/java-gc.png" alt="java gc" class="wp-image-34173" width="250"&gt;
&lt;/figure&gt;
&lt;p&gt;Performance and price are two big considerations in application hosting that always matter. And, often, we question ourselves on how to decrease the spends, without affecting the performance of your apps at the same time. In this article, we&amp;rsquo;d like to address automatic memory management for Java applications hosted with Jelastic using garbage collection.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s clarify what garbage collection is, what it does for Java applications and how it works within Jelastic PaaS.&lt;/p&gt;</description></item><item><title>SKP's Core Java/Java EE Roots : Gang of Four Design Patterns - Part 01</title><link>https://foojayio.github.io/website/today/gang-of-four-design-patterns-using-core-java-part-01/</link><pubDate>Wed, 28 Apr 2021 13:43:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/gang-of-four-design-patterns-using-core-java-part-01/</guid><description>&lt;p&gt;&lt;strong&gt;[About SKP&amp;rsquo;s Core Java/Java EE Roots]&lt;/strong&gt;&lt;br&gt;
Series of Articles on Rooted Concepts in Core Java and J2EE. They Revolve Around Memory Architecture, Connection &amp;amp; Memory Leaks, Core Java Syntax &amp;amp; Semantics, Java Object Layout/Anatomy, Multi-Threading, Asynchronous Task Execution, Design Patterns, Java Agents, Class Loading, API Design, OOPs &amp;amp; SOLID.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;To understand the philosophical and historical perspective on the Gang of Four&amp;rsquo;s design patterns, I made a short, 10-minute video. (This was also my PluralSight Author Audition). Please take time to view the [Introduction to Gang of Four Design Patterns] Video.&lt;/p&gt;</description></item><item><title>Modern JavaFX Game Development with FXGL - Pong</title><link>https://foojayio.github.io/website/today/modern-javafx-game-development-with-fxgl-pong-simple/</link><pubDate>Tue, 27 Apr 2021 07:48:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/modern-javafx-game-development-with-fxgl-pong-simple/</guid><description>&lt;p&gt;In this tutorial we will make a very simple clone of the classic Pong game using the &lt;a href="https://github.com/AlmasB/FXGL" target="_blank" rel="noopener noreferrer"&gt;FXGL game engine&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;We will be using the latest (currently 11.15) version of FXGL via Maven (or Gradle):&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="java"&gt;&amp;lt;dependency&amp;gt;
 &amp;lt;groupId&amp;gt;com.github.almasb&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;fxgl&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;11.15&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/pre&gt;
&lt;p&gt;The full source code is available at the end of this page. The game will look like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://raw.githubusercontent.com/AlmasB/git-server/master/storage/images/fxgl_pong.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Whilst this tutorial is meant to teach basic concepts, building on them will allow us to produce much more &lt;a href="https://youtu.be/yhr1b4061os?t=496" target="_blank" rel="noopener noreferrer"&gt;complex examples&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Building Microservices with Spring Boot Fat (Uber) Jar</title><link>https://foojayio.github.io/website/today/building-microservices-spring-boot-fat-uber-jar/</link><pubDate>Wed, 21 Apr 2021 09:28:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-microservices-spring-boot-fat-uber-jar/</guid><description>&lt;p&gt;In most minds,&lt;em&gt;microservices&lt;/em&gt; is an approach to make a traditional monolithic system more structured, dividing it into logical components that correspond to different functional areas of application. Thus, acting as a microservice, each component becomes self-contained, easily scaled, maintained and even upgraded without affecting the overall system. Also, with &lt;em&gt;microservice&lt;/em&gt; architecture, you can use a software written in different programming languages, including Java. Such freedom attracts but may frighten at the same time.&lt;/p&gt;</description></item><item><title>Jenkins Cluster for Continuous Integration and Delivery in Jelastic PaaS</title><link>https://foojayio.github.io/website/today/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/</link><pubDate>Mon, 12 Apr 2021 12:44:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/</guid><description>&lt;p&gt;Jenkins is an open-source continuous integration and delivery system designed to ensure build and deploy automation. It is well-suited to be installed in the cloud to run self-hosted pipelines.&lt;/p&gt;
&lt;p&gt;Jenkins supports clustering via master-slave mode. A build process can be delegated to several slave (worker) nodes. This allows serving multiple projects in a single Jenkins cluster setup.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll describe how to install Jenkins cluster with slave nodes auto-discovering and self-registering inside a master node. Jelastic PaaS implemented this solution in &lt;strong&gt;Jenkins DevOps Pack&lt;/strong&gt; that can be installed from the &lt;a href="https://docs.jelastic.com/marketplace/" target="_blank" rel="noopener noreferrer"&gt;Marketplace&lt;/a&gt;
 or through environment setup wizard as a &lt;strong&gt;New Environment&lt;/strong&gt;. In this tutorial we&amp;rsquo;ll cover both. Also, you will find out how to build a simple Java project hosted on GitHub using Jelastic Maven plugin.&lt;/p&gt;</description></item><item><title>OIDC Client with Mutual TLS Client Authentication</title><link>https://foojayio.github.io/website/today/oidc-client-with-mutual-tls-client-authentication/</link><pubDate>Thu, 04 Feb 2021 08:48:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/oidc-client-with-mutual-tls-client-authentication/</guid><description>&lt;p&gt;It is common to authenticate OAuth and OpenID Connect (OIDC) clients with secrets. When you register a client in the Authorization Server (i.e., the OpenID Connect Provider, OP), you typically get a client ID and a secret. These are then used as credentials whenever your client sends requests to the Authorization Server. Often, this type of credential will provide a sufficient level of security for a deployment; other times, however, this simply is not enough. Authenticating with client ID and secret means that if anyone manages to steal or guess your application&amp;rsquo;s credentials, they will be able to use them to impersonate it. The attacker does not even have to intercept the credentials themselves. They may be able to capture a request sent to the Authorization Server and replay it. The Authorization Server does not know who is sending the request; it can only check whether the credentials are valid. (This is why it&amp;rsquo;s also important to use TLS and unguessable client secrets when using this type of credential.)&lt;/p&gt;</description></item><item><title>How to Do Device Monitoring with JavaFX and FXGL</title><link>https://foojayio.github.io/website/today/device-monitoring-with-javafx-and-fxgl/</link><pubDate>Mon, 11 Jan 2021 10:09:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/device-monitoring-with-javafx-and-fxgl/</guid><description>&lt;p&gt;In a previous post &lt;a href="https://foojayio.github.io/website/today/category/java/javafx/"&gt;&amp;ldquo;Getting Started with FXGL Game Development&amp;rdquo;&lt;/a&gt;
 we already have taken a look at the &lt;a href="https://github.com/AlmasB/FXGL" target="_blank" rel="noopener noreferrer"&gt;FXGL game development framework&lt;/a&gt;
 developed by &lt;a href="https://twitter.com/AlmasBaim" target="_blank" rel="noopener noreferrer"&gt;Almas Baimagambetov&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;But, this game engine can also be used for other use cases. In this post, we will be building a system monitoring dashboard, which can run on a Raspberry Pi. The dashboard can be used to keep an eye on any device that can report its state to a queue. And, for me personally, it finally solves the problem of finding the IP addresses of all my Raspberry Pi&amp;rsquo;s when my router decided to shuffle them&amp;hellip; 😉&lt;/p&gt;</description></item><item><title>How To Bring Your Java Microservices To The Cloud</title><link>https://foojayio.github.io/website/today/how-to-bring-your-java-microservices-to-the-cloud/</link><pubDate>Fri, 08 Jan 2021 11:20:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-bring-your-java-microservices-to-the-cloud/</guid><description>&lt;p&gt;All companies are software companies, and businesses will always experience the challenge of keeping integrations between users and applications scalable, productive, fast, and of high quality. To combat this, cloud, microservices, and other modern solutions come up more and more in architectural decisions.&lt;/p&gt;
&lt;h4 id="here-is-the-questionis-java-prepared-to-deal-with-these-diverse-concepts-in-a-corporate-environment"&gt;Here is the question&amp;mdash;is Java prepared to deal with these diverse concepts in a corporate environment?&lt;/h4&gt;
&lt;p&gt;Yes, and to demonstrate how &lt;a href="https://jakarta.ee/" title="Jakarta EE" target="_blank" rel="noopener noreferrer"&gt;Jakarta EE&lt;/a&gt;
 and &lt;a href="https://microprofile.io/" title="Eclipse MicroProfile" target="_blank" rel="noopener noreferrer"&gt;Eclipse MicroProfile&lt;/a&gt;
 work very well and in the cloud, Payara and Platform.sh collaborated together on this webinar. You can watch the video presentation by Otavio Santana and Rudy de Busscher below:&lt;/p&gt;</description></item><item><title>Creating a JavaFX World Clock from Scratch (Part 2)</title><link>https://foojayio.github.io/website/today/creating-a-javafx-world-clock-from-scratch-part-2/</link><pubDate>Thu, 24 Dec 2020 09:46:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-a-javafx-world-clock-from-scratch-part-2/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;The only way to learn mathematics is to do mathematics.&amp;rdquo;&lt;/em&gt; &amp;ndash; Paul Halmos&lt;a href="https://en.wikipedia.org/wiki/Paul_Halmos" title="Mathematician Paul Halmos" target="_blank" rel="noopener noreferrer"&gt;[1]&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Welcome to &lt;em&gt;Creating a JavaFX World Clock from Scratch Part 2!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is the second installment of a series of blog entries on how I created a &amp;ldquo;sci-fi&amp;rdquo; looking world clock using JavaFX.&lt;/p&gt;
&lt;p&gt;If you have not read Part 1&lt;a href="https://foojayio.github.io/website/today/creating-a-javafx-world-clock-from-scratch-part-1/" title="Creating a JavaFX World Clock from Scratch Part 1"&gt;[2]&lt;/a&gt;
 please see the introduction section of the &lt;em&gt;Creating a JavaFX World Clock from Scratch (Part 1)&lt;/em&gt; &lt;a href="https://foojayio.github.io/website/today/creating-a-javafx-world-clock-from-scratch-part-1/" title="Creating a JavaFX World Clock from Scratch Part 1"&gt;[2]&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Creating a JavaFX World Clock from Scratch (Part 1)</title><link>https://foojayio.github.io/website/today/creating-a-javafx-world-clock-from-scratch-part-1/</link><pubDate>Mon, 14 Dec 2020 09:27:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-a-javafx-world-clock-from-scratch-part-1/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Good design&amp;rsquo;s not about what medium you&amp;rsquo;re working in. It&amp;rsquo;s about thinking hard about what you want to do and what you have to work with before you start.&amp;quot; &amp;ndash; Susan Kare &lt;a href="https://en.wikipedia.org/wiki/Susan_Kare" title="Susan Kare" target="_blank" rel="noopener noreferrer"&gt;[6]&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="h3-0-introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Welcome to &lt;em&gt;Creating a JavaFX World Clock from Scratch (Part 1)&lt;/em&gt;! In this series of blog entries I would like to show you how I created a &amp;ldquo;sci-fi&amp;rdquo; looking world clock that happens to be a cross-platform Java desktop application.&lt;/p&gt;</description></item><item><title>Immutable Collections in Java with Sealed Types</title><link>https://foojayio.github.io/website/today/immutable-collections-in-java-with-sealed-types/</link><pubDate>Thu, 10 Dec 2020 03:02:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/immutable-collections-in-java-with-sealed-types/</guid><description>&lt;br /&gt;
&lt;img fetchpriority="high" decoding="async" aria-describedby="caption-attachment-36538" class="size-medium wp-image-36538" src="foojay-don-1-1-469x510.png" alt="" width="469" height="510"&gt;
&lt;p&gt;&lt;em&gt;Designing Immutable Collection using Sealed Types in JDK 15&lt;/em&gt;{#caption-attachment-36538}&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;How to define contractual, structural, and verifiable immutable Java collections.&lt;/p&gt;
&lt;h2 id="9dc0"&gt;Introducing Sealed Types&lt;/h2&gt;
&lt;p&gt;JDK 15 was released on September 15, 2020. &lt;a href="https://openjdk.java.net/jeps/360" target="_blank" rel="noopener noreferrer"&gt;JEP 360&lt;/a&gt;
Sealed Types was included as a preview feature in this release, with its second preview in JDK 16. Sealed Types is part of &lt;a href="https://openjdk.java.net/projects/amber/" target="_blank" rel="noopener noreferrer"&gt;Project Amber&lt;/a&gt;
. Sealed classes or interfaces can be used to restrict the interfaces or classes that are allowed to extend them. This is accomplished by using the &lt;code&gt;sealed&lt;/code&gt;, &lt;code&gt;non-sealed&lt;/code&gt;, and &lt;code&gt;permits&lt;/code&gt; modifiers.{#297e}&lt;/p&gt;</description></item><item><title>What are Hidden Classes in Java 15 And How Are They Used?</title><link>https://foojayio.github.io/website/today/what-are-hidden-classes-in-java-15/</link><pubDate>Thu, 03 Dec 2020 10:15:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-are-hidden-classes-in-java-15/</guid><description>&lt;p&gt;As we know, &lt;code&gt;sun.misc.Unsafe&lt;/code&gt; APIs are not recommended to use outside the JDK, with a slight mistake you may cause the JVM to crash. In some cases, code may not be portable across different platforms and many other related problems may occur.&lt;/p&gt;
&lt;p&gt;On the other hand, there are some useful features Unsafe APIs provide and we don&amp;rsquo;t have an alternative for those as a standard language feature. To remove Unsafe API usages, JDK developers provide standard language features, the JDK 15 &amp;ldquo;hidden class&amp;rdquo; is one such feature. After the introduction of hidden classes, &lt;code&gt;sun.misc.Unsafe::defineAnonymousClass&lt;/code&gt; is deprecated in Java 15, which will be removed in future releases.&lt;/p&gt;</description></item><item><title>Why I Love IntelliJ IDEA for Java Development</title><link>https://foojayio.github.io/website/today/why-i-love-intellij-idea-for-java-development/</link><pubDate>Mon, 30 Nov 2020 09:16:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-i-love-intellij-idea-for-java-development/</guid><description>&lt;p&gt;If you&amp;rsquo;re a Java developer like me, you like to crank out code and get shit done. I like many things about IntelliJ IDEA, but I thought it&amp;rsquo;d be fun to write about the ones that make me most productive. First, a bit of my development history.&lt;/p&gt;
&lt;p&gt;When I first started doing Java development in the late 90s, I used HomeSite as my editor. HomeSite was an HTML editor initially developed by Nick Bradbury. I liked it because it defaulted to a view of your code rather than being WYSIWYG like Dreamweaver and FrontPage. It&amp;rsquo;s funny to look back now and laugh about how inefficient I was: I used to google for import statements, then copy/pasted them into the editor.&lt;/p&gt;</description></item><item><title>Native Applications from a JavaFX Project for Multiple Devices</title><link>https://foojayio.github.io/website/today/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/</link><pubDate>Wed, 25 Nov 2020 08:58:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/</guid><description>&lt;p&gt;The post &lt;a href="https://foojayio.github.io/website/today/starting-a-javafx-project-with-gluon-tools/"&gt;&amp;ldquo;Starting a JavaFX Project with Gluon Tools&amp;rdquo;&lt;/a&gt;
 shows you how to start a Gluon Mobile Multiview project with a few clicks in IntelliJ IDEA thanks to the &lt;a href="https://plugins.jetbrains.com/plugin/7864-gluon" target="_blank" rel="noopener noreferrer"&gt;&amp;ldquo;Gluon plugin&amp;rdquo;&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;In this post, we will use such a project and build it with GitHub Actions as a native application for Windows, MacOS, iOS, Linux, and Android from one single code base!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Yes, that&amp;rsquo;s right!&lt;/p&gt;
&lt;p&gt;True &amp;ldquo;Write Once, Run Everywhere&amp;rdquo;!!!
&lt;img src="https://foojayio.github.io/website/today/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/github_actions_gluon_diagram.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="h2-0-the-application"&gt;The Application&lt;/h2&gt;
&lt;p&gt;This application is built around a Java library I created last year for 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;
 which helps you to calculate the value of a resistor from its color rings. This library is further described on &lt;a href="https://webtechie.be/post/2019-11-25-resistor-color-codes-and-calculations-a-java-maven-library/" target="_blank" rel="noopener noreferrer"&gt;&amp;ldquo;Resistor color codes and calculations as a Java Maven library&amp;rdquo;&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Starting a JavaFX Project with Gluon Tools</title><link>https://foojayio.github.io/website/today/starting-a-javafx-project-with-gluon-tools/</link><pubDate>Tue, 17 Nov 2020 08:38:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/starting-a-javafx-project-with-gluon-tools/</guid><description>&lt;p&gt;Here on foojay.io you can already find two posts by Carl Dea to get you started with JavaFX:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/blog/beginning-javafx-with-intellij/"&gt;Beginning JavaFX Applications with IntelliJ IDE&lt;/a&gt;
: step-by-step how to start a new JavaFX project without any tools, are by using the Maven and Gradle tools.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/blog/a-javafx-app-on-zulufx-in-60-seconds/"&gt;A JavaFX App on ZuluFX in 60 Seconds&lt;/a&gt;
: how to use a popular distribution from &lt;a href="https://www.azul.com/" target="_blank" rel="noopener noreferrer"&gt;Azul&lt;/a&gt;
 to build a JavaFX HelloWorld Application in 60 seconds.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In this post, I want to show you yet another approach that uses the tools provided by &lt;a href="https://gluonhq.com/" target="_blank" rel="noopener noreferrer"&gt;Gluon&lt;/a&gt;
, who are the maintainers, and the driving force behind &lt;a href="https://openjfx.io/" target="_blank" rel="noopener noreferrer"&gt;OpenJFX&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>For the Record: A Little Less Conversation, A Little More Action</title><link>https://foojayio.github.io/website/today/for-the-record/</link><pubDate>Fri, 13 Nov 2020 08:52:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/for-the-record/</guid><description>&lt;p&gt;Ever since Java announced their 6-month release cycle, there is excitement around exploring new features and even more so with preview features.&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://openjdk.java.net/jeps/12" target="_blank" rel="noopener noreferrer"&gt;JEP-12&lt;/a&gt;
 for the definition of the preview feature.{#2d3e}&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A &lt;em&gt;preview feature&lt;/em&gt; is a new feature of the Java language, Java Virtual Machine, or Java SE API that is fully specified, fully implemented, and yet impermanent. It is available in a JDK feature release to provoke developer feedback based on real world use; this may lead to it becoming permanent in a future Java SE Platform.{#9a9b}&lt;/p&gt;</description></item><item><title>Getting Started Quickly and Easily with Payara Server</title><link>https://foojayio.github.io/website/today/getting-started-with-payara-server/</link><pubDate>Tue, 10 Nov 2020 09:39:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/getting-started-with-payara-server/</guid><description>&lt;p&gt;The following four short videos will take you step-by-step through installing, writing, and deploying an application to &lt;a href="https://www.payara.fish/" title="Payara Server" target="_blank" rel="noopener noreferrer"&gt;Payara Server&lt;/a&gt;
, even if you&amp;rsquo;ve never used the application server before:&lt;/p&gt;
&lt;p&gt;{#more-36262}&lt;/p&gt;
&lt;h2 id="h2-0-introduction-to-payara-server"&gt;Introduction to Payara Server&lt;/h2&gt;
&lt;p&gt;Learn how to write a simple Hello World application and deploy it to Payara Server.&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/KEsus1Ihjs4?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;&lt;strong&gt;Install Software&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>New to IntelliJ IDEA by JetBrains? Me Too!</title><link>https://foojayio.github.io/website/today/new-to-intellij-idea-me-too/</link><pubDate>Fri, 02 Oct 2020 10:07:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/new-to-intellij-idea-me-too/</guid><description>&lt;p&gt;Until recently, I last wrote Java in anger in 2002. IntelliJ IDEA had just been released; it wasn&amp;rsquo;t remotely on my radar. I honestly can&amp;rsquo;t remember what IDE we were using back then, but it certainly was a very long way to the fully featured IDE that JetBrains produce today.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my experience of using IntelliJ IDEA for the first time!&lt;/p&gt;
&lt;h3 id="h3-0-1-downloading-intellij-idea"&gt;1. Downloading IntelliJ IDEA&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s a lot going on when you first load IntelliJ IDEA, but I learned pretty quickly that there are also some good first steps you can take to make your experience a little more comfortable.&lt;/p&gt;</description></item><item><title>Electronics &amp; Quarkus Qute on Raspberry Pi</title><link>https://foojayio.github.io/website/today/electronics-quarkus-qute-on-raspberry-pi/</link><pubDate>Wed, 30 Sep 2020 08:07:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/electronics-quarkus-qute-on-raspberry-pi/</guid><description>&lt;p&gt;The &amp;ldquo;Hello World&amp;rdquo; version of electronics programming is a blinking LED. But, in this post, we will go a few steps further and control 8 LEDs inside a number display.&lt;/p&gt;
&lt;p&gt;We will do this by taking a closer look at one of the projects in the list &amp;ldquo;&lt;a href="https://foojayio.github.io/website/blog/spectacular-java-projects-on-the-raspberry-pi/"&gt;Spectacular Java Projects on the Raspberry Pi&lt;/a&gt;
&amp;rdquo;.&lt;/p&gt;
&lt;figure class="alignleft size-thumbnail is-resized"&gt;
 &lt;img decoding="async" src="led-number-display-300x260.jpg" alt="" class="wp-image-35408" width="99" height="86"&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href="https://twitter.com/Igfasouza" target="_blank" rel="noopener noreferrer"&gt;Igor De Souza&lt;/a&gt;
, Dublin based Principal Big Data Consultant at Oracle, set up an interesting experiment in which he combines a LED number display with the Raspberry Pi and Quarkus.&lt;/p&gt;</description></item><item><title>Getting Started with Babel for Java and OpenJDK</title><link>https://foojayio.github.io/website/today/getting-started-with-babel-for-java/</link><pubDate>Tue, 29 Sep 2020 07:57:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/getting-started-with-babel-for-java/</guid><description>&lt;p&gt;In the JavaScript world, developers have to deal with a multitude of JavaScript engines in different browsers and browser versions, while the language itself is evolving quickly. This is only possible because of clever tools like the retrofitting compiler Babel (&lt;a href="https://babeljs.io/" target="_blank" rel="noopener noreferrer"&gt;https://babeljs.io&lt;/a&gt;
). Babel backports new features to work on older JavaScript engines, allowing developers to use modern JavaScript language features and still be compatible with the majority of browsers out there.&lt;/p&gt;</description></item><item><title>Getting Started Learning Java as a First Language</title><link>https://foojayio.github.io/website/today/learning-java-as-a-first-language/</link><pubDate>Thu, 24 Sep 2020 13:44:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/learning-java-as-a-first-language/</guid><description>&lt;p&gt;I started programming in Java way back in 1999. I had just started a job as the director of web development at a small startup called eDeploy.com. I wrote a lot of HTML, CSS, and JavaScript for a SaaS product that helped companies install network equipment. The backend for our app was written in Java and we deployed to iPlanet Application Server. At our height, we trusted Loudcloud to run our software.&lt;/p&gt;</description></item><item><title>Getting Started with a Simple Service with Spring Boot</title><link>https://foojayio.github.io/website/today/a-simple-service-with-spring-boot/</link><pubDate>Tue, 22 Sep 2020 12:59:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-simple-service-with-spring-boot/</guid><description>&lt;p&gt;In this post, I will demonstrate how to create a simple Web Service using Spring Boot. This framework makes it almost effortless to develop web services, so long as the appropriate dependencies are in place.&lt;/p&gt;
&lt;p&gt;In this example, I will create a Web Service that will read the current temperature from a file and make it available to clients via a RESTful endpoint.&lt;/p&gt;
&lt;h4 id="1-use-the-spring-intializr"&gt;1. Use the Spring Intializr&lt;/h4&gt;
&lt;p&gt;The Spring Initializr helps one to choose the dependencies that are required for production a particular solution.&lt;/p&gt;</description></item></channel></rss>