<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DevOps on foojay.io - Friends of OpenJDK</title><link>https://foojayio.github.io/website/today/category/devops/</link><description>Recent content in DevOps on foojay.io - Friends of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 21 Jul 2026 11:52:14 +0000</lastBuildDate><atom:link href="https://foojayio.github.io/website/today/category/devops/index.xml" rel="self" type="application/rss+xml"/><item><title>BoxLang AWS, Azure, and Google Secrets Manager Module Released</title><link>https://foojayio.github.io/website/today/boxlang-aws-azure-and-google-secrets-manager-module-released/</link><pubDate>Tue, 21 Jul 2026 11:38:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-aws-azure-and-google-secrets-manager-module-released/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-aws-azure-and-google-secrets-manager-module-released/boxlang-secrets-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Every production application carries secrets: database passwords, API tokens, encryption keys. The question is never whether to manage them &amp;ndash; it&amp;rsquo;s how badly the current approach is going to hurt you.&lt;/p&gt;
&lt;p&gt;Hardcoded credentials in config files get committed to repos. Environment variables sprawl across deployment pipelines with no audit trail. Custom integration code for each cloud provider means three different patterns to maintain, test, and rotate. And when a key needs to rotate at 2am? Someone is waking up.&lt;/p&gt;</description></item><item><title>BoxLang 1.15.0 Released: Blazing Fast Strings, Runtime Portability, and much more</title><link>https://foojayio.github.io/website/today/boxlang-1-15-0-released-blazing-fast-strings-runtime-portability-and-much-more/</link><pubDate>Tue, 14 Jul 2026 17:57:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-1-15-0-released-blazing-fast-strings-runtime-portability-and-much-more/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-1-15-0-released-blazing-fast-strings-runtime-portability-and-much-more/boxlang-v1.15.0-700x467.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BoxLang 1.15.0&lt;/strong&gt; is a high-impact release with two big headlines and a long tail of hardening. The first headline is a &lt;strong&gt;massive performance upgrade to string handling&lt;/strong&gt; : a new first-class &lt;code&gt;BoxStringBuilder&lt;/code&gt; type, compile-time literal folding, smarter &lt;code&gt;&amp;amp;=&lt;/code&gt; semantics, and a runtime concat strategy that automatically switches to builder-backed accumulation once your expression gets big enough. Your existing string-heavy code just got faster. No rewrites required.&lt;/p&gt;
&lt;p&gt;The second headline is architectural. Every class loader in the BoxLang runtime and module system has been fully abstracted behind a pluggable &lt;code&gt;IClassLoaderFactory&lt;/code&gt; interface. That single seam is what unlocks the &lt;strong&gt;Android runtime&lt;/strong&gt; and &lt;strong&gt;Ahead-of-Time (AOT) compiled runtimes&lt;/strong&gt; such as GraalVM Native Image that we have on the roadmap. The default behavior is unchanged, but the ceiling just got a lot higher.&lt;/p&gt;</description></item><item><title>What's New in actions/setup-java 5.4 and 5.5: Signature Verification, Kona JDK, and a Better Maven Experience</title><link>https://foojayio.github.io/website/today/whats-new-in-actions-setup-java-5-4-and-5-5-signature-verification-kona-jdk-and-a-better-maven-experience/</link><pubDate>Wed, 08 Jul 2026 18:56:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/whats-new-in-actions-setup-java-5-4-and-5-5-signature-verification-kona-jdk-and-a-better-maven-experience/</guid><description>&lt;p&gt;If you build Java on GitHub Actions, &lt;code&gt;actions/setup-java&lt;/code&gt; is almost certainly the first step in your workflow. It installs a JDK, wires up &lt;code&gt;JAVA_HOME&lt;/code&gt; and the &lt;code&gt;PATH&lt;/code&gt;, configures Maven &lt;code&gt;settings.xml&lt;/code&gt;, sets up dependency caching, and registers Maven toolchains &amp;mdash; all before your build even starts.&lt;/p&gt;
&lt;p&gt;The last two releases, &lt;strong&gt;v5.4.0&lt;/strong&gt; and &lt;strong&gt;v5.5.0&lt;/strong&gt; , are quietly some of the most interesting in a while. v5.5.0 in particular brings something Java developers have been asking about for years on CI: &lt;strong&gt;cryptographic verification of the JDK you just downloaded&lt;/strong&gt;. There&amp;rsquo;s also a brand-new distribution, smarter version-file handling, and a batch of Maven quality-of-life fixes that make your logs cleaner and your toolchains file saner.&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>Enterprise Java quality gates in the age of AI</title><link>https://foojayio.github.io/website/today/enterprise-java-quality-gates-ai/</link><pubDate>Fri, 29 May 2026 07:00:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/enterprise-java-quality-gates-ai/</guid><description>&lt;img decoding="async" class="size-medium wp-image-123963" src="ChatGPT-Image-May-26-2026-04_44_09-PM-700x394.png" alt="Illustration of human developers and an AI assistant writing code together, with the code passing through an enterprise quality gate before reaching a trusted repository." width="100%"&gt;
&lt;p&gt;People and AI can write code together, but enterprise repositories still need deterministic quality gates to protect code quality.&lt;/p&gt;
&lt;br /&gt;
&lt;h2 id="h2-0-enterprise-quality-is-a-scaling-problem"&gt;Enterprise quality is a scaling problem&lt;/h2&gt;
&lt;p&gt;Enterprise Java development is not only about writing correct code. It is about keeping a large, long-lived codebase understandable, reviewable and safe to change while many people and many tools touch it over time.&lt;/p&gt;</description></item><item><title>BoxLang v1.13.0: Compatibility, Concurrency, and Formatter Maturity</title><link>https://foojayio.github.io/website/today/boxlang-v1-13-0-compatibility-concurrency-and-formatter-maturity/</link><pubDate>Tue, 19 May 2026 12:11:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-v1-13-0-compatibility-concurrency-and-formatter-maturity/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-v1-13-0-compatibility-concurrency-and-formatter-maturity/boxlang-v1.13.0-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BoxLang 1.13.0&lt;/strong&gt; is a stability-first release with deep compatibility work and runtime hardening. This build closes 48 issues, with the majority focused on CFML compatibility edge cases, concurrency correctness, formatting parity, and miniserver/runtime reliability under real production loads.&lt;/p&gt;
&lt;p&gt;While this release is bug-fix heavy, it still introduces several meaningful features and quality-of-life improvements: character-aware trimming, class metadata lookup by absolute path, process environment control in SystemExecute(), SOAP headers, new query column rename capabilities, and safer miniserver routing/security defaults.&lt;/p&gt;</description></item><item><title>Dockerizing a Java 26 Project with Docker Init</title><link>https://foojayio.github.io/website/today/dockerizing-a-java-26-project-with-docker-init/</link><pubDate>Mon, 27 Apr 2026 09:55:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/dockerizing-a-java-26-project-with-docker-init/</guid><description>&lt;p&gt;Docker Init was introduced in Docker Desktop 4.27, before LLMs became the default answer to everything. It&amp;rsquo;s a &amp;ldquo;smart&amp;rdquo; interactive wizard that analyzes your project and generates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A &lt;code&gt;Dockerfile&lt;/code&gt; (multi-stage, production-ready)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;code&gt;compose.yaml&lt;/code&gt; file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;code&gt;.dockerignore&lt;/code&gt; file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;code&gt;README.Docker.md&lt;/code&gt; with build and run instructions&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What makes it valuable is that it&amp;rsquo;s deterministic&amp;mdash;not a probabilistic guess. It produces the same correct output every time, following Docker&amp;rsquo;s own best practices.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://dockersecurity.io/commandos-asgard/asgard-init.png" alt="Docker Commandos setting up the command center" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>AWS Nitro and CPU Graviton Meets Unikernels</title><link>https://foojayio.github.io/website/today/aws-nitro-and-cpu-graviton-meets-unikernels/</link><pubDate>Fri, 10 Apr 2026 16:26:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/aws-nitro-and-cpu-graviton-meets-unikernels/</guid><description>&lt;h2 id="h2-0-aws-nitro-and-cpu-graviton-meets-unikernels-java-and-quarkus-on-arm64-aws-graviton-with-nanos-unikernel"&gt;AWS Nitro and CPU Graviton Meets Unikernels: Java and Quarkus on ARM64 AWS Graviton with Nanos Unikernel&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://github.com/user-attachments/assets/2c957ea8-2c6b-4caa-86f8-5adeb9e8bedc" alt="image" loading="lazy"&gt;
&lt;/p&gt;
&lt;h2 id="h2-1-java-and-jakarta-ee-truly-meet-unikernels"&gt;Java and Jakarta EE Truly Meet Unikernels&lt;/h2&gt;
&lt;p&gt;The key message of this article is simple and strong:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;any Java or Jakarta EE application is already ready&lt;/strong&gt; to benefit from the advantages of unikernels.&lt;/p&gt;
&lt;p&gt;Java and Jakarta EE, including modern frameworks such as Quarkus, can immediately take advantage of the unikernel model &lt;strong&gt;without waiting for new languages, new runtimes, or radical rewrites&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Introducing Floci: A High-Performance, GraalVM-Powered AWS Emulator</title><link>https://foojayio.github.io/website/today/introducing-floci-a-high-performance-graalvm-powered-aws-emulator/</link><pubDate>Fri, 03 Apr 2026 19:00:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/introducing-floci-a-high-performance-graalvm-powered-aws-emulator/</guid><description>&lt;h2 id="h2-0-the-motivation-why-another-aws-emulator"&gt;The Motivation: Why Another AWS Emulator?&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/introducing-floci-a-high-performance-graalvm-powered-aws-emulator/perf-chart-light-700x394.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;As Java developers, we are used to local-first development. Tools that emulate the cloud environment have become essential for keeping feedback loops tight and costs at zero. However, the ecosystem has shifted. Many of us have felt the friction of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mandatory Authentication: Needing to log in or use tokens just to run local tests.&lt;/li&gt;
&lt;li&gt;Heavy Resource Footprint: Docker containers that consume a lot of resources.&lt;/li&gt;
&lt;li&gt;Slow Startup: Waiting several seconds for the environment to be &lt;strong&gt;ready.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I created Floci (from the floccus cloud formation) to solve these specific pain points. It is a 100% open-source, MIT-licensed alternative designed for speed, privacy, and simplicity.&lt;/p&gt;</description></item><item><title>TestBox 7: Real-Time Feedback, a Browser-Based IDE, and Modern Testing Workflows on the JVM</title><link>https://foojayio.github.io/website/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/</link><pubDate>Tue, 24 Mar 2026 16:58:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/testbox-7-1-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;TestBox 7.x focuses on improving testing workflows for BoxLang and CFML applications. This release introduces improvements to the &lt;strong&gt;BoxLang CLI runner&lt;/strong&gt; , real-time &lt;strong&gt;streaming test execution via SSE&lt;/strong&gt; , &lt;strong&gt;dry run&lt;/strong&gt; capabilities, a browser-based &lt;strong&gt;TestBox RUN&lt;/strong&gt; interface, and several developer experience enhancements.&lt;/p&gt;
&lt;p&gt;Check out the what&amp;rsquo;s new here: &lt;a href="https://testbox.ortusbooks.com/readme/release-history/whats-new-with-7.0.0" target="_blank" rel="noopener noreferrer"&gt;https://testbox.ortusbooks.com/readme/release-history/whats-new-with-7.0.0&lt;/a&gt;
&lt;/p&gt;
&lt;h4 id="testbox-run-a-browser-ide-for-your-tests"&gt;TestBox RUN: A Browser IDE for Your Tests&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/image-700x155.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;The centerpiece of TestBox 7 is &lt;strong&gt;TestBox RUN&lt;/strong&gt; : a self-hosted, single-page web app (&lt;code&gt;bx/tests/index.bxm&lt;/code&gt;) that you drop into any &lt;strong&gt;BoxLang&lt;/strong&gt; project and open in a browser. No build toolchain. No external service. Just BoxLang.&lt;/p&gt;</description></item><item><title>Azul Zulu OpenJDK Docker Images Now Available on Docker Hub</title><link>https://foojayio.github.io/website/today/official-azul-zulu-openjdk-images-now-available-on-docker-hub/</link><pubDate>Mon, 23 Mar 2026 07:53:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/official-azul-zulu-openjdk-images-now-available-on-docker-hub/</guid><description>&lt;p&gt;&lt;a href="https://www.azul.com/blog/trusted-java-containers-azul-zulu-openjdk-joins-dockers-official-images/" title="Azul recently announced that" target="_blank" rel="noopener noreferrer"&gt;Azul recently announced that&lt;/a&gt;
 Azul Zulu Builds of OpenJDK are now available as Docker Official images on Docker Hub. That means you can pull TCK‑verified, fully compliant OpenJDK builds directly from the same Official Images library you already trust for your base OS and databases.&lt;/p&gt;
&lt;p&gt;You can browse and pull the images here:&lt;br&gt;
&lt;a href="https://hub.docker.com/_/azul-zulu" target="_blank" rel="noopener noreferrer"&gt;https://hub.docker.com/_/azul-zulu&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id="h2-0-why-should-you-care-about-official-images"&gt;Why should you care about official images?&lt;/h2&gt;
&lt;p&gt;With the official Docker images you get:&lt;/p&gt;</description></item><item><title>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>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>Shai-Hulud and the npm Worm: How Speed-Optimised Dev Ecosystems Made a Self-Propagating Supply Chain Attack Inevitable</title><link>https://foojayio.github.io/website/today/the-shai-hulud-cyber-worm-and-more-thoughts-on-supply-chain-attacks/</link><pubDate>Thu, 12 Feb 2026 11:47:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-shai-hulud-cyber-worm-and-more-thoughts-on-supply-chain-attacks/</guid><description>&lt;h2 id="h2-0-first-a-word-about-ecosystems"&gt;first, a word about ecosystems&lt;/h2&gt;
&lt;p&gt;Before we dive into Shai-Hulud, before we label it &amp;ldquo;sophisticated&amp;rdquo; or &amp;ldquo;advanced&amp;rdquo; or &amp;ldquo;next generation,&amp;rdquo; we need to be honest about something.&lt;/p&gt;
&lt;p&gt;The worm didn&amp;rsquo;t appear in a broken system. It appeared in the one we deliberately optimised.&lt;/p&gt;
&lt;p&gt;In the book Dune, the worm is integral to the ecosystem. The planet, its environment, and the worms are deeply interconnected.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s true for the cyber-worm equivalent. The worm is an entirely predictable outcome of the ecosystem in which we, as developers, are part&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>Not a Lucid Web3 Dream Anymore: x402, ERC-8004, A2A, and The Next Wave of AI Commerce</title><link>https://foojayio.github.io/website/today/not-a-lucid-web3-dream-anymore-x402-erc-8004-a2a-and-the-next-wave-of-ai-commerce/</link><pubDate>Fri, 09 Jan 2026 16:05:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/not-a-lucid-web3-dream-anymore-x402-erc-8004-a2a-and-the-next-wave-of-ai-commerce/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/not-a-lucid-web3-dream-anymore-x402-erc-8004-a2a-and-the-next-wave-of-ai-commerce/daydreams-scaled.jpg" alt="DayDreams" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This article is for technically savvy readers, especially developers, protocol designers, and product teams working with AI agents, APIs, or crypto rails, who want a clear view of how these areas connect.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;It explains how x402, ERC-8004, and agent discovery layers turn APIs and agents into small usage-based businesses, and what that means for real systems over the next 1&amp;ndash;3 years.&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3 id="h3-0-vocabulary-for-this-article"&gt;Vocabulary for this article&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;In this article, I use the term &lt;em&gt;micro business&lt;/em&gt; for a very small overall business, and &lt;em&gt;nano business&lt;/em&gt; for a single x402-priced endpoint or agent that earns on its own from per-call payments in stablecoins.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AP2 (Agent Payment Protocol):&lt;/strong&gt; AP2 defines how agents pay each other. It standardizes how a service quotes a price, how payment is confirmed, and how both sides record what was bought, so payments fit directly into automated agent workflows. In practice, it is a protocol that lets one machine pay another machine for work, without a human in the loop.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A2A (Agent-to-Agent communication):&lt;/strong&gt; A2A covers how agents talk, pass context, and coordinate work. It lets agents call each other, exchange structured messages, and chain tasks instead of acting as isolated scripts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;x402:&lt;/strong&gt; x402 is an HTTP-based payment protocol for APIs. A server responds with status &lt;code&gt;402 Payment Required&lt;/code&gt;, the price, and a payment route, and the client pays by using stablecoins on-chain and then retries the request to get the result.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ERC-8004 (8004):&lt;/strong&gt; ERC-8004 standard is an on-chain registry for agents. It gives each agent an identity and a place to store reputation data, so other agents and tools can decide whom to trust and which services to call.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="h2-1-foreword"&gt;Foreword&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;x402&lt;/strong&gt; and &lt;strong&gt;ERC-8004&lt;/strong&gt; .&lt;/p&gt;</description></item><item><title>Java and Jakarta EE and the Evolution of the Cloud with Nanos Unikernel</title><link>https://foojayio.github.io/website/today/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/</link><pubDate>Tue, 06 Jan 2026 20:51:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/</guid><description>&lt;p&gt;The evolution of the Java and Jakarta Enterprise ecosystem is converging toward an increasingly simple, efficient, and scalable architecture that improves security, delivers higher performance, and reduces hardware and infrastructure costs.&lt;/p&gt;
&lt;p&gt;For years, Kubernetes has been considered the de‑facto standard for modernizing Java applications in a cloud‑native direction. However, Kubernetes is not the only way to achieve scalability, continuous upgrades, and isolation. An alternative approach &amp;mdash; often underestimated &amp;mdash; is to leverage the &lt;strong&gt;hypervisors already included and fully managed by major cloud providers&lt;/strong&gt; , using &lt;strong&gt;Unikernel&lt;/strong&gt; images based on &lt;a href="https://nanovms.com" target="_blank" rel="noopener noreferrer"&gt;&lt;strong&gt;Nanos&lt;/strong&gt;&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>How to Release a Java Module to Maven Central with JReleaser and GitHub Actions (2025 Guide)</title><link>https://foojayio.github.io/website/today/how-to-publish-a-java-maven-project-to-maven-central-using-jreleaser-and-github-actions-2025-guide/</link><pubDate>Fri, 12 Dec 2025 07:42:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-publish-a-java-maven-project-to-maven-central-using-jreleaser-and-github-actions-2025-guide/</guid><description>&lt;p&gt;This article is a tutorial that guides you through the process of releasing a Java module with &lt;a href="https://jreleaser.org/" target="_blank" rel="noopener noreferrer"&gt;JReleaser&lt;/a&gt;
 to Maven Central with Github Actions. It is a 2025 update of the &lt;a href="https://foojayio.github.io/website/today/how-to-release-a-java-module-with-jreleaser-to-maven-central-with-github-actions/"&gt;foojay.io/today/how-to-release-a-java-module-with-jreleaser-to-maven-central-with-github-actions&lt;/a&gt;
 article.&lt;/p&gt;
&lt;p&gt;JReleaser is a tool that streamlines the release process for Java projects, allowing developers to quickly and efficiently publish their modules to Maven Central.&lt;/p&gt;
&lt;p&gt;This article will use the &lt;a href="https://github.com/jagodevreede/semver-check/" title="SemVer Check project" target="_blank" rel="noopener noreferrer"&gt;SemVer Check project&lt;/a&gt;
 as an example project that uses Maven as a build tool.&lt;/p&gt;</description></item><item><title>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 #8</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-8/</link><pubDate>Thu, 30 Oct 2025 06:36:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-8/</guid><description>&lt;p&gt;&lt;strong&gt;Fourteen days have passed, and it is time to present a fresh collection of readings that could influence developments in the field of artificial intelligence.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This newsletter focuses on examining how AI enhances productivity through enterprise studies, agentic system architecture, attack vectors, Model Context Protocol (MCP) implementation, Agent-to-Agent (A2A) protocol, Java code generation within IDEs, LLM benchmarking methodologies, and the security challenges arising from increased AI-LLM adoption.&lt;/p&gt;
&lt;p&gt;The world influenced by LLM is changing very quickly, let&amp;rsquo;s start&amp;hellip;&lt;/p&gt;</description></item><item><title>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>Why Mirroring Production in Dev Helps You Avoid Costly Mistakes</title><link>https://foojayio.github.io/website/today/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/</link><pubDate>Mon, 28 Jul 2025 13:31:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/</guid><description>&lt;p&gt;&lt;strong&gt;Many developers start building their applications with MongoDB using a free M0 cluster or a local environment. While this is common and convenient, it can lead to issues that could easily be avoided by using a more robust setup, such as a development cluster that closely mirrors production. Problems like inefficient queries, missing indexes, or even costly mistakes often go unnoticed in limited environments like M0 or local setups.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll explore why your development environment should closely reflect your production environment, and how using an M10+ cluster with tools like Query Profiler and Performance Advisor can help you catch performance issues early and build with confidence.&lt;/p&gt;</description></item><item><title>Cloudflare Tunnel for Home Assistant</title><link>https://foojayio.github.io/website/today/cloudflare-tunnel-for-home-assistant/</link><pubDate>Tue, 03 Jun 2025 11:29:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/cloudflare-tunnel-for-home-assistant/</guid><description>&lt;p&gt;I continue to take care of my Home Assistant. This week, I replaced my original setup with &lt;a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/" target="_blank" rel="noopener noreferrer"&gt;Cloudflare Tunnel&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;This is the 6^th^ post in the My journey with Home Assistant focus series. Other posts include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://blog.frankel.ch/home-assistant/1/" target="_blank" rel="noopener noreferrer"&gt;Why Home Assistant?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.frankel.ch/home-assistant/2/" target="_blank" rel="noopener noreferrer"&gt;The Home Assistant model&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.frankel.ch/home-assistant/3/" target="_blank" rel="noopener noreferrer"&gt;Replace Philips Hue automation with Home Assistant&amp;rsquo;s&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.frankel.ch/home-assistant/4/" target="_blank" rel="noopener noreferrer"&gt;An example of HACS: Adaptive Lighting&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.frankel.ch/home-assistant/5/" target="_blank" rel="noopener noreferrer"&gt;The Home Assistant companion app&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="h2-0-the-initial-setup"&gt;The initial setup&lt;/h2&gt;
&lt;p&gt;My usage of Home Assistant required external access from the beginning.&lt;/p&gt;</description></item><item><title>One giant Kubernetes cluster for everything</title><link>https://foojayio.github.io/website/today/one-giant-kubernetes-cluster-for-everything/</link><pubDate>Tue, 25 Mar 2025 10:33:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/one-giant-kubernetes-cluster-for-everything/</guid><description>&lt;p&gt;The ideal size of your Kubernetes clusters is a day 0 question and demands a definite answer.&lt;/p&gt;
&lt;p&gt;You find one giant cluster on one end of the spectrum and many small-sized ones on the other, with every combination in between. This decision will impact your organization for years to come. Worse, if you decide to change your topology, you&amp;rsquo;re in for a time-wasting and expensive ride.&lt;/p&gt;
&lt;p&gt;I want to list each approach&amp;rsquo;s pros and cons in this post. Then, I&amp;rsquo;ll settle the discussion once and for all and argue why selecting the giant cluster option is better.&lt;/p&gt;</description></item><item><title>Pull request testing on Kubernetes: vCluster for isolation and costs control</title><link>https://foojayio.github.io/website/today/pull-request-testing-on-kubernetes-vcluster-for-isolation-and-costs-control/</link><pubDate>Sun, 16 Mar 2025 11:47:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/pull-request-testing-on-kubernetes-vcluster-for-isolation-and-costs-control/</guid><description>&lt;p&gt;This week&amp;rsquo;s article is the third and final in my series about running tests on Kubernetes for each pull request. In the &lt;a href="https://blog.frankel.ch/pr-testing-kubernetes/1/" target="_blank" rel="noopener noreferrer"&gt;first post&lt;/a&gt;
, I described the app and how to test locally using Testcontainers and in a GitHub workflow. The &lt;a href="https://blog.frankel.ch/pr-testing-kubernetes/2/" target="_blank" rel="noopener noreferrer"&gt;second post&lt;/a&gt;
 focused on setting up the target environment and running end-to-end tests on Kubernetes.&lt;/p&gt;
&lt;p&gt;I concluded the latter by mentioning a significant quandary. Creating a dedicated cluster for each workflow significantly impacts the time it takes to run. On , it took between 5 and 7 minutes to spin off a new cluster. If you create a GKE instance upstream, you face two issues:&lt;/p&gt;</description></item><item><title>Run a Java Lambda Function From a Docker image</title><link>https://foojayio.github.io/website/today/run-a-java-lambda-function-from-a-docker-image/</link><pubDate>Wed, 11 Dec 2024 16:16:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/run-a-java-lambda-function-from-a-docker-image/</guid><description>&lt;p&gt;&lt;strong&gt;Have you ever wanted to deploy a Java Serverless function, but package it with a Docker Image? That is possible now with AWS new Container support. This guide will show you how to try it yourself, step by step!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Hello Lambda Function project contains an AWS Lambda maven application with &lt;a href="https://github.com/aws/aws-sdk-java-v2" target="_blank" rel="noopener noreferrer"&gt;AWS Java SDK 2.x&lt;/a&gt;
 dependencies.&lt;/p&gt;
