<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Use Cases on foojay.io - Friends Of OpenJDK</title><link>https://foojay.io/today/category/use-cases/</link><description>Recent content in Use Cases on foojay.io - Friends Of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 21 Sep 2026 06:03:55 +0000</lastBuildDate><atom:link href="https://foojay.io/today/category/use-cases/index.xml" rel="self" type="application/rss+xml"/><item><title>Jakarta Faces, Java Web Framework, Stateless Edition: Marketplace AliFaces</title><link>https://foojay.io/today/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/</link><pubDate>Sat, 29 Aug 2026 19:22:52 +0000</pubDate><guid>https://foojay.io/today/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/</guid><description>&lt;h3 id="a-fully-stateless-jakarta-faces-marketplace-with-server-side-rendering--no-httpsession-no-saved-viewstate-no-sticky-sessions"&gt;A Fully Stateless Jakarta Faces Marketplace with Server-Side Rendering — No HttpSession, No Saved ViewState, No Sticky Sessions&lt;/h3&gt;&#10;&lt;p&gt;(see the poc on: &lt;a href="http://129.152.31.253:8080/alifaces" title="AliFaces POC Run On Oracle OCI" target="_blank" rel="noopener noreferrer"&gt;AliFaces POC Run On Oracle OCI(Nanos Unikernel)&lt;/a&gt;)&lt;/p&gt;&#10;&lt;p&gt;Jakarta Faces still carries a few persistent assumptions: it is stateful, it requires &lt;code&gt;HttpSession&lt;/code&gt;, it needs sticky sessions to scale horizontally, and its server-side rendering model belongs to an older generation of web applications.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;AliFaces&lt;/strong&gt; challenges those assumptions with running code — not a Hello World, but a marketplace-style application with catalog, search, filters, cart, checkout, orders, browsing history, themes, responsive layouts and a JSON API for mobile clients.&lt;/p&gt;</description></item><item><title>Introducing BoxLang AI Explorer: A Local Catalog for Every AI Pattern</title><link>https://foojay.io/today/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/</link><pubDate>Tue, 18 Aug 2026 14:15:48 +0000</pubDate><guid>https://foojay.io/today/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/boxlang-explorer-700x394.png" alt="" width="700" height="394" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;Learning a new AI API usually means jumping between scattered documentation pages, guessing at imports, and copy-pasting code that may or may not still work. We wanted something better for BoxLang AI, so we built the &lt;strong&gt;BoxLang AI Explorer&lt;/strong&gt; : a local, browser-based catalog of runnable BoxLang AI examples, organized by category and difficulty, each with guidance, source code, and sample output. You can also try it online at &lt;a href="https://ai.boxlang.io/explorer/" target="_blank" rel="noopener noreferrer"&gt;https://ai.boxlang.io/explorer/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Seasons time-lapse - the video</title><link>https://foojay.io/today/seasons-time-lapse-the-video/</link><pubDate>Tue, 09 Jun 2026 12:45:51 +0000</pubDate><guid>https://foojay.io/today/seasons-time-lapse-the-video/</guid><description>&lt;p&gt;In the &lt;a href="https://blog.frankel.ch/seasons-time-lapse/1/" target="_blank" rel="noopener noreferrer"&gt;first post&lt;/a&gt; of this series, I focused on the project foundations: what should I do to create a video from photos taken from the same position year after year? I dedicated the &lt;a href="https://blog.frankel.ch/seasons-time-lapse/2/" target="_blank" rel="noopener noreferrer"&gt;second part&lt;/a&gt; to aligning images. It wasn&amp;rsquo;t as easy as I expected. I stumbled upon new concepts, such as and .&lt;/p&gt;&#10;&lt;p&gt;In this third and final post, I want to tackle the video creation itself, explain some &amp;ldquo;artistic&amp;rdquo; decisions, and leave the door open to future work.&lt;/p&gt;</description></item><item><title>JC-AI Newsletter #13</title><link>https://foojay.io/today/jc-ai-newsletter-13/</link><pubDate>Thu, 05 Feb 2026 21:12:12 +0000</pubDate><guid>https://foojay.io/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;&#10;&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>From a JAR to a full-fledged MacOS app</title><link>https://foojay.io/today/from-a-jar-to-a-full-fledged-macos-app/</link><pubDate>Thu, 05 Feb 2026 10:15:05 +0000</pubDate><guid>https://foojay.io/today/from-a-jar-to-a-full-fledged-macos-app/</guid><description>&lt;p&gt;A couple of years ago, I developed a small &lt;a href="https://blog.frankel.ch/state-jvm-desktop-frameworks/2/" target="_blank" rel="noopener noreferrer"&gt;Kotlin GUI&lt;/a&gt; to help me rename my files in batch. I actually created it with &lt;a href="https://blog.frankel.ch/focus/state-jvm-desktop-frameworks/" target="_blank" rel="noopener noreferrer"&gt;different JVM frameworks&lt;/a&gt; to compare their relative merits. In any case, I didn&amp;rsquo;t use it up until last week. And then, I was surprised to see that it didn&amp;rsquo;t work to rename a network volume, although it had in the past. In this brief post, I aim to describe the issue and its solution.&lt;/p&gt;</description></item><item><title>Bootstrapping a Java File System</title><link>https://foojay.io/today/bootstrapping-a-java-file-system/</link><pubDate>Thu, 29 Jan 2026 01:44:32 +0000</pubDate><guid>https://foojay.io/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;&#10;&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>DocBox v5 - Reborn: Modern API Docs for BoxLang &amp; CFML</title><link>https://foojay.io/today/docbox-v5-reborn-modern-api-docs-for-boxlang-cfml/</link><pubDate>Tue, 27 Jan 2026 12:15:45 +0000</pubDate><guid>https://foojay.io/today/docbox-v5-reborn-modern-api-docs-for-boxlang-cfml/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/docbox-v5-reborn-modern-api-docs-for-boxlang-cfml/bx-docbox-700x467.jpg" alt="" width="700" height="467" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;Welcome to DocBox v5! We didn&amp;rsquo;t just update DocBox. We rebuilt it from the ground up.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;DocBox v5.0.0&lt;/strong&gt; represents a complete architectural rewrite—modern syntax, blazing performance, and a stunning new look that finally brings API documentation into 2025. Gone are the clunky HTML pages of yesteryear. Say hello to a gorgeous, theme-driven single-page application that makes browsing your API docs feel like using a premium developer tool. We have also released a dedicated module for BoxLang: &lt;strong&gt;BX-DOCBOX&lt;/strong&gt;. A fully interactive CLI tool for generating your docs from the command line using pure BoxLang.&lt;/p&gt;</description></item><item><title>BoxLang AI v2: Enterprise AI Development Without the Complexity</title><link>https://foojay.io/today/boxlang-ai-v2-enterprise-ai-development-without-the-complexity/</link><pubDate>Thu, 22 Jan 2026 15:09:25 +0000</pubDate><guid>https://foojay.io/today/boxlang-ai-v2-enterprise-ai-development-without-the-complexity/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-ai-v2-enterprise-ai-development-without-the-complexity/boxlang-ai-v2-700x467.jpg" alt="" width="700" height="467" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;One Year. 100+ Features. Unlimited Possibilities.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Just one year ago, in March 2024, we launched BoxLang AI 1.0. Today, we&amp;rsquo;re thrilled to announce &lt;strong&gt;BoxLang AI v2&lt;/strong&gt;—a massive leap forward that positions BoxLang as one of the most powerful and versatile AI framework on the JVM. This release is 9-months in the making, with over 100 new features! This would have not been possible without all the new features that the BoxLang JVM language exposes to developers like: Server Side Events, HTTP Streaming, HTTP pooling, Caching, and so much more.&lt;/p&gt;</description></item><item><title>Announcing bx-ldap: Enterprise LDAP for BoxLang</title><link>https://foojay.io/today/announcing-bx-ldap-enterprise-ldap-for-boxlang/</link><pubDate>Tue, 16 Dec 2025 17:01:13 +0000</pubDate><guid>https://foojay.io/today/announcing-bx-ldap-enterprise-ldap-for-boxlang/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/announcing-bx-ldap-enterprise-ldap-for-boxlang/bx-ldap-700x467.jpg" alt="" width="700" height="467" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&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;&#10;&lt;blockquote&gt;&#10;&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;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="-why"&gt;🎯 Why?&lt;/h2&gt;&#10;&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>BoxLang RSS: Full-Featured RSS/Atom Feed Module for BoxLang</title><link>https://foojay.io/today/boxlang-rss-full-featured-rss-atom-feed-module-for-boxlang/</link><pubDate>Tue, 02 Dec 2025 11:19:11 +0000</pubDate><guid>https://foojay.io/today/boxlang-rss-full-featured-rss-atom-feed-module-for-boxlang/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-rss-full-featured-rss-atom-feed-module-for-boxlang/bx-rss-700x467.jpg" alt="" width="700" height="467" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&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;&#10;&lt;h2 id="thanks-to-ray-camden"&gt;Thanks To Ray Camden&lt;/h2&gt;&#10;&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;&#10;&lt;h2 id="why-bx-rss"&gt;Why bx-rss?&lt;/h2&gt;&#10;&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>JC-AI Newsletter #8</title><link>https://foojay.io/today/jc-ai-newsletter-8/</link><pubDate>Thu, 30 Oct 2025 06:36:12 +0000</pubDate><guid>https://foojay.io/today/jc-ai-newsletter-8/</guid><description>&lt;p&gt;&lt;strong&gt;Fourteen days have passed, and it is time to present a fresh collection of readings that could influence developments in the field of artificial intelligence.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;This newsletter focuses on examining how AI enhances productivity through enterprise studies, agentic system architecture, attack vectors, Model Context Protocol (MCP) implementation, Agent-to-Agent (A2A) protocol, Java code generation within IDEs, LLM benchmarking methodologies, and the security challenges arising from increased AI-LLM adoption.&lt;/p&gt;&#10;&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>Agent Memory with Spring AI &amp; Redis</title><link>https://foojay.io/today/agent-memory-with-spring-ai-redis/</link><pubDate>Wed, 23 Jul 2025 16:34:04 +0000</pubDate><guid>https://foojay.io/today/agent-memory-with-spring-ai-redis/</guid><description>&lt;h3 id="you-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;&#10;&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>Kotlin adoption inside ING, five years later</title><link>https://foojay.io/today/ing-kotlin-adoption-five-years/</link><pubDate>Wed, 02 Jul 2025 06:21:47 +0000</pubDate><guid>https://foojay.io/today/ing-kotlin-adoption-five-years/</guid><description>&lt;p&gt;&lt;em&gt;TL;DR: Five years after its introduction Kotlin adoption inside ING keeps growing year after year, with a current adoption rate of just over 11%. We were also featured as one of the user stories for the KotlinConf 2025 Keynote.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Five years ago, &lt;a href="https://medium.com/@Frevib" target="_blank" rel="noopener noreferrer"&gt;Hielke&lt;/a&gt; and I wrote one of the first blogs of this account about being &lt;a href="https://medium.com/ing-blog/introducing-kotlin-at-ing-a-long-but-rewarding-story-1bfcd3dc8da0" target="_blank" rel="noopener noreferrer"&gt;the first team to put Kotlin on production at ING&lt;/a&gt;. The article generated some interest and to this day it is still present as one of the &lt;a href="https://kotlinlang.org/lp/server-side/case-studies/" target="_blank" rel="noopener noreferrer"&gt;Kotlin website case studies&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Semantic Search with Spring Boot &amp; Redis</title><link>https://foojay.io/today/semantic-search-with-spring-boot-redis/</link><pubDate>Mon, 05 May 2025 15:35:55 +0000</pubDate><guid>https://foojay.io/today/semantic-search-with-spring-boot-redis/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;strong&gt;You&amp;rsquo;re building a semantic search app using Spring Boot and Redis. Instead of matching exact words, semantic search finds meaning using Vector Similarity Search (VSS). It works by turning movie synopses into vectors with embedding models, storing them in Redis (as a vector database), and finding the closest matches to user queries.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;&#10;&#9;&#9;&#9;&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/o3XN4dImESE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;&#10;&#9;&#9;&lt;/div&gt;&#10;&#10;&lt;p&gt;A traditional searching system works by matching the words a user types with the words stored in a database or document collection. It usually looks for exact or partial matches without understanding the meaning behind the words.&lt;/p&gt;</description></item><item><title>Review of Junie, a coding agent by JetBrains – Revie</title><link>https://foojay.io/today/checking-out-junie-a-coding-agent-by-jetbrains/</link><pubDate>Wed, 26 Feb 2025 01:38:47 +0000</pubDate><guid>https://foojay.io/today/checking-out-junie-a-coding-agent-by-jetbrains/</guid><description>&lt;p&gt;Other languages: &lt;a href="https://flounder.dev/es/posts/trying-out-junie/" target="_blank" rel="noopener noreferrer"&gt;Español&lt;/a&gt; &lt;a href="https://flounder.dev/ko/posts/trying-out-junie/" target="_blank" rel="noopener noreferrer"&gt;한국어&lt;/a&gt; &lt;a href="https://flounder.dev/pt/posts/trying-out-junie/" target="_blank" rel="noopener noreferrer"&gt;Português&lt;/a&gt; &lt;a href="https://flounder.dev/zh/posts/trying-out-junie/" target="_blank" rel="noopener noreferrer"&gt;中文&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Recently, I talked about &lt;a href="https://flounder.dev/duplicate-finder/" target="_blank" rel="noopener noreferrer"&gt;Duplicate Finder&lt;/a&gt; on the &lt;a href="https://foojay.io/today/category/podcast/"&gt;Foojay Podcast&lt;/a&gt; hosted by &lt;a href="https://foojay.social/@frankdelporte" target="_blank" rel="noopener noreferrer"&gt;Frank Delporte&lt;/a&gt;. We briefly touched upon implementing support for other formats, and Frank asked if I&amp;rsquo;m planning on adding AsciiDoc, as it could be useful for his technical writing at Azul.&lt;/p&gt;&#10;&lt;p&gt;We agreed to think about adding the support soon. At the same time I got access to &lt;a href="https://www.jetbrains.com/junie/" target="_blank" rel="noopener noreferrer"&gt;Junie&lt;/a&gt;, a newly announced coding agent by JetBrains, which is currently in early access. After a while, a thought came to me that this is a great opportunity to try it in action.&lt;/p&gt;</description></item><item><title>A solution to the problem of cluster-wide CRDs</title><link>https://foojay.io/today/a-solution-to-the-problem-of-cluster-wide-crds/</link><pubDate>Thu, 30 Jan 2025 11:55:14 +0000</pubDate><guid>https://foojay.io/today/a-solution-to-the-problem-of-cluster-wide-crds/</guid><description>&lt;p&gt;&lt;strong&gt;I&amp;rsquo;m an average Reddit user, scrolling much more than reading or interacting. Sometimes, however, a post rings a giant red bell. When I stumbled upon &lt;a href="https://www.reddit.com/r/kubernetes/comments/1ga0deo/comment/lta8itb/?context=3&amp;amp;share_id=ZS15DmQexSXUjhXuqQ81z" target="_blank" rel="noopener noreferrer"&gt;If you could add one feature to K8s, what would it be?&lt;/a&gt;, I knew the content would be worth it.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;The most voted answer is:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Namespace scoped CRDs&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="a-short-intro-to-crds"&gt;A short intro to CRDs&lt;/h2&gt;&#10;&lt;p&gt;Kubernetes comes packed with existing objects, such as &lt;code&gt;Pod&lt;/code&gt;, &lt;code&gt;Service&lt;/code&gt;, &lt;code&gt;DaemonSet&lt;/code&gt;, etc., but you can create your own: the latter are called Custom Resource Definitions. Most of the time, s are paired with a custom controller called an &lt;em&gt;operator&lt;/em&gt;. An operator subscribes to the lifecycle events of CRD(s). When you act upon a CRD by creating, updating, or deleting it, Kubernetes changes its status, and the operator gets notified. What it does depends on the nature of the CRD.&lt;/p&gt;</description></item><item><title>Java Server and Rust Client Built with Generated Networking Code</title><link>https://foojay.io/today/fuchs2024-fepcos-j-java-server-and-rust-client/</link><pubDate>Fri, 04 Oct 2024 11:58:05 +0000</pubDate><guid>https://foojay.io/today/fuchs2024-fepcos-j-java-server-and-rust-client/</guid><description>&lt;h2 id="fepcos-j-implementing-a-java-server-and-a-rust-client-without-manual-network-programming"&gt;FEPCOS-J: Implementing a Java Server and a Rust Client without Manual Network Programming&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;FEPCOS-J allows declaratively implementing a Java server and generating its profile, which, for example, can be used to generate the networking code of a Rust client.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;As I have shown in a &lt;a href="https://foojay.io/today/fuchs-2024-fepcos-j-multithreaded-server/"&gt;previous post&lt;/a&gt; [1] and a &lt;a href="https://youtu.be/qtPP7kZbriQ" target="_blank" rel="noopener noreferrer"&gt;video&lt;/a&gt; [2], the &lt;a href="http://fepcos.info/en/fepcos-j.html" target="_blank" rel="noopener noreferrer"&gt;FEPCOS-J development tool&lt;/a&gt; [3] prototypically implements a Java language extension that allows implementing a client-server application in Java without the need for manual network programming.&lt;/p&gt;</description></item><item><title>Implementing the Idempotency-Key specification on Apache APISIX</title><link>https://foojay.io/today/implementing-the-idempotency-key-specification-on-apache-apisix/</link><pubDate>Mon, 02 Sep 2024 20:58:24 +0000</pubDate><guid>https://foojay.io/today/implementing-the-idempotency-key-specification-on-apache-apisix/</guid><description>&lt;p&gt;&lt;strong&gt;Recently, I wrote an &lt;a href="https://blog.frankel.ch/fix-duplicate-api-requests/" target="_blank" rel="noopener noreferrer"&gt;analysis&lt;/a&gt; of the &lt;a href="https://datatracker.ietf.org/doc/html/draft-ietf-httpapi-idempotency-key-header-04" target="_blank" rel="noopener noreferrer"&gt;IETF Idempotency-Key specification&lt;/a&gt;. The specification aims to avoid duplicated requests.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;In short, the idea is for the client to send a unique key along with the request:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;If the server doesn&amp;rsquo;t know the key, it proceeds as usual and then stores the response&lt;/li&gt;&#10;&lt;li&gt;If the server knows the key, it short-circuits any further processing and immediately returns the stored response&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;This post shows how to implement it with &lt;a href="https://apisix.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache APISIX&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Allocation Profiling in Java</title><link>https://foojay.io/today/get-started-with-allocation-profiling/</link><pubDate>Fri, 09 Aug 2024 08:44:59 +0000</pubDate><guid>https://foojay.io/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;&#10;&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;&#10;&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>JavaFX Nodes versus Canvas</title><link>https://foojay.io/today/javafx-nodes-versus-canvas/</link><pubDate>Wed, 07 Aug 2024 08:22:31 +0000</pubDate><guid>https://foojay.io/today/javafx-nodes-versus-canvas/</guid><description>&lt;p&gt;&lt;strong&gt;Recently I was working on an article about Azul Zulu with JavaFX support for ARM systems, like the Raspberry Pi. As you can see in &lt;a href="https://www.youtube.com/watch?v=XhDQvkcYJ88" target="_blank" rel="noopener noreferrer"&gt;this video&lt;/a&gt;, I found out my little test application with a lot of &amp;ldquo;bouncing balls&amp;rdquo; started losing performance on the Raspberry Pi with more than 1000 of those balls.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Of course, having that high number of visual components in a typical JavaFX user interface would be a badly designed application. Imagine a long registration form with that number of input fields and labels&amp;hellip; it would drive your users crazy.&lt;/p&gt;</description></item><item><title>Client-server application in Java: Easy with FEPCOS-J – Video.</title><link>https://foojay.io/today/fuchs-2024-video-fepcos_j-client-server-application-in-java/</link><pubDate>Tue, 30 Jul 2024 11:51:04 +0000</pubDate><guid>https://foojay.io/today/fuchs-2024-video-fepcos_j-client-server-application-in-java/</guid><description>&lt;p&gt;&lt;strong&gt;This is a result of the &lt;a href="http://fepcos.info" target="_blank" rel="noopener noreferrer"&gt;FEPCOS-Project&lt;/a&gt;, aka @FepcosInfo; #FepcosJ_blog5.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;See how FEPCOS-J relieves developers of the network programming required to implement a client-server application in Java.&lt;br&gt;&#10;&lt;a href="https://youtu.be/qtPP7kZbriQ" target="_blank" rel="noopener noreferrer"&gt;&lt;img src="https://foojay.io/today/fuchs-2024-video-fepcos_j-client-server-application-in-java/fuchs2024FepcosJ_video1-512x512-1.png" alt="Link to video: Easy Implementation of a Client-Server Application in Java with FEPCOS-J.&#10;#FepcosJ_video1, #FepcosJ." width="512" height="512" loading="lazy" decoding="async"&gt;&lt;/a&gt; &lt;strong&gt;External link to&lt;/strong&gt; : G. Fuchs: &lt;em&gt;Video: Easy Implementation of a Client-Server Application in Java with FEPCOS-J&lt;/em&gt;; On: YouTube, FEPCOS-Project (@FepcosInfo); 29-July-2024; &lt;a href="https://youtu.be/qtPP7kZbriQ" target="_blank" rel="noopener noreferrer"&gt;https://youtu.be/qtPP7kZbriQ&lt;/a&gt;.&lt;br&gt;&#10;&lt;img src="https://foojay.io/today/fuchs-2024-video-fepcos_j-client-server-application-in-java/fuchs-2024-implementing-a-service-with-fepcos-j-1024x576.png" alt="FEPCOS-J provides annotations for programming a client-server application in Java." width="1024" height="576" loading="lazy" decoding="async"&gt; &lt;strong&gt;Impression of the above-linked video&lt;/strong&gt;: FEPCOS-J provides annotations like @AYSpec, @In, @Out, and @Behavior for programming a client-server application in Java. Watch the video for a complete example application of FEPCOS-J.&lt;/p&gt;</description></item><item><title>A Beginner's Guide to IntelliJ Profiler</title><link>https://foojay.io/today/beginners-guide-to-java-profiler/</link><pubDate>Thu, 04 Jul 2024 06:26:35 +0000</pubDate><guid>https://foojay.io/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;&#10;&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;&#10;&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>Hack a Java application with the debugger</title><link>https://foojay.io/today/debugger-godmode-hacking-a-jvm-application-with-the-debugger/</link><pubDate>Thu, 13 Jun 2024 04:58:03 +0000</pubDate><guid>https://foojay.io/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;&#10;&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;&#10;&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; – it made you invincible.&lt;/p&gt;</description></item><item><title>Workflow, From Stateless To Stateful</title><link>https://foojay.io/today/workflow-from-stateless-to-stateful/</link><pubDate>Wed, 05 Jun 2024 06:11:38 +0000</pubDate><guid>https://foojay.io/today/workflow-from-stateless-to-stateful/</guid><description>&lt;p&gt;&lt;strong&gt;A (long) time ago, my first job consisted of implementing &lt;em&gt;workflows&lt;/em&gt; using the Staffware engine. In short, a workflow comprises &lt;em&gt;tasks&lt;/em&gt;; an automated task delegates to code, while a manual task requires somebody to do something and mark it as done. Then, it proceeds to the next task - or tasks.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Here&amp;rsquo;s a sample workflow:&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://foojay.io/today/workflow-from-stateless-to-stateful/procurement.png" alt="" width="751" height="510" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;The above diagram uses &lt;a href="https://en.wikipedia.org/wiki/Business_Process_Model_and_Notation" target="_blank" rel="noopener noreferrer"&gt;Business Process Model and Notation&lt;/a&gt;. You can now design your workflow using and run it with compatible workflow engines.&lt;/p&gt;</description></item><item><title>Task scheduler in Java: background job processing with JobRunr</title><link>https://foojay.io/today/getting-started-with-jobrunr-a-powerful-task-scheduler-in-ja/</link><pubDate>Wed, 22 May 2024 11:05:04 +0000</pubDate><guid>https://foojay.io/today/getting-started-with-jobrunr-a-powerful-task-scheduler-in-ja/</guid><description>&lt;h2 id="what-is-jobrunr"&gt;What is JobRunr&lt;/h2&gt;&#10;&lt;h3 id="task-scheduler-in-java"&gt;Task scheduler in Java&lt;/h3&gt;&#10;&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;&#10;&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>Diagnosing user-reported issues using WireQuery</title><link>https://foojay.io/today/diagnosing-user-reported-issues-using-wirequery/</link><pubDate>Mon, 13 May 2024 07:11:04 +0000</pubDate><guid>https://foojay.io/today/diagnosing-user-reported-issues-using-wirequery/</guid><description>&lt;p&gt;&lt;strong&gt;As a developer, I&amp;rsquo;ve often struggled with diagnosing user-reported issues, which is often caused by a lack of information to reproduce the problem. While a ticket may contain a screenshot of the problem and a description, it often does not portray the complete picture. For example: what did the user do that led up to the issue? What endpoints were called from the frontend, and how did they respond? What did the underlying systems communicate? Etc.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Debug Without Breakpoints – Guide to IntelliJ IDEA's Pause</title><link>https://foojay.io/today/debug-without-breakpoints/</link><pubDate>Mon, 22 Apr 2024 06:59:28 +0000</pubDate><guid>https://foojay.io/today/debug-without-breakpoints/</guid><description>&lt;p&gt;Read in other languages: &lt;a href="https://flounder.dev/zh/posts/debug-without-breakpoints/" target="_blank" rel="noopener noreferrer"&gt;中文&lt;/a&gt; &lt;a href="https://flounder.dev/es/posts/debug-without-breakpoints/" target="_blank" rel="noopener noreferrer"&gt;Español&lt;/a&gt; &lt;a href="https://flounder.dev/pt/posts/debug-without-breakpoints/" target="_blank" rel="noopener noreferrer"&gt;Português&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;In a typical debugging scenario, you would set breakpoints to tell the debugger when to suspend your program. A breakpoint usually corresponds to the moment that marks the starting point of the further investigation.&lt;/p&gt;&#10;&lt;p&gt;However, in some situations you aren&amp;rsquo;t certain about where to set a breakpoint. Other times, you might prefer to suspend the program at a particular &lt;em&gt;time&lt;/em&gt; rather than aiming at a specific &lt;em&gt;line&lt;/em&gt;.&#10;&lt;img src="https://foojay.io/today/debug-without-breakpoints/debug-without-breakpoints-banner-1024x538.jpg" alt="post banner" width="1024" height="538" loading="lazy" decoding="async"&gt;&lt;/p&gt;</description></item><item><title>Multithreaded server in Java: That's easy with FEPCOS-J.</title><link>https://foojay.io/today/fuchs-2024-fepcos-j-multithreaded-server/</link><pubDate>Thu, 21 Mar 2024 08:38:28 +0000</pubDate><guid>https://foojay.io/today/fuchs-2024-fepcos-j-multithreaded-server/</guid><description>&lt;h2 id="fepcos-j-4-easy-programming-of-a-multithreaded-tcpip-server-in-java"&gt;FEPCOS-J (4) Easy programming of a multithreaded TCP/IP server in Java&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;FEPCOS-J prototypically implements a Java language extension that allows the realization of a multithreaded TCP/IP server in Java without thread or network programming.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Please help me to make FEPCOS-J a Free/Libre and Open-Source Software (FLOSS).&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;FEPCOS-J &lt;a href="#references"&gt;[1]&lt;/a&gt; is a Java development tool that prototypes a Java language extension for declarative programming of networked systems. See my previous posts for details &lt;a href="#references"&gt;[2, 3, 4]&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Localize applications with AI</title><link>https://foojay.io/today/localize-apps-with-ai/</link><pubDate>Wed, 20 Mar 2024 08:50:29 +0000</pubDate><guid>https://foojay.io/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;&#10;&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;&#10;&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>From Kotlin Scripting to Python</title><link>https://foojay.io/today/from-kotlin-scripting-to-python/</link><pubDate>Thu, 07 Mar 2024 01:04:15 +0000</pubDate><guid>https://foojay.io/today/from-kotlin-scripting-to-python/</guid><description>&lt;p&gt;GitHub offers a way to customize one&amp;rsquo;s profile by allowing one to create a &lt;code&gt;README&lt;/code&gt; in a specific repository, named as your profile, &lt;em&gt;e.g.&lt;/em&gt; , &lt;code&gt;nfrankel/nfrankel&lt;/code&gt;. A couple of years ago, I automated the update of my GitHub profile with up-to-date info: my latest blog posts, my upcoming talks, and the last recorded YouTube talk. I took the time to document how to do it &lt;a href="https://blog.frankel.ch/automating-conference-submission-workflow/" target="_blank" rel="noopener noreferrer"&gt;on this blog&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;At the time, I chose Kotlin scripting because I was proficient enough in Kotlin, but I wanted to learn the scripting part. Over the years, I became more and more dissatisfied with the solution. I recently moved away from Kotlin Scripting to Python. In this post, I want to explain my reasons and document the migration.&lt;/p&gt;</description></item></channel></rss>