<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Posts on kidoni.dev</title>
    <link>https://kidoni.dev/posts/</link>
    <description>Recent content in Posts on kidoni.dev</description>
    <generator>Hugo -- 0.157.0</generator>
    <language>en-US</language>
    <lastBuildDate>Fri, 20 Feb 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://kidoni.dev/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Vibe Coding a Lox Compiler, Part 0: Background</title>
      <link>https://kidoni.dev/posts/vibe-lox-pt0-preamble/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/vibe-lox-pt0-preamble/</guid>
      <description>Using Claude Code to build a compiler and blog about it&amp;#34;</description>
    </item>
    <item>
      <title>Vibe Coding a Lox Compiler, Part 1: Introduction &amp; Compilers 101</title>
      <link>https://kidoni.dev/posts/vibe-lox-pt1-introduction/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/vibe-lox-pt1-introduction/</guid>
      <description>An introduction to the series and a Compilers 101 primer covering tokenization, parsing, ASTs, interpreters, VMs, and native compilation.</description>
    </item>
    <item>
      <title>Vibe Coding a Lox Compiler, Part 2: Tokenization</title>
      <link>https://kidoni.dev/posts/vibe-lox-pt2-tokenization/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/vibe-lox-pt2-tokenization/</guid>
      <description>How vibe-lox turns raw Lox source text into a stream of typed tokens using the winnow parser-combinator library.</description>
    </item>
    <item>
      <title>Vibe Coding a Lox Compiler, Part 3: Parsing &amp; the Abstract Syntax Tree</title>
      <link>https://kidoni.dev/posts/vibe-lox-pt3-parsing/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/vibe-lox-pt3-parsing/</guid>
      <description>How vibe-lox turns a flat token stream into a typed Abstract Syntax Tree using a hand-written recursive descent parser.</description>
    </item>
    <item>
      <title>Vibe Coding a Lox Compiler, Part 4: The Tree-Walk Interpreter</title>
      <link>https://kidoni.dev/posts/vibe-lox-pt4-interpreter/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/vibe-lox-pt4-interpreter/</guid>
      <description>How vibe-lox executes Lox programs by walking the AST — including the resolver, scoped environments, closures, and OOP.</description>
    </item>
    <item>
      <title>Vibe Coding a Lox Compiler, Part 5: The Bytecode VM</title>
      <link>https://kidoni.dev/posts/vibe-lox-pt5-vm/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/vibe-lox-pt5-vm/</guid>
      <description>How vibe-lox compiles Lox to bytecode and executes it on a stack-based virtual machine — roughly 3× faster than tree-walking.</description>
    </item>
    <item>
      <title>Vibe Coding a Lox Compiler, Part 6: LLVM IR &amp; Native Compilation</title>
      <link>https://kidoni.dev/posts/vibe-lox-pt6-llvm/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/vibe-lox-pt6-llvm/</guid>
      <description>How vibe-lox compiles Lox to LLVM IR and native executables using the inkwell crate, a C runtime, and LLVM&amp;#39;s TargetMachine.</description>
    </item>
    <item>
      <title>Vibe Coding a Lox Compiler, Part 7: The REPL</title>
      <link>https://kidoni.dev/posts/vibe-lox-pt7-repl/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/vibe-lox-pt7-repl/</guid>
      <description>Building an interactive Lox REPL with backslash commands and tab completion using the rustyline crate.</description>
    </item>
    <item>
      <title>Level Up Your Rust Testing With testcontainers and rstest</title>
      <link>https://kidoni.dev/posts/up-your-rust-testing-game/</link>
      <pubDate>Sun, 07 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/up-your-rust-testing-game/</guid>
      <description>Leverage the `testcontainers` and `rstest` crates for testing with Rust</description>
    </item>
    <item>
      <title>Using CodeSnap or nvim-silicon For Screenshots in Neovim</title>
      <link>https://kidoni.dev/posts/codesnap-vs-silicon/</link>
      <pubDate>Wed, 19 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/codesnap-vs-silicon/</guid>
      <description>Comparing CodeSnap and nvim-silicon as screenshot plugins in Neovim.</description>
    </item>
    <item>
      <title>Protecting Secrets in Dotfiles with Chezmoi</title>
      <link>https://kidoni.dev/posts/chezmoi-templates-and-secrets/</link>
      <pubDate>Fri, 20 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/chezmoi-templates-and-secrets/</guid>
      <description>Don&amp;#39;t put sensitive details like passwords or API keys in your dotfiles</description>
    </item>
    <item>
      <title>My Take on Helix and Neovim</title>
      <link>https://kidoni.dev/posts/helix-vs-neovim/</link>
      <pubDate>Sat, 14 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/helix-vs-neovim/</guid>
      <description>How do I like Helix and how does it compare to Neovim at this stage?</description>
    </item>
    <item>
      <title>Peekable Iterators in Java</title>
      <link>https://kidoni.dev/posts/peekable-iterator-in-java/</link>
      <pubDate>Sat, 07 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/peekable-iterator-in-java/</guid>
      <description>an implementation of an iterator allowing peeking ahead.</description>
    </item>
    <item>
      <title>Using chezmoi part 2 - Templates</title>
      <link>https://kidoni.dev/posts/using-templates-with-chezmoi/</link>
      <pubDate>Mon, 07 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/using-templates-with-chezmoi/</guid>
      <description>chezmoi has a robust templating system; let&amp;#39;s see how to use it</description>
    </item>
    <item>
      <title>Quick bytes - using UDP in Rust</title>
      <link>https://kidoni.dev/posts/udp-example/</link>
      <pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/udp-example/</guid>
      <description>a simple example using UDP to send and receive data with Rust</description>
    </item>
    <item>
      <title>What does &#34;kidoni&#34; mean?</title>
      <link>https://kidoni.dev/posts/what-does-kidoni-mean/</link>
      <pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/what-does-kidoni-mean/</guid>
      <description>Where did I get &amp;#34;kidoni&amp;#34; from?</description>
    </item>
    <item>
      <title>Using Java&#39;s New Gatherer Interface</title>
      <link>https://kidoni.dev/posts/java-stream-gatherer-interface/</link>
      <pubDate>Sat, 01 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/java-stream-gatherer-interface/</guid>
      <description>Create new collectors using Java&amp;#39;s Gatherer interface, using some Rust methods as examples.</description>
    </item>
    <item>
      <title>Taking Screenshots in Neovim with Silicon</title>
      <link>https://kidoni.dev/posts/nvim-silicon-plugin/</link>
      <pubDate>Sat, 15 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/nvim-silicon-plugin/</guid>
      <description>Integrating the `silicon` tool with Neovim to take screenshots of code.</description>
    </item>
    <item>
      <title>Totally Terrific Terminal Tools</title>
      <link>https://kidoni.dev/posts/terminal-power-user/</link>
      <pubDate>Mon, 03 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/terminal-power-user/</guid>
      <description>Some tools for terminals can seriously up your programming game.</description>
    </item>
    <item>
      <title>Using chezmoi to manage dotfiles</title>
      <link>https://kidoni.dev/posts/using-chezmoi/</link>
      <pubDate>Thu, 09 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/using-chezmoi/</guid>
      <description>how I have set up chezmoi to manage my dotfiles</description>
    </item>
    <item>
      <title>Learning Git Internals with Rust - Part 6</title>
      <link>https://kidoni.dev/posts/learning-git-pt6/</link>
      <pubDate>Mon, 07 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/learning-git-pt6/</guid>
      <description>git tree and commit objects</description>
    </item>
    <item>
      <title>Learning Git Internals with Rust - Part 5</title>
      <link>https://kidoni.dev/posts/learning-git-pt5/</link>
      <pubDate>Sun, 06 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/learning-git-pt5/</guid>
      <description>git ls-tree</description>
    </item>
    <item>
      <title>Could I Possibly Switch from JetBrains IDEs to Neovim?</title>
      <link>https://kidoni.dev/posts/could-i-possibly-switch-from-jetbrains-ides-to-neovim/</link>
      <pubDate>Mon, 02 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/could-i-possibly-switch-from-jetbrains-ides-to-neovim/</guid>
      <description>Is Neovim and IDE on par with JetBrains&amp;#39; IDEs and other GUI IDEs?</description>
    </item>
    <item>
      <title>Learning Git Internals with Rust - Part 4</title>
      <link>https://kidoni.dev/posts/learning-git-pt4/</link>
      <pubDate>Sun, 25 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/learning-git-pt4/</guid>
      <description>git cat-file</description>
    </item>
    <item>
      <title>Learning Git Internals with Rust - Part 3</title>
      <link>https://kidoni.dev/posts/learning-git-pt3/</link>
      <pubDate>Tue, 20 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/learning-git-pt3/</guid>
      <description>Rust refactoring</description>
    </item>
    <item>
      <title>Learning Git Internals with Rust - Part 2</title>
      <link>https://kidoni.dev/posts/learning-git-pt2/</link>
      <pubDate>Tue, 30 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/learning-git-pt2/</guid>
      <description>Git Objects</description>
    </item>
    <item>
      <title>Learning Git Internals with Rust</title>
      <link>https://kidoni.dev/posts/learning-git-pt1/</link>
      <pubDate>Fri, 26 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/learning-git-pt1/</guid>
      <description>the first in a series on Git internals as a project to learn Rust</description>
    </item>
    <item>
      <title>Text Parsing in Rust with Nom</title>
      <link>https://kidoni.dev/posts/text-parsing-in-rust-with-nom/</link>
      <pubDate>Thu, 11 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/text-parsing-in-rust-with-nom/</guid>
      <description>using the nom crate for creating parsers in Rust</description>
    </item>
    <item>
      <title>Using thread locals in Rust</title>
      <link>https://kidoni.dev/posts/using-thread-locals-in-rust/</link>
      <pubDate>Fri, 14 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/using-thread-locals-in-rust/</guid>
      <description>one approach to thread-local data in Rust</description>
    </item>
    <item>
      <title>Creating a TUI in Rust</title>
      <link>https://kidoni.dev/posts/creating-a-tui-in-rust/</link>
      <pubDate>Thu, 02 May 2024 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/creating-a-tui-in-rust/</guid>
      <description>using ratatui to create a Rust TUI</description>
    </item>
    <item>
      <title>Improving your error handling in Rust</title>
      <link>https://kidoni.dev/posts/improving-error-handling-in-rust/</link>
      <pubDate>Sat, 13 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/improving-error-handling-in-rust/</guid>
      <description>tips for better error handling in Rust</description>
    </item>
    <item>
      <title>Logging in a Rust Application</title>
      <link>https://kidoni.dev/posts/logging-in-a-rust-app/</link>
      <pubDate>Sun, 07 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/logging-in-a-rust-app/</guid>
      <description>how to use logging in a Rust application</description>
    </item>
    <item>
      <title>There&#39;s No Such Thing as &#39;Regression Testing&#39;</title>
      <link>https://kidoni.dev/posts/there-is-no-such-thing-as-regression-testing/</link>
      <pubDate>Sat, 10 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/there-is-no-such-thing-as-regression-testing/</guid>
      <description>&lt;p&gt;How would you define &amp;ldquo;regression testing&amp;rdquo;? According to