&lt;p&gt;Here follows instructions from AWS Document on building &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/java-image.html#java-image-instructions" target="_blank" rel="noopener noreferrer"&gt;Lambda for Java&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The sample code seen below can be found in my GitHub repository: &lt;a href="https://github.com/charlfasching/hello-lambda" target="_blank" rel="noopener noreferrer"&gt;hello-lambda&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Prevent LDAP injection in #java 💥💉with #springboot</title><link>https://foojayio.github.io/website/today/prevent-ldap-injection-in-java-with-springboot/</link><pubDate>Wed, 04 Dec 2024 14:45:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/prevent-ldap-injection-in-java-with-springboot/</guid><description>&lt;p&gt;&lt;strong&gt;LDAP (Lightweight Directory Access Protocol)&lt;/strong&gt; is essential for managing and accessing directory information in Java web applications. However, it&amp;rsquo;s crucial to understand and prevent &lt;strong&gt;LDAP Injection&lt;/strong&gt;, a serious security vulnerability that can lead to unauthorized access and data breaches.&lt;/p&gt;
&lt;p&gt;Following &lt;strong&gt;OWASP Recommendations&lt;/strong&gt; , such as validating user inputs and using parameterized queries, is vital for securing your applications. In this article, we&amp;rsquo;ll dive into LDAP, explore LDAP Injection, share OWASP&amp;rsquo;s best practices, and demonstrate secure coding in &lt;strong&gt;Spring Boot&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Effortless updates requires a zero-migration policy</title><link>https://foojayio.github.io/website/today/effortless-updates-zero-migration/</link><pubDate>Tue, 05 Nov 2024 12:19:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/effortless-updates-zero-migration/</guid><description>&lt;p&gt;&lt;strong&gt;In today&amp;rsquo;s production environments, it is not only expected, but critical to keep your technology stack as up-to-date as possible.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Staying current helps to mitigate security risks, while also benefiting from bug fixes, performance improvements, and new features and function that can help drive your business&amp;rsquo;s success.&lt;/p&gt;
&lt;p&gt;This is true whether you&amp;rsquo;re deploying to a cloud or locally, and applies regardless of the deployment type, whether container images, VMs, or bare metal.&lt;/p&gt;</description></item><item><title>Foojay Podcast #58: How Java Developers Can Secure Their Code</title><link>https://foojayio.github.io/website/today/foojay-podcast-58/</link><pubDate>Mon, 30 Sep 2024 07:43:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-58/</guid><description>&lt;p&gt;Three years after Log4Shell caused a significant security issue, we still struggle with insecure dependencies and injection problems.&lt;/p&gt;
&lt;p&gt;In this podcast, we&amp;rsquo;ll discuss how developers can secure their code.&lt;/p&gt;
&lt;p&gt;I talked with three authors who posted a security and code quality post on Foojay.io.&lt;/p&gt;
&lt;h2 id="h2-0-video"&gt;Video&lt;/h2&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/sRVcqILDuSo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;h2 id="h2-1-podcast-apps"&gt;Podcast Apps&lt;/h2&gt;
&lt;p&gt;You can listen and subscribe to the Foojay Podcast on:&lt;/p&gt;</description></item><item><title>Health Check Response Format for HTTP APIs</title><link>https://foojayio.github.io/website/today/health-check-response-format-for-http-apis/</link><pubDate>Thu, 12 Sep 2024 10:02:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/health-check-response-format-for-http-apis/</guid><description>&lt;p&gt;I&amp;rsquo;m continuing my journey on getting more familiar with HTTP APIs by reading related . This time, I read the &lt;a href="https://datatracker.ietf.org/doc/html/draft-inadarei-api-health-check" target="_blank" rel="noopener noreferrer"&gt;Health Check Response Format for HTTP APIs&lt;/a&gt;
 on the suggestion of &lt;a href="https://twitter.com/stefanofago/" target="_blank" rel="noopener noreferrer"&gt;Stefano Fago&lt;/a&gt;
. In this article, I&amp;rsquo;d like to summarize my reading.&lt;/p&gt;
&lt;p&gt;Note that it&amp;rsquo;s a draft. Moreover, it has been dormant for nearly two years and, thus, has been automatically expired. However, it&amp;rsquo;s the closest to a specification on health checks and thus deserves some love.&lt;/p&gt;</description></item><item><title>DRY your Apache APISIX config</title><link>https://foojayio.github.io/website/today/dry-your-apache-apisix-config/</link><pubDate>Thu, 12 Sep 2024 09:59:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/dry-your-apache-apisix-config/</guid><description>&lt;p&gt;is an important principle in software development. In this article, you learn how to apply it to Apache APISIX configuration.&lt;/p&gt;
&lt;h2 id="h2-0-the-dry-principle"&gt;The DRY principle&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Don&amp;rsquo;t repeat yourself&amp;rdquo; (DRY) is a principle of software development aimed at reducing repetition of information which is likely to change, replacing it with abstractions that are less likely to change, or using data normalization which avoids redundancy in the first place.&lt;/p&gt;
&lt;p&gt;&amp;ndash; &lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself" target="_blank" rel="noopener noreferrer"&gt;Wikipedia - Don&amp;rsquo;t repeat yourself&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>Implementing the Idempotency-Key specification on Apache APISIX</title><link>https://foojayio.github.io/website/today/implementing-the-idempotency-key-specification-on-apache-apisix/</link><pubDate>Mon, 02 Sep 2024 20:58:24 +0000</pubDate><guid>https://foojayio.github.io/website/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;
&lt;p&gt;In short, the idea is for the client to send a unique key along with the request:&lt;/p&gt;
&lt;ul&gt;
&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;
&lt;li&gt;If the server knows the key, it short-circuits any further processing and immediately returns the stored response&lt;/li&gt;
&lt;/ul&gt;
&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>When (not) to write an Apache APISIX plugin</title><link>https://foojayio.github.io/website/today/when-not-to-write-an-apache-apisix-plugin/</link><pubDate>Mon, 02 Sep 2024 20:50:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/when-not-to-write-an-apache-apisix-plugin/</guid><description>&lt;p&gt;&lt;strong&gt;When I introduce Apache APISIX in my talks, I mention the &lt;a href="https://apisix.apache.org/plugins/" target="_blank" rel="noopener noreferrer"&gt;massive number of existing plugins&lt;/a&gt;
, and that each of them implements a specific feature.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One of the key features of Apache APISIX is its flexibility. If a feature is missing, you can create your own plugin in Lua or a language compiled into Wasm, showcasing the platform&amp;rsquo;s adaptability to your specific needs.&lt;/p&gt;
&lt;p&gt;In this article, I aim to provide practical alternatives to writing a custom plugin, offering solutions you can quickly implement in your projects.&lt;/p&gt;</description></item><item><title>Creating 12-factor cloud-native Java apps with open source</title><link>https://foojayio.github.io/website/today/creating-cloud-native-java-applications-with-the-12-factor-app-methodology/</link><pubDate>Fri, 23 Aug 2024 05:30:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-cloud-native-java-applications-with-the-12-factor-app-methodology/</guid><description>&lt;p&gt;&lt;strong&gt;Learn how you could create cloud-native Java apps that are portable, scalable, and reliable with the 12 factor app methodology and open source Java frameworks.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Created in 2012, the 12-factor app methodology was designed to provide a set of guidelines for helping developers and organizations to design and build cloud-native applications. We&amp;rsquo;ll explore how you can take advantage of each of these 12 factors to create applications, utilizing open source technologies, that thrive in the cloud.&lt;/p&gt;</description></item><item><title>OpenTelemetry Tracing on Spring Boot, Java Agent vs. Micrometer Tracing</title><link>https://foojayio.github.io/website/today/opentelemetry-tracing-on-spring-boot-java-agent-vs-micrometer-tracing/</link><pubDate>Thu, 22 Aug 2024 08:34:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/opentelemetry-tracing-on-spring-boot-java-agent-vs-micrometer-tracing/</guid><description>&lt;p&gt;&lt;strong&gt;My &lt;a href="https://github.com/nfrankel/opentelemetry-tracing" target="_blank" rel="noopener noreferrer"&gt;demo&lt;/a&gt;
 of OpenTelemetry Tracing features two Spring Boot components. One uses the Java agent, and I noticed a different behavior when I recently upgraded it from v1.x to v2.x. In the other one, I&amp;rsquo;m using Micrometer Tracing because I compile to GraalVM native, and it can&amp;rsquo;t process Java agents.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I want to compare these three different ways in this post: Java agent v1, Java agent v2, and Micrometer Tracing.&lt;/p&gt;</description></item><item><title>Are Critical Vulnerabilities Lurking in Your Java Ecosystem?</title><link>https://foojayio.github.io/website/today/are-critical-vulnerabilities-lurking-in-your-java-ecosystem/</link><pubDate>Mon, 19 Aug 2024 12:57:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/are-critical-vulnerabilities-lurking-in-your-java-ecosystem/</guid><description>&lt;p&gt;Java, the popular object-oriented language renowned for its portability, performance, and security, is often the preferred choice for organisations building everything from enterprise and cloud-native applications to Android apps.&lt;/p&gt;
&lt;p&gt;However, despite these strengths, Java&amp;rsquo;s popularity and the complex ecosystem of third-party libraries it relies upon have also made it a prime target for malicious actors to exploit vulnerabilities. According to the Datadog &amp;ldquo;State of DevSecOps&amp;rdquo;[1] report, a staggering 90% of Java services are susceptible to one or more critical or high-severity vulnerabilities, often stemming from external dependencies, compared to an average of 47% for other technologies. This discrepancy is concerning and points to inherent issues within the Java ecosystem.&lt;/p&gt;</description></item><item><title>Free tier API with Apache APISIX</title><link>https://foojayio.github.io/website/today/free-tier-api-with-apache-apisix/</link><pubDate>Mon, 05 Aug 2024 13:50:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/free-tier-api-with-apache-apisix/</guid><description>&lt;p&gt;&lt;strong&gt;Lots of service providers offer a free tier of their service. The idea is to let you kick their service&amp;rsquo;s tires freely. If you need to go above the free tier at any point, you&amp;rsquo;ll likely stay on the service and pay.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this day and age, most services are online and accessible via an API. Today, we will implement a free tier with &lt;a href="https://apisix.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache APISIX&lt;/a&gt;
.&lt;/p&gt;
&lt;h2 id="h2-0-a-naive-approach"&gt;A naive approach&lt;/h2&gt;
&lt;p&gt;I implemented a free tier in my post &lt;a href="https://blog.frankel.ch/evolve-apis/#know-your-users" target="_blank" rel="noopener noreferrer"&gt;Evolving your RESTful APIs, a step-by-step approach&lt;/a&gt;
, albeit in a very naive way. I copy-pasted the &lt;a href="https://apisix.apache.org/docs/apisix/plugins/limit-count/" target="_blank" rel="noopener noreferrer"&gt;limit-count&lt;/a&gt;
 plugin and added my required logic.&lt;/p&gt;</description></item><item><title>Differentiating rate limits in Apache APISIX</title><link>https://foojayio.github.io/website/today/differentiating-rate-limits-in-apache-apisix/</link><pubDate>Mon, 05 Aug 2024 13:37:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/differentiating-rate-limits-in-apache-apisix/</guid><description>&lt;p&gt;&lt;strong&gt;In my talk Evolving your APIs, I mention that an API Gateways is a Reverse Proxy &amp;ldquo;on steroids&amp;rdquo;. One key difference between the former and the latter is that the API Gateway is not unfriendly to business logic. The poster child is rate-limiting.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rate-limiting is an age-old Reverse Proxy feature focused on protecting against attacks. It treats all clients the same and is purely technical. In this day and age, most API providers offer different subscription tiers; the higher the tier, the higher the rate limit, and the more you pay incidentally. It&amp;rsquo;s not technical anymore and requires to differentiate between clients.&lt;/p&gt;</description></item><item><title>Random and fixed routes with Apache APISIX</title><link>https://foojayio.github.io/website/today/random-and-fixed-routes-with-apache-apisix/</link><pubDate>Mon, 05 Aug 2024 13:29:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/random-and-fixed-routes-with-apache-apisix/</guid><description>&lt;p&gt;&lt;strong&gt;My ideas for blog posts inevitably start to dry up after over two years at &lt;a href="https://apisix.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache APISIX&lt;/a&gt;
.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hence, I did some triage on the &lt;a href="https://github.com/apache/apisix/issues" target="_blank" rel="noopener noreferrer"&gt;APISIX repo&lt;/a&gt;
. I stumbled upon this one question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We have a requirement to use a plugin, where we need to route the traffic on percentage basis. I&amp;rsquo;ll give an example for better understanding.&lt;/p&gt;
&lt;p&gt;We have an URL where ca is country (Canada) and fr is french language. Now the traffic needs to routed 10% to and the remaining 90% to. And whenever we&amp;rsquo;re routing the traffic to we need to set a cookie. So for next call, if the cookie is there, it should directly go to else it should go via a 10:90 traffic split. What is the best possible way to achieve this ??&lt;/p&gt;</description></item><item><title>Advanced URL Rewriting with Apache APISIX</title><link>https://foojayio.github.io/website/today/advanced-url-rewriting-with-apache-apisix/</link><pubDate>Thu, 25 Jul 2024 09:10:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/advanced-url-rewriting-with-apache-apisix/</guid><description>&lt;p&gt;&lt;strong&gt;I spoke at &lt;a href="https://www.pgday.ch/2024/#schedule" target="_blank" rel="noopener noreferrer"&gt;Swiss PgDay&lt;/a&gt;
 in Switzerland in late June. The talk was about how to create a no-code API with the famous &lt;a href="https://www.postgresql.org/" target="_blank" rel="noopener noreferrer"&gt;PostgreSQL&lt;/a&gt;
 database, the related &lt;a href="https://postgrest.org/" target="_blank" rel="noopener noreferrer"&gt;PostgREST&lt;/a&gt;
, and &lt;a href="https://apisix.apache.org" target="_blank" rel="noopener noreferrer"&gt;Apache APISIX&lt;/a&gt;
, of course. I already wrote about the idea in a &lt;a href="https://blog.frankel.ch/poor-man-api/" target="_blank" rel="noopener noreferrer"&gt;previous post&lt;/a&gt;
. However, I wanted to improve it, if only slightly.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;PostgREST offers a powerful &lt;code&gt;SELECT&lt;/code&gt; mechanism. To list all entities with a column equal to a value, you need the following command:&lt;/p&gt;</description></item><item><title>New video series "JavaFX In Action", Part 1</title><link>https://foojayio.github.io/website/today/new-video-series-javafx-in-action-part-1/</link><pubDate>Tue, 16 Jul 2024 07:35:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/new-video-series-javafx-in-action-part-1/</guid><description>&lt;p&gt;JavaFX is a powerful user interface framework, often overlooked in the world of desktop applications development. With this new series of video interviews, I want to take you behind-the-scenes of some applications built using JavaFX.&lt;/p&gt;
&lt;p&gt;JavaFX combines the best features of a modern user interface toolkit with the unparalleled strength of the Java platform. This approach enables you to perform heavy &amp;ldquo;background tasks&amp;rdquo;, like processing large amounts of data, while still providing a responsive user interface.&lt;/p&gt;</description></item><item><title>Dynamic watermarking with imgproxy and Apache APISIX</title><link>https://foojayio.github.io/website/today/dynamic-watermarking-with-imgproxy-and-apache-apisix/</link><pubDate>Wed, 10 Jul 2024 13:38:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/dynamic-watermarking-with-imgproxy-and-apache-apisix/</guid><description>&lt;p&gt;I described &lt;a href="https://foojayio.github.io/website/today/dynamic-watermarking-on-the-jvm/"&gt;how to add a dynamic watermark to your images on the JVM&lt;/a&gt;
. I didn&amp;rsquo;t find any library, so I had to develop the feature, or, more precisely, an embryo of a feature, by myself.&lt;/p&gt;
&lt;p&gt;Depending on your tech stack, you must search for an existing library or roll up your sleeves. For example, Rust offers such an out-of-the-box library. Worse, this approach might be impossible to implement if you don&amp;rsquo;t have access to the source image.&lt;/p&gt;</description></item><item><title>Foojay Podcast #55: Embedded Java, Part 2</title><link>https://foojayio.github.io/website/today/foojay-podcast-55/</link><pubDate>Mon, 01 Jul 2024 08:21:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-55/</guid><description>&lt;p&gt;As a backend developer, you may not realize that Java was initially born on embedded devices like set-top boxes and gateways. We discussed this topic for the first time almost three years ago in &lt;a href="https://foojayio.github.io/website/today/foojay-podcast-2/"&gt;Foojay Podcast #2 with James Gosling, Johan Vos, Erik Costlow, and Frank Delporte&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;In this episode #55, we look into the history of the Java Micro Edition and how things evolved. Nowadays, with processors becoming increasingly powerful, we can run the exact same Java runtime on any Linux system, from the biggest cloud servers to the smallest Raspberry Pi Zero.&lt;/p&gt;</description></item><item><title>Renovate for everything</title><link>https://foojayio.github.io/website/today/renovate-for-everything/</link><pubDate>Thu, 27 Jun 2024 08:18:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/renovate-for-everything/</guid><description>&lt;p&gt;In my earlier post about moving from &lt;a href="https://blog.frankel.ch/kotlin-scripting-to-python/" target="_blank" rel="noopener noreferrer"&gt;Kotlin Scripting to Python&lt;/a&gt;
, I mentioned several reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Separating the content from the script&lt;/li&gt;
&lt;li&gt;Kotlin Scripting is an unloved child of JetBrains&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mend.io/renovate/" target="_blank" rel="noopener noreferrer"&gt;Renovate&lt;/a&gt;
 cannot update Kotlin Scripting files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I was wrong on the third point. Here&amp;rsquo;s my &lt;em&gt;mea culpa&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;First things first, Renovate does indeed &lt;a href="https://docs.renovatebot.com/modules/manager/kotlin-script/" target="_blank" rel="noopener noreferrer"&gt;manages Kotlin Scripting&lt;/a&gt;
 files - since 2022.&lt;/p&gt;
&lt;p&gt;Even better, Renovate can manage &lt;em&gt;any&lt;/em&gt; type of file. Thanks to Max Andersen for the tip:&lt;/p&gt;</description></item><item><title>Even More Opentelemetry!</title><link>https://foojayio.github.io/website/today/even-more-opentelemetry/</link><pubDate>Thu, 20 Jun 2024 06:40:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/even-more-opentelemetry/</guid><description>&lt;p&gt;&lt;strong&gt;I continue to work on my &lt;a href="https://github.com/nfrankel/opentelemetry-tracing" target="_blank" rel="noopener noreferrer"&gt;Opentelemetry demo&lt;/a&gt;
. Its main idea is to showcase &lt;em&gt;traces&lt;/em&gt; across various technology stacks, including asynchronous communication via an MQTT queue. Recently, I added a couple of components and changed the architecture. Here are some noteworthy learnings; note that some of them might not be entirely connected to OpenTelemetry.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an updated diagram. New components appear in violet, and updated components appear in green.&lt;/p&gt;</description></item><item><title>Foojay Podcast #53: JCON Report, Part 5 – CQRS, JOOQ, GraphQL, API, Vaadin, OpenRewrite, ErrorProne, Gateways, Proxies,...</title><link>https://foojayio.github.io/website/today/foojay-podcast-53/</link><pubDate>Mon, 17 Jun 2024 09:24:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-53/</guid><description>&lt;p&gt;This is the final part of the JCON interviews. Did I save the best for last? It&amp;rsquo;s up to you to decide&amp;hellip;&lt;/p&gt;
&lt;p&gt;In this episode you&amp;rsquo;ll hear Simon Martinelli, Nicolas Fränkel, Marcus Hellberg, Rick Ossendrijver, and Abdel Sghiouar.&lt;/p&gt;
&lt;p&gt;We talked about a bunch of topics like evolving your APIs, GraphQL, Java versus Kotlin versus Rust, Vaadin, AI and ChatGPT, OpenRewrite, ErrorProne, Infrastructure, and a lot more.&lt;/p&gt;
&lt;h2 id="h2-0-video"&gt;Video&lt;/h2&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6ops5sU_UiY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;h2 id="h2-1-podcast-apps"&gt;Podcast Apps&lt;/h2&gt;
&lt;p&gt;You can listen and subscribe to the Foojay Podcast on:&lt;/p&gt;</description></item><item><title>Exploring Cost-Effective Solutions for Stateful Rest Services</title><link>https://foojayio.github.io/website/today/exploring-cost-effective-solutions-for-stateful-rest-services/</link><pubDate>Mon, 27 May 2024 13:13:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-cost-effective-solutions-for-stateful-rest-services/</guid><description>&lt;h2 id="h2-0-a-case-study-with-ibm-cloud-code-engine-eclipsestore-and-ibm-cloud-object-storage"&gt;A Case Study with IBM Cloud Code Engine, EclipseStore, and IBM Cloud Object Storage&lt;/h2&gt;
&lt;p&gt;In the dynamic realm of cloud computing, finding cost-effective solutions for stateful rest services that don&amp;rsquo;t necessarily require scaling can be a nuanced challenge.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll take a pragmatic look at a use case leveraging &lt;a href="https://www.ibm.com/products/code-engine" title="IBM Cloud Code Engine" target="_blank" rel="noopener noreferrer"&gt;IBM Cloud Code Engine&lt;/a&gt;
, &lt;a href="https://eclipsestore.io/" title="EclipseStore" target="_blank" rel="noopener noreferrer"&gt;EclipseStore&lt;/a&gt;
, and &lt;a href="https://www.ibm.com/products/cloud-object-storage" title="IBM Cloud Object Storage (COS)" target="_blank" rel="noopener noreferrer"&gt;IBM Cloud Object Storage (COS)&lt;/a&gt;
. The goal is to shed light on how this can be a practical and economical alternative, particularly when scalability is not a primary concern.&lt;/p&gt;</description></item><item><title>Is your Java application ready for the next generation of server CPUs?</title><link>https://foojayio.github.io/website/today/is-your-java-application-ready-for-the-next-generation-of-server-cpus/</link><pubDate>Wed, 08 May 2024 08:03:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/is-your-java-application-ready-for-the-next-generation-of-server-cpus/</guid><description>&lt;p&gt;&lt;strong&gt;If you only know about Arm CPU architecture from working on smartphones or Raspberry Pi devices, it might come as a surprise to you that there are also high-performance, cloud-scale Arm CPUs already on the Java market.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The share of cloud and server workloads running on Arm is increasing every year. Back in 2011, Arm released the AArch64 instruction set, the first 64-bit support on Arm CPUs. Since then, Arm&amp;rsquo;s silicon partners have been producing a range of systems-on-chip (SoCs) that adopt Arm&amp;rsquo;s high performance CPUs. These power a broad range of diverse devices and technologies, including &lt;a href="https://newsroom.arm.com/news/tcs23-mediatek-vivo" title="flagship smartphones" target="_blank" rel="noopener noreferrer"&gt;flagship smartphones&lt;/a&gt;
, &lt;a href="https://newsroom.arm.com/blog/windows-on-arm-laptop-momentum" title="laptops" target="_blank" rel="noopener noreferrer"&gt;laptops&lt;/a&gt;
, &lt;a href="https://newsroom.arm.com/blog/high-end-aiot-markets" target="_blank" rel="noopener noreferrer"&gt;industrial IoT&lt;/a&gt;
, servers, and even &lt;a href="https://newsroom.arm.com/news/arm-powered-fugaku-supercomputer-claims-1-spot-on-top500-third-time-in-a-row" target="_blank" rel="noopener noreferrer"&gt;powerful super computers&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Five ways to pass parameters to Apache APISIX</title><link>https://foojayio.github.io/website/today/five-ways-to-pass-parameters-to-apache-apisix/</link><pubDate>Tue, 30 Apr 2024 14:53:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/five-ways-to-pass-parameters-to-apache-apisix/</guid><description>&lt;p&gt;I recently read &lt;a href="https://javabulletin.substack.com/p/6-ways-to-pass-parameters-to-spring" target="_blank" rel="noopener noreferrer"&gt;6 Ways To Pass Parameters to Spring REST API&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Though the title is a bit misleading, as it&amp;rsquo;s unrelated to REST, it does an excellent job listing all ways to send parameters to a Spring application.&lt;/p&gt;
&lt;p&gt;I want to do the same for Apache APISIX; it&amp;rsquo;s beneficial when you write a custom plugin.&lt;/p&gt;
&lt;h2 id="h2-0-general-setup"&gt;General setup&lt;/h2&gt;
&lt;p&gt;The general setup uses Docker Compose and static configuration.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll have one plugin per way to pass parameters.&lt;/p&gt;</description></item><item><title>Why This JCON Europe Talk Is Unmissable (Part 1)</title><link>https://foojayio.github.io/website/today/why-this-jcon-europe-talk-is-unmissable-part-1/</link><pubDate>Mon, 29 Apr 2024 07:29:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-this-jcon-europe-talk-is-unmissable-part-1/</guid><description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://2024.europe.jcon.one/" target="_blank" rel="noopener noreferrer"&gt;JCON Europe&lt;/a&gt;
 in Cologne is around the corner (&lt;a href="https://bit.ly/3xv9yfT" target="_blank" rel="noopener noreferrer"&gt;and here are your free Foojay JCON tickets&lt;/a&gt;
), May 13 to 16. Why should you go? Well, one reason is that the talks will be awesome. Here&amp;rsquo;s the start of a series of reasons why some of them are absolutely unmissable!&lt;/strong&gt;
&lt;img src="https://foojayio.github.io/website/today/why-this-jcon-europe-talk-is-unmissable-part-1/image-2.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;h2 id="h2-0-devops-for-java-developers-or-maybe-against-them-baruch-sadogursky"&gt;&lt;strong&gt;DevOps for Java Developers (Or Maybe Against Them?!) - Baruch Sadogursky&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Thursday, 16 May 2024 12:30 pm - 1:15 pm - Cinema BlackBox&lt;/p&gt;</description></item><item><title>Using my new Raspberry Pi to run an existing GitHub Action</title><link>https://foojayio.github.io/website/today/using-my-new-raspberry-pi-to-run-an-existing-github-action/</link><pubDate>Tue, 23 Apr 2024 18:45:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/using-my-new-raspberry-pi-to-run-an-existing-github-action/</guid><description>&lt;p&gt;Recently, I mentioned &lt;a href="https://blog.frankel.ch/kotlin-scripting-to-python/" target="_blank" rel="noopener noreferrer"&gt;how I refactored&lt;/a&gt;
 &lt;a href="https://github.com/nfrankel/nfrankel-update/" target="_blank" rel="noopener noreferrer"&gt;the script&lt;/a&gt;
 that kept &lt;a href="https://github.com/nfrankel/" target="_blank" rel="noopener noreferrer"&gt;my GitHub profile&lt;/a&gt;
 up-to-date. Since Geecon Prague, I&amp;rsquo;m also a happy owner of a Raspberry Pi:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/nicolas_frankel/status/1715313240568197233" target="_blank" rel="noopener noreferrer"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;[&lt;/p&gt;