&lt;a href=&#34;https://en.m.wikipedia.org/wiki/Regression_testing&#34;&gt;Wikipedia&lt;/a&gt;,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Regression testing (rarely non-regression
testing[&lt;a href=&#34;https://en.m.wikipedia.org/wiki/Regression_testing#cite_note-1&#34;&gt;1&lt;/a&gt;])
is re-running &lt;a href=&#34;https://en.m.wikipedia.org/wiki/Functional_testing&#34;&gt;functional&lt;/a&gt;
and &lt;a href=&#34;https://en.m.wikipedia.org/wiki/Non-functional_testing&#34;&gt;non-functional tests&lt;/a&gt;
to ensure that previously developed and tested software still performs after
a change.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In the modern age of test automation and continuous integration, tests
are run (or should be) automatically by the build system. Whether
testing functional or non-functional features, there really are only
three categories of tests to run:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unit tests&lt;/li&gt;
&lt;li&gt;Integration tests&lt;/li&gt;
&lt;li&gt;System tests&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&amp;rsquo;s discuss each in turn.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building cloud software? Don&#39;t forget about this ...</title>
      <link>https://kidoni.dev/posts/building-cloud-software/</link>
      <pubDate>Mon, 22 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/building-cloud-software/</guid>
      <description>&lt;p&gt;When developers set out to architect a piece of software &amp;mdash; whether a
brand new green-field project or rearchitecting an existing product &amp;mdash; the
typical considerations are things like&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;should I use microservices and how many&lt;/li&gt;
&lt;li&gt;how will these microservices communicate&lt;/li&gt;
&lt;li&gt;how will data persist&lt;/li&gt;
&lt;li&gt;what guarantees must be provided for messages flowing through the system&lt;/li&gt;
&lt;li&gt;what&amp;rsquo;s encrypted, where and when&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Boxes and lines start appearing on whiteboards (physical or virtual) &amp;hellip;
here are the N microservices, we&amp;rsquo;ll use gRPC here, we&amp;rsquo;ll use Kafka there
and MongoDb will save everything. We&amp;rsquo;ll deploy to Kubernetes, set up
deployments with
&lt;a href=&#34;https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/&#34;&gt;HPA&lt;/a&gt;,
have at least 3 instances so our brain doesn&amp;rsquo;t get split, and monitor with the
EFK stack. Great! Let&amp;rsquo;s write some code.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to &#34;group by&#34; using Java Stream API</title>
      <link>https://kidoni.dev/posts/how-to-group-by-using-java-stream-api/</link>
      <pubDate>Fri, 12 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/how-to-group-by-using-java-stream-api/</guid>
      <description>Coding a function like SQL&amp;#39;s GROUP BY using Java Stream API</description>
    </item>
    <item>
      <title>Java&#39;s fork-join framework</title>
      <link>https://kidoni.dev/posts/java-fork-join-framework/</link>
      <pubDate>Thu, 21 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/java-fork-join-framework/</guid>
      <description>&lt;p&gt;Since Java 7, the JDK includes a set of classes implementing a fork-join
pattern. This is an approach decomposing work into multiple tasks that
can be executed in parallel. Java provides &lt;code&gt;ForkJoinPool&lt;/code&gt; and &lt;code&gt;ForkJoinTask&lt;/code&gt; as
the two primary classes implementing the approach. This post will cover
an example of using these, by converting a Mergesort implementation from
a recursive implementation to one using fork-join.&lt;/p&gt;
&lt;p&gt;Mergesort is a classic divide-and-conquer approach to sorting. The data
to be sorted are split into two halves, and those halves each are split
into two until the data can no longer be split. Then the resulting
arrays are merged and sorted.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Protocol Buffers To Serialize To Off-Heap Memory</title>
      <link>https://kidoni.dev/posts/using-protocol-buffers-to-serialize-to-off-heap-memory/</link>
      <pubDate>Sat, 02 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/using-protocol-buffers-to-serialize-to-off-heap-memory/</guid>
      <description>Protocol buffers can be used to serialize Java objects to off-heap memory.</description>
    </item>
    <item>
      <title>Using off-heap memory in Java programs</title>
      <link>https://kidoni.dev/posts/using-off-heap-memory-in-java-programs/</link>
      <pubDate>Fri, 01 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/using-off-heap-memory-in-java-programs/</guid>
      <description>How to use the &amp;#34;native&amp;#34; process heap from a Java program.</description>
    </item>
    <item>
      <title>Bootiful ksqlDb part 2 --- creating a stream</title>
      <link>https://kidoni.dev/posts/bootiful-ksqldb-pt2/</link>
      <pubDate>Thu, 31 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/bootiful-ksqldb-pt2/</guid>
      <description>&lt;p&gt;In this post I will explore the ksqlDb API for creating streams. This is
the second post about using ksqlDb with Spring Boot. Read the first post
&lt;a href=&#34;https://medium.com/everyday-programmer/bootiful-ksqldb-a4bb218d4056&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A stream in ksqlDb is analogous to a stream in Kafka Streams. One
difference is how you create the stream. As described in the first post,
a stream in Kafka Streams is created programmatically with an API.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;StreamsBuilder&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;streamsBuilder&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StreamsBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;KStream&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Order&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ordersStream&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;streamsBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;orders&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ordersStream&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;orderType&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Electronics&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;groupByKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;aggregate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;0f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;orderAmount&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toStream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;output&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Topology&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;topology&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;streamsBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;KafkaStreams&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kafkaStreams&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;KafkaStreams&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;topology&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Properties&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;kafkaStreams&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;start&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ksqlDb uplevels this to a more familiar SQL syntax. Here&amp;rsquo;s an example
from the &lt;a href=&#34;https://ksqldb.io/quickstart.html&#34;&gt;ksqlDb quickstart&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Separating integration tests from unit tests</title>
      <link>https://kidoni.dev/posts/separating-integration-tests-from-unit-tests/</link>
      <pubDate>Wed, 30 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/separating-integration-tests-from-unit-tests/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Update 2024-12-15
This blog is obviously very OO-centric, focusing on the notion of a
class as the smallest &amp;ldquo;unit&amp;rdquo;. Obviously, in non-OO languages, what
a &amp;ldquo;unit&amp;rdquo; is will vary e.g. it could be a compilation unit. But the
idea still holds, that you are trying to test individual units of
behavior without pulling in dependencies that may result in longer
startup time, failures in the dependencies (which may be out of your
control), or code that doesn&amp;rsquo;t exist yet (for TDD).&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Three Must Read Books for the Working Software Developer</title>
      <link>https://kidoni.dev/posts/book-recommendations/</link>
      <pubDate>Wed, 23 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/book-recommendations/</guid>
      <description>some book recommendations for developers</description>
    </item>
    <item>
      <title>Bootiful ksqlDb</title>
      <link>https://kidoni.dev/posts/bootiful-ksqldb/</link>
      <pubDate>Wed, 25 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://kidoni.dev/posts/bootiful-ksqldb/</guid>
      <description>&lt;p&gt;In this post I will show how to use the &lt;a href=&#34;https://docs.ksqldb.io/en/latest/&#34;&gt;ksqlDb&lt;/a&gt;
Java REST client to interact with the ksqlDb server using a Spring Boot
application as a foundation. The Boot app will also use
&lt;a href=&#34;https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html&#34;&gt;Spring Webflux&lt;/a&gt;
to help expand the use of reactive programming. I will also show the use of the
&lt;a href=&#34;https://testcontainers.org&#34;&gt;Testcontainers&lt;/a&gt; framework for integrating
deployment of Docker containers as part of integration testing, in this case
with JUnit 5.&lt;/p&gt;
&lt;p&gt;What this will not cover is details of &lt;a href=&#34;http://kafka.apache.org&#34;&gt;Apache Kafka&lt;/a&gt; or
&lt;a href=&#34;https://docs.spring.io/spring-boot/docs/current/reference/html/index.html&#34;&gt;Spring Boot&lt;/a&gt;,
or even ksqlDb and streaming systems,
except to provide background to understand the code. There are plenty of
other examples and posts that cover those details.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