&lt;img fetchpriority="high" decoding="async" class="aligncenter wp-image-106305 size-medium" src="Screenshot-2024-03-10-at-17.20.56-557x510.png" alt="" width="557" height="510"&gt;
&lt;p&gt;](&lt;a href="https://twitter.com/nicolas_frankel/status/1715313240568197233" target="_blank" rel="noopener noreferrer"&gt;https://twitter.com/nicolas_frankel/status/1715313240568197233&lt;/a&gt;
)&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Though the current setup works flawlessly - and is free, I wanted to experiment with self-hosted runners. Here are my findings.&lt;/p&gt;
&lt;h2 id="h2-0-context"&gt;Context&lt;/h2&gt;
&lt;p&gt;GitHub offers a large free usage of GitHub Actions:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GitHub Actions usage is free for standard GitHub-hosted runners in public repositories, and for self-hosted runners. For private repositories, each GitHub account receives a certain amount of free minutes and storage for use with GitHub-hosted runners, depending on the account&amp;rsquo;s plan. Any usage beyond the included amounts is controlled by spending limits.&lt;/p&gt;</description></item><item><title>12 Text Tools For Developers</title><link>https://foojayio.github.io/website/today/12-text-tools-for-developers/</link><pubDate>Tue, 09 Apr 2024 07:31:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/12-text-tools-for-developers/</guid><description>&lt;p&gt;&lt;strong&gt;As developer, you would think we would spend all our time in an IDE doing development. The reality is a bit different. We may need to analyze logs, test our web services, generate test data, do security tests, analyze data in the database, and so on. Text processing os also part of a developer job. Let&amp;rsquo;s see a few free text tools to simplify your job.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using online tools makes me wonder if I&amp;rsquo;m leaking company data to the website, so I wrote a desktop freeware &lt;a href="https://www.japplis.com/toolbox/" target="_blank" rel="noopener noreferrer"&gt;Japplis Toolbox&lt;/a&gt;
 containing a collection of text tools.&lt;/p&gt;</description></item><item><title>Improving upon my OpenTelemetry Tracing demo</title><link>https://foojayio.github.io/website/today/improving-upon-my-opentelemetry-tracing-demo/</link><pubDate>Wed, 03 Apr 2024 06:35:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/improving-upon-my-opentelemetry-tracing-demo/</guid><description>&lt;p&gt;Last year, I wrote a &lt;a href="https://blog.frankel.ch/end-to-end-tracing-opentelemetry/" target="_blank" rel="noopener noreferrer"&gt;post&lt;/a&gt;
 on Open Telemetry Tracing to understand more about the subject. I also created a demo around it, which featured the following components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Apache APISIX API Gateway&lt;/li&gt;
&lt;li&gt;A Kotlin/Spring Boot service&lt;/li&gt;
&lt;li&gt;A Python/Flask service&lt;/li&gt;
&lt;li&gt;And a Rust/Axum service&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ve recently improved the demo to deepen my understanding and want to share my learning.&lt;/p&gt;
&lt;h2 id="h2-0-using-a-regular-database"&gt;Using a regular database&lt;/h2&gt;
&lt;p&gt;In the initial demo, I didn&amp;rsquo;t bother with a regular database. Instead:&lt;/p&gt;</description></item><item><title>Secure your API with these 16 Practices with Apache APISIX - part 1</title><link>https://foojayio.github.io/website/today/secure-your-api-with-these-16-practices-with-apache-apisix-part-1/</link><pubDate>Mon, 11 Mar 2024 09:35:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/secure-your-api-with-these-16-practices-with-apache-apisix-part-1/</guid><description>&lt;p&gt;A couple of months ago, I stumbled upon this list &lt;a href="https://www.linkedin.com/posts/brijpandeyji_secure-your-api-with-these-16-practices-activity-7094020647529369601-5kzQ/" target="_blank" rel="noopener noreferrer"&gt;16 practices to secure your API&lt;/a&gt;
:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Authentication 🕵️️ - Verifies the identity of users accessing APIs.&lt;/li&gt;
&lt;li&gt;Authorization 🚦 - Determines permissions of authenticated users.&lt;/li&gt;
&lt;li&gt;Data Redaction 🖍️ - Obscures sensitive data for protection.&lt;/li&gt;
&lt;li&gt;Encryption 🔒 - Encodes data so only authorized parties can decode it.&lt;/li&gt;
&lt;li&gt;Error Handling ❌ - Manages responses when things go wrong, avoiding revealing sensitive info.&lt;/li&gt;
&lt;li&gt;Input Validation &amp;amp; Data Sanitization 🧹 - Checks input data and removes harmful parts.&lt;/li&gt;
&lt;li&gt;Intrusion Detection Systems 👀 - Monitor networks for suspicious activities.&lt;/li&gt;
&lt;li&gt;IP Whitelisting 📝 - Permits API access only from trusted IP addresses.&lt;/li&gt;
&lt;li&gt;Logging and Monitoring 🖥️ - Keeps detailed logs and regularly monitors APIs.&lt;/li&gt;
&lt;li&gt;Rate Limiting ⏱️ - Limits user requests to prevent overload.&lt;/li&gt;
&lt;li&gt;Secure Dependencies 📦 - Ensures third-party code is free from vulnerabilities.&lt;/li&gt;
&lt;li&gt;Security Headers 📋 - Enhances site security against types of attacks like XSS.&lt;/li&gt;
&lt;li&gt;Token Expiry ⏳ - Regularly expiring and renewing tokens prevents unauthorized access.&lt;/li&gt;
&lt;li&gt;Use of Security Standards and Frameworks 📘 - Guides your API security strategy.&lt;/li&gt;
&lt;li&gt;Web Application Firewall 🔥 - Protects your site from HTTP-specific attacks.&lt;/li&gt;
&lt;li&gt;API Versioning 🔄 - Maintains different versions of your API for seamless updates.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;While it&amp;rsquo;s debatable whether some points relate to security, &lt;em&gt;e.g.,&lt;/em&gt;, versioning, the list is a good starting point anyway. In this two-post series, I&amp;rsquo;d like to describe how we can implement each point with Apache APISIX (or not).&lt;/p&gt;</description></item><item><title>Hardening Apache APISIX with the OWASP's Coraza and Core Ruleset</title><link>https://foojayio.github.io/website/today/hardening-apache-apisix-with-the-owasps-coraza-and-core-ruleset/</link><pubDate>Tue, 20 Feb 2024 08:01:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/hardening-apache-apisix-with-the-owasps-coraza-and-core-ruleset/</guid><description>&lt;blockquote&gt;
&lt;p&gt;The Open Worldwide Application Security Project is an online community that produces freely available articles, methodologies, documentation, tools, and technologies in the fields of IoT, system software and web application security. The OWASP provides free and open resources. It is led by a non-profit called The OWASP Foundation. The OWASP Top 10 - 2021 is the published result of recent research based on comprehensive data compiled from over 40 partner organizations.&lt;/p&gt;</description></item><item><title>Kicking the Tires of Docker Scout</title><link>https://foojayio.github.io/website/today/kicking-the-tires-of-docker-scout/</link><pubDate>Thu, 08 Feb 2024 08:47:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/kicking-the-tires-of-docker-scout/</guid><description>&lt;p&gt;I never moved away from Docker Desktop.&lt;/p&gt;
&lt;p&gt;For some time, after you use it to build an image, it prints a message:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic"&gt;What's Next?
 View a summary of image vulnerabilities and recommendations → docker scout quickview&lt;/pre&gt;
&lt;p&gt;I decided to give it a try. I&amp;rsquo;ll use the root commit of my &lt;a href="https://github.com/nfrankel/opentelemetry-tracing" target="_blank" rel="noopener noreferrer"&gt;OpenTelemetry tracing demo&lt;/a&gt;
. Let&amp;rsquo;s execute the proposed command:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="bash"&gt;docker scout quickview otel-catalog:1.0&lt;/pre&gt;
&lt;p&gt;Here&amp;rsquo;s the result:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic"&gt; ✓ Image stored for indexing
 ✓ Indexed 272 packages
 Target │ otel-catalog:1.0 │ 0C 2H 15M 23L
 digest │ 7adfce68062e │
 Base image │ eclipse-temurin:21-jre │ 0C 0H 15M 23L
 Refreshed base image │ eclipse-temurin:21-jre │ 0C 0H 15M 23L
 │ │
What's Next?
 View vulnerabilities → docker scout cves otel-catalog:1.0
 View base image update recommendations → docker scout recommendations otel-catalog:1.0
 Include policy results in your quickview by supplying an organization → docker scout quickview otel-catalog:1.0 --org &amp;lt;organization&amp;gt;&lt;/pre&gt;
&lt;p&gt;Docker gives out exciting bits of information:&lt;/p&gt;</description></item><item><title>Java Flight Recording and Analysis with Azul Mission Control</title><link>https://foojayio.github.io/website/today/java-flight-recording-and-analysis-with-azul-mission-control/</link><pubDate>Thu, 25 Jan 2024 07:59:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-flight-recording-and-analysis-with-azul-mission-control/</guid><description>&lt;p&gt;&lt;strong&gt;Java Flight Recording (JFR) is a Java Virtual Machine (JVM) profiling and diagnostics tool. It enables you to collect and analyze data regarding the performance and behavior of a Java application. As JFR is included in the JVM, there is no need for additional tools or installations to make recordings of your applications.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;By utilizing JFR, you gain valuable insights into the runtime behavior of your Java applications. It helps you to optimize performance, identify and troubleshoot issues, and ensure better overall reliability. JFR is designed with very low overhead, allowing its use in production environments with minimal impact on the performance of your application.&lt;/p&gt;</description></item><item><title>Unlocking Scrum: A Software Engineer's Journey - Part 1</title><link>https://foojayio.github.io/website/today/unlocking-scrum-a-software-engineers-journey-part-1/</link><pubDate>Thu, 04 Jan 2024 16:12:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/unlocking-scrum-a-software-engineers-journey-part-1/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/unlocking-scrum-a-software-engineers-journey-part-1/scrum-700x376.webp" alt="https://medium.com/@johnwilliams1756/embracing-scrum-while-ensuring-timely-delivery-of-software-features-20b82ee1abcd" loading="lazy"&gt;
&lt;/p&gt;
&lt;h3 id="h3-0-introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Hey there 🖐️, have you heard of Agile and Scrum?&lt;/p&gt;
&lt;p&gt;If not, buckle up because we&amp;rsquo;re about to embark on a journey to Scrumland!&lt;/p&gt;
&lt;p&gt;Scrum is a framework under the Agile umbrella that makes software development a breeze (or at least, less of a hurricane 🌪️).&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s all about collaboration, flexibility, and delivering value in small, tasty chunks. 🍫&lt;/p&gt;
&lt;h3 id="h3-1-understanding-scrum"&gt;Understanding Scrum&lt;/h3&gt;
&lt;p&gt;Scrum is like a game with its own rules and players. It&amp;rsquo;s anchored on principles like transparency, inspection, and adaptation. Imagine a GPS that reroutes you when you take a wrong turn &amp;ndash; that&amp;rsquo;s Scrum! 🗺️&lt;/p&gt;</description></item><item><title>Playing with WASM on Docker</title><link>https://foojayio.github.io/website/today/playing-with-wasm-on-docker/</link><pubDate>Wed, 03 Jan 2024 07:48:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/playing-with-wasm-on-docker/</guid><description>&lt;p&gt;The idea of bytecode that can run anywhere dates back to the JVM inception (as far as I know).&lt;/p&gt;
&lt;p&gt;WebAssembly is the new implementation of an old idea. While WebAssembly is meant to run in the browser, Docker recently announced its capability to run WASM code without needing containers.&lt;/p&gt;
&lt;p&gt;In this post, I want to explore how it can work.&lt;/p&gt;
&lt;h2 id="h2-0-prerequisite"&gt;Prerequisite&lt;/h2&gt;
&lt;p&gt;Running WebAssembly is a &lt;em&gt;beta&lt;/em&gt; feature and requires using &lt;code&gt;containerd&lt;/code&gt;. To enable &lt;code&gt;containerd&lt;/code&gt;, go to the Docker Desktop dashboard, then Settings &amp;gt; Features in development &amp;gt; Beta features &amp;gt; Use containerd for storing and pulling image.&lt;/p&gt;</description></item><item><title>Foojay Podcast #38: Java in the Cloud</title><link>https://foojayio.github.io/website/today/foojay-podcast-38/</link><pubDate>Mon, 25 Dec 2023 12:02:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-38/</guid><description>&lt;p&gt;Java was born in 1995, when the internet as we know it today didn&amp;rsquo;t exist yet.&lt;/p&gt;
&lt;p&gt;Cloud servers, Docker, Kubernetes, distributed systems, scaling up and down&amp;hellip; these things are now part of our daily job, but Java wasn&amp;rsquo;t originally designed for it.&lt;/p&gt;
&lt;p&gt;In this episode, we want to learn if the recent evolutions in OpenJDK, and ongoing related projects, will make Java a full Cloud member.&lt;/p&gt;
&lt;h2 id="h2-0-video"&gt;Video&lt;/h2&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/xU4rKnzkSpo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;h2 id="h2-1-podcast-apps"&gt;Podcast Apps&lt;/h2&gt;
&lt;p&gt;You can listen and subscribe to the Foojay Podcast on:&lt;/p&gt;</description></item><item><title>Five Apache Projects You Probably Haven't Heard Of (Yet)</title><link>https://foojayio.github.io/website/today/five-apache-projects-you-probably-havent-heard-of-yet/</link><pubDate>Sun, 24 Dec 2023 10:17:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/five-apache-projects-you-probably-havent-heard-of-yet/</guid><description>&lt;p&gt;&lt;strong&gt;In early 2021, I started to work on the &lt;a href="https://apisix.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache APISIX&lt;/a&gt;
 project. I have to admit that at the time I had never heard about it before.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As a result, in this article, I&amp;rsquo;d like to introduce some Apache projects that are less well-known than HTTPD or Kafka.&lt;/p&gt;
&lt;h2 id="h2-0-apache-apisix"&gt;Apache APISIX&lt;/h2&gt;
&lt;img fetchpriority="high" decoding="async" class="alignright wp-image-103491 size-full" src="apisix.png" alt="" width="256" height="256"&gt;
&lt;p&gt;&lt;a href="https://apisix.apache.org/" target="_blank" rel="noopener noreferrer"&gt;APISIX&lt;/a&gt;
 is an &lt;a href="https://en.wikipedia.org/wiki/API_management" target="_blank" rel="noopener noreferrer"&gt;API Gateway&lt;/a&gt;
. It builds upon &lt;a href="https://openresty.org/en/" target="_blank" rel="noopener noreferrer"&gt;OpenResty&lt;/a&gt;
, a Lua layer built on top of the famous &lt;a href="https://nginx.org/" target="_blank" rel="noopener noreferrer"&gt;nginx&lt;/a&gt;
 reverse-proxy. APISIX adds abstractions to the mix, &lt;em&gt;e.g.&lt;/em&gt; , &lt;code&gt;Route&lt;/code&gt;, &lt;code&gt;Service&lt;/code&gt;, &lt;code&gt;Upstream&lt;/code&gt;, and offers a plugin-based architecture.&lt;/p&gt;</description></item><item><title>Canary Releases with Apache APISIX</title><link>https://foojayio.github.io/website/today/canary-releases-with-apache-apisix/</link><pubDate>Tue, 19 Dec 2023 08:01:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/canary-releases-with-apache-apisix/</guid><description>&lt;p&gt;&lt;strong&gt;In a few words, the idea of canary releases is to deliver a new software version to only a fraction of the users, analyze the results, and decide whether to proceed further or not. If results are not aligned with expectations, roll back; if they are, increase the number of users exposed until all users benefit from the new version.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this article, I&amp;rsquo;d like to detail this introduction briefly, explain different ways to define the fraction, and show how to execute it with Apache APISIX.&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>Exploring the OpenTelemetry Collector</title><link>https://foojayio.github.io/website/today/exploring-the-opentelemetry-collector/</link><pubDate>Sun, 03 Dec 2023 12:57:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-the-opentelemetry-collector/</guid><description>&lt;p&gt;The OpenTelemetry Collector sits at the center of the OpenTelemetry architecture but is unrelated to the W3C Trace Context.&lt;/p&gt;
&lt;p&gt;In my &lt;a href="https://github.com/nfrankel/opentelemetry-tracing" target="_blank" rel="noopener noreferrer"&gt;tracing demo&lt;/a&gt;
, I use Jaeger instead of the Collector.&lt;/p&gt;
&lt;p&gt;Yet, it&amp;rsquo;s ubiquitous, as in every OpenTelemetry-related post. I wanted to explore it further.&lt;/p&gt;
&lt;p&gt;In this post, I explore the different aspects of the Collector:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The data kind: logs, metrics, and traces&lt;/li&gt;
&lt;li&gt;Push and pull models&lt;/li&gt;
&lt;li&gt;Operations: reads, transformations, and writes&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-0-first-steps"&gt;First steps&lt;/h2&gt;
&lt;p&gt;A long time ago, &lt;em&gt;observability&lt;/em&gt; as we know it didn&amp;rsquo;t exist; what we had instead was &lt;em&gt;monitoring&lt;/em&gt;. Back then, monitoring was a bunch of people looking at screens displaying dashboards. Dashboards themselves consisted of metrics and only system metrics: mainly CPU, memory, and disk usage. For this reason, we will start with metrics.&lt;/p&gt;</description></item><item><title>Generative AI and Java - hype or urgent reality?</title><link>https://foojayio.github.io/website/today/generative-ai-and-java-hype-or-urgent-reality/</link><pubDate>Mon, 06 Nov 2023 07:59:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/generative-ai-and-java-hype-or-urgent-reality/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/generative-ai-and-java-hype-or-urgent-reality/image1-700x272.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s hard to grasp that it&amp;rsquo;s been about a year since Chat GPT and other generative AI tools burst onto the scene. We&amp;rsquo;re all still grappling with, well, everything about them. Whatever equilibrium we eventually find, it&amp;rsquo;s clear that the world is changing. The whole world mind, not just the IT industry.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/olimpiupop" title="Olimpiu Pop" target="_blank" rel="noopener noreferrer"&gt;Olimpiu Pop&lt;/a&gt;
 and I have debated the situation multiple times, and we realised that there&amp;rsquo;s lots of rumour around AI and Java but not much in the way of fact.&lt;/p&gt;</description></item><item><title>Controlling JIT Compiler Overhead to Avoid CPU Autoscaling</title><link>https://foojayio.github.io/website/today/controlling-jit-compiler-overhead-to-avoid-cpu-autoscaling/</link><pubDate>Wed, 01 Nov 2023 07:54:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/controlling-jit-compiler-overhead-to-avoid-cpu-autoscaling/</guid><description>&lt;p&gt;&lt;strong&gt;Today&amp;rsquo;s modern, containerized, elastically scaling Java clusters often rely on CPU utilization as the main trigger for scaling out new instances. Imperfect as this metric may be, it is ubiquitous to scale out new instances based on CPU utilization going over some limit. Often that limit is surprisingly low, somewhere around 40 to 50%.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.azul.com/products/prime/" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;
 replaces OpenJDK&amp;rsquo;s HotSpot C2 compiler with the Falcon JIT compiler. &lt;a href="https://docs.azul.com/prime/Falcon-Compiler" target="_blank" rel="noopener noreferrer"&gt;Falcon&lt;/a&gt;
 generates much faster code than OpenJDK, allowing you to handle more transactions in a container before hitting your CPU utilization limit. And, Prime&amp;rsquo;s smoother and more consistent execution allows you to safely raise your CPU utilization to 60-70%, resulting in massive gains in carrying capacity for each container and lower overall cloud costs to handle your total Java workload.&lt;/p&gt;</description></item><item><title>Resizing images on-the-fly</title><link>https://foojayio.github.io/website/today/resizing-images-on-the-fly/</link><pubDate>Mon, 23 Oct 2023 18:01:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/resizing-images-on-the-fly/</guid><description>&lt;p&gt;As a web architect, one of the many issues is asset management. And the most significant issue in assets is images. A naive approach would be to set an image and let the browser resize the image via CSS:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="css"&gt;img {
 height: 100%;
 width: 100%;
 object-fit: contain;
}&lt;/pre&gt;
&lt;p&gt;However, it means that you download the original image. It entails two problems: the size of the original image and the suboptimal browser-based resizing.&lt;/p&gt;</description></item><item><title>Send Your Logs To Loki</title><link>https://foojayio.github.io/website/today/send-your-logs-to-loki/</link><pubDate>Thu, 12 Oct 2023 08:00:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/send-your-logs-to-loki/</guid><description>&lt;p&gt;&lt;strong&gt;One of my current talks focuses on Observability in general and Distributed Tracing in particular, with an &lt;a href="https://opentelemetry.io/" target="_blank" rel="noopener noreferrer"&gt;OpenTelemetry&lt;/a&gt;
 implementation. In the demo, I show how you can see the traces of a simple distributed system consisting of: the Apache APISIX API Gateway, a Kotlin app with Spring Boot, a Python app with Flask, and a Rust app with Axum.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Earlier this year, I spoke and attended the Observability room at FOSDEM. One of the talks demoed the Grafana stack: Mimir for metrics, Tempo for traces, and Loki for logs. I was pleasantly surprised how one could move from one to the other. Thus, I wanted to achieve the same in my demo but via OpenTelemetry to avoid coupling to the Grafana stack.&lt;/p&gt;</description></item><item><title>Down the Rabbit Hole of an Apache APISIX Plugin</title><link>https://foojayio.github.io/website/today/down-the-rabbit-hole-of-an-apache-apisix-plugin/</link><pubDate>Wed, 27 Sep 2023 08:43:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/down-the-rabbit-hole-of-an-apache-apisix-plugin/</guid><description>&lt;p&gt;&lt;strong&gt;My demo, Evolving your APIs, features a custom Apache APISIX plugin. I believe that the process of &lt;a href="https://apisix.apache.org/docs/apisix/plugin-develop/" target="_blank" rel="noopener noreferrer"&gt;creating a custom plugin&lt;/a&gt;
 is relatively well-documented. However, I wanted to check the parameters of the &lt;code&gt;_M.access(conf, ctx)&lt;/code&gt; function, especially the &lt;code&gt;ctx&lt;/code&gt; one.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The documentation states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;ctx&lt;/code&gt; parameter caches data information related to the request. You can use &lt;code&gt;core.log.warn(core.json.encode(ctx, true))&lt;/code&gt; to output it to &lt;code&gt;error.log&lt;/code&gt; for viewing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Unfortunately, &lt;code&gt;core.log&lt;/code&gt; ultimately depends on nginx&amp;rsquo;s logging, and its buffer is limited in size. Thanks to my colleague &lt;a href="https://twitter.com/shreemaan_abhi" target="_blank" rel="noopener noreferrer"&gt;Abhishek&lt;/a&gt;
 for finding &lt;a href="http://nginx.org/en/docs/dev/development_guide.html#logging" target="_blank" rel="noopener noreferrer"&gt;the info&lt;/a&gt;
. For this reason, the &lt;code&gt;ctx&lt;/code&gt; display is (heavily) truncated. I had to log data bit by bit; however, it was instructive.&lt;/p&gt;</description></item><item><title>System Architecture: Move Authentication to the API Gateway</title><link>https://foojayio.github.io/website/today/system-architecture-move-authentication-to-the-api-gateway/</link><pubDate>Fri, 15 Sep 2023 07:47:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/system-architecture-move-authentication-to-the-api-gateway/</guid><description>&lt;p&gt;&lt;strong&gt;When exposing an application to the outside world, consider a Reverse-Proxy or an API Gateway to protect it from attacks. Rate Limiting comes to mind first, but it shouldn&amp;rsquo;t stop there. We can factor many features in the API Gateway and should be bold in moving them from our apps. In this post, I&amp;rsquo;ll show how to implement authentication at the Gateway API stage.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-overall-authentication-flow"&gt;Overall authentication flow&lt;/h2&gt;
&lt;p&gt;The API Gateway doesn&amp;rsquo;t authenticate but delegates authentication to an authentication provider. After authentication, the Gateway forwards the request to the app. The app checks authentication and gets the associated identity and permissions.&lt;/p&gt;</description></item><item><title>The DiscoAPI Helps You To Find Any OpenJDK Distribution</title><link>https://foojayio.github.io/website/today/disco-api-helping-you-to-find-any-openjdk-distribution/</link><pubDate>Tue, 12 Sep 2023 03:42:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/disco-api-helping-you-to-find-any-openjdk-distribution/</guid><description>&lt;p&gt;&lt;strong&gt;Did you know Foojay is not only a human-readable OpenJDK knowledge base but also provides the Disco API that lets you search all OpenJDK distributions? And even if you didn&amp;rsquo;t know, you probably already are using it, as it&amp;rsquo;s integrated into &lt;a href="https://sdkman.io/" target="_blank" rel="noopener noreferrer"&gt;SDKMAN!&lt;/a&gt;
, &lt;a href="https://jreleaser.org/" target="_blank" rel="noopener noreferrer"&gt;JReleaser&lt;/a&gt;
, &lt;a href="https://www.jbang.dev/" target="_blank" rel="noopener noreferrer"&gt;JBang!&lt;/a&gt;
, &lt;a href="https://docs.gradle.org/current/userguide/toolchains.html" target="_blank" rel="noopener noreferrer"&gt;Gradle toolchain&lt;/a&gt;
, &lt;a href="https://paketo.io/docs/howto/java/" target="_blank" rel="noopener noreferrer"&gt;Paketo buildpacks&lt;/a&gt;
,and more.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Disco API (i.e., the short name for the Universal OpenJDK Discovery API) is a database and API with all the available OpenJDK versions from all distributors, like Corretto, Liberica, Oracle, Temurin, Zulu, and many others. In total, there are now 89352 different packages at the end of August 2023.&lt;/p&gt;</description></item><item><title>Ops friendly Apache APISIX</title><link>https://foojayio.github.io/website/today/ops-friendly-apache-apisix/</link><pubDate>Wed, 06 Sep 2023 06:27:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/ops-friendly-apache-apisix/</guid><description>&lt;p&gt;&lt;strong&gt;Though I always worked on the Dev side of IT, I was also interested in the Ops side. I even had a short experience being a WebSphere admin: I used it several times, helping Ops deal with the Admin console while being a developer.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Providing a single package that Ops can configure and deploy in different environments is very important. As a JVM developer, I&amp;rsquo;ve been happy using Spring Boot and its wealth of configuration options: command-line parameters, JVM parameters, files, profiles, environment variables, etc.&lt;/p&gt;</description></item><item><title>Evaluating Apache APISIX vs. Spring Cloud Gateway</title><link>https://foojayio.github.io/website/today/evaluating-apache-apisix-vs-spring-cloud-gateway/</link><pubDate>Thu, 27 Jul 2023 06:29:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/evaluating-apache-apisix-vs-spring-cloud-gateway/</guid><description>&lt;p&gt;&lt;strong&gt;Given the number of API Gateways available on the market, I&amp;rsquo;m regularly asked which is better. Better is a very subjective term. However, there&amp;rsquo;s no denying that if you&amp;rsquo;re advocating for a product, you should know your product and its competitors. In this article, I&amp;rsquo;d like to share my understanding of Spring Cloud Gateway and how it compares to Apache APISIX.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m cautious when comparing products because most comparisons I read are heavily biased. That&amp;rsquo;s a risk, especially when working on one of the products one is comparing. I&amp;rsquo;ll also avoid &amp;ldquo;benchmarketing&amp;rdquo; - when you benchmark products in a context that favors your own; I&amp;rsquo;ll focus on the so-called Developer Experience.&lt;/p&gt;</description></item><item><title>Sticky sessions with Apache APISIX - the demo</title><link>https://foojayio.github.io/website/today/sticky-sessions-with-apache-apisix-the-demo/</link><pubDate>Fri, 07 Jul 2023 16:54:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/sticky-sessions-with-apache-apisix-the-demo/</guid><description>&lt;p&gt;We&amp;rsquo;ve described the concept behind &lt;a href="https://foojayio.github.io/website/today/sticky-sessions-with-apache-apisix/"&gt;sticky sessions&lt;/a&gt;
: you forward a request to the same upstream because there&amp;rsquo;s context data associated with the session on that node.&lt;/p&gt;
&lt;p&gt;However, if necessary, you should replicate the data to other upstreams because this one might go down. In this post, we are going to illustrate it with a demo.&lt;/p&gt;
&lt;h2 id="h2-0-the-overall-design"&gt;The overall design&lt;/h2&gt;
&lt;p&gt;Design options are limitless. I&amp;rsquo;ll keep myself to a familiar stack, the JVM. Also, as mentioned in the previous post, one should only implement sticky sessions with session replication.&lt;/p&gt;</description></item><item><title>Sticky sessions with Apache APISIX</title><link>https://foojayio.github.io/website/today/sticky-sessions-with-apache-apisix/</link><pubDate>Fri, 07 Jul 2023 16:51:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/sticky-sessions-with-apache-apisix/</guid><description>&lt;p&gt;Sticky sessions, also known as session affinity, is a mechanism by which a routing component that acts as a facade always routes a request to the same underlying upstream node.&lt;/p&gt;
&lt;p&gt;In this article, I&amp;rsquo;ll describe the reason behind sticky sessions, available alternatives, and how to implement them via Apache APISIX.&lt;/p&gt;
&lt;h2 id="h2-0-why-sticky-sessions"&gt;Why sticky sessions?&lt;/h2&gt;
&lt;p&gt;Sticky sessions became popular when we stored the state on the upstream node, not the database. I&amp;rsquo;ll use the example of a simplified e-commerce shop to explain further.&lt;/p&gt;</description></item><item><title>Foojay Podcast #26: The Future of Source Control and CI/CD</title><link>https://foojayio.github.io/website/today/foojay-podcast-26/</link><pubDate>Mon, 26 Jun 2023 08:35:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-26/</guid><description>&lt;p&gt;As developers, we like to automate the boring parts of our job. This automation includes the source control system, build pipelines, and code analysis tools.&lt;/p&gt;
&lt;p&gt;In recent decades, we have seen evolutions from CVS to Subversion to Git. Is this the endpoint? Did we find the holy grail in version control? Or what evolutions are waiting for us?&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s find out together with these fantastic guests&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This is the final episode of season 2 of the Foojay Podcast. See you in September for the start of our new season with more JUGs, the launch of Java 21, and much more!&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>GitLab Pages Preview</title><link>https://foojayio.github.io/website/today/gitlab-pages-preview/</link><pubDate>Mon, 12 Jun 2023 08:55:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/gitlab-pages-preview/</guid><description>&lt;p&gt;When I write Apache APISIX-related blog posts, I want my colleagues to review them first. However, it&amp;rsquo;s my blog, and since I mix personal and business posts, I want to keep them from the repository. I need a preview, accessible only to a few, something like &lt;a href="https://vercel.com/docs/concepts/deployments/preview-deployments" target="_blank" rel="noopener noreferrer"&gt;Vercel&amp;rsquo;s preview&lt;/a&gt;
. I&amp;rsquo;m using GitLab Pages, and there&amp;rsquo;s no such out-of-the-box feature.&lt;/p&gt;
&lt;p&gt;I tried two methods: GitHub gists and PDFs. Both have issues.&lt;/p&gt;</description></item><item><title>Managing Data Residency: The Demo</title><link>https://foojayio.github.io/website/today/managing-data-residency-the-demo/</link><pubDate>Mon, 29 May 2023 07:33:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/managing-data-residency-the-demo/</guid><description>&lt;p&gt;I explained the concepts and theory behind Data Residency in a &lt;a href="https://foojayio.github.io/website/today/managing-data-residency-concepts-theory/"&gt;previous post&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s time to get our hands dirty and implement it in a simple demo.&lt;/p&gt;
&lt;h2 id="h2-0-the-sample-architecture"&gt;The sample architecture&lt;/h2&gt;
&lt;p&gt;In the last section of the previous post, I proposed a sample architecture where location-based routing happened at two different stages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The API Gateway checks for an existing &lt;code&gt;X-Country&lt;/code&gt; header. Depending on its value, it forwards the request to the computed upstream; If no value is found or no value matches, it forwards it to a default upstream.&lt;/li&gt;
&lt;li&gt;The application uses &lt;a href="https://shardingsphere.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache Shardingsphre&lt;/a&gt;
 to route again depending on the data. If the value computed by the API Gateway is correct, the flow stays &amp;ldquo;in its lane&amp;rdquo;; if not, it&amp;rsquo;s routed to the correct database, but with a performance penalty as it&amp;rsquo;s outside its lane.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I simplified some aspects:&lt;/p&gt;</description></item><item><title>Foojay Podcast #23: Java Profiling and Performance</title><link>https://foojayio.github.io/website/today/foojay-podcast-23/</link><pubDate>Mon, 22 May 2023 10:23:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-23/</guid><description>&lt;p&gt;How do you get the maximum performance out of your Java application?&lt;/p&gt;
&lt;p&gt;And how to use profiling to find the bottlenecks?&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s learn all about it in this podcast, with Heinz Kabutz, Marcus Lagergren, Chris Newland, and Frank Delporte!&lt;/p&gt;
&lt;p&gt;Java profiling is a crucial technique for measuring and improving the performance of applications.&lt;/p&gt;
&lt;p&gt;It helps identify bottlenecks, memory leaks, and other application performance issues.&lt;/p&gt;
&lt;p&gt;There are various challenges with using Java profiling, and the need for profiling depends on the complexity of the application and the performance requirements.&lt;/p&gt;</description></item><item><title>Fearless Distroless</title><link>https://foojayio.github.io/website/today/fearless-distroless/</link><pubDate>Fri, 21 Apr 2023 08:59:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/fearless-distroless/</guid><description>&lt;p&gt;With the rise of Docker came a new focus for engineers: optimizing the build to reach the smallest image size possible.&lt;/p&gt;
&lt;p&gt;A couple of options are available.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-stage builds.&lt;/strong&gt; A &lt;code&gt;Dockerfile&lt;/code&gt; can consist of multiple steps, each having a different Docker base image. Each step can copy files from any of the previous build steps. Only the last one will receive a tag; the others will be left untagged.This approach separates one or more build steps and a run step. On the JVM, it means that the first step includes compiling and packaging, based on a JDK, and the second step comprises running, based on a JRE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Choosing the smallest base image size.&lt;/strong&gt; The smaller the base image, the smaller the resulting image.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this post, I&amp;rsquo;m going to focus on the second point.&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>Analyzing &amp; Tuning Warm-up: Azul Zulu Prime Builds of OpenJDK</title><link>https://foojayio.github.io/website/today/analyzing-and-tuning-warm-up-of-the-jvm-with-azul-zulu-prime-builds-of-openjdk/</link><pubDate>Sat, 01 Apr 2023 16:35:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/analyzing-and-tuning-warm-up-of-the-jvm-with-azul-zulu-prime-builds-of-openjdk/</guid><description>&lt;p&gt;&lt;strong&gt;Warm-up is the time taken for the Java application to reach the optimum compiled code performance&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It is the task of the Just-in-Time (JIT) compiler to deliver optimal performance by producing optimized compiled code from application bytecode. This article will give you a basic understanding of how JIT compilation works and how to optimize warm-up using Azul Zulu Prime Builds of OpenJDK (Azul Zulu Prime JDK).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This post has been reviewed and extended on July 20th of 2023 thanks to the contributions of Matt Van Order.&lt;/p&gt;</description></item><item><title>How to create SBOMs in Java with Maven and Gradle</title><link>https://foojayio.github.io/website/today/how-to-create-sboms-in-java-with-maven-and-gradle/</link><pubDate>Fri, 17 Mar 2023 09:08:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-create-sboms-in-java-with-maven-and-gradle/</guid><description>&lt;p&gt;When building applications in Java, we highly depend on external libraries and frameworks. And each Java package that is imported likely also depends on more libraries. This means that the amount of Java packages included in your application is often not really transparent.&lt;/p&gt;
&lt;p&gt;As a developer, these nested (transitive) dependencies create the problem that you probably do not know all the libraries you are actually using.&lt;/p&gt;
&lt;p&gt;Recently, we discussed why and how we should maintain our dependencies carefully. In the article &lt;a href="https://snyk.io/blog/best-practices-for-managing-java-dependencies/" target="_blank" rel="noopener noreferrer"&gt;Best practices for managing Java dependencies&lt;/a&gt;
, I discussed the options and tools available for setting up a dependency management strategy.&lt;/p&gt;</description></item><item><title>DevOps for Developers - Introduction and Version Control</title><link>https://foojayio.github.io/website/today/devops-for-developers-introduction-version-control/</link><pubDate>Sun, 12 Mar 2023 09:13:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/devops-for-developers-introduction-version-control/</guid><description>&lt;p&gt;I start some of my talks with a joke: back in my day we didn&amp;rsquo;t have monitoring or observability. We&amp;rsquo;d go to the server and give it a kick. Hear the HD spin? It&amp;rsquo;s working!&lt;/p&gt;
&lt;p&gt;We didn&amp;rsquo;t have DevOps. If we were lucky we had some admins and a technician to solve hardware issues. That&amp;rsquo;s it.&lt;/p&gt;
&lt;p&gt;In a small company, we would do all of that ourselves. Today this is no longer practical. The complexity of deployment and scale is so big, it&amp;rsquo;s hard to imagine a growing company without an engineer dedicated to the operations.&lt;/p&gt;</description></item><item><title>Event Driven Hello World Program</title><link>https://foojayio.github.io/website/today/event-driven-hello-world-program/</link><pubDate>Thu, 02 Mar 2023 16:34:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/event-driven-hello-world-program/</guid><description>&lt;p&gt;&lt;strong&gt;Event-driven microservices&lt;/strong&gt; can be straightforward to describe before they are implemented, tested and maintained.&lt;/p&gt;
&lt;p&gt;They are also highly responsive to new information in real time, with latencies in Java of below 10 microseconds 99.99% of the time depending on the functionality of the small independently deployable microservice.&lt;/p&gt;
&lt;p&gt;In this introductory article, we use an example &lt;a href="https://chronicle.software/how-to-develop-event-driven-architectures/" title="event-driven" target="_blank" rel="noopener noreferrer"&gt;event-driven&lt;/a&gt;
&lt;a href="https://en.wikipedia.org/wiki/%22Hello,_World!%22_program" title=" Hello World" target="_blank" rel="noopener noreferrer"&gt;Hello World&lt;/a&gt;
 program (a programming paradigm where the program flow is determined by events) to step through &lt;a href="https://chronicle.software/how-bdd-works-well-with-eda/" title="behaviour-driven development" target="_blank" rel="noopener noreferrer"&gt;behaviour-driven development&lt;/a&gt;
, where we describe the behaviour the business needs first as test data, and writing a very simple &lt;a href="https://en.wikipedia.org/wiki/Microservices" title="microservice" target="_blank" rel="noopener noreferrer"&gt;microservice&lt;/a&gt;
 which turns input events like this:&lt;/p&gt;</description></item><item><title>SBOMs and Software Composition Analysis │ Foojay.io</title><link>https://foojayio.github.io/website/today/sboms-and-software-composition-analysis/</link><pubDate>Mon, 27 Feb 2023 08:11:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/sboms-and-software-composition-analysis/</guid><description>&lt;h4 id="this-article-is-the-second-in-a-series-about-sboms-software-supply-chains-the-government-and-you"&gt;This article is the second in a series about SBOMs, software supply chains, the government and you.&lt;/h4&gt;
&lt;h4 id="i-hope-you-are-still-hungry-after-the-first-article-as-more-cake-is-available-below"&gt;I hope you are still hungry after the first article as more cake is available below!&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/sboms-and-software-composition-analysis/cake-image.png" alt="Cake and Dependencies" title="Cake and Dependencies" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you have read the first article in this series that introduces SBOMs &lt;a href="https://foojayio.github.io/website/today/sboms-first-steps-in-a-new-journey-for-developers/" title="SBOMs: First Steps in a New Journey for Developers"&gt;SBOMs: First Steps in a New Journey for Developers | Foojay.io&lt;/a&gt;
 then you already know how important they are and will be increasingly going forward.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 9: Docker compose all the things</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-9-docker-compose-all-the-things/</link><pubDate>Sun, 26 Feb 2023 10:02:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-9-docker-compose-all-the-things/</guid><description>&lt;p&gt;Our microservices project contains quite a few pieces now.&lt;/p&gt;
&lt;p&gt;We have two databases, three API services, a user-view service for books, and a service to host our configuration.&lt;/p&gt;
&lt;p&gt;With so many pieces to manage, it would be nice to have something that orchestrates the individual services into a system, such as Docker Compose.&lt;/p&gt;
&lt;p&gt;Back in our &lt;a href="https://foojayio.github.io/website/today/journeys-in-java-level-5-building-an-empire-of-microservices/"&gt;Level 5&lt;/a&gt;
 rendition, we did exactly this for our smaller version of the project.&lt;/p&gt;
&lt;p&gt;Now that we have expanded our services, we need to add those new pieces into the existing Docker Compose management umbrella.&lt;/p&gt;</description></item><item><title>Update or Upgrade Java... and Which Version Should You Use?</title><link>https://foojayio.github.io/website/today/should-you-update-java-or-upgrade-and-which-version-should-you-use/</link><pubDate>Thu, 23 Feb 2023 09:12:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/should-you-update-java-or-upgrade-and-which-version-should-you-use/</guid><description>&lt;h2 id="h2-0-update-versus-upgrade-what-s-the-difference-and-what-are-the-consequences-of-your-decision"&gt;&lt;em&gt;Update versus Upgrade: what&amp;rsquo;s the difference and what are the consequences of your decision?&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Since 2018, every six months we get an upgrade to a new OpenJDK version, and this year versions 20 and 21 will be released.&lt;/p&gt;
&lt;p&gt;Next to these six-month releases, OpenJDK distributor Azul, amongst others, provides four critical patch updates (CPU) and patch set updates (PSU) per year.&lt;/p&gt;
&lt;p&gt;So what&amp;rsquo;s the difference between a Java upgrade and an update?&lt;/p&gt;</description></item><item><title>SBOMs: First Steps in a New Journey for Developers</title><link>https://foojayio.github.io/website/today/sboms-first-steps-in-a-new-journey-for-developers/</link><pubDate>Tue, 14 Feb 2023 10:01:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/sboms-first-steps-in-a-new-journey-for-developers/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;This article is the first in a series about SBOMs, software supply chains, the government and you. Buckle up - it&amp;rsquo;s going to be a wild ride. Luckily there is cake to see you through.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Software bill of materials, anyone? A year ago, most developers had not heard of the &amp;lsquo;SBOM&amp;rsquo; acronym.&lt;/p&gt;
&lt;p&gt;Indeed, related terms like &amp;ldquo;software supply chain&amp;rdquo; or &amp;ldquo;security hygiene&amp;rdquo; were absent from most developers&amp;rsquo; vocabularies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Things are about to change! This year is already shaping up to be the year of SBOMs, of securing the software supply chain, and of the appearance of legislation that enforces better security practices among those involved in software. Whether in creation, testing, deploying, securing or operating, we all have specific security responsibilities in protecting our part of the software supply chain.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Securing Admin Access to Apache APISIX</title><link>https://foojayio.github.io/website/today/securing-admin-access-to-apache-apisix/</link><pubDate>Sat, 11 Feb 2023 16:34:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/securing-admin-access-to-apache-apisix/</guid><description>&lt;p&gt;API Gateways are critical components in one&amp;rsquo;s infrastructure.&lt;/p&gt;
&lt;p&gt;If an attacker could change the configuration of routes, they could direct traffic to their infrastructure.&lt;/p&gt;
&lt;p&gt;Consequences could range from data theft to financial losses.&lt;/p&gt;
&lt;p&gt;Worse, data theft could only be noticed after a long time by mirroring the load.&lt;/p&gt;
&lt;p&gt;Hence, protecting your API Gateway is of utmost importance.&lt;/p&gt;
&lt;p&gt;In this short article, I&amp;rsquo;ll list a couple of ways to secure your Apache APISIX admin access.&lt;/p&gt;</description></item><item><title>How to Run a Java Application with CRaC in a Docker Container</title><link>https://foojayio.github.io/website/today/how-to-run-a-java-application-with-crac-in-a-docker-container/</link><pubDate>Wed, 01 Feb 2023 09:41:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-run-a-java-application-with-crac-in-a-docker-container/</guid><description>&lt;p&gt;CRaC (Coordinated Restore at Checkpoint) is &lt;a href="https://openjdk.org/projects/crac/" target="_blank" rel="noopener noreferrer"&gt;an OpenJDK project&lt;/a&gt;
 that was &lt;a href="https://www.azul.com/blog/aws-snapstart-builds-momentum-for-the-crac-api/" target="_blank" rel="noopener noreferrer"&gt;developed by Azul&lt;/a&gt;
 to solve the problem of &amp;ldquo;slow&amp;rdquo; startup times of the Java Virtual Machine in a microservice environment.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The most up-to-date guidelines can be found on &amp;ldquo;&lt;a href="https://docs.azul.com/core/crac/crac-guidelines.html#running-crac-in-a-virtualized-environment-docker" target="_blank" rel="noopener noreferrer"&gt;Coordinated Restore at Checkpoint Usage Guidelines&lt;/a&gt;
&amp;rdquo; in the Azul Docs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When the JVM runs your application code, it does things like interpreting, compiling and optimizing code to make your application run as fast as possible under the given workload. This is great but can take some time and especially when you run short lived microservices you don&amp;rsquo;t want to wait until the JVM has produced the most optimized code.&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>Azul Provides the CRaC in AWS SnapStart Builds</title><link>https://foojayio.github.io/website/today/azul-provides-the-crac-in-aws-snapstart-builds/</link><pubDate>Tue, 20 Dec 2022 07:45:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/azul-provides-the-crac-in-aws-snapstart-builds/</guid><description>&lt;p&gt;At Azul, we are very excited about the Amazon Web Services launch of &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/snapstart-runtime-hooks.html" target="_blank" rel="noopener noreferrer"&gt;SnapStart for Lambdas&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;SnapStart is based on the CRaC (Coordinated Restore at Checkpoint) API developed in OpenJDK, which was originated and led by Azul.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is the CRaC API?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://openjdk.org/projects/crac/" target="_blank" rel="noopener noreferrer"&gt;CRaC API&lt;/a&gt;
 provides a common way for Java applications to coordinate with underlying checkpoint/restore mechanisms, allowing Java code to work seamlessly and portably across various checkpoint/restore mechanisms as they become available.&lt;/p&gt;</description></item><item><title>Compilation Avoidance with Gradle</title><link>https://foojayio.github.io/website/today/compilation-avoidance-with-gradle/</link><pubDate>Tue, 13 Dec 2022 15:35:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/compilation-avoidance-with-gradle/</guid><description>&lt;p&gt;We at Gradle recently noticed some community chatter about speeding up Gradle compilation on the JVM by ignoring changes not affecting the application binary interface (ABIs) of dependencies.&lt;/p&gt;
&lt;p&gt;What a great idea! In fact, Gradle has used ABIs for Java out of the box for this without any extra configuration &lt;a href="https://blog.gradle.org/incremental-compiler-avoidance" target="_blank" rel="noopener noreferrer"&gt;since version 3.4&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;We refer to this feature as &lt;strong&gt;&lt;a href="https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_compile_avoidance" target="_blank" rel="noopener noreferrer"&gt;compilation avoidance&lt;/a&gt;
&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This post explains what ABI-based compilation means for the average workflow. Spoiler: utilizing compilation avoidance is one of the best performance enhancements for any build.&lt;/p&gt;</description></item><item><title>A Poor Man's API</title><link>https://foojayio.github.io/website/today/poor-mans-api/</link><pubDate>Tue, 29 Nov 2022 09:13:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/poor-mans-api/</guid><description>&lt;p&gt;Creating a full-fledged API requires resources, both time and money.&lt;/p&gt;
&lt;p&gt;You need to think about the model, the design, the REST principles, etc., without writing a single line of code.&lt;/p&gt;
&lt;p&gt;Most of the time, you don&amp;rsquo;t know whether it&amp;rsquo;s worth it: you&amp;rsquo;d like to offer a Minimum Viable Product and iterate from there.&lt;/p&gt;
&lt;p&gt;I want to show how you can achieve it without writing a single line of code.&lt;/p&gt;
&lt;h2 id="h2-0-the-solution"&gt;The solution&lt;/h2&gt;
&lt;p&gt;The main requirement of the solution is to use the &lt;a href="https://www.postgresql.org/" target="_blank" rel="noopener noreferrer"&gt;PostgreSQL database&lt;/a&gt;
. It&amp;rsquo;s a well-established Open Source SQL database.&lt;/p&gt;</description></item><item><title>Foojay Podcast #7: Security in Java -- what do we need to know?</title><link>https://foojayio.github.io/website/today/foojay-podcast-7/</link><pubDate>Mon, 21 Nov 2022 10:22:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-7/</guid><description>&lt;p&gt;For this Foojay Podcast**,** we invited security experts to dive into the fascinating world of secure coding and detecting vulnerabilities in your Java applications.&lt;/p&gt;
&lt;p&gt;How can you make and keep your systems safe?&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s what we want to find out&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/ATXMizsu1Rc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;h2 id="h2-1--odcast-pps"&gt;Podcast Apps&lt;/h2&gt;
&lt;p&gt;You can listen and subscribe to the Foojay Podcast on:&lt;/p&gt;</description></item><item><title>Reducing Tail Latencies with Chronicle Queue Enterprise</title><link>https://foojayio.github.io/website/today/reducing-tail-latencies-with-chronicle-queue-enterprise/</link><pubDate>Wed, 09 Nov 2022 15:07:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/reducing-tail-latencies-with-chronicle-queue-enterprise/</guid><description>&lt;p&gt;Persistent queue solutions are frequently used when designing low-latency applications.&lt;/p&gt;
&lt;p&gt;The problem is that high sustained message rates, or bursty workloads, can lead to delays caused by the OS or hardware which are challenging to mitigate.&lt;/p&gt;
&lt;p&gt;In this article, we will describe how &lt;a href="https://chronicle.software/queue-enterprise/" title="Chronicle Queue Enterprise" target="_blank" rel="noopener noreferrer"&gt;Chronicle Queue Enterprise&lt;/a&gt;
 solves this.&lt;/p&gt;
&lt;h3 id="h3-0-background"&gt;Background&lt;/h3&gt;
&lt;p&gt;When benchmarking Java low-latency persistent queue solutions, latencies tend to be excellent up to high percentiles until sustained throughput limits are reached; these sustained throughput limits are determined by disk performance, OS version, and configuration.&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>Creating Terabyte Sized Queues with Low-Latency</title><link>https://foojayio.github.io/website/today/creating-terabyte-sized-queues-with-low-latency/</link><pubDate>Wed, 02 Nov 2022 10:45:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-terabyte-sized-queues-with-low-latency/</guid><description>&lt;p&gt;Queues are often fundamental components in software design patterns.&lt;/p&gt;
&lt;p&gt;But, what if there are millions of messages received every second and multi-process consumers need to be able to read the complete ledger of all messages?&lt;/p&gt;
&lt;p&gt;Java can only hold so much information before the heap becomes a limiting factor with high-impacting garbage collections as a result, potentially preventing us from fulfilling targeted SLAs or even halting the JVM for seconds or even minutes.&lt;/p&gt;</description></item><item><title>Discuss the Problem, Not the Solution!</title><link>https://foojayio.github.io/website/today/discuss-problem-not-solution/</link><pubDate>Tue, 01 Nov 2022 10:56:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/discuss-problem-not-solution/</guid><description>&lt;p&gt;As a tech guy, I love to discuss technologies. And as discussions go, it&amp;rsquo;s generally the comparison kind: JVM vs. Net, Java vs. Kotlin, Go vs. Rust, Maven vs. the unspeakable one, etc.&lt;/p&gt;
&lt;p&gt;However, it&amp;rsquo;s too easy to fall into the quagmire of the merits and flaws of our beloved toys, talk about them for hours, and not reach a satisfactory agreement.&lt;/p&gt;
&lt;p&gt;A couple of years ago, I worked as a &amp;ldquo;Solution Architect&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Renovate: Dependabot Alternative</title><link>https://foojayio.github.io/website/today/renovate-alternative-dependabot/</link><pubDate>Fri, 28 Oct 2022 07:17:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/renovate-alternative-dependabot/</guid><description>&lt;p&gt;I won&amp;rsquo;t introduce &lt;a href="https://github.com/dependabot" target="_blank" rel="noopener noreferrer"&gt;Dependabot&lt;/a&gt;
. Lots and lots of developers use it daily on GitHub. I do use it as well. However, it suffers from two drawbacks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;While it&amp;rsquo;s perfectly integrated with GitHub, integrations with other platforms are less seamless.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s limited in the list of &lt;a href="https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#package-ecosystem" target="_blank" rel="noopener noreferrer"&gt;ecosystems&lt;/a&gt;
 it supports For example, I generally use Docker Compose files for my demos. When necessary, I use Kubernetes. Dependabot supports none.Worse, Dependabot &lt;a href="https://github.com/dependabot/dependabot-core/blob/main/CONTRIBUTING.md#contributing-new-ecosystems" target="_blank" rel="noopener noreferrer"&gt;doesn&amp;rsquo;t accept contributions to add new ecosystems&lt;/a&gt;
.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Recently, I watched Viktor Farcic&amp;rsquo;s &lt;a href="https://www.youtube.com/watch?v=l0YH557eIiE" target="_blank" rel="noopener noreferrer"&gt;Automate Dependency Management With Renovate&lt;/a&gt;
. I found &lt;a href="https://www.mend.io/free-developer-tools/renovate/" target="_blank" rel="noopener noreferrer"&gt;Renovate&lt;/a&gt;
 super neat, thought about using it, and&amp;hellip; forgot. Then I stumbled upon another mention of it. It pushed me to implement it in two locations:&lt;/p&gt;</description></item><item><title>Why the Fastest Way of Serializing a Java Field is not Serializing it at All</title><link>https://foojayio.github.io/website/today/why-the-fastest-way-of-serializing-a-java-field-is-not-serializing-it-at-all/</link><pubDate>Tue, 25 Oct 2022 12:54:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-the-fastest-way-of-serializing-a-java-field-is-not-serializing-it-at-all/</guid><description>&lt;p&gt;This article elaborates on different ways of serializing Java objects and benchmarks performance for the variants. Read this article and become aware of different ways to improve Java serialization performance.&lt;/p&gt;
&lt;p&gt;In a previous article about &lt;a href="https://chronicle.software/queue/" title="open-source Chronicle Queue" target="_blank" rel="noopener noreferrer"&gt;open-source Chronicle Queue&lt;/a&gt;
, there was some benchmarking and method profiling indicating that the speed of serialization had a significant impact on execution performance. After all, this is only to be expected as Chronicle Queue (and other persisted queue libraries) must convert Java objects located on the heap to binary data, which is subsequently stored in files. Even for the most internally efficient libraries, this inevitable serialization procedure will largely dictate performance.&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>Low Latency Microservices, A Retrospective</title><link>https://foojayio.github.io/website/today/low-latency-microservices-a-retrospective/</link><pubDate>Thu, 06 Oct 2022 06:25:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/low-latency-microservices-a-retrospective/</guid><description>&lt;p&gt;I wrote an article on &lt;a href="https://vanilla-java.github.io/2016/03/22/Micro-services-for-performance.html" title="low latency microservices" target="_blank" rel="noopener noreferrer"&gt;low latency microservices&lt;/a&gt;
 almost five years ago now. Chronicle Software has worked with a number of tier one investment banks to implement and support those systems. What has changed in that time and what lessons have we learnt?&lt;/p&gt;
&lt;p&gt;Read this article and learn what we learned after five years of developing and supporting low latency microservices.&lt;/p&gt;
&lt;h3 id="h3-0-separation-of-concerns-gives-better-testability"&gt;Separation of Concerns Gives Better Testability&lt;/h3&gt;
&lt;p&gt;Microservices repeatedly demonstrated that testing and debugging business components were much easier with simple, stand-alone components with clear contracts between microservices.&lt;/p&gt;</description></item><item><title>The Maze of Python Dependency Management</title><link>https://foojayio.github.io/website/today/the-maze-of-python-dependency-management/</link><pubDate>Mon, 03 Oct 2022 12:49:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-maze-of-python-dependency-management/</guid><description>&lt;p&gt;For over 20 years, I&amp;rsquo;ve developed code for the JVM, first in Java, then in Kotlin.&lt;/p&gt;
&lt;p&gt;However, the JVM is not a silver bullet, &lt;em&gt;e.g.&lt;/em&gt;, in scripts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Virtual machines incur additional memory requirements.&lt;/li&gt;
&lt;li&gt;In many cases, the script doesn&amp;rsquo;t run long enough to gain any benefit performance-wise. The bytecode is interpreted and never compiles to native code.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For these reasons, I now write my scripts in Python. One of them collects social media metrics from different sources and stores them in BigQuery for analytics.&lt;/p&gt;</description></item><item><title>Starting Docker Desktop with Spring Boot</title><link>https://foojayio.github.io/website/today/starting-docker-desktop-with-spring-boot/</link><pubDate>Fri, 30 Sep 2022 05:37:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/starting-docker-desktop-with-spring-boot/</guid><description>&lt;br /&gt;
&lt;p&gt;I came across Docker Desktop for the first time about three years ago, when I was working as a Principal Architect (Strategic R &amp;amp; D) on the Microservices Reference Architecture for a product development organization.&lt;/p&gt;
&lt;p&gt;At that time, when I was working on my corporate laptop - It became a tedious task to configure virtualization and settings to get it to work. Once I got it running smoothly, I realized that the memory requirements required to run it is quite high. At times, I found it tough to use my laptop for daily development with it running. It was also because I was working on microservices and had almost 6+ spring boot applications running.&lt;/p&gt;</description></item><item><title>Reclaiming Persistent Volumes in Kubernetes</title><link>https://foojayio.github.io/website/today/reclaiming-persistent-volumes-in-kubernetes/</link><pubDate>Wed, 28 Sep 2022 09:55:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/reclaiming-persistent-volumes-in-kubernetes/</guid><description>&lt;p&gt;&lt;a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;
 is a widely used open-source container management platform for running stateless, containerized applications at scale. In recent years, Kubernetes has been extended to also support stateful workloads, including databases and key-value stores.{#43de}&lt;/p&gt;
&lt;p&gt;There are three important API resources when it comes to managing stateful applications in Kubernetes:{#8e8a}&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/" target="_blank" rel="noopener noreferrer"&gt;StatefulSet&lt;/a&gt;
 (STS)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/" target="_blank" rel="noopener noreferrer"&gt;PersistentVolume&lt;/a&gt;
 (PV)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/storage/storage-classes/" target="_blank" rel="noopener noreferrer"&gt;PersistentVolumeClaim&lt;/a&gt;
 (PVC)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;STSs schedule stateful pods, which can claim PVs through PVCs and mount them as volumes. Once a PV is claimed by an STS replica, Kubernetes will make sure that the volume stays with the replica, even if the pod gets rescheduled.{#e855}&lt;/p&gt;</description></item><item><title>Storing 1TB in Virtual Memory on a 128GB Machine</title><link>https://foojayio.github.io/website/today/chronicle-queue-storing-1tb-in-virtual-memory-on-a-128gb-machine/</link><pubDate>Tue, 27 Sep 2022 09:10:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/chronicle-queue-storing-1tb-in-virtual-memory-on-a-128gb-machine/</guid><description>&lt;p&gt;If you use a standard JVM like the Oracle JVM or the OpenJDK, you might find that as the heap size grows the performance of your JVM can drop as GC pause time escalates.&lt;/p&gt;
&lt;p&gt;This tends to be a problem around 32 GB of heap, but it often depends on the application at which point the size of your heap becomes a problem.&lt;/p&gt;
&lt;p&gt;One way around this is to use an always concurrent collector such as &lt;a href="https://www.azul.com/products/prime/" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;
 which is designed to both scale to much larger heap sizes and even reduces the GC pause times for smaller heap consistently.&lt;/p&gt;</description></item><item><title>Apache APISIX Loves Rust! (And Me Too)</title><link>https://foojayio.github.io/website/today/apache-apisix-loves-rust/</link><pubDate>Mon, 26 Sep 2022 09:23:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/apache-apisix-loves-rust/</guid><description>&lt;p&gt;Apache APISIX is built upon the shoulders of two giants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nginx.com/" target="_blank" rel="noopener noreferrer"&gt;NGINX&lt;/a&gt;
, a widespread Open Source reverse-proxy&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openresty.org/en/" target="_blank" rel="noopener noreferrer"&gt;OpenResty&lt;/a&gt;
, a platform that allows scripting NGINX with the &lt;a href="https://www.lua.org/" target="_blank" rel="noopener noreferrer"&gt;Lua&lt;/a&gt;
 programming language via &lt;a href="https://luajit.org/" target="_blank" rel="noopener noreferrer"&gt;LuaJIT&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This approach allows APISIX to provide out-of-the-box Lua plugins that should fit most business requirements. But it always comes a time when generic plugins don&amp;rsquo;t fit your requirements. In this case, you can write your own Lua plugin.&lt;/p&gt;</description></item><item><title>A Better Way To Use Gradle With Github Actions</title><link>https://foojayio.github.io/website/today/a-better-way-to-use-gradle-with-github-actions/</link><pubDate>Wed, 21 Sep 2022 12:54:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-better-way-to-use-gradle-with-github-actions/</guid><description>&lt;h2 id="h2-0-running-gradle-builds-on-github-actions"&gt;Running Gradle builds on GitHub Actions&lt;/h2&gt;
&lt;p&gt;GitHub Actions provides a convenient and powerful CI platform for projects hosted on GitHub. To enhance the experience of building Gradle projects on GitHub Actions, the Gradle team has developed the &lt;code&gt;gradle-build-action&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Together with Gradle Build Scans™, the &lt;code&gt;gradle-build-action&lt;/code&gt; provides deep integration between Gradle and GitHub Actions, providing easier setup and a better experience when building and testing your Gradle project with GitHub Actions.&lt;/p&gt;</description></item><item><title>Introduction to Kubernetes Extensibility</title><link>https://foojayio.github.io/website/today/introduction-to-kubernetes-extensibility/</link><pubDate>Tue, 20 Sep 2022 09:44:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/introduction-to-kubernetes-extensibility/</guid><description>&lt;p&gt;Kubernetes offers a lot of benefits: an enormous ecosystem with plenty of actors, self-healing capabilities, etc. There&amp;rsquo;s no free lunch, though. It also comes with downsides, chief among them its complexity and operating costs.&lt;/p&gt;
&lt;p&gt;However, the more I work with Kubernetes, the more I think its most significant asset is &lt;strong&gt;extensibility&lt;/strong&gt;. If you need something that the platform doesn&amp;rsquo;t provide by default, there&amp;rsquo;s an option to develop it yourself and integrate it. In this post, I&amp;rsquo;d like to list such extension points.&lt;/p&gt;</description></item><item><title>Let's Create Mappers Without Creating Underlying Objects in Java</title><link>https://foojayio.github.io/website/today/did-you-know-you-can-create-mappers-without-creating-underlying-objects-in-java/</link><pubDate>Tue, 20 Sep 2022 09:16:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/did-you-know-you-can-create-mappers-without-creating-underlying-objects-in-java/</guid><description>&lt;p&gt;As most Java developers know, putting values in a Java Map (like a HashMap) involves creating a large number of auxiliary objects under the covers.&lt;/p&gt;
&lt;p&gt;For example, a HashMap with int keys and long values might, for each entry, create a wrapped Integer, a wrapped Long object and a Node that holds the former values together with a hash value and a link to other potential Node objects sharing the same hash bucket.&lt;/p&gt;</description></item><item><title>How the world caught up with Apache Cassandra</title><link>https://foojayio.github.io/website/today/how-the-world-caught-up-with-apache-cassandra/</link><pubDate>Thu, 15 Sep 2022 16:50:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-the-world-caught-up-with-apache-cassandra/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/how-the-world-caught-up-with-apache-cassandra/hero-techcrunch.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;The O&amp;rsquo;Reilly book, &lt;em&gt;Cassandra: The Definitive Guide,&lt;/em&gt; features a quote from Ray Kurzweil, the noted inventor and futurist: {#speakable-summary}&lt;/p&gt;
&lt;p&gt;&amp;ldquo;An invention has to make sense in the world in which it is finished, not the world in which it is started.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This quote has a prophetic ring to it, especially considering my co-author Eben Hewitt included it in the 2010 first edition of this book we wrote, back when Apache Cassandra, the open-source, distributed, and highly scalable NoSQL database, was just on its 0.7 release.&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>A Quick Glance at the Kubernetes Gateway API</title><link>https://foojayio.github.io/website/today/kubernetes-gateway-api/</link><pubDate>Mon, 12 Sep 2022 09:55:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/kubernetes-gateway-api/</guid><description>&lt;p&gt;In &lt;a href="https://blog.frankel.ch/basics-access-kubernetes-pods/" target="_blank" rel="noopener noreferrer"&gt;one of my recent blog posts&lt;/a&gt;
, I described several ways to access Kubernetes pods. One can access a pod through its IP, but pods are naturally transient. The nominal way is to configure a &lt;code&gt;Service&lt;/code&gt;: its IP is stable, and Kubernetes&amp;rsquo; job is to keep the mapping between a &lt;code&gt;Service&lt;/code&gt; and its underlying pods up-to-date.&lt;/p&gt;
&lt;p&gt;Different kinds of services are available: internal only, &lt;code&gt;NodePort&lt;/code&gt; to finally allow access from outside the cluster, and &lt;code&gt;LoadBalancer&lt;/code&gt; that relies on a third-party component - in general, a cloud provider one.&lt;/p&gt;</description></item><item><title>Multi-cluster Cassandra with Google Kubernetes Engine (Pt. 2)</title><link>https://foojayio.github.io/website/today/multi-cluster-cassandra-deployment-with-google-kubernetes-engine-pt-2/</link><pubDate>Thu, 08 Sep 2022 17:20:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/multi-cluster-cassandra-deployment-with-google-kubernetes-engine-pt-2/</guid><description>&lt;p&gt;This is the second in a series of posts examining patterns for using K8ssandra to create Cassandra clusters with different deployment topologies.&lt;/p&gt;
&lt;p&gt;In the &lt;a href="https://k8ssandra.io/blog/tutorials/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes/" target="_blank" rel="noopener noreferrer"&gt;first article&lt;/a&gt;
 in this series, we looked at how you could create a Cassandra cluster with two datacenters in a single cloud region, using separate Kubernetes namespaces in order to isolate workloads. For example, you might want to create a secondary Cassandra datacenter to isolate a read-heavy analytics workload from the datacenter supporting your main application.&lt;/p&gt;</description></item><item><title>Running your Database on OpenShift and CodeReady Containers</title><link>https://foojayio.github.io/website/today/running-your-database-on-openshift-and-codeready-containers/</link><pubDate>Tue, 06 Sep 2022 09:43:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/running-your-database-on-openshift-and-codeready-containers/</guid><description>&lt;p&gt;Let&amp;rsquo;s take an introductory run-through of setting up your database on OpenShift, using your own hardware and RedHat&amp;rsquo;s CodeReady Containers.&lt;/p&gt;
&lt;p&gt;CodeReady Containers is a great way to run OpenShift K8s locally, ideal for development and testing. The steps in this blog post will require a machine, laptop or desktop, of decent capability; preferably quad CPUs and 16GB+ RAM.&lt;/p&gt;
&lt;h2 id="h2-0-download-and-install-redhat-s-codeready-containers"&gt;Download and Install RedHat&amp;rsquo;s CodeReady Containers&lt;/h2&gt;
&lt;p&gt;Download and install RedHat&amp;rsquo;s CodeReady Containers as described in &lt;a href="https://developers.redhat.com/blog/2019/09/05/red-hat-openshift-4-on-your-laptop-introducing-red-hat-codeready-containers" target="_blank" rel="noopener noreferrer"&gt;Red Hat OpenShift 4 on your laptop: Introducing Red Hat CodeReady Containers&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>Learning by Auditing Kubernetes Manifests</title><link>https://foojayio.github.io/website/today/learning-by-auditing-kubernetes-manifests/</link><pubDate>Mon, 05 Sep 2022 08:44:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/learning-by-auditing-kubernetes-manifests/</guid><description>&lt;p&gt;Last year, I spoke at the &lt;a href="https://www.devopsonline.co.uk/national-devops-conference/" target="_blank" rel="noopener noreferrer"&gt;National DevOps Conference&lt;/a&gt;
 that took place at the British Museum. I had already visited the museum before, but speaking there was a fantastic experience. Besides, we had the museum all for ourselves for a couple of hours. If you&amp;rsquo;ve ever visited the place, you know what I mean.&lt;/p&gt;
&lt;p&gt;Anyway, I also attended a talk about &lt;a href="https://www.checkov.io/" target="_blank" rel="noopener noreferrer"&gt;Checkov&lt;/a&gt;
:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Checkov scans cloud infrastructure configurations to find misconfigurations before they&amp;rsquo;re deployed.&lt;/p&gt;</description></item><item><title>End-to-End Tracing with OpenTelemetry</title><link>https://foojayio.github.io/website/today/end-to-end-tracing-opentelemetry/</link><pubDate>Mon, 29 Aug 2022 14:24:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/end-to-end-tracing-opentelemetry/</guid><description>&lt;p&gt;Whether you implement microservices or not (and you probably shouldn&amp;rsquo;t), your system is most probably composed of multiple components.&lt;/p&gt;
&lt;p&gt;The most straightforward system is probably made of a reverse proxy, an app, and a database.&lt;/p&gt;
&lt;p&gt;In this case, monitoring is not only a good idea; it&amp;rsquo;s a requirement.&lt;/p&gt;
&lt;p&gt;The higher the number of components through which a request may flow, the strongest the requirement.&lt;/p&gt;
&lt;p&gt;However, monitoring is only the beginning of the journey.&lt;/p&gt;</description></item><item><title>Back to Basics: Accessing Kubernetes Pods</title><link>https://foojayio.github.io/website/today/back-to-basics-accessing-kubernetes-pods/</link><pubDate>Mon, 22 Aug 2022 13:56:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/back-to-basics-accessing-kubernetes-pods/</guid><description>&lt;p&gt;Kubernetes is a colossal beast. You need to understand many different concepts before it starts being useful.&lt;/p&gt;
&lt;p&gt;When everything is set up, you&amp;rsquo;ll probably want to expose some pods to the outside of the cluster.&lt;/p&gt;
&lt;p&gt;Kubernetes provides different ways to do it: I&amp;rsquo;ll describe them in this post.&lt;/p&gt;
&lt;h2 id="h2-0-setup"&gt;Setup&lt;/h2&gt;
&lt;p&gt;For the sake of the demo, I&amp;rsquo;ll be using &lt;a href="https://kind.sigs.k8s.io/" target="_blank" rel="noopener noreferrer"&gt;Kind&lt;/a&gt;
:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;kind is a tool for running local Kubernetes clusters using Docker container &amp;ldquo;nodes&amp;rdquo;. kind was primarily designed for testing Kubernetes itself, but may be used for local development or CI.&lt;/p&gt;</description></item><item><title>Bridge the DevOps/Dev Gap without Sacrificing Reliability</title><link>https://foojayio.github.io/website/today/effectively-bridging-the-devops-rd-gap-without-sacrificing-reliability/</link><pubDate>Fri, 19 Aug 2022 09:16:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/effectively-bridging-the-devops-rd-gap-without-sacrificing-reliability/</guid><description>&lt;p&gt;DevOps culture revolutionized our industry. Continuous Delivery and Continuous Integration made six sigma reliability commonplace. 20 years ago we would kick the production servers and listen to the hard drive spin, that was observability. Today&amp;rsquo;s DevOps teams deploy monitoring tools that provide development teams with deep insight into the production environment.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;O brave new world That has such people in&amp;rsquo;t!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;mdash; William Shakespeare&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Before DevOps practices were commonplace, production used to fail. A lot. We don&amp;rsquo;t want to go back to the time before DevOps tools were commonplace&amp;hellip;&lt;/p&gt;</description></item><item><title>Secure CI/CD Pipelines with GitHub Actions for Your Java Apps</title><link>https://foojayio.github.io/website/today/building-secure-ci-cd-pipelines-with-github-actions-for-your-java-application/</link><pubDate>Thu, 11 Aug 2022 06:28:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-secure-ci-cd-pipelines-with-github-actions-for-your-java-application/</guid><description>&lt;p&gt;This article was originally post at&lt;a href="https://snyk.io/blog/building-a-secure-pipeline-with-github-actions/" target="_blank" rel="noopener noreferrer"&gt;Snyk.io&lt;/a&gt;
 and is used with permission&lt;/p&gt;
&lt;p&gt;GitHub Actions has made it easier than ever to build a secure continuous integration and continuous delivery (CI/CD) pipeline for your GitHub projects.&lt;/p&gt;
&lt;p&gt;By integrating your CI/CD pipeline and GitHub repository, GitHub Actions allows you to automate your build, test, and deployment pipeline.&lt;/p&gt;
&lt;p&gt;You can create workflows that build and test every pull request to your repository or deploy merged pull requests to production.&lt;/p&gt;</description></item><item><title>Deploy a Multi-Datacenter Cassandra Cluster in Kubernetes</title><link>https://foojayio.github.io/website/today/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes-pt-1/</link><pubDate>Wed, 10 Aug 2022 08:27:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes-pt-1/</guid><description>&lt;p&gt;The &lt;a href="https://k8ssandra.io/get-started/" target="_blank" rel="noopener noreferrer"&gt;Get Started&lt;/a&gt;
 examples on the K8ssandra site are primarily concerned with spinning up a single Apache Cassandra datacenter in a single Kubernetes cluster.&lt;/p&gt;
&lt;p&gt;However, there are many situations that can benefit from other deployment options.&lt;/p&gt;
&lt;p&gt;In this series of articles, we&amp;rsquo;ll examine different deployment patterns and show how to implement them using K8ssandra.&lt;/p&gt;
&lt;h2 id="h-flexible-topologies-with-cassandra"&gt;Flexible topologies with Cassandra&lt;/h2&gt;
&lt;p&gt;From its earliest days, Cassandra has included the ability to assign nodes to datacenters and racks. A rack was originally conceived as mapping to a single rack of servers connected to shared resources, like power, network, and cooling.&lt;/p&gt;</description></item><item><title>Write Your Own Service Discovery Client for Apache APISIX</title><link>https://foojayio.github.io/website/today/service-discovery-client-apache-apisix/</link><pubDate>Mon, 01 Aug 2022 10:27:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/service-discovery-client-apache-apisix/</guid><description>&lt;p&gt;API Gateways in general, and &lt;a href="https://apisix.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache APISIX&lt;/a&gt;
 in particular, provide a single entry point into one&amp;rsquo;s information system.&lt;/p&gt;
&lt;p&gt;This architecture allows for managing load balancing and failover over similar nodes.&lt;/p&gt;
&lt;p&gt;For example, here&amp;rsquo;s how you can create a route balanced over two nodes in Apache APISIX:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="bash"&gt;curl http://localhost:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '{
 "uri": "/*",
 "upstream": {
 "type": "roundrobin",
 "nodes": {
 "192.168.0.1:80": 1, # 1
 "192.168.0.2:80": 1 # 1
 }
 }
}'&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Every request has a 50/50 chance of being sent to either node&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It worked for a long time, but in this day and age, nodes are probably not pets but cattle: they come, and they go. Hence, it&amp;rsquo;s essential to dynamically update the nodes list when it happens.&lt;/p&gt;</description></item><item><title>Kubernetes and the Data Centre: Is Full Scale Migration Possible?</title><link>https://foojayio.github.io/website/today/kubernetes-and-the-data-centre-is-full-scale-migration-possible/</link><pubDate>Thu, 21 Jul 2022 13:48:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/kubernetes-and-the-data-centre-is-full-scale-migration-possible/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/kubernetes-and-the-data-centre-is-full-scale-migration-possible/kubernetes-genric-169jpeg_51633.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Data centres used to be exactly that - the centres of our data worlds, where all information, files and records would be kept and controlled.&lt;/p&gt;
&lt;p&gt;Today, that is no longer the case. More companies are moving to cloud services, whether this is dialling down on their traditional on-premises environments or never setting them up in the first place.&lt;/p&gt;
&lt;p&gt;This is not to say that data centres will be wholly abandoned for cloud, but the mix will continue to evolve and be very different to today. Gartner &lt;a href="https://www.gartner.com/smarterwithgartner/the-everywhere-enterprise-a-gartner-qa-with-david-cappuccio/" target="_blank" rel="noopener noreferrer"&gt;predicts&lt;/a&gt;
 that by 2025, 85% of infrastructure strategies will take a more hybrid approach, integrating on-premises, colocation, cloud and edge delivery options, compared with 20% in 2020.&lt;/p&gt;</description></item><item><title>General Build Distribution: A Game-Changer or a Gimmick?</title><link>https://foojayio.github.io/website/today/general-build-distribution-a-game-changer-or-a-gimmick/</link><pubDate>Wed, 20 Jul 2022 21:09:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/general-build-distribution-a-game-changer-or-a-gimmick/</guid><description>&lt;p&gt;&lt;strong&gt;Understand the performance potential of remote and distributed builds and explore how to improve build feedback times.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://foojayio.github.io/website/today/remote-and-distributed-build-patterns/"&gt;Remote and Distributed Build Patterns&lt;/a&gt;
 article explains the differences between remote and distributed builds and variations on each. Specifically, we distinguished between &amp;ldquo;test distribution&amp;rdquo; and &amp;ldquo;general build distribution&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;This article discusses distributed builds in a broader perspective of improving build feedback times. We&amp;rsquo;ll start by explaining the types of changes engineers tend to make, identify the typical bottlenecks and share how these relate to distributed builds. We will also study the performance potential of general build distribution. Finally, we will explore a holistic approach to improving build feedback times.&lt;/p&gt;</description></item><item><title>Why a Cloud-Native Database Must Run on K8s</title><link>https://foojayio.github.io/website/today/why-a-cloud-native-database-must-run-on-k8s/</link><pubDate>Tue, 19 Jul 2022 17:44:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-a-cloud-native-database-must-run-on-k8s/</guid><description>&lt;p&gt;We&amp;rsquo;ve been talking about migrating workloads to the cloud for a long time, but a look at the application portfolios of many IT organizations demonstrates that there&amp;rsquo;s still a lot of work to be done. In many cases, challenges with persisting and moving data in clouds continue to be the key limiting factor slowing cloud adoption, despite the fact that databases in the cloud have been available for years.&lt;/p&gt;
&lt;p&gt;For this reason, there has been a surge of recent interest in data infrastructure that is designed to take maximum advantage of the benefits that cloud computing provides. A &lt;a href="https://k8ssandra.io/blog/2021/03/23/the-search-for-a-cloud-native-database/" target="_blank" rel="noopener noreferrer"&gt;cloud-native database&lt;/a&gt;
 is one that achieves the goals of scalability, elasticity, resiliency, observability and automation; the &lt;a href="https://k8ssandra.io/" target="_blank" rel="noopener noreferrer"&gt;K8ssandra&lt;/a&gt;
 project is a great example. It packages Apache &lt;a href="https://containerjournal.com/?s=Cassandra" target="_blank" rel="noopener noreferrer"&gt;Cassandra&lt;/a&gt;
 and supporting tools into a production-ready Kubernetes deployment.&lt;/p&gt;</description></item><item><title>Remote and Distributed Build Patterns</title><link>https://foojayio.github.io/website/today/remote-and-distributed-build-patterns/</link><pubDate>Tue, 19 Jul 2022 10:48:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/remote-and-distributed-build-patterns/</guid><description>&lt;p&gt;&lt;strong&gt;Remote and distributed builds are terms frequently used, misused and abused. Here we share insight for what these terms mean and how they affect your build feedback times.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A frequently-requested feature for the &lt;a href="https://gradle.org/" target="_blank" rel="noopener noreferrer"&gt;Gradle Build Tool&lt;/a&gt;
 is the ability to perform remote or distributed builds.&lt;/p&gt;
&lt;p&gt;But what exactly does this mean? And what are the motivations behind the requests?&lt;/p&gt;
&lt;p&gt;This article will explore the difference between remote vs. distributed builds and their variations. As there is no industry-wide agreement on consistent terminology for these concepts, the goal of this article is to give an overview of these patterns and how they relate to each other.&lt;/p&gt;</description></item><item><title>How to Secure Your Web Apps With An API Gateway</title><link>https://foojayio.github.io/website/today/how-to-secure-your-web-apps-with-an-api-gateway/</link><pubDate>Mon, 18 Jul 2022 18:50:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-secure-your-web-apps-with-an-api-gateway/</guid><description>&lt;p&gt;API management solutions, also known as API gateways, are a must in this day and age of APIs.&lt;/p&gt;
&lt;p&gt;However, once you&amp;rsquo;ve set up such a gateway, you can use it for different purposes unrelated to APIs.&lt;/p&gt;
&lt;p&gt;Today, I want to show you how to improve the security of web apps.&lt;/p&gt;
&lt;h2 id="h2-0-prevent-sniffing"&gt;Prevent sniffing&lt;/h2&gt;
&lt;p&gt;Browsers are fantastic pieces of technology that try to make the life of users as comfortable as possible.&lt;/p&gt;</description></item><item><title>The End of the Beginning for Apache Cassandra</title><link>https://foojayio.github.io/website/today/the-end-of-the-beginning-for-apache-cassandra/</link><pubDate>Tue, 12 Jul 2022 17:43:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-end-of-the-beginning-for-apache-cassandra/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/the-end-of-the-beginning-for-apache-cassandra/1_xslbFHC3hRapwGV_wj17vg-1024x663.jpeg" alt="" loading="lazy"&gt;
 Image: &lt;a href="https://pixabay.com/photos/prairie-river-stream-curved-sunset-679014/" target="_blank" rel="noopener noreferrer"&gt;Pixabay&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Editor&amp;rsquo;s note: This story originally ran on July 27, 2021, the day that Apache Cassandra 4.0 was released.&lt;/em&gt;{#4bbb}&lt;/p&gt;
&lt;p&gt;Today is a big day for those of us in the &lt;a href="https://cassandra.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache Cassandra&lt;/a&gt;
 community. After a long uphill climb, Apache Cassandra 4.0 has &lt;a href="https://thenewstack.io/apache-cassandra-4-0-comes-in-ready-for-production/" target="_blank" rel="noopener noreferrer"&gt;finally shipped&lt;/a&gt;
. I say finally, because it has at times seemed like an elusive goal. I&amp;rsquo;ve been involved in the Cassandra project for almost 10 years now and I have seen a lot of ups and downs.{#d6a4}&lt;/p&gt;</description></item><item><title>K8ssandra ramps up security features to match Kubernetes’ best practices</title><link>https://foojayio.github.io/website/today/k8ssandra-ramps-up-security-features-to-match-kubernetes-best-practices/</link><pubDate>Thu, 23 Jun 2022 19:54:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/k8ssandra-ramps-up-security-features-to-match-kubernetes-best-practices/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/k8ssandra-ramps-up-security-features-to-match-kubernetes-best-practices/1_qz4yqblkLUoJDL3t8xrsSg-1024x478.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;New security features are coming to the open-source data platform: K8ssandra. The goal? To align even more with the security best practices of Kubernetes. Here&amp;rsquo;s an introduction to the platform&amp;rsquo;s security mission and an update on current initiatives.&lt;/em&gt;{#e3b8}&lt;/p&gt;
&lt;p&gt;The security defaults applied by &lt;a href="https://k8ssandra.io/" target="_blank" rel="noopener noreferrer"&gt;K8ssandra&lt;/a&gt;
 are about to get even more aligned with&lt;a href="https://kubernetes.io/docs/concepts/security/overview/" target="_blank" rel="noopener noreferrer"&gt;Kubernetes&amp;rsquo; security practices&lt;/a&gt;
. In an upcoming release of K8ssandra, pod and container security configurations give users full customization capabilities and default values out of the box.{#c373}&lt;/p&gt;</description></item><item><title>Tombstones and Ghost Data Don’t Have to Be Scary!</title><link>https://foojayio.github.io/website/today/tombstones-and-ghost-data-dont-have-to-be-scary/</link><pubDate>Thu, 09 Jun 2022 20:36:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/tombstones-and-ghost-data-dont-have-to-be-scary/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/tombstones-and-ghost-data-dont-have-to-be-scary/1_g5MhVmTyqdCWG_-LkItmNg-1024x679.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Working with tombstones can be one of the more frustrating aspects of Apache Cassandra®. Problems with tombstones can happen when a large number of deletes occur within a short period of time, resulting in slower queries and disk bloat. This article will discuss tombstones, including the purpose they serve, and strategies/methods on how to avoid them.&lt;/strong&gt;&lt;/em&gt;{#2508}&lt;/p&gt;
&lt;p&gt;&lt;a href="https://cassandra.apache.org/doc/4.0/cassandra/operating/compaction/index.html#why-tombstones" target="_blank" rel="noopener noreferrer"&gt;Tombstones&lt;/a&gt;
 in &lt;a href="https://cassandra.apache.org/_/index.html" target="_blank" rel="noopener noreferrer"&gt;Apache Cassandra&lt;/a&gt;
&lt;em&gt;®&lt;/em&gt; are written markers that are created whenever a value is deleted. Their purpose is to indicate that any prior values have been deleted. When a read occurs, it pulls data from the sorted string table (SSTable) files on a node that may contain the data. All prior values for the requested key are returned, ordered by write-time.{#d711}&lt;/p&gt;</description></item><item><title>Managing Distributed Applications in Kubernetes Using Cilium and Istio with Helm and Operator for Deployment</title><link>https://foojayio.github.io/website/today/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/</link><pubDate>Tue, 07 Jun 2022 14:51:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/1_i26lEM7Wl5JA7FIMlhtKNA-1024x576.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This post will show you the benefits of managing your distributed applications with Kubernetes in cross-cloud, multi-cloud, and hybrid cloud scenarios using Cilium and Istio with Helm and Operator for deployment.&lt;/em&gt;{#6864}&lt;/p&gt;
&lt;p&gt;In our recent post on &lt;a href="https://thenewstack.io/taking-your-database-beyond-a-single-kubernetes-cluster/" target="_blank" rel="noopener noreferrer"&gt;The New Stack&lt;/a&gt;
, we showed you how you can leverage &lt;a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;
 (K8s) and &lt;a href="https://cassandra.apache.org/_/index.html" target="_blank" rel="noopener noreferrer"&gt;Apache Cassandra&lt;/a&gt;
TM to manage distributed applications at scale, with thousands of nodes across both on-premises and in the cloud. In that example, we used &lt;a href="https://k8ssandra.io/" target="_blank" rel="noopener noreferrer"&gt;K8ssandra&lt;/a&gt;
 and &lt;a href="https://cloud.google.com/" target="_blank" rel="noopener noreferrer"&gt;Google Cloud Platform&lt;/a&gt;
 (GCP) to illustrate some of the challenges you might expect to encounter as you grow into a multi-cloud environment, upgrade to another K8s version, or begin working with different distributions and complimentary tooling. In this post, we&amp;rsquo;ll explore a few alternative approaches to using K8s to help you more easily manage distributed applications.{#fec3}&lt;/p&gt;</description></item><item><title>How to Develop and Test an Automated CI/CD Workflow with Cassandra</title><link>https://foojayio.github.io/website/today/how-to-develop-and-test-an-automated-ci-cd-workflow-with-cassandra/</link><pubDate>Fri, 03 Jun 2022 08:52:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-develop-and-test-an-automated-ci-cd-workflow-with-cassandra/</guid><description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;In this post, we&amp;rsquo;ll show you how to develop a CI/CD workflow using Apache Cassandra&lt;/em&gt; ™&lt;em&gt;with a GitHub Actions runner. See for yourself how much time and effort you can save by deploying Cassandra cloud-natively while you test and deploy your cloud-native applications!&lt;/em&gt;&lt;/strong&gt;{#6067}&lt;/p&gt;
&lt;p&gt;If you have projects that depend on &lt;a href="https://cassandra.apache.org/_/index.html" target="_blank" rel="noopener noreferrer"&gt;Apache Cassandra&lt;/a&gt;
™ and you want to develop an automated continuous integration and continuous delivery (CI/CD) flow, you&amp;rsquo;re going to need to create Cassandra clusters dynamically for your tests to make sure that your app works after each code change. &lt;a href="https://www.datastax.com/" target="_blank" rel="noopener noreferrer"&gt;DataStax&lt;/a&gt;
 does this every day &amp;mdash; we run Cassandra in &lt;a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;
 to power &lt;a href="https://astra.dev/38xbdFI" target="_blank" rel="noopener noreferrer"&gt;Astra DB&lt;/a&gt;
. And, we use continuous testing of our Cassandra deployments to make sure Astra DB works reliably.{#8d10}&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>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>Conditional Builds on GitLab</title><link>https://foojayio.github.io/website/today/conditional-builds-on-gitlab/</link><pubDate>Mon, 09 May 2022 09:16:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/conditional-builds-on-gitlab/</guid><description>&lt;p&gt;Regular readers of my articles know that I&amp;rsquo;m using &lt;a href="https://jekyllrb.com/" target="_blank" rel="noopener noreferrer"&gt;Jekyll&lt;/a&gt;
 to generate my static blog site, together with GitLab. When I push on the &lt;code&gt;master&lt;/code&gt; branch, it triggers the generation job.&lt;/p&gt;
&lt;p&gt;However, Jekyll is Ruby-based and requires a couple of Gem dependencies. I&amp;rsquo;ve also added a few plugins. For this reason, I&amp;rsquo;ve created a &lt;a href="https://blog.frankel.ch/musings-dockerfile-jekyll/" target="_blank" rel="noopener noreferrer"&gt;Docker image with all required dependencies&lt;/a&gt;
. Regularly, I update the versions in the &lt;code&gt;Gemfile.lock&lt;/code&gt; via Bundler. Afterward, I need to rebuild the Docker image.&lt;/p&gt;</description></item><item><title>Securely Authenticate to Google Cloud from GitHub</title><link>https://foojayio.github.io/website/today/securely-authenticate-google-cloud-github/</link><pubDate>Mon, 02 May 2022 08:57:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/securely-authenticate-google-cloud-github/</guid><description>&lt;p&gt;Recently, I designed a simple metrics-tracking system.&lt;/p&gt;
&lt;p&gt;A Python script queries different providers&amp;rsquo; APIs for metrics, &lt;em&gt;e.g.&lt;/em&gt;, Twitter, GitHub, etc.&lt;/p&gt;
&lt;p&gt;The idea is to run this script each day, store them in Google BigQuery and provide an excellent data visualization in Google Data Studio.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m a big fan of automation, so I&amp;rsquo;m using GitHub Actions.&lt;/p&gt;
&lt;h2 id="h2-0-accessing-google-cloud-with-a-service-account"&gt;Accessing Google Cloud with a Service Account&lt;/h2&gt;
&lt;p&gt;I query the different APIs with different Python libraries. All of them allow authenticating by passing a parameter. In general, it&amp;rsquo;s a token. One can store the value in a GitHub secret, get it as an environment variable in the GitHub Action and use it in the code.&lt;/p&gt;</description></item><item><title>Full Stream Ahead: Astra Streaming, Powered by Apache Pulsar</title><link>https://foojayio.github.io/website/today/full-stream-ahead-astra-streaming-powered-by-apache-pulsar/</link><pubDate>Thu, 24 Mar 2022 09:22:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/full-stream-ahead-astra-streaming-powered-by-apache-pulsar/</guid><description>&lt;p&gt;With a serverless architecture, multi-region geo replication, and Apache Cassandra&amp;rsquo;s legendary performance, &lt;a href="https://astra.datastax.com" target="_blank" rel="noopener noreferrer"&gt;DataStax Astra DB&lt;/a&gt;
 makes it easy for developers and enterprises to start small with their applications and grow them to infinite scale without constant performance tuning and optimization exercises.&lt;/p&gt;
&lt;p&gt;However, cloud app developers also face significant challenge`s beyond data at rest. Modern data apps require high-scale streaming technologies that can deliver the reactive engagement at the point of interaction that end users have come to expect. That&amp;rsquo;s why today, we&amp;rsquo;re excited to announce that these capabilities have been added to DataStax Astra.&lt;/p&gt;</description></item><item><title>JDKMon 17.0.23 Released</title><link>https://foojayio.github.io/website/today/jdkmon-17-0-23-released/</link><pubDate>Fri, 11 Mar 2022 09:52:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/jdkmon-17-0-23-released/</guid><description>&lt;p&gt;JDKMon is a little tool written in JavaFX that tries to detect all OpenJDK distributions installed on your machine while keeping track of updates for those distributions.&lt;/p&gt;
&lt;p&gt;It will scan for new updates every three hours and will inform you about available updates.&lt;/p&gt;
&lt;figure class="wp-block-image size-full is-resized is-style-default"&gt;
 &lt;img fetchpriority="high" decoding="async" src="jdkmon-17.0.23.png" alt="" class="wp-image-52579" width="423" height="306"&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; JDKMon won&amp;rsquo;t install the distributions on your machine but will enable you to download them to a place of your choice.&lt;/p&gt;
&lt;p&gt;At the moment the following distributions are supported:&lt;/p&gt;</description></item><item><title>The Serverless Database You Really Want</title><link>https://foojayio.github.io/website/today/the-serverless-database-you-really-want/</link><pubDate>Thu, 03 Mar 2022 20:43:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-serverless-database-you-really-want/</guid><description>&lt;p&gt;The dreaded part of every site reliability engineer&amp;rsquo;s (SRE) job eventually: capacity planning. You know, the dance between all the stakeholders when deploying your applications. Did engineering really simulate the right load and do we understand how the application scales? Did product managers accurately estimate the amount of usage? Did we make architectural decisions that will keep us from meeting our SLA goals? And then the question that everyone will have to answer eventually: how much is this going to cost? This forces SREs to assume the roles of engineer, accountant and fortune teller.&lt;/p&gt;</description></item><item><title>Save Hours on your Setup of K8ssandra with the New Config Builder</title><link>https://foojayio.github.io/website/today/save-hours-on-your-setup-of-k8ssandra-with-the-new-config-builder/</link><pubDate>Thu, 24 Feb 2022 19:36:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/save-hours-on-your-setup-of-k8ssandra-with-the-new-config-builder/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Setting up K8ssandra in your workflow just got a whole lot easier. With the new Config Builder you can be running Apache Cassandra® on Kubernetes in a matter of minutes.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The purpose of K8ssandra is to make it easy to run Apache Cassandra® on Kubernetes. We recently took another big step in that direction by releasing the &lt;a href="https://dtsx.io/3pIiPcR" target="_blank" rel="noopener noreferrer"&gt;K8ssandra config builder&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Even if you&amp;rsquo;ve created thousands of nodes or integrated K8ssandra in your stack, you&amp;rsquo;ll probably want to give the config builder a try. Walk through the interactive wizard defining the shape of your cluster, resource requirements, and toggle features to fit your needs. This is great for smoothing out the on-ramp for a production ready environment of K8ssandra.&lt;/p&gt;</description></item><item><title>Why we decided to build a K8ssandra Operator - Part 4</title><link>https://foojayio.github.io/website/today/why-we-decided-to-build-a-k8ssandra-operator-part-4/</link><pubDate>Tue, 22 Feb 2022 17:04:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-we-decided-to-build-a-k8ssandra-operator-part-4/</guid><description>&lt;p&gt;In the &lt;a href="https://k8ssandra.io/blog/other/why_k8ssandra_operator_part_1/" target="_blank" rel="noopener noreferrer"&gt;first&lt;/a&gt;
, &lt;a href="https://k8ssandra.io/blog/articles/why-k8ssandra-operator-part-2/" target="_blank" rel="noopener noreferrer"&gt;second&lt;/a&gt;
, and &lt;a href="https://k8ssandra.io/blog/articles/why-we-decided-to-build-a-k8ssandra-operator-part-3/" target="_blank" rel="noopener noreferrer"&gt;third&lt;/a&gt;
 posts in this series, we&amp;rsquo;ve shared conversations with K8ssandra core team members on our journey to build a Kubernetes operator for K8ssandra. We&amp;rsquo;ve discussed the virtues of the Helm package manager versus Kubernetes operators for deploying and managing infrastructure in Kubernetes and some of our implementation choices for the operator.&lt;/p&gt;
&lt;p&gt;In this final post of the series, we pick up from the previous post with a discussion of how we decided to structure our projects in GitHub, how we test the K8ssandra operator, and our hopes for how the operator will expand the K8ssandra developer community.&lt;/p&gt;</description></item><item><title>Cassandra Database Migration to Kubernetes with Zero Downtime</title><link>https://foojayio.github.io/website/today/cassandra-database-migration-to-kubernetes-with-zero-downtime/</link><pubDate>Tue, 15 Feb 2022 15:22:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/cassandra-database-migration-to-kubernetes-with-zero-downtime/</guid><description>&lt;p&gt;K8ssandra is a cloud-native distribution of the Apache Cassandra® database that runs on Kubernetes, with a suite of tools to ease and automate operational tasks. In this post, we&amp;rsquo;ll walk you through a database migration from a Cassandra cluster running in AWS EC2 to a K8ssandra cluster running in Kubernetes on AWS EKS, with zero downtime.&lt;/p&gt;
&lt;p&gt;As an Apache Cassandra user, your expectation should be that migrating to K8ssandra would happen without downtime. To make that happen with &amp;ldquo;classic&amp;rdquo; clusters running on virtual machines or bare metal instances, you will use the datacenter (DC) switch technique which is commonly used in the Cassandra community to transfer clusters to different hardware or environments. The good news is that it&amp;rsquo;s not very different for clusters running in Kubernetes as most Container Network Interfaces (CNI) will provide routable pod IPs.&lt;/p&gt;</description></item><item><title>Deploying to Multiple Kubernetes Clusters with the K8ssandra Operator</title><link>https://foojayio.github.io/website/today/deploying-to-multiple-kubernetes-clusters-with-the-k8ssandra-operator/</link><pubDate>Fri, 04 Feb 2022 22:10:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/deploying-to-multiple-kubernetes-clusters-with-the-k8ssandra-operator/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/deploying-to-multiple-kubernetes-clusters-with-the-k8ssandra-operator/0_cYkNr7XdB-MsJiu5-1024x674.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;We built the new K8ssandra Operator to simplify deploying multiple Apache Cassandra data centers in different regions and across multiple Kubernetes (K8s) clusters. We&amp;rsquo;re not at the finish line just yet, but we&amp;rsquo;ve hit the first major milestone. Now, it&amp;rsquo;s easier than ever to run Apache Cassandra® across multiple K8s clusters in multiple regions with the K8ssandraCluster!&lt;/p&gt;
&lt;p&gt;The K8ssandraCluster is a new custom resource for K8ssandra that covers all the bases necessary for installing a production-ready, multi-cluster K8ssandra deployment. Head over to the &lt;a href="https://medium.com/building-the-open-data-stack/deploying-to-multiple-kubernetes-clusters-with-the-k8ssandra-operator-f7562bee1841" target="_blank" rel="noopener noreferrer"&gt;DataStax Tech blog&lt;/a&gt;
 to learn more about how to specify your remote clusters with the K8ssandraCluster, its deployment architecture, and what&amp;rsquo;s coming next in our continued development of the K8ssandra operator.&lt;/p&gt;</description></item><item><title>Backing up K8ssandra with MinIO</title><link>https://foojayio.github.io/website/today/backing-up-k8ssandra-with-minio-2/</link><pubDate>Thu, 03 Feb 2022 22:50:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/backing-up-k8ssandra-with-minio-2/</guid><description>&lt;p&gt;K8ssandra includes Medusa for Apache Cassandra® to handle backup and restore for your Cassandra nodes. Recently Medusa was upgraded to introduce support for all S3 compatible backends, including &lt;a href="https://min.io/" target="_blank" rel="noopener noreferrer"&gt;MinIO&lt;/a&gt;
, the popular k8s-native object storage suite. Let&amp;rsquo;s see how to set up K8ssandra and MinIO to backup Cassandra in just a few steps.&lt;/p&gt;
&lt;h2 id="deploy-minio"&gt;Deploy MinIO&lt;/h2&gt;
&lt;p&gt;Similar to K8ssandra, MinIO can be simply deployed through Helm.&lt;/p&gt;
&lt;p&gt;First, add the MinIO repository to your local list:&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>Unboxing K8ssandra: The Data Layer For Your Kubernetes-Powered Applications</title><link>https://foojayio.github.io/website/today/unboxing-k8ssandra-the-data-layer-for-your-kubernetes-powered-applications/</link><pubDate>Tue, 01 Feb 2022 17:51:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/unboxing-k8ssandra-the-data-layer-for-your-kubernetes-powered-applications/</guid><description>&lt;h4 id="a-complimentary-live-webinar-sponsored-by-datastax"&gt;A Complimentary Live Webinar, Sponsored by DataStax&lt;/h4&gt;
&lt;p&gt;Kubernetes made it easy to deploy and scale out your cloud-native applications. With &lt;a href="https://k8ssandra.io/" target="_blank" rel="noopener noreferrer"&gt;K8ssandra&lt;/a&gt;
, you can now scale application data with the same simplicity and high availability. Join us as we unbox K8ssandra a cloud native data layer for Kubernetes and explore how you can deploy it alongside your applications.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.k8ssandra.io/install/" target="_blank" rel="noopener noreferrer"&gt;Install k8ssandra&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Authenticate with &lt;a href="https://stargate.io/" target="_blank" rel="noopener noreferrer"&gt;Stargate&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Query your data via a convenient API (REST, document, or graphql)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not familiar with Cassandra? &lt;a href="https://astra.dev/3f8QkAl" target="_blank" rel="noopener noreferrer"&gt;Astra DB&lt;/a&gt;
 is a great (free) place to learn without any of the infrastructure setup, or management headaches.&lt;/p&gt;</description></item><item><title>Taking Your Database Beyond a Single Kubernetes Cluster</title><link>https://foojayio.github.io/website/today/taking-your-database-beyond-a-single-kubernetes-cluster/</link><pubDate>Wed, 19 Jan 2022 10:31:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/taking-your-database-beyond-a-single-kubernetes-cluster/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/taking-your-database-beyond-a-single-kubernetes-cluster/0_ntxtNVffHhl99weW-1-1024x535.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;By &lt;a href="https://www.linkedin.com/in/bradfordcp/" target="_blank" rel="noopener noreferrer"&gt;Christopher Bradford&lt;/a&gt;
 and &lt;a href="https://www.linkedin.com/in/ty-morton-2b55b82/" target="_blank" rel="noopener noreferrer"&gt;Ty Morton&lt;/a&gt;
{#31db}&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Global applications need a data layer that is as distributed as the users they serve. &lt;a href="https://cassandra.apache.org/_/index.html" target="_blank" rel="noopener noreferrer"&gt;Apache Cassandra&lt;/a&gt;
 has risen to this challenge, handling data needs for the likes of Apple, Netflix and Sony. Traditionally, managing data layers for a distributed application was handled with dedicated teams to manage the deployment and operations of thousands of nodes &amp;mdash; both on-premises and in the cloud.&lt;/p&gt;</description></item><item><title>Polyglot Cloud Native Debugging: Beyond Logs/APM</title><link>https://foojayio.github.io/website/today/polyglot-cloud-native-debugging-beyond-apm-and-logging/</link><pubDate>Tue, 18 Jan 2022 07:55:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/polyglot-cloud-native-debugging-beyond-apm-and-logging/</guid><description>&lt;p&gt;&lt;strong&gt;I&amp;rsquo;ve done quite a few conference talks since I became a developer advocate for &lt;a href="https://lightrun.com/" target="_blank" rel="noopener noreferrer"&gt;Lightrun&lt;/a&gt;
. One of my most popular talks has a title similar to the title of this article. In this article I&amp;rsquo;ll try to cover the gist of the talk.&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/cj--cJrYqhQ?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="_cloud_native_applications"&gt;Cloud-Native Applications&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s practically an alphabet soup of terms covering public cloud, hybrid cloud, etc. There&amp;rsquo;s also a lot of overlap between the various terms. The nice thing about this topic is that it applies, regardless. You will run into problems with microservices, architecture and monolithic applications or serverless.&lt;/p&gt;</description></item><item><title>Kubernetes and Apache Cassandra: What Works (and What Doesn’t)</title><link>https://foojayio.github.io/website/today/kubernetes-and-apache-cassandra-what-works-and-what-doesnt/</link><pubDate>Fri, 14 Jan 2022 16:30:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/kubernetes-and-apache-cassandra-what-works-and-what-doesnt/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/kubernetes-and-apache-cassandra-what-works-and-what-doesnt/K15a-AdobeStock_459893049-1536x922-1-1024x615.jpeg" alt="" loading="lazy"&gt;
 &amp;ldquo;I need it now and I need it reliable&amp;rdquo;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ndash; ANYONE WHO HASN&amp;rsquo;T DEPLOYED APPLICATION INFRASTRUCTURE&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you&amp;rsquo;re on the receiving end of this statement, we understand you here in the &lt;a href="https://dtsx.io/3uZHFqS" target="_blank" rel="noopener noreferrer"&gt;K8ssandra community&lt;/a&gt;
. Although we do have reason for hope. Recent &lt;a href="https://dok.community/dokc-2021-report/" target="_blank" rel="noopener noreferrer"&gt;surveys&lt;/a&gt;
 have shown that &lt;a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;
 (K8s) is growing in popularity, not only because it&amp;rsquo;s powerful technology, but because it actually delivers on reducing the toil of deployment.&lt;/p&gt;</description></item><item><title>How to Put a Database in Kubernetes?</title><link>https://foojayio.github.io/website/today/how-to-put-a-database-in-kubernetes/</link><pubDate>Thu, 13 Jan 2022 09:18:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-put-a-database-in-kubernetes/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/how-to-put-a-database-in-kubernetes/0_aX8FjIfXNHJhbSWU.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Learn the key steps of deploying databases and stateful workloads in Kubernetes and meet the cloud-native technologies, like K8ssandra, that can streamline Apache Cassandra for K8s.&lt;/strong&gt;{#95cc}&lt;/p&gt;
&lt;p&gt;The idea of running a stateful workload in Kubernetes (K8s) can be intimidating, especially if you haven&amp;rsquo;t done it before. How do you deploy a database? Where is the actual storage? How is the storage mapped to the database or the application using it?{#6cde}&lt;/p&gt;</description></item><item><title>Requirements for Running K8ssandra for Development</title><link>https://foojayio.github.io/website/today/requirements-for-running-k8ssandra-for-development/</link><pubDate>Thu, 06 Jan 2022 12:15:27 +0000</pubDate><guid>https://foojayio.github.io/website/today/requirements-for-running-k8ssandra-for-development/</guid><description>&lt;br /&gt;
&lt;p&gt;The K8ssandra &lt;a href="https://k8ssandra.io/get-started/" target="_blank" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt;
 is a excellent guide for doing a full installation of K8ssandra on a dev laptop and trying out the various components of the K8ssandra stack. While this is a great way to get your first hands-on experience with K8ssandra, let&amp;rsquo;s state the obvious: running K8ssandra locally on a dev laptop is not aimed at performance. In this blog post, we will start Apache Cassandra® locally then explain how to run benchmarks to help evaluate what level of performance (especially throughput) you can expect from a dev laptop deployment.&lt;/p&gt;</description></item><item><title>Why K8ssandra?</title><link>https://foojayio.github.io/website/today/why-k8ssandra/</link><pubDate>Thu, 06 Jan 2022 12:10:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-k8ssandra/</guid><description>&lt;h2 id="the-problem-scalable-data-persistence-for-cloud-native-applications"&gt;The problem: scalable data persistence for cloud-native applications&lt;/h2&gt;
&lt;p&gt;The past decade and a half has brought tremendous change in how we in the software industry think about building and delivering internet applications. With the launch of Amazon Web Services (AWS) in 2006, companies of any size could access cloud computing infrastructure. The burst of creativity that followed gave birth to concepts like &lt;a href="http://pzf.fremantle.org/2010/05/cloud-native.html" target="_blank" rel="noopener noreferrer"&gt;cloud-native&lt;/a&gt;
 in 2010, and methodologies such as the &lt;a href="https://12factor.net/" target="_blank" rel="noopener noreferrer"&gt;twelve-factor app&lt;/a&gt;
 in 2011.&lt;/p&gt;</description></item><item><title>JReleaser 0.10.0 Released!</title><link>https://foojayio.github.io/website/today/jreleaser-0-10-0-released/</link><pubDate>Tue, 04 Jan 2022 13:30:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/jreleaser-0-10-0-released/</guid><description>&lt;p&gt;JReleaser is a tool that streamlines creating releases for [Java] projects.&lt;/p&gt;
&lt;p&gt;It can create a GitHub/GitLab/Gitea release, while also packaging binaries for Homebrew, Snapcraft, Docker, Chocolatey, Scoop, JBang and, more than that, announces releases to Twitter, SdkMan!, e-mail, Zulip, Discord, Gitter, Slack, Teams, and more.&lt;/p&gt;
&lt;p&gt;JReleaser &lt;a href="https://github.com/jreleaser/jreleaser/releases/tag/v0.10.0" title="v0.10.0" target="_blank" rel="noopener noreferrer"&gt;v0.10.0&lt;/a&gt;
 is the last push towards 1.0.0. We&amp;rsquo;ll concentrate on bug fixing and polishing from now on. Be mindful of the &lt;a href="https://github.com/jreleaser/jreleaser/issues?q=is%3Aissue&amp;#43;label%3A%22BREAKING&amp;#43;CHANGE%22&amp;#43;milestone%3Av0.10.0&amp;#43;is%3Aclosed" target="_blank" rel="noopener noreferrer"&gt;breaking changes&lt;/a&gt;
 introduced in this release.&lt;/p&gt;</description></item><item><title>New Survey Finds Data on Kubernetes Is No Longer a Pipe Dream</title><link>https://foojayio.github.io/website/today/new-survey-finds-data-on-kubernetes-is-no-longer-a-pipe-dream/</link><pubDate>Thu, 30 Dec 2021 15:52:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/new-survey-finds-data-on-kubernetes-is-no-longer-a-pipe-dream/</guid><description>&lt;p&gt;For people that work in infrastructure and application development, the pace of change is quick. Finish one project and it&amp;rsquo;s on to the next. Each iteration requires an evaluation asking if the right technology is being used and if it provides a new advantage. Kubernetes has been on the fast track of continuous evaluation. New projects and methodologies are continuously emerging and it can be hard to keep up. Then there is the question of running stateful services. The Data on Kubernetes community has &lt;a href="https://dok.community/dokc-2021-report/" target="_blank" rel="noopener noreferrer"&gt;released a report&lt;/a&gt;
 titled &amp;ldquo;Data on Kubernetes 2021&amp;rdquo; to give us a snapshot of where our industry sits with stateful workloads. Over 500 executives and tech leaders were asked some very direct and insightful questions about how they use Kubernetes. It turns out that there were a lot of surprising finds. Some that I would have never predicted. Let&amp;rsquo;s dig into some of the highlights that stood out to me.&lt;/p&gt;</description></item><item><title>The future of cloud-native databases begins with Apache Cassandra 4.0</title><link>https://foojayio.github.io/website/today/the-future-of-cloud-native-databases-begins-with-apache-cassandra-4-0/</link><pubDate>Wed, 29 Dec 2021 07:40:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-future-of-cloud-native-databases-begins-with-apache-cassandra-4-0/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Reliability at massive scale is one of the biggest challenges we face at Amazon.com, one of the largest e-commerce operations in the world; even the slightest outage has significant financial consequences and impacts customer trust.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was the first line of the highly impactful &lt;a href="http://www.cs.cornell.edu/courses/cs5414/2017fa/papers/dynamo.pdf" target="_blank" rel="noopener noreferrer"&gt;paper&lt;/a&gt;
 titled &amp;ldquo;Dynamo: Amazon&amp;rsquo;s Highly Available Key-value Store.&amp;rdquo; Published in 2007, it was written at a time when the status quo of database systems was not working for the massive explosion of internet-based applications. A team of computer engineers and scientists at Amazon completely re-thought the idea of data storage in terms of what would be needed for the future, with a firm footing in the computer science of the past. They were trying to solve an immediate problem but they had unwittingly sparked a huge revolution with distributed databases and the eventual collision with cloud-native applications.&lt;/p&gt;</description></item><item><title>Kubernetes Data Simplicity: Getting started with K8ssandra</title><link>https://foojayio.github.io/website/today/kubernetes-data-simplicity-getting-started-with-k8ssandra/</link><pubDate>Thu, 23 Dec 2021 08:56:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/kubernetes-data-simplicity-getting-started-with-k8ssandra/</guid><description>&lt;p&gt;You might have heard about the &lt;a href="https://github.com/k8ssandra/k8ssandra" target="_blank" rel="noopener noreferrer"&gt;K8ssandra&lt;/a&gt;
 project and want to start contributing, or maybe you want to start using all of its features. If you aren&amp;rsquo;t familiar with K8ssandra (pronounced like &amp;ldquo;Kate Sandra&amp;rdquo;), you can read this &lt;a href="https://k8ssandra.io/" target="_blank" rel="noopener noreferrer"&gt;overview&lt;/a&gt;
 before digging into the developer activities in this post.&lt;/p&gt;
&lt;p&gt;In a nutshell, K8ssandra is an open-source distribution of Apache Cassandra™ for Kubernetes, which includes a rich set of trusted open-source services and tooling. K8ssandra comes with handy features that are baked-in and pluggable, which allows for flexible deployment and configuration.&lt;/p&gt;</description></item><item><title>What is GitOps? What are its benefits?</title><link>https://foojayio.github.io/website/today/what-is-gitops-what-are-its-benefits/</link><pubDate>Fri, 17 Dec 2021 16:19:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-is-gitops-what-are-its-benefits/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Let&amp;rsquo;s understand what GitOps is and its benefits. You will also learn how ArgoCD can help with the continuous delivery of Kubernetes-based applications.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The following article is an excerpt from my book &lt;strong&gt;Effortless Cloud-Native App Development Using Skaffold&lt;/strong&gt; from Packt Publishing.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636304168731/qHmKbqm_y.jpeg" alt="B17385_Mockup Cover_High Res.jpg" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;It is available for order from &lt;a href="https://www.amazon.com/Effortless-Cloud-Native-Development-using-Skaffold/dp/1801077118" target="_blank" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;
 and directly from &lt;a href="https://www.packtpub.com/product/effortless-cloud-native-apps-development-using-skaffold/9781801077118" target="_blank" rel="noopener noreferrer"&gt;Packt&lt;/a&gt;
. This excerpt comes from chapter 9: Creating a Production-Ready CI/CD Pipeline with Skaffold:&lt;/p&gt;
&lt;h3 id="h3-0-what-is-gitops"&gt;What is GitOps&lt;/h3&gt;
&lt;p&gt;The word GitOps was coined by a company named Weaveworks. The idea behind GitOps is to consider Git as a single source of truth for your application and declarative infrastructure. Using Git to manage your declarative infrastructure makes it easy for developers because they interact with Git daily. Once you add configuration inside Git, you get the benefits of version control, such as reviewing changes using pull requests, audit, and compliance.&lt;/p&gt;</description></item><item><title>Adelphi: Apache Cassandra Testing Goes Cloud Native</title><link>https://foojayio.github.io/website/today/adelphi-apache-cassandra-testing-goes-cloud-native/</link><pubDate>Thu, 09 Dec 2021 15:55:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/adelphi-apache-cassandra-testing-goes-cloud-native/</guid><description>&lt;p&gt;|&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;|
| &lt;strong&gt;adelphi&lt;/strong&gt; (ancient greek ἀδελφός) - Subs.: brother or sister, son of the same mother. Adj.: double, twin, in pairs. |&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/adelphi-apache-cassandra-testing-goes-cloud-native/Screen-Shot-2021-05-11-at-14.44.17-1024x129.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is Adelphi?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/datastax/adelphi" target="_blank" rel="noopener noreferrer"&gt;Adelphi&lt;/a&gt;
 is an open-source QA tool for Apache Cassandra™, it&amp;rsquo;s packaged as a &lt;a href="https://helm.sh/" target="_blank" rel="noopener noreferrer"&gt;Helm&lt;/a&gt;
 chart and it simplifies the tasks of running data integrity and performance tests on Kubernetes.&lt;/p&gt;
&lt;p&gt;Built for simplicity, Adelphi is an opinionated tool; it runs an &lt;a href="https://argoproj.github.io/argo-workflows/" target="_blank" rel="noopener noreferrer"&gt;Argo&lt;/a&gt;
 workflow of well-defined steps and prefers convention over configuration, but it exposes some knobs that you can override.&lt;/p&gt;</description></item><item><title>Backing up K8ssandra with MinIO</title><link>https://foojayio.github.io/website/today/backing-up-k8ssandra-with-minio/</link><pubDate>Tue, 30 Nov 2021 17:00:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/backing-up-k8ssandra-with-minio/</guid><description>&lt;p&gt;K8ssandra includes Medusa for Apache Cassandra® to handle backup and restore for your Cassandra nodes. Recently Medusa was upgraded to introduce support for all S3 compatible backends, including &lt;a href="https://min.io/" target="_blank" rel="noopener noreferrer"&gt;MinIO&lt;/a&gt;
, the popular k8s-native object storage suite. Let&amp;rsquo;s see how to set up K8ssandra and MinIO to backup Cassandra in just a few steps. If you don&amp;rsquo;t want to self-manage Kubernetes and Cassandra, you can always use &lt;a href="https://dtsx.io/3nHk38t" target="_blank" rel="noopener noreferrer"&gt;Astra DB&lt;/a&gt;
, where this is all set up for you.&lt;/p&gt;</description></item><item><title>JReleaser 0.9.0 Released!</title><link>https://foojayio.github.io/website/today/jreleaser-0-9-0-released/</link><pubDate>Tue, 30 Nov 2021 10:29:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/jreleaser-0-9-0-released/</guid><description>&lt;p&gt;JReleaser is a tool that streamlines creating releases for [Java] projects. It can create a GitHub/GitLab/Gitea release, while also packaging binaries for Homebrew, Snapcraft, Docker, Chocolatey, Scoop, JBang and, more than that, announces releases to Twitter, SdkMan!, e-mail, Zulip, Discord, Gitter, Slack, Teams, and more.&lt;/p&gt;
&lt;p&gt;JReleaser &lt;a href="https://github.com/jreleaser/jreleaser/releases/tag/v0.9.0" title="v0.9.0" target="_blank" rel="noopener noreferrer"&gt;v0.9.0&lt;/a&gt;
 has just been released! JReleaser v0.9.0 is a big update as we gear towards v1.0.0. Plenty of improvements were added to this release to make it the best one so far. Be mindful of the &lt;a href="https://github.com/jreleaser/jreleaser/issues?q=is%3Aclose&amp;#43;is%3Aissue&amp;#43;label%3A%22BREAKING&amp;#43;CHANGE%22&amp;#43;milestone%3Av0.9.0" title="breaking" target="_blank" rel="noopener noreferrer"&gt;breaking changes&lt;/a&gt;
 introduced in this release.There are plenty of improvements in several areas, a quick summary of the highlights follows:&lt;/p&gt;</description></item><item><title>Developer Productivity Masterclass: Interview With Leonid Blouvshtein</title><link>https://foojayio.github.io/website/today/developer-productivity-masterclass-interview-with-leonid-blouvshtein/</link><pubDate>Tue, 30 Nov 2021 09:09:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/developer-productivity-masterclass-interview-with-leonid-blouvshtein/</guid><description>&lt;p&gt;&lt;strong&gt;On December 7th, Lightrun will &lt;a href="https://www.linkedin.com/events/developerproductivitymasterclas6870717107772907520/" title="host a free master class" target="_blank" rel="noopener noreferrer"&gt;host a free master class&lt;/a&gt;
 with Mykyta Protsenko, Senior Software Engineer at Netflix; Michael Wood, Field CTO, HashiCorp; Ryan Menezez, Software Engineering Manager, Meta; and Leonid Blouvshtein, CTO of Lightrun.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/events/developerproductivitymasterclas6870717107772907520/" target="_blank" rel="noopener noreferrer"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;[&lt;/p&gt;
&lt;img fetchpriority="high" decoding="async" class="alignnone size-medium wp-image-50863" src="devprodmaster-700x227.png" alt="" width="700" height="227"&gt;
&lt;p&gt;](&lt;a href="https://www.linkedin.com/events/developerproductivitymasterclas6870717107772907520/" target="_blank" rel="noopener noreferrer"&gt;https://www.linkedin.com/events/developerproductivitymasterclas6870717107772907520/&lt;/a&gt;
)&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;I got a chance to grab Leonid and make him sit down for this quick interview&amp;hellip;&lt;/p&gt;
&lt;h3 id="h3-0-q-tell-us-a-bit-about-yourself"&gt;Q: Tell us a bit about yourself?&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ve worked in several successful startups while most of my experience is with distributed systems that require high performance. This was after I graduated from the elite 8200 intelligence unit of the IDF.&lt;/p&gt;</description></item><item><title>Port Management in Local Kubernetes Clusters</title><link>https://foojayio.github.io/website/today/port-management-in-local-kubernetes-clusters/</link><pubDate>Mon, 29 Nov 2021 08:44:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/port-management-in-local-kubernetes-clusters/</guid><description>&lt;p&gt;Most of my talks contain a demo. A fair share of these demos require multiple &amp;ldquo;infrastructure&amp;rdquo; dependencies: a database (or more), Elasticsearch, you name it. To ease my setup and avoid messing up my machine, I use either Docker Compose or Kubernetes locally on my Mac. Both rely on Docker Desktop.&lt;/p&gt;
&lt;p&gt;To expose a cluster &lt;code&gt;Service&lt;/code&gt; on my host, I use &lt;code&gt;nodePort&lt;/code&gt;. Hence, I set a dedicated node port for each service. I need to remember each of them for each demo. Worse, services might be (are) declared across different manifest files.&lt;/p&gt;</description></item><item><title>Book Review: “Effortless Cloud-Native App Development Using Skaffold”</title><link>https://foojayio.github.io/website/today/book-review-effortless-cloud-native-app-development-using-skaffold-2/</link><pubDate>Thu, 25 Nov 2021 12:52:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/book-review-effortless-cloud-native-app-development-using-skaffold-2/</guid><description>&lt;p&gt;I&amp;rsquo;m a developer who cares deeply about production. But I&amp;rsquo;m not a devops and unfortunately I&amp;rsquo;m pretty bad at that. That&amp;rsquo;s why when I heard about Skaffold it instantly piqued my interest. Write Kubernetes cloud native apps without well&amp;hellip; Writing Kubernetes native apps&amp;hellip; Sign me up!&lt;/p&gt;
&lt;p&gt;Unfortunately, as we all know. The time to pick up a new technology is when we actually need it and then it&amp;rsquo;s a rush to get something out. Few of us have time to take off from our busy day to study something and learn something new. That&amp;rsquo;s why when &lt;a href="https://twitter.com/iASHeeesh" target="_blank" rel="noopener noreferrer"&gt;Ashish Choudhary&lt;/a&gt;
, the author of the book &amp;ldquo;&lt;strong&gt;Effortless Cloud Native App Development Using Skaffold&lt;/strong&gt; &amp;quot; asked for reviewers in the &lt;a href="https://foojayio.github.io/website/"&gt;foojay.io&lt;/a&gt;
 slack group, I jumped on the opportunity. I can learn something interesting and be productive (this book review).&lt;/p&gt;</description></item><item><title>K8ssandra: Production-Ready Platform for Cassandra on Kubernetes</title><link>https://foojayio.github.io/website/today/k8ssandra-production-ready-platform-for-running-apache-cassandra-on-kubernetes/</link><pubDate>Wed, 24 Nov 2021 09:45:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/k8ssandra-production-ready-platform-for-running-apache-cassandra-on-kubernetes/</guid><description>&lt;p&gt;&lt;a href="https://k8ssandra.io/" target="_blank" rel="noopener noreferrer"&gt;K8ssandra&lt;/a&gt;
, an open-source distribution of Apache Cassandra for Kubernetes, aims to provide a &amp;ldquo;production-ready platform&amp;rdquo;, and this includes automation for operational tasks such as repairs, backups, and monitoring. Cassandra is a distributed NoSQL database designed for global scale and fault tolerance for the most demanding applications on the planet, written in Java.&lt;/p&gt;
&lt;p&gt;K8ssandra is deployed using Helm and supports stateful workloads out of the box, which enables database administrators (DBAs) and site reliability engineers (SREs) to set up and operate Cassandra clusters using best practices in a Kubernetes environment.&lt;/p&gt;</description></item><item><title>Customer Miscommunication Leads to Ongoing Nightmare</title><link>https://foojayio.github.io/website/today/production-horrors-customer-miscommunication-leads-to-ongoing-nightmare/</link><pubDate>Tue, 16 Nov 2021 08:28:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/production-horrors-customer-miscommunication-leads-to-ongoing-nightmare/</guid><description>&lt;h3 id="h3-0-production-disasters-are-sometimes-those-pileups-we-can-see-coming-from-miles-away-but-the-train-is-moving-so-fast-we-can-t-possibly-stop-it-this-is-one-of-those-stories-in-it-a-combination-of-bad-communication-missing-skills-immature-technological-choices-created-a-pile-up"&gt;&lt;strong&gt;Production disasters are sometimes those pileups we can see coming from miles away. But the train is moving so fast we can&amp;rsquo;t possibly stop it. This is one of those stories. In it a combination of bad communication, missing skills, immature technological choices created a pile up.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;You can&amp;rsquo;t debug a specification. You must stay vigilant during the development cycle to find conceptual mistakes and reorient the Titanic.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a bit of a different story in the series. When I came up with the concept for production horrors my thoughts were mostly about a single day or a single event that made our production fail. Naturally our mind gravitates towards crashes or issues like the recent Facebook outage. But last time around, I gave the example of problematic caching that led to a billing problem&amp;hellip;&lt;/p&gt;</description></item><item><title>Lights, Camera, Action: GitHub Actions with Java (Part 2)</title><link>https://foojayio.github.io/website/today/github-actions-with-java-part-2/</link><pubDate>Mon, 15 Nov 2021 14:35:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/github-actions-with-java-part-2/</guid><description>&lt;figure class="alignright is-resized"&gt;
 &lt;img fetchpriority="high" decoding="async" src="distro-choice.jpg" alt="Distro Choice 337" width="308" height="465"&gt;
&lt;/figure&gt;
&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Have you ever been given too many choices resulting in the feeling of indifference (&amp;ldquo;not a big deal, doesn&amp;rsquo;t really matter either way&amp;rdquo;)? However, when given &lt;strong&gt;two&lt;/strong&gt; choices, somehow you feel torn or become more critical of one versus the other.&lt;/p&gt;
&lt;p&gt;In this short overview, you will learn how to create a GitHub Action workflow that allows you to choose a particular OpenJDK build distribution.&lt;/p&gt;
&lt;p&gt;And welcome back to the series of articles on GitHub Actions with Java &lt;strong&gt;Part 2&lt;/strong&gt; . If you didn&amp;rsquo;t catch &lt;strong&gt;Part 1&lt;/strong&gt; head over here: &lt;a href="https://foojayio.github.io/website/today/github-actions-with-java-part-1/"&gt;https://foojay.io/today/github-actions-with-java-part-1&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Production Horrors - Handling Disasters: Public Debrief. Handling failures</title><link>https://foojayio.github.io/website/today/production-horrors-handling-disasters-public-debrief/</link><pubDate>Wed, 03 Nov 2021 10:49:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/production-horrors-handling-disasters-public-debrief/</guid><description>&lt;p&gt;&lt;strong&gt;Just in time for Halloween failures in production are scarier than most movie monsters. Here&amp;rsquo;s a personal scary story of a production fail&amp;hellip;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Halloween is probably the most appropriate time to start this new series of articles. I &lt;a href="https://foojayio.github.io/website/today/author/shai-almog/"&gt;talk a lot about theory on Foojay&lt;/a&gt;
, but when you&amp;rsquo;re on the front line of a production disaster, it &amp;ldquo;gets real&amp;rdquo; very fast. People often think of production disasters as crashes or sites going down like the recent Facebook downtime. While that&amp;rsquo;s an interesting subject, a lot of these things can go under the radar and hit you like a brick wall.&lt;/p&gt;</description></item><item><title>Announcement: JReleaser 0.8.0 Released!</title><link>https://foojayio.github.io/website/today/jreleaser-0-8-0-released/</link><pubDate>Tue, 02 Nov 2021 12:12:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/jreleaser-0-8-0-released/</guid><description>&lt;p&gt;JReleaser is a tool that streamlines creating releases for [Java] projects.&lt;/p&gt;
&lt;p&gt;It can create a GitHub/GitLab/Gitea release, while also packaging binaries for Homebrew, Snapcraft, Docker, Chocolatey, Scoop, JBang and, more than that, announces releases to Twitter, SdkMan!, e-mail, Zulip, Discord, Gitter, Slack, Teams, and more.&lt;/p&gt;
&lt;p&gt;This release closes all required items in the v1.0.0 roadmap, opening the door for v1.0.0 to be released next after polish and housekeeping items are taken care of.&lt;/p&gt;</description></item><item><title>Lights, Camera, Action: GitHub Actions with Java (Part 1)</title><link>https://foojayio.github.io/website/today/github-actions-with-java-part-1/</link><pubDate>Thu, 28 Oct 2021 12:36:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/github-actions-with-java-part-1/</guid><description>&lt;h4 id="have-you-ever-heard-of-jenkins-travis-teamcity-or-bamboo"&gt;Have you ever heard of &lt;a href="https://www.jenkins.io/" target="_blank" rel="noopener noreferrer"&gt;Jenkins&lt;/a&gt;
, &lt;a href="https://www.travis-ci.com/" target="_blank" rel="noopener noreferrer"&gt;Travis&lt;/a&gt;
, &lt;a href="https://www.jetbrains.com/teamcity/" target="_blank" rel="noopener noreferrer"&gt;TeamCity&lt;/a&gt;
 or &lt;a href="https://www.atlassian.com/software/bamboo" target="_blank" rel="noopener noreferrer"&gt;Bamboo&lt;/a&gt;
?&lt;/h4&gt;
&lt;figure class="alignright size-full is-resized"&gt;
 &lt;img fetchpriority="high" decoding="async" src="github_smothie.jpg" alt="GitHub Actions with Java" class="wp-image-50461" width="332" height="442"&gt;
 &lt;figcaption&gt;
 "Github smoothie" Acarlos1000
 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;For those who do not know, these are build infrastructure software services that manage and schedule (notify) the building of software artifacts (yours).&lt;/p&gt;
&lt;p&gt;Often, you might hear the term &amp;ldquo;CI/CD pipelines&amp;rdquo;, which refers to the concept of Continuous Integration and/or Continuous Delivery. In layman&amp;rsquo;s terms, it&amp;rsquo;s all about building, testing and deploying software in an automated fashion.&lt;/p&gt;</description></item><item><title>Git Archeology: Removing the Sands of Time from Code</title><link>https://foojayio.github.io/website/today/git-archeology/</link><pubDate>Sat, 23 Oct 2021 06:55:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/git-archeology/</guid><description>&lt;p&gt;Working on a large codebase, it&amp;rsquo;s pretty normal to not remember every small or large subsystem or implementation choice. Be it whether you&amp;rsquo;re new to a codebase, or you&amp;rsquo;ve been focused on a specific area of the codebase.&lt;/p&gt;
&lt;p&gt;When working on refactorings or bug fixes, I often end up in areas I might not be too familiar with. Generally not dramatic, it happens quite often that I&amp;rsquo;m stopping what I&amp;rsquo;m doing because I need to decide on how to move forward. As software engineers, we have to make so many micro-decisions every minute that we&amp;rsquo;re pretty used to it.&lt;/p&gt;</description></item><item><title>PSA: The Risks of Remote JDWP Debugging: It's Like a Wide Open Door</title><link>https://foojayio.github.io/website/today/psa-the-risks-of-remote-jdwp-debugging/</link><pubDate>Wed, 20 Oct 2021 08:13:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/psa-the-risks-of-remote-jdwp-debugging/</guid><description>&lt;p&gt;&lt;strong&gt;It isn&amp;rsquo;t so much a security risk as it is a wide open door with everything labeled for anyone to take freely and matches to burn it all down&amp;hellip;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When I teach or lecture and mention security, I always love the analogy of security as an onion. This is a common cliché yet it&amp;rsquo;s still a powerful analogy for people who are new to the concepts. The equivalent analogy I would pick for remote debugging is like leaving your front door open with all your valuables piled in easy to spot and well labeled boxes. Calling JDWP insecure doesn&amp;rsquo;t make any sense. It wasn&amp;rsquo;t designed to be secure so it isn&amp;rsquo;t&amp;hellip;&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>JReleaser: Looking for Translation Contributions</title><link>https://foojayio.github.io/website/today/jreleaser-looking-for-translation-contributions/</link><pubDate>Fri, 08 Oct 2021 20:45:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/jreleaser-looking-for-translation-contributions/</guid><description>&lt;p&gt;The &lt;a href="https://jreleaser.org/" target="_blank" rel="noopener noreferrer"&gt;JReleaser project&lt;/a&gt;
 has recently added internationalization support to its CLI tool, with complete translations for English, German, French, and Brazilian Portuguese. A translation to Italian is currently in the works.&lt;/p&gt;
&lt;p&gt;The project is looking for people who would like to contribute translations to their native language, allowing JReleaser to reach and help an even wider audience.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re interested in joining these efforts, please open a ticket at &lt;a href="https://github.com/jreleaser/jreleaser/issues" target="_blank" rel="noopener noreferrer"&gt;https://github.com/jreleaser/jreleaser/issues&lt;/a&gt;
, letting the project maintainers know which language you&amp;rsquo;d like to tackle.&lt;/p&gt;</description></item><item><title>This Just In: JReleaser 0.7.0 Released!</title><link>https://foojayio.github.io/website/today/jreleaser-0-7-0-released/</link><pubDate>Wed, 29 Sep 2021 12:12:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/jreleaser-0-7-0-released/</guid><description>&lt;p&gt;JReleaser is a tool that streamlines creating releases for [Java] projects.&lt;/p&gt;
&lt;p&gt;It can create a GitHub/GitLab/Gitea release, while also packaging binaries for Homebrew, Snapcraft, Docker, Chocolatey, Scoop, JBang and, more than that, announces releases to Twitter, SdkMan!, e-mail, Zulip, Discord, Gitter, Slack, Teams, and more.&lt;/p&gt;
&lt;p&gt;This is a small release as core features are mostly complete:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JDKs:&lt;/strong&gt; The jdks-gradle-plugin now unpacks the chosen JDK distribution in a subdirectory that matches the configured named. This is a breaking change! Additionally, tasks for removing cached JDKs were also added.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; Linking a release to a discussion is automatically skipped if the release is a draft or early access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Changelog:&lt;/strong&gt; You can now specify if a full or partial changelog should be generated when the release is early access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Homebrew:&lt;/strong&gt; Fixes automatic generation of Cask v.s Formula.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Release:&lt;/strong&gt; You may skip creating a release but keep the tag. This is useful for the case when you&amp;rsquo;d like to push release assets via an uploader but want to skip creating a Git release.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full changelog can be found at the &lt;a href="https://github.com/jreleaser/jreleaser/releases/tag/v0.7.0" target="_blank" rel="noopener noreferrer"&gt;v0.7.0&lt;/a&gt;
 release page.&lt;/p&gt;</description></item><item><title>Looking For Free Docker Registries</title><link>https://foojayio.github.io/website/today/looking-for-free-docker-registries/</link><pubDate>Tue, 24 Aug 2021 07:19:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/looking-for-free-docker-registries/</guid><description>&lt;p&gt;Since Docker announced that it would remove unused images from Docker Hub, I&amp;rsquo;ve been interested in listing places where I could host mine.&lt;/p&gt;
&lt;p&gt;As it&amp;rsquo;s for personal purposes, I&amp;rsquo;m interested in free plans. Here&amp;rsquo;s what I found:&lt;/p&gt;
&lt;p&gt;| Provider | Private? | Monthly limit || Details |&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Provider&lt;/th&gt;
					&lt;th&gt;Private?&lt;/th&gt;
					&lt;th&gt;Storage&lt;/th&gt;
					&lt;th&gt;Transfer&lt;/th&gt;
					&lt;th&gt;Details&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="https://www.docker.com/pricing" target="_blank" rel="noopener noreferrer"&gt;Docker Hub&lt;/a&gt;
&lt;/td&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;❓&lt;/td&gt;
					&lt;td&gt;* Anonymous: 100 pulls / 6 hours * Authenticated: 200 pulls / 6 hours&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="https://docs.gitlab.com/ee/user/packages/container_registry/" target="_blank" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt;
&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;10Gb&lt;/td&gt;
					&lt;td&gt;❓&lt;/td&gt;
					&lt;td&gt;* Storage quota is per-project * Quota includes &lt;strong&gt;all&lt;/strong&gt; artifacts, including code&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="https://docs.github.com/en/packages/guides/about-github-container-registry" target="_blank" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;&amp;gt; GitHub Container Registry is currently in public beta and subject to change. During the beta, storage and bandwidth are free&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="https://aws.amazon.com/ecr/pricing/" target="_blank" rel="noopener noreferrer"&gt;AWS&lt;/a&gt;
&lt;/td&gt;
					&lt;td&gt;* First year only * 500Mb storage&lt;/td&gt;
					&lt;td&gt;50Gb&lt;/td&gt;
					&lt;td&gt;* Anonymous: 500Gb * Authenticated: 5Tb&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="https://cloud.ibm.com/registry/catalog" target="_blank" rel="noopener noreferrer"&gt;IBM Cloud&lt;/a&gt;
&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;500Mb&lt;/td&gt;
					&lt;td&gt;5Gb&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Here are some additional options with their associated pricing model:&lt;/p&gt;</description></item><item><title>SolarWinds Hack: What Does This Mean For Us?</title><link>https://foojayio.github.io/website/today/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/</link><pubDate>Thu, 19 Aug 2021 08:19:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/</guid><description>&lt;p&gt;In the past two years, we have had to learn a lot about cybersecurity. New attack vectors are becoming more and more sophisticated and are directed more and more against the value chain in general.&lt;/p&gt;
&lt;p&gt;But what does that mean for us? What can be done about it, and what reactions have the state already taken?&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with the story that got all of this rolling and made sure that the general attention was drawn to the vulnerabilities of the available IT infrastructure.&lt;/p&gt;</description></item><item><title>Updating Data Files: Commits vs. Pull Requests?</title><link>https://foojayio.github.io/website/today/updating-data-files-commits-vs-pull-requests/</link><pubDate>Wed, 18 Aug 2021 17:22:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/updating-data-files-commits-vs-pull-requests/</guid><description>&lt;p&gt;For once, I&amp;rsquo;m wondering a bit if this article can be helpful to somebody else since I believe my context is pretty specific. Anyway, just in case it might be the helpful case, here it is!&lt;/p&gt;
&lt;p&gt;My &lt;a href="https://github.com/hazelcast/jet-train" target="_blank" rel="noopener noreferrer"&gt;Jet Train&lt;/a&gt;
 project makes use of &lt;a href="https://developers.google.com/transit/gtfs" target="_blank" rel="noopener noreferrer"&gt;GTFS&lt;/a&gt;
. GTFS stands for General Transit Feed Specification. It models public transportation schedules and their associated geographic information.&lt;/p&gt;
&lt;p&gt;GTFS is based on two kinds of data, static data, and dynamic data. Static data may change but do so rarely, &lt;em&gt;e.g.&lt;/em&gt;, transit agencies and bus stations. They are available as static files that you need to download now and then. Before, I had to download and overwrite them every time I run the demo.&lt;/p&gt;</description></item><item><title>Introducing SAST, DAST, IAST and RASP</title><link>https://foojayio.github.io/website/today/sast-dast-iast-and-rasp/</link><pubDate>Thu, 05 Aug 2021 08:28:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/sast-dast-iast-and-rasp/</guid><description>&lt;p&gt;In this article, we&amp;rsquo;re going to look at the differences between the various cybersecurity defence techniques. Here you can identify four main groups, which we will go through briefly one after another to illustrate the advantages and disadvantages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SAST: Static Application Security Testing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;SAST describes the process in which the components of an application are subjected to a static analysis. This approach not only searches for security gaps but also determines the licenses for the individual elements. In the following, however, I will only deal with the consideration of vulnerabilities.&lt;/p&gt;</description></item><item><title>GitLab: Your Continuous Deployment One-Stop Shop</title><link>https://foojayio.github.io/website/today/gitlab-continuous-deployment-one-stop-shop/</link><pubDate>Wed, 04 Aug 2021 07:44:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/gitlab-continuous-deployment-one-stop-shop/</guid><description>&lt;p&gt;This week, I want to take a break from my Rust series and focus on a different subject. I&amp;rsquo;ve already written about &lt;a href="https://blog.frankel.ch/my-blogging-stack-publishing-process/" target="_blank" rel="noopener noreferrer"&gt;my blogging stack&lt;/a&gt;
 in detail.&lt;/p&gt;
&lt;p&gt;However, I didn&amp;rsquo;t touch on one facet and that facet is how I generate the static pages from Jekyll. As I describe in the blog post, I&amp;rsquo;ve included quite a couple of customizations. Some of them require external dependencies, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A for PlantUML diagrams generation&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;graphviz&lt;/em&gt; package for the same reason&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All in all, it means that I require a fully configured system. I solved this problem by using containerization, namely Docker. Within the &lt;code&gt;Dockerfile&lt;/code&gt;, I&amp;rsquo;m able to install all required dependencies. Then, in my GitLab build file, I can reference this image and benefit from all its capabilities.&lt;/p&gt;</description></item><item><title>Announcement: JReleaser 0.6.0 Released!</title><link>https://foojayio.github.io/website/today/jreleaser-0-6-0-released/</link><pubDate>Tue, 03 Aug 2021 18:15:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/jreleaser-0-6-0-released/</guid><description>&lt;p&gt;&lt;strong&gt;JReleaser is a tool that streamlines creating releases for [Java] projects. It can create a GitHub/GitLab/Gitea release, while also packaging binaries for Homebrew, Snapcraft, Docker, Chocolatey, Scoop, JBang and, more than that, announces releases to Twitter, SdkMan!, e-mail, Zulip, Discord, Gitter, Slack, Teams, and more.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this release you&amp;rsquo;ll find updates and features such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Several updates to the Homebrew packager, such as multi-platform (OSX &amp;amp; Linux) support, ability to use the &lt;code&gt;binary&lt;/code&gt; stanza with &lt;code&gt;.zip&lt;/code&gt; artifacts, ability to use the &lt;code&gt;appcast&lt;/code&gt; stanza with casks, ability to explicitly enable or disable generation of Casks.&lt;/li&gt;
&lt;li&gt;Sdkman has been split into packager and announcer, giving you more options to publish multiple candidates per project. The old behavior remains in place, that is, the announcer can publish and announce a single candidate for the whole project.&lt;/li&gt;
&lt;li&gt;Uploaders such as JFrog Artifactory and HTTP can now configure a downloadURL variable that can be used in templates.&lt;/li&gt;
&lt;li&gt;You can now target with pinpoint accuracy how artifacts, files, and globs should be uploaded, released, checksumed, and signed. These 4 sections offer configurable properties to activate or deactivate their targets. You also have the choice of adding extra properties to artifacts fur further tweaking the desired behavior.&lt;/li&gt;
&lt;li&gt;Partial model evaluation lets you execute a release for artifacts matching a particular platform. Useful when dealing with Native Image and Native Package distributions when not all artifacts are locally available. Model properties may also be overridden from the command line, user or project properties (Maven), or project properties (Gradle).&lt;/li&gt;
&lt;li&gt;Changelog formatting options now include the ability to hide specific commit categories (such as merge commits if you have configured such category) as well as contributors (such as bots). You can also format how contributors are displayed, for example linking to their Git profile with their username or name.&lt;/li&gt;
&lt;li&gt;The Docker packager now lets you publish packaged files (Dockerfile + supporting files) to a Git repository of your choice.&lt;/li&gt;
&lt;li&gt;The Article announcer lets you bootstrap a blog post or article based on templates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full changelog can be found at the &lt;a href="https://github.com/jreleaser/jreleaser/releases/tag/v0.6.0" title="v0.6.0 release" target="_blank" rel="noopener noreferrer"&gt;v0.6.0 release&lt;/a&gt;
 page.&lt;/p&gt;</description></item><item><title>SKP's Primer: Failures, Pitfalls, and Disadvantages of Microservices</title><link>https://foojayio.github.io/website/today/skps-definitive-primer-failures-pitfalls-and-disadvantages-of-microservices/</link><pubDate>Mon, 02 Aug 2021 09:35:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/skps-definitive-primer-failures-pitfalls-and-disadvantages-of-microservices/</guid><description>&lt;p&gt;&lt;strong&gt;[About SKP&amp;rsquo;s Definitive Microservices Primer]&lt;/strong&gt;&lt;br&gt;
Series of Articles on Microservices Architecture. They Revolve Around Microservices Strategy, Decision Making, Monolithic vs Microservices, Microservices Infrastructure, Failures &amp;amp; Pitfalls of Microservices, Microservices Design Patterns, Database Design, Security, Logging, Messaging, Containerization, Cloud Providers and Everything that is Microservices and More!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="h2-0-intro-to-microservices-adoption-in-real-world"&gt;Intro to Microservices Adoption in Real World&lt;/h2&gt;
&lt;p&gt;Microservices Adoption is almost becoming the normal in almost all software product and it services organizations. Hereby, i am taking this opportunity to make you aware of the Real-World Issues (Case Studies) that are faced by organizations (small, mid, large) of all sizes in migrating or adopting microservices. Since learning from other&amp;rsquo;s mistakes and knowing the pitfalls upfront help us prepare and plan better - this article will be helpful for those planning a shift to the Microservices Strategy organization-wide or simply making a move from Monolithic to Microservices Architecture.&lt;/p&gt;</description></item><item><title>Connect Stateful Workloads Across Kubernetes Clusters</title><link>https://foojayio.github.io/website/today/connect-stateful-workloads-across-kubernetes-clusters/</link><pubDate>Fri, 23 Jul 2021 08:44:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/connect-stateful-workloads-across-kubernetes-clusters/</guid><description>&lt;p&gt;One of the biggest selling points of Apache Cassandra™ is its shared-nothing architecture, making it an ideal choice for deployments that span multiple physical datacenters. So when our &lt;a href="https://astra.datastax.com/" target="_blank" rel="noopener noreferrer"&gt;Cassandra as-a-service&lt;/a&gt;
 single-region offering reached maturity, we naturally started looking into offering it cross-region and cross-cloud.&lt;/p&gt;
&lt;p&gt;One of the biggest challenges in providing a solution that spans multiple regions and clouds is correctly configuring the network so that Cassandra nodes in different data centers can communicate with each other successfully, even as individual nodes are added, replaced, or removed. From the start of the cloud journey at DataStax, we selected Kubernetes as our orchestration platform, so our search for a networking solution started there. While we&amp;rsquo;ve benefited immensely from the ecosystem and have our share of war stories, this time we chose to forge our own path, landing on ad-hoc overlay virtual application networks (how&amp;rsquo;s that for a buzzword soup?).&lt;/p&gt;</description></item><item><title>CVSS 101: First Steps with Common Vulnerability Scoring System</title><link>https://foojayio.github.io/website/today/cvss-101-first-steps-with-common-vulnerability-scoring-system/</link><pubDate>Wed, 14 Jul 2021 06:56:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/cvss-101-first-steps-with-common-vulnerability-scoring-system/</guid><description>&lt;p&gt;What is the &lt;a href="https://www.first.org/cvss/v3.0/specification-document" target="_blank" rel="noopener noreferrer"&gt;Common Vulnerability Scoring System&lt;/a&gt;
 (CVSS), who is behind it, what are we doing with it, and what does a CVSS Value mean for you?&lt;/p&gt;
&lt;p&gt;On Foojay, you can apply the insights below to understand the &lt;a href="https://foojayio.github.io/website/java-15/?quarter=102020&amp;amp;tab=cve&amp;amp;version=15.0.1"&gt;Security/CVE Views in the OpenJDK Update &amp;amp; Release Details pages&lt;/a&gt;
, such as the one shown here:
&lt;a href="https://foojayio.github.io/website/java-15/?quarter=102020&amp;amp;tab=cve&amp;amp;version=15.0.1"&gt;&lt;img src="https://foojayio.github.io/website/today/cvss-101-first-steps-with-common-vulnerability-scoring-system/image-3-1024x481.png" alt="" loading="lazy"&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I will explain how a CVSS Score is calculated, what the different elements of it mean, and what are the differences between the different CVSS versions.&lt;/p&gt;</description></item><item><title>A Case for Databases on Kubernetes from a Former Skeptic</title><link>https://foojayio.github.io/website/today/a-case-for-databases-on-kubernetes-from-a-former-skeptic/</link><pubDate>Tue, 13 Jul 2021 09:12:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-case-for-databases-on-kubernetes-from-a-former-skeptic/</guid><description>&lt;p&gt;Kubernetes is everywhere. Transactional apps, video streaming services and machine learning workloads are finding a home on this ever-growing platform. But what about databases?&lt;/p&gt;
&lt;p&gt;If you had asked me this question five years ago, the answer would have been a resounding &amp;ldquo;&lt;strong&gt;No!&lt;/strong&gt; &amp;quot; &amp;mdash; based on my experience in development and operations. In the following years, as more resources emerged for stateful applications, my answer would have changed to &amp;ldquo;&lt;em&gt;&lt;strong&gt;Maybe&lt;/strong&gt;,&amp;rdquo;&lt;/em&gt; but always with a qualifier: &amp;ldquo;It&amp;rsquo;s fine for development or test environments&amp;hellip;&amp;rdquo; or &amp;ldquo;If the rest of your tooling is Kubernetes-based, and you have extensive experience&amp;hellip;&amp;rdquo;&lt;/p&gt;</description></item><item><title>About The Lifecycle of a Security Vulnerability</title><link>https://foojayio.github.io/website/today/the-lifecycle-of-a-security-vulnerability/</link><pubDate>Thu, 08 Jul 2021 08:40:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-lifecycle-of-a-security-vulnerability/</guid><description>&lt;p&gt;Again and again, we read in the IT news about new security gaps that have been identified. The more severe the classification of the loophole, the more attention the information receives in the general press. Most of the time, you don&amp;rsquo;t even hear or read anything about all the security holes found that are not as well known as the SolarWinds Hack, for example.&lt;/p&gt;
&lt;p&gt;But what is the typical lifecycle of such a security gap?&lt;/p&gt;</description></item><item><title>Kubernetes Is The Best Technology For Running A Cloud-Native Database</title><link>https://foojayio.github.io/website/today/why-kubernetes-is-the-best-technology-for-running-a-cloud-native-database/</link><pubDate>Wed, 30 Jun 2021 09:13:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-kubernetes-is-the-best-technology-for-running-a-cloud-native-database/</guid><description>&lt;p&gt;We&amp;rsquo;ve been talking about migrating workloads to the cloud for a long time, but a look at the application portfolios of many IT organizations demonstrates that there&amp;rsquo;s still a lot of work to be done. In many cases, challenges with persisting and moving data in clouds continue to be the key limiting factor slowing cloud adoption, despite the fact that databases in the cloud have been available for years.&lt;/p&gt;
&lt;p&gt;For this reason, there has been a surge of recent interest in data infrastructure that is designed to take maximum advantage of the benefits that cloud computing provides. A &lt;a href="https://k8ssandra.io/blog/2021/03/23/the-search-for-a-cloud-native-database/?ref=hackernoon.com" target="_blank" rel="noopener noreferrer"&gt;cloud-native database&lt;/a&gt;
 is one that achieves the goals of scalability, elasticity, resiliency, observability, and automation; the &lt;a href="https://k8ssandra.io/?utm_medium=referral&amp;amp;utm_source=hackernoon&amp;amp;utm_campaign=k8ssandra&amp;amp;ref=hackernoon.com" target="_blank" rel="noopener noreferrer"&gt;K8ssandra&lt;/a&gt;
 project is a great example. It packages Apache Cassandra and supporting tools into a production-ready Kubernetes deployment.&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>Querying Your In-Memory-Data-Grid: Why and How?</title><link>https://foojayio.github.io/website/today/querying-your-in-memory-data-grid-why-and-how/</link><pubDate>Fri, 21 May 2021 07:11:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/querying-your-in-memory-data-grid-why-and-how/</guid><description>&lt;blockquote&gt;
&lt;p&gt;An in-memory data grid (IMDG) is a set of networked/clustered computers that pool together their random access memory (RAM) to let applications share data with other applications running in the cluster. Though IMDGs are sometimes generically described as a distributed in-memory data store, IMDGs offer more than just storage. IMDGs are built for data processing at extremely high speeds. They are designed for building and running large-scale applications that need more RAM than is typically available in a single computer server. This enables the highest application performance by using RAM along with the processing power of multiple computers that run tasks in parallel. IMDGs are especially valuable for applications that do extensive parallel processing on large data sets.&lt;/p&gt;</description></item><item><title>Namespace Shadowing (a.k.a. “Dependency Confusion”) Attack</title><link>https://foojayio.github.io/website/today/namespace-shadowing-a-k-a-dependency-confusion-attack/</link><pubDate>Thu, 22 Apr 2021 06:31:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/namespace-shadowing-a-k-a-dependency-confusion-attack/</guid><description>&lt;h3 id="h3-0-tl-dr-yet-another-case-for-using-exclude-patterns-in-remote-repositories"&gt;TL;DR: Yet Another Case for Using Exclude Patterns in Remote Repositories&lt;/h3&gt;
&lt;p&gt;The npm Registry is vulnerable to supply chain namespace shadowing, also known as &amp;ldquo;Dependency Confusion&amp;rdquo; attacks. Make sure you create npm scoped packages and force exclude patterns.&lt;/p&gt;
&lt;h3 id="h3-1-long-time-obsession-with-exclude-patterns"&gt;Long-time Obsession with Exclude Patterns&lt;/h3&gt;
&lt;p&gt;I remember the first JFrog customer training I delivered in February 2012. This slide was the one where I explained the importance of setting exclude patterns on your repositories (you can see it is 2012 by the slide design, right? Also, Ant was a thing.):&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>DevOps 101 Part III: Package Management</title><link>https://foojayio.github.io/website/today/devops-101-part-iii-package-management/</link><pubDate>Wed, 24 Mar 2021 07:35:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/devops-101-part-iii-package-management/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This post was originally published by &lt;a href="https://dev.to/katcosgrove" target="_blank" rel="noopener noreferrer"&gt;Kat Costgove&lt;/a&gt;
 at &lt;a href="https://dev.to/jfrog/devops-101-package-management-1i14" target="_blank" rel="noopener noreferrer"&gt;Dev.to&lt;/a&gt;
.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When you&amp;rsquo;re new to an industry, you encounter a lot of new concepts. This can make it really difficult to get your feet underneath you on an unfamiliar landscape, especially for junior engineers. What&amp;rsquo;s all this jargon? What does DevOps really mean? What&amp;rsquo;s all this software? Is DevOps a methodology, or a toolset? Is any of this actually going to make my life easier, or is it just a bunch of industry buzzwords?&lt;/p&gt;</description></item><item><title>DevOps 101 Part II: Introduction to Container Registries</title><link>https://foojayio.github.io/website/today/devops-101-part-ii-container-registries/</link><pubDate>Wed, 17 Mar 2021 08:58:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/devops-101-part-ii-container-registries/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This post was originally published by &lt;a href="https://dev.to/katcosgrove" target="_blank" rel="noopener noreferrer"&gt;Kat Costgove&lt;/a&gt;
 at &lt;a href="https://dev.to/jfrog/devops-101-container-registries-1lil" target="_blank" rel="noopener noreferrer"&gt;Dev.to&lt;/a&gt;
.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When you&amp;rsquo;re new to an industry, you encounter a lot of new concepts. This can make it really difficult to get your feet underneath you on an unfamiliar landscape, especially for junior engineers.&lt;/p&gt;
&lt;p&gt;In this series (&lt;a href="https://foojayio.github.io/website/today/devops-101-part-i-ci-cd/"&gt;part 1 is here&lt;/a&gt;
), I&amp;rsquo;m covering tools and terminology common to the DevOps space, plus the occasional newbie-friendly tutorial for emerging or established technologies. If you have a request or suggestion, let me know!&lt;/p&gt;</description></item><item><title>Intro for Java Devs to DevOps 101 Part I: CI/CD</title><link>https://foojayio.github.io/website/today/devops-101-part-i-ci-cd/</link><pubDate>Tue, 09 Mar 2021 08:00:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/devops-101-part-i-ci-cd/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This post was originally published by &lt;a href="https://dev.to/katcosgrove" target="_blank" rel="noopener noreferrer"&gt;Kat Costgove&lt;/a&gt;
 at &lt;a href="https://dev.to/jfrog/devops-101-ci-cd-49il" target="_blank" rel="noopener noreferrer"&gt;Dev.to&lt;/a&gt;
.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When you&amp;rsquo;re new to an industry, you encounter a lot of new concepts. This can make it really difficult to get your feet underneath you on an unfamiliar landscape, especially for junior engineers.&lt;/p&gt;
&lt;p&gt;In this series, I&amp;rsquo;ll cover &lt;a href="https://jfrog.com/devops-tools/" target="_blank" rel="noopener noreferrer"&gt;tools&lt;/a&gt;
 and terminology common to the DevOps space, plus the occasional newbie-friendly tutorial for emerging or established technologies. If you have a request or suggestion, let me know!&lt;/p&gt;</description></item><item><title>Demystifying Google Container Tool, Jib: Java Image Builder</title><link>https://foojayio.github.io/website/today/demystifying-google-container-tool-jib-java-image-builder/</link><pubDate>Thu, 18 Feb 2021 18:42:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/demystifying-google-container-tool-jib-java-image-builder/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This article covers some internals of image layering created by container image builder Jib and explore what distroless images are and their benefits.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Are you wondering what Jib is, actually? You should probably read my previous &lt;a href="https://ashishtechmill.com/containerizing-spring-boot-application-with-jib" title="article" target="_blank" rel="noopener noreferrer"&gt;article&lt;/a&gt;
 before going ahead.&lt;/p&gt;
&lt;p&gt;In short, Jib is an excellent tool for Java developers who are interested in containerizing Java applications, but not so interested in creating and maintaining Dockerfile or installing Docker. A Java developer can add a plugin to Maven or Gradle, and that&amp;rsquo;s it. You don&amp;rsquo;t have to learn new technology just to containerize your Java application.&lt;/p&gt;</description></item><item><title>Quick Security Wins and Getting Started with DevSecOps</title><link>https://foojayio.github.io/website/today/getting-started-with-devsecops/</link><pubDate>Wed, 03 Feb 2021 17:41:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/getting-started-with-devsecops/</guid><description>&lt;p&gt;&lt;em&gt;Hello and welcome to my first DevSecOps article! Here in Germany, it&amp;rsquo;s winter right now, and the forests are quiet. The snow slows down everything and it&amp;rsquo;s a beautiful time to move undisturbed through the woods.&lt;/em&gt; &lt;em&gt;Here you can pursue your thoughts, and I started thinking about a subject that customers or participants at conferences ask me repeatedly.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The question I am asked is almost always: &amp;ldquo;What are the quick wins or low hanging fruits if you want to deal more with the topic of security in software development? And I want you to answer this question right &lt;strong&gt;now!&lt;/strong&gt;&amp;rdquo;&lt;/p&gt;</description></item><item><title>Astra Service Broker: Tradeoff-Free Cassandra in Kubernetes</title><link>https://foojayio.github.io/website/today/announcing-the-astra-service-broker-tradeoff-free-cassandra-in-kubernetes/</link><pubDate>Thu, 19 Nov 2020 19:52:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/announcing-the-astra-service-broker-tradeoff-free-cassandra-in-kubernetes/</guid><description>&lt;p&gt;When you are designing and building a cloud-native application, you are probably thinking about deploying it with Kubernetes. What about the database? That can get a bit more complicated as you weigh out the tradeoffs of elasticity, scale, and self-healing requirements versus maintaining servers and the long term operations required. Apache Cassandra™ ticks the first three boxes easily, but what about the operational burden of managing Cassandra? That&amp;rsquo;s where the cloud-native Cassandra service, &lt;a href="https://www.datastax.com/products/datastax-astra" target="_blank" rel="noopener noreferrer"&gt;DataStax Astra&lt;/a&gt;
, helps both operators and developers. But what makes it easy for deployments on Kubernetes to access the Astra managed service?&lt;/p&gt;</description></item></channel></rss>