<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://www.yellowduck.be/pretty-atom-feed-v3.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <link href="https://www.yellowduck.be" rel="alternate"/>
  <link href="https://www.yellowduck.be/posts/feed" rel="self"/>
  <author>
    <name>Pieter Claerhout</name>
    <email>pieter@yellowduck.be</email>
  </author>
  <id>https://www.yellowduck.be/posts/feed</id>
  <title>🐥 YellowDuck.be</title>
  <updated>2026-07-11T13:00:00Z</updated>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/how-to-safely-delete-records-in-massive-tables-on-aws-using-laravel" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;When handling massive databases, like Flare&apos;s table with 1 billion records, a naive &lt;code&gt;DELETE&lt;/code&gt; can lead to disastrous locks. A straightforward delete could halt your app for hours. Instead, employing a &lt;code&gt;LIMIT&lt;/code&gt; can speed up deletions, releasing locks faster. However, AWS Lambda&apos;s 15-minute execution time limit complicates things, necessitating a job queue for longer processes. By using &lt;code&gt;CleanTableJob&lt;/code&gt;, the deletion tasks can self-dispatch, ensuring they run smoothly without overwhelming the system. Additionally, implementing an atomic lock prevents overlapping jobs, offering a reliable setup for managing large tables. Overall, this approach effectively balances database integrity and performance, ensuring efficient record management on AWS.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://flareapp.io/blog/how-to-safely-delete-records-in-massive-tables-on-aws-using-laravel&quot;&gt;Continue reading on &lt;strong&gt;flareapp.io&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/laravel&quot;&gt;#laravel&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/database&quot;&gt;#database&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/devops&quot;&gt;#devops&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-11T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/how-to-safely-delete-records-in-massive-tables-on-aws-using-laravel</id>
    <title>🔗 How to safely delete records in massive tables on AWS using Laravel</title>
    <updated>2026-07-11T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/add-a-second-remote-origin-with-git" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Sometimes you need a second remote origin for a project, especially if it involves auto deployment and access limitations. Hamid Shoja outlines the steps to add a second remote origin in Git where syncing with the primary origin is crucial. The process begins by using &lt;code&gt;git remote add&lt;/code&gt; to add the additional origin, followed by using &lt;code&gt;git push --all&lt;/code&gt; to push changes to both remote repositories. The article also highlights how to sync changes between the two origins with commands like &lt;code&gt;git fetch&lt;/code&gt; and &lt;code&gt;git merge&lt;/code&gt;, ensuring that both repositories remain aligned. This is particularly useful for developers needing flexibility in managing their code with multiple repositories.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://dev.to/hash01/add-a-second-remote-origin-to-git-35a7&quot;&gt;Continue reading on &lt;strong&gt;dev.to&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/git&quot;&gt;#git&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-11T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/add-a-second-remote-origin-with-git</id>
    <title>🔗 Add a second remote origin with Git</title>
    <updated>2026-07-11T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/why-dead-code-feels-hard-to-delete" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;It’s a common challenge when developers hesitate to delete dead code, often due to the sunk cost fallacy or loss aversion. The sunk cost fallacy leads us to believe that since we invested time and effort into writing code, it holds inherent value. However, this line of thinking can lead to increased complexity and future costs. The loss aversion principle further complicates matters, as losing code feels worse than never having it at all, even if it&apos;s unused. Understanding these cognitive biases sheds light on why teams cling to dead code and emphasizes the need to view code as a liability, not a resource. Minimizing unnecessary code leads to more clarity and lower maintenance costs, ultimately helping teams serve their customers better.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://www.germanvelasco.com/blog/why-dead-code-feels-hard-to-delete&quot;&gt;Continue reading on &lt;strong&gt;www.germanvelasco.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-10T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/why-dead-code-feels-hard-to-delete</id>
    <title>🔗 Why dead code feels hard to delete</title>
    <updated>2026-07-10T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/docker-alternative-podman-on-linux" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Podman presents a compelling alternative to Docker, especially for Linux users. This article outlines how Podman operates without a central daemon, making it more secure and flexible by allowing rootless container execution. Readers learn the straightforward installation process, using common commands like &lt;code&gt;podman run&lt;/code&gt; and &lt;code&gt;podman ps&lt;/code&gt;, and the benefits of managing containers through systemd with Quadlets. Comparisons with Docker show Podman’s advantages, particularly in security and alignment with Linux philosophy, while also acknowledging Docker’s extensive ecosystem. It&apos;s a practical guide for anyone considering a switch or starting containerization on Linux systems with a focus on efficiency and improved security.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://linuxblog.io/docker-alternative-podman-on-linux/&quot;&gt;Continue reading on &lt;strong&gt;linuxblog.io&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/devops&quot;&gt;#devops&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/linux&quot;&gt;#linux&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/docker&quot;&gt;#docker&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/sysadmin&quot;&gt;#sysadmin&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-10T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/docker-alternative-podman-on-linux</id>
    <title>🔗 Docker alternative: Podman on Linux</title>
    <updated>2026-07-10T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/six-sql-patterns-i-use-to-catch-transaction-fraud" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Fraud detection largely relies on SQL rather than machine learning or hype-driven technologies. The author shares six effective SQL patterns applicable to various transaction systems, from credit cards to e-commerce. The first pattern addresses &lt;strong&gt;velocity&lt;/strong&gt;, identifying rapid usage of a stolen card, suggesting fraud. The second pattern, &lt;strong&gt;impossible travel&lt;/strong&gt;, flags transactions occurring in far-apart locations within an implausibly short time frame. Another pattern identifies &lt;strong&gt;amount anomalies&lt;/strong&gt; where specific transaction amounts correlate strongly with fraudulent behavior. The article also highlights &lt;strong&gt;suspicious merchants&lt;/strong&gt; exhibiting unusual activity and &lt;strong&gt;off-hours spending&lt;/strong&gt;, which indicates potential unauthorized use. Finally, a framework involving &lt;strong&gt;window functions&lt;/strong&gt; allows for more complex fraud detection by aggregating signals from these patterns. The author notes that utilizing these patterns collectively enhances the ability to uncover fraudulent transactions effectively. This practical SQL-focused approach provides a foundation for building robust fraud detection mechanisms.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://analytics.fixelsmith.com/posts/sql-fraud-patterns/&quot;&gt;Continue reading on &lt;strong&gt;analytics.fixelsmith.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/pattern&quot;&gt;#pattern&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/sql&quot;&gt;#sql&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-10T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/six-sql-patterns-i-use-to-catch-transaction-fraud</id>
    <title>🔗 Six SQL patterns I use to catch transaction fraud</title>
    <updated>2026-07-10T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/stop-mounting-your-liveview-twice" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Every LiveView mounts twice on the first page load—once for the static HTTP &quot;dead render&quot; and again when the WebSocket connects. This can lead to unnecessary database queries and performance hits. The recommended fix is to use &lt;code&gt;connected?/1&lt;/code&gt; to conditionally load data during the connection, but this approach has its drawbacks. It still results in duplicate processing when mounting and can hinder SEO and user experience by leading to an empty first paint.&lt;/p&gt;
&lt;p&gt;The article outlines the limitations of this conventional solution and highlights ongoing efforts by the Phoenix team to improve LiveView&apos;s handling of mounts via the adoption of LiveViews. This new approach aims to keep the LiveView process alive across connections, avoiding the need for multiple mounts altogether, enhancing performance and reliability. By addressing these challenges, developers can create more efficient LiveViews without compromising on initial page load quality or SEO prioritization.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://elixirdrops.net/d/9mrw2kg3&quot;&gt;Continue reading on &lt;strong&gt;elixirdrops.net&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/elixir&quot;&gt;#elixir&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/phoenix&quot;&gt;#phoenix&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-09T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/stop-mounting-your-liveview-twice</id>
    <title>🔗 Stop mounting your LiveView twice</title>
    <updated>2026-07-09T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/stop-programming-in-markdown" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Amidst the rising hype around AI, particularly LLMs, companies misuse these tools in scenarios where traditional code is far superior. This translates to programming in Markdown, relying on LLMs to interpret logic with slow, costly, and insecure performance. Tasks often solvable with straightforward code are overcomplicated by using prompted LLMs. Examples like automating e-commerce returns illustrate a misuse of LLMs when simple code suffices. Additionally, the allure of LLMs often stems from their ability to simplify interactions, making them tempting despite their inefficiencies. The article emphasizes the need to resist using LLMs needlessly and to leverage traditional programming for common business processes. It calls for a reevaluation of when and how LLMs should be integrated into systems, pointing out the risks and inefficiencies of relying on them when simpler solutions exist.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://structural.chat/articles/programming-in-markdown/&quot;&gt;Continue reading on &lt;strong&gt;structural.chat&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/ai&quot;&gt;#ai&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-09T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/stop-programming-in-markdown</id>
    <title>🔗 Stop programming in Markdown</title>
    <updated>2026-07-09T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/modern-css-theming-with-light-dark-contrast-color-and-style-queries" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;This article dives into a novel dynamic theming system using new CSS features. It introduces &lt;code&gt;light-dark()&lt;/code&gt; for switching between light and dark color schemes based on user preferences, while &lt;code&gt;contrast-color()&lt;/code&gt; ensures optimal text visibility against varying backgrounds. The author combines these functions with &lt;code&gt;@container style()&lt;/code&gt; to create customizable color palettes, enhancing both accessibility and aesthetics. Practical examples illustrate how to implement shadows in light mode and glowing borders in dark mode, ensuring that UI elements are visually appealing and readable irrespective of the theme. This innovative approach allows developers to craft intricate themes that respect user settings while providing a fluid user experience. Everything is browser-compatible as of May 2026, making this a timely exploration into modern CSS capabilities.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://una.im/modern-css-theming/&quot;&gt;Continue reading on &lt;strong&gt;una.im&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/frontend&quot;&gt;#frontend&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/css&quot;&gt;#css&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-09T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/modern-css-theming-with-light-dark-contrast-color-and-style-queries</id>
    <title>🔗 Modern CSS theming with light-dark(), contrast-color(), and style queries</title>
    <updated>2026-07-09T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/mistral-ocr-4-sota-ocr-for-document-intelligence" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Mistral AI has released Mistral OCR 4, touting its ability to extract and structure content from documents with exceptional accuracy. This model supports 170 languages and is designed for self-hosted deployments, ensuring compliance and sovereignty. It introduces features like bounding boxes, block classification, and inline confidence scores, tackling the weaknesses of previous OCR generations. Human evaluations showed that independent annotators preferred OCR 4, achieving a win rate of 72% against leading systems, while delivering an impressive overall score on OlmOCRBench (85.20). The model facilitates enhanced document processing for tasks like retrieval-augmented generation and agentic workflows, marking a significant step forward in document intelligence.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://mistral.ai/news/ocr-4/&quot;&gt;Continue reading on &lt;strong&gt;mistral.ai&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/tools&quot;&gt;#tools&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/ai&quot;&gt;#ai&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/devops&quot;&gt;#devops&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-08T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/mistral-ocr-4-sota-ocr-for-document-intelligence</id>
    <title>🔗 Mistral OCR 4 : SOTA OCR for Document Intelligence</title>
    <updated>2026-07-08T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/in-memory-of-the-man-who-put-red-and-green-squiggles-under-words" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Tony Krueger, whose contributions went largely unrecognized, passed away recently. He is best known for implementing the red and green squiggles in Microsoft Word that alert users to spelling and grammatical errors. These features transformed how people interacted with word processors, shifting from interruptive spell checks to an unobtrusive system that highlights mistakes as they occur. Krueger&apos;s work on various versions of Word helped pave the way for modern writing tools in nearly every application today. His innovative approach not only improved user experience but also earned him an unexpected moment of fame when Penn &amp; Teller acknowledged his work. While often overlooked, Krueger&apos;s legacy continues to impact users across the globe every time they see a red squiggle beneath a misspelled word. The next time this happens, remember to thank Tony.&lt;/p&gt;
&lt;p&gt;Tony also reverse-engineered and ported the game Chip’s Challenge to Windows, showcasing his technical prowess before his fame in word processing began.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/oldnewthing/20260622-00/?p=112451&quot;&gt;Continue reading on &lt;strong&gt;devblogs.microsoft.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/tools&quot;&gt;#tools&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-08T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/in-memory-of-the-man-who-put-red-and-green-squiggles-under-words</id>
    <title>🔗 In memory of the man who put red and green squiggles under words</title>
    <updated>2026-07-08T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/key-activities-for-sustainable-engineering-team" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;What signals indicate it&apos;s time for managers to change their operational focus? In a compelling article, Dunya Kirkali breaks down the essential activities that engineering managers must prioritize for effective team management. The piece categorizes these activities into internal, boundary, and external groups, emphasizing that synchronization meetings, reflections, and planning sessions are key for internal cohesion. Managers need to be attuned to their team&apos;s momentum through regular retrospectives and syncs. Boundary activities, such as ops reviews and business reviews, ensure alignment with organizational goals while external activities—like market research and customer feedback—provide necessary context. This framework enables managers to know when to shift their attention, ensuring teams can deliver effectively without micromanagement. Managers are encouraged to focus not just on the tasks at hand but on the signals that reveal deeper insights about their team’s dynamics.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://blog.incrementalforgetting.tech/p/key-activities-for-sustainable-engineering&quot;&gt;Continue reading on &lt;strong&gt;blog.incrementalforgetting.tech&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-08T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/key-activities-for-sustainable-engineering-team</id>
    <title>🔗 Key activities for sustainable engineering team</title>
    <updated>2026-07-08T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/how-to-start-and-enable-clamav-service-on-linux" rel="alternate"/>
    <content type="html">&lt;p&gt;ClamAV is a powerful, open-source antivirus engine designed to detect malware, viruses, and trojans on Linux systems. If you have just installed it, you need to start its background services so that it can protect your system and keep its virus definitions up to date.&lt;/p&gt;
&lt;p&gt;This guide will show you how to start, enable, and verify the ClamAV services using &lt;code&gt;systemctl&lt;/code&gt;.&lt;/p&gt;
&lt;h1&gt;Prerequisites&lt;/h1&gt;
&lt;p&gt;Before running the commands, ensure you have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Linux distribution installed.&lt;/li&gt;
&lt;li&gt;Administrative privileges (&lt;code&gt;sudo&lt;/code&gt; or &lt;code&gt;root&lt;/code&gt; access).&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Step 1: Start the Antivirus Daemon&lt;/h1&gt;
&lt;p&gt;The primary service is &lt;code&gt;clamav-daemon&lt;/code&gt;. This background process loads virus signatures into memory and handles on-access scanning. It also allows you to run high-speed scans using the &lt;code&gt;clamdscan&lt;/code&gt; utility.&lt;/p&gt;
&lt;p&gt;Run the following commands in your terminal:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Start the service:&lt;/strong&gt;
&lt;pre class=&quot;lumis&quot;&gt;&lt;code class=&quot;language-bash&quot; translate=&quot;no&quot; tabindex=&quot;0&quot;&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;1&quot;&gt;&lt;span class=&quot;l-function-call&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;systemctl&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;start&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;clamav-daemon&lt;/span&gt;
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable it to start automatically on boot:&lt;/strong&gt;
&lt;pre class=&quot;lumis&quot;&gt;&lt;code class=&quot;language-bash&quot; translate=&quot;no&quot; tabindex=&quot;0&quot;&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;1&quot;&gt;&lt;span class=&quot;l-function-call&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;systemctl&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;enable&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;clamav-daemon&lt;/span&gt;
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verify that it is running correctly:&lt;/strong&gt;
&lt;pre class=&quot;lumis&quot;&gt;&lt;code class=&quot;language-bash&quot; translate=&quot;no&quot; tabindex=&quot;0&quot;&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;1&quot;&gt;&lt;span class=&quot;l-function-call&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;systemctl&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;clamav-daemon&lt;/span&gt;
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Note:&lt;/strong&gt; The daemon might take a few moments to change to an &quot;active&quot; status. This delay happens because it is loading a large database of malware definitions directly into your system&apos;s RAM.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Step 2: Start the Automatic Database Updater&lt;/h1&gt;
&lt;p&gt;An antivirus engine is only as good as its virus signatures. ClamAV uses a separate service called &lt;code&gt;clamav-freshclam&lt;/code&gt; to look for and download the latest malware definitions automatically.&lt;/p&gt;
&lt;p&gt;To get the updater running, execute these commands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Start the updater service:&lt;/strong&gt;
&lt;pre class=&quot;lumis&quot;&gt;&lt;code class=&quot;language-bash&quot; translate=&quot;no&quot; tabindex=&quot;0&quot;&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;1&quot;&gt;&lt;span class=&quot;l-function-call&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;systemctl&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;start&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;clamav-freshclam&lt;/span&gt;
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable the updater to start on boot:&lt;/strong&gt;
&lt;pre class=&quot;lumis&quot;&gt;&lt;code class=&quot;language-bash&quot; translate=&quot;no&quot; tabindex=&quot;0&quot;&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;1&quot;&gt;&lt;span class=&quot;l-function-call&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;systemctl&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;enable&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;clamav-freshclam&lt;/span&gt;
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verify the update status:&lt;/strong&gt;
&lt;pre class=&quot;lumis&quot;&gt;&lt;code class=&quot;language-bash&quot; translate=&quot;no&quot; tabindex=&quot;0&quot;&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;1&quot;&gt;&lt;span class=&quot;l-function-call&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;systemctl&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;clamav-freshclam&lt;/span&gt;
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Your Linux machine is now running ClamAV in the background with continuous, automated database updates. You can now safely run manual system scans or configure real-time protection.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/terminal&quot;&gt;#terminal&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/linux&quot;&gt;#linux&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/sysadmin&quot;&gt;#sysadmin&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-07T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/how-to-start-and-enable-clamav-service-on-linux</id>
    <title>🐥 How to start and enable ClamAV service on Linux</title>
    <updated>2026-07-07T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/build-a-document-processing-workflow-in-30-minutes" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Workflows is an orchestration platform for building, executing, and monitoring complex AI-driven workflows. It provides durable, fault-tolerant workflow execution backed by battle-tested distributed systems infrastructure, combined with a developer-friendly SDK.&lt;/p&gt;
&lt;p&gt;In this tutorial, you’ll build an end-to-end medical document processing pipeline using three Mistral capabilities: OCR to read PDFs, Agents to classify documents and extract structured data, and Workflows to orchestrate the entire process reliably.&lt;/p&gt;
&lt;p&gt;The pipeline takes any scanned medical PDF like a prescription, a hospital bill, or an imaging report and runs it through three steps: optical character recognition (OCR) to extract raw text, an AI agent to classify the document type with a confidence score, and a second agent to extract patient information and document-specific fields as structured JSON. Because it’s built on Mistral Workflows, each step is durable and fault-tolerant: if a worker restarts mid-execution, the workflow resumes where it left off instead of starting over.&lt;/p&gt;
&lt;p&gt;You’ll also include a human-in-the-loop step: when the classifier’s confidence falls below a configurable threshold, the pipeline pauses and waits for a user to review and confirm the category before extraction continues. Mistral Workflows enables these long-running processes that can pause and resume based on external input, which is difficult to build reliably with a simple async queue or a chain of API calls.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://x.com/MistralDevs/status/2071625939444744521&quot;&gt;Continue reading on &lt;strong&gt;x.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/pdf&quot;&gt;#pdf&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/ai&quot;&gt;#ai&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-07T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/build-a-document-processing-workflow-in-30-minutes</id>
    <title>🔗 Build a document processing workflow in 30 minutes</title>
    <updated>2026-07-07T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/rbac-in-laravel-a-practical-deep-dive" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Role-Based Access Control (RBAC) provides a structured approach to authorization that becomes essential as applications scale. It helps define clear permissions through roles rather than relying on individual user permissions. Wendell Adriel&apos;s article delves into designing a robust RBAC model within Laravel without the need for external packages. Readers can learn about critical concepts such as team-aware roles, permission inheritance, and the importance of constraints like separation of duties. The article also emphasizes the value of establishing a clear permission model before defining roles, which aids in creating a cleaner and more manageable authorization system. This practical guide includes implementation steps and insights into potential pitfalls, making it a must-read for developers looking to optimize access control in their applications.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://wendelladriel.com/blog/rbac-in-laravel-a-practical-deep-dive&quot;&gt;Continue reading on &lt;strong&gt;wendelladriel.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/laravel&quot;&gt;#laravel&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/auth&quot;&gt;#auth&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-07T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/rbac-in-laravel-a-practical-deep-dive</id>
    <title>🔗 RBAC in Laravel: a practical deep dive</title>
    <updated>2026-07-07T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/building-go-apis-with-huma-sqlc-and-goose" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Building an API with Huma, &lt;code&gt;sqlc&lt;/code&gt;, and Goose showcases a streamlined stack that strikes a balance between structure and simplicity. The author emphasizes the effectiveness of writing SQL for the schema and queries, enabling automatic generation of Go code while avoiding complexities introduced by ORMs. The project layout, from database migrations managed by Goose to type-safe Go code generated by &lt;code&gt;sqlc&lt;/code&gt;, demonstrates how each tool integrates seamlessly without unnecessary overhead. Huma simplifies API operation definitions and generates OpenAPI specifications directly from Go structs, ensuring the documentation stays aligned with the implementation. This approach drastically reduces onboarding time for new engineers while maintaining clarity and predictability in code execution, essentially providing a clean, efficient development workflow that encourages productivity without compromising on control or understanding.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://blainsmith.com/articles/building-go-apis-with-huma-slqc-and-goose/&quot;&gt;Continue reading on &lt;strong&gt;blainsmith.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/golang&quot;&gt;#golang&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/database&quot;&gt;#database&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-06T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/building-go-apis-with-huma-sqlc-and-goose</id>
    <title>🔗 Building Go APIs with Huma, sqlc, and Goose</title>
    <updated>2026-07-06T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/why-your-x2d-ii-files-look-better-on-ipad-than-iphone" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Have you ever wondered why X2D II files appear more vibrant on an iPad than on an iPhone? The difference is not just in display technology but in how your eye perceives images. Konrad Michels reveals that while the iPhone 17 Pro Max boasts a higher pixel density at 460 PPI compared to the iPad Pro M4’s 264 PPI, this alone doesn’t enhance image quality for X2D II reviews. The article explains that the larger screen of the iPad allows images to occupy a greater angular size on your retina, activating peak contrast sensitivity and revealing subtle tonal gradations. Essentially, the X2D II’s 100-megapixel files require that angular room to fully appreciate their depth and detail, an insight often overlooked in favor of pixel count. Ultimately, understanding this visual physics leads to better evaluation of medium-format photography.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://blog.tonalphoto.com/x2d-ii-files-ipad-vs-iphone/&quot;&gt;Continue reading on &lt;strong&gt;blog.tonalphoto.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-06T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/why-your-x2d-ii-files-look-better-on-ipad-than-iphone</id>
    <title>🔗 Why your X2D II files look better on iPad than iPhone</title>
    <updated>2026-07-06T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/agentic-rag-vs-long-context-llms-a-171-question-benchmark-on-30-long-pdfs" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;What happens when you evaluate agentic retrieval-augmented generation (RAG) against long-context LLMs? This article presents a rigorous benchmark of 171 questions asked across 30 long PDFs. The results highlight stark differences in performance between traditional RAG methods and long-context language models. The findings suggest that long-context LLMs excel at parsing complex documents, allowing for more nuanced responses. Data shows that while RAG can be effective, its reliance on external data sources may hinder performance on intricate queries. This comparison offers vital insights for researchers and practitioners considering which model to adopt for handling extensive textual information.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://www.surfsense.com/blog/agentic-rag-vs-long-context-llms-benchmark&quot;&gt;Continue reading on &lt;strong&gt;www.surfsense.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/pdf&quot;&gt;#pdf&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/ai&quot;&gt;#ai&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/testing&quot;&gt;#testing&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-06T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/agentic-rag-vs-long-context-llms-a-171-question-benchmark-on-30-long-pdfs</id>
    <title>🔗 Agentic RAG vs long-context LLMs: a 171-question benchmark on 30 long PDFs</title>
    <updated>2026-07-06T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/fixing-korean-pdf-rendering-issues-in-poppler-on-ubuntu-22-04" rel="alternate"/>
    <content type="html">&lt;p&gt;Poppler’s &lt;code&gt;pdftoppm&lt;/code&gt; tool is commonly used to render PDFs into images for processing, previews, or conversion pipelines. On Ubuntu 22.04, the default Poppler version (22.02) can run into issues when rendering PDFs that contain Korean text, especially when fonts are missing or incorrectly substituted.&lt;/p&gt;
&lt;p&gt;This post explains a practical fix that avoids upgrading Poppler entirely.&lt;/p&gt;
&lt;h1&gt;The problem&lt;/h1&gt;
&lt;p&gt;When rendering certain Korean PDFs with &lt;code&gt;pdftoppm&lt;/code&gt;, the output may show:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;missing characters (blank boxes or “tofu” glyphs)&lt;/li&gt;
&lt;li&gt;incorrect font substitution&lt;/li&gt;
&lt;li&gt;broken or unreadable text rendering&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is often not caused by Poppler itself, but by missing font configuration and CMap data required for CJK (Chinese, Japanese, Korean) text handling.&lt;/p&gt;
&lt;h1&gt;The root cause&lt;/h1&gt;
&lt;p&gt;Poppler relies on the system font stack and external mapping data:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fontconfig&lt;/strong&gt;: resolves font substitutions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CJK fonts&lt;/strong&gt;: provide actual glyphs for Korean characters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Poppler CMap data&lt;/strong&gt;: maps PDF encodings to Unicode correctly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On a minimal Ubuntu server installation, two key components are often missing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;poppler-data&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;CJK font packages such as Noto Sans CJK&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;The fix&lt;/h1&gt;
&lt;p&gt;Instead of upgrading Poppler, installing the correct font dependencies resolves the issue.&lt;/p&gt;
&lt;h2&gt;1. Install CJK fonts&lt;/h2&gt;
&lt;pre class=&quot;lumis&quot;&gt;&lt;code class=&quot;language-bash&quot; translate=&quot;no&quot; tabindex=&quot;0&quot;&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;1&quot;&gt;&lt;span class=&quot;l-function-call&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;fonts-noto-cjk&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;fonts-noto-core&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;fonts-unifont&lt;/span&gt;
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. Install Poppler CMap data&lt;/h2&gt;
&lt;pre class=&quot;lumis&quot;&gt;&lt;code class=&quot;language-bash&quot; translate=&quot;no&quot; tabindex=&quot;0&quot;&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;1&quot;&gt;&lt;span class=&quot;l-function-call&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;poppler-data&lt;/span&gt;
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. Rebuild the font cache&lt;/h2&gt;
&lt;pre class=&quot;lumis&quot;&gt;&lt;code class=&quot;language-bash&quot; translate=&quot;no&quot; tabindex=&quot;0&quot;&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;1&quot;&gt;&lt;span class=&quot;l-function-call&quot;&gt;fc-cache&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;-fv&lt;/span&gt;
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Verify the fix&lt;/h1&gt;
&lt;p&gt;Re-run your rendering command:&lt;/p&gt;
&lt;pre class=&quot;lumis&quot;&gt;&lt;code class=&quot;language-bash&quot; translate=&quot;no&quot; tabindex=&quot;0&quot;&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;1&quot;&gt;&lt;span class=&quot;l-function-call&quot;&gt;pdftoppm&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;input.pdf&lt;/span&gt; &lt;span class=&quot;l-variable-parameter&quot;&gt;output&lt;/span&gt;
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Korean text should now render correctly in the generated images.&lt;/p&gt;
&lt;h1&gt;Why this works&lt;/h1&gt;
&lt;p&gt;Poppler 22.x is capable of rendering CJK PDFs correctly, but only when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the system provides appropriate glyph fonts&lt;/li&gt;
&lt;li&gt;CMap mappings are available via &lt;code&gt;poppler-data&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without these, Poppler falls back to incomplete or incorrect font substitution, leading to broken output.&lt;/p&gt;
&lt;h1&gt;When you actually need a newer Poppler&lt;/h1&gt;
&lt;p&gt;Upgrading Poppler is only necessary if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rendering logic itself is broken (rare for CJK issues)&lt;/li&gt;
&lt;li&gt;you need specific bug fixes or features in newer releases&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For font-related issues, upgrading is usually unnecessary and introduces avoidable dependency complexity.&lt;/p&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;If you encounter broken Korean text rendering in &lt;code&gt;pdftoppm&lt;/code&gt; on Ubuntu 22.04, the fix is typically not a Poppler upgrade but a missing font stack.&lt;/p&gt;
&lt;p&gt;Installing &lt;code&gt;fonts-noto-cjk&lt;/code&gt; and &lt;code&gt;poppler-data&lt;/code&gt; resolves most cases immediately and keeps your system stable without rebuilding core libraries.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/pdf&quot;&gt;#pdf&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/linux&quot;&gt;#linux&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/sysadmin&quot;&gt;#sysadmin&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-05T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/fixing-korean-pdf-rendering-issues-in-poppler-on-ubuntu-22-04</id>
    <title>🐥 Fixing Korean PDF rendering issues in Poppler on Ubuntu 22.04</title>
    <updated>2026-07-05T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/dont-roll-your-own" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;This article presents a critical viewpoint on modern web design practices, echoing a well-known principle in cryptography: &quot;Don&apos;t roll your own crypto.&quot; The author emphasizes that while developers are free to innovate, they should avoid reinventing standard UI elements that users rely on. This is particularly vital for website functionalities like scrolling, link navigation, text selection, and form controls. The author recalls frustrating experiences with custom implementations that disrupt user familiarity and efficiency, citing specific design pitfalls in well-known platforms like GitHub. With concrete examples and a personal touch, this piece serves as a warning for developers to lean on tried-and-true practices, ensuring usability over novelty.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://susam.net/do-not-roll-your-own.html&quot;&gt;Continue reading on &lt;strong&gt;susam.net&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/frontend&quot;&gt;#frontend&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/html&quot;&gt;#html&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-05T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/dont-roll-your-own</id>
    <title>🔗 Don&apos;t roll your own ...</title>
    <updated>2026-07-05T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/migrating-from-go-to-rust" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Out of all the migrations, moving from Go to Rust stands out as unique. It is less about speed or type systems, as Go already offers significant advantages in those areas. Instead, this guide, written by Matthias Endler, addresses the nuances of correctness guarantees, runtime trade-offs, and developer ergonomics. It targets backend services, highlighting where Go excels and the challenges developers might face when transitioning to Rust.&lt;/p&gt;
&lt;p&gt;The piece meticulously maps Go patterns to Rust equivalents, explaining how Rust&apos;s borrow checker enhances safety. Endler emphasizes the importance of understanding the trade-offs involved, especially considering Go&apos;s strong community and tooling. Rust&apos;s advantages include zero-cost abstractions and stricter compile-time guarantees, making the migration worthwhile for teams burdened by Go&apos;s limitations in error handling and concurrency. The guide ultimately serves as a practical resource for Go developers contemplating this shift, offering insights backed by professional experience in both languages.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://corrode.dev/learn/migration-guides/go-to-rust/#error-handling-if-err-nil-vs-result-t-e&quot;&gt;Continue reading on &lt;strong&gt;corrode.dev&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/golang&quot;&gt;#golang&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/rust&quot;&gt;#rust&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-05T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/migrating-from-go-to-rust</id>
    <title>🔗 Migrating from Go to Rust</title>
    <updated>2026-07-05T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/testing-go-clis-with-testscript" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Have you ever wondered what happens when a command-line interface (CLI) is tested under real conditions? The article dives into the testing of the CLI &lt;code&gt;eon&lt;/code&gt;, which schedules jobs using LLMs. It emphasizes the need for integration tests that mimic user behavior rather than relying solely on unit tests. The author shares a detailed exploration of using the &lt;code&gt;testscript&lt;/code&gt; package to create robust tests that check command behavior while providing isolation from actual file systems and configurations.&lt;/p&gt;
&lt;p&gt;By correctly setting up test scenarios, the &lt;code&gt;eon&lt;/code&gt; CLI can add jobs, list them, and handle errors without affecting the user&apos;s actual environment. This methodology ensures that testing the CLI&apos;s performance and reliability is aligned with how users would typically interact with it. Through this approach, consumers of the &lt;code&gt;eon&lt;/code&gt; CLI can have confidence in its functionality and robustness without the risk of disruptions from their local setups.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://rednafi.com/go/testscript-cli/&quot;&gt;Continue reading on &lt;strong&gt;rednafi.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/golang&quot;&gt;#golang&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/tools&quot;&gt;#tools&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/testing&quot;&gt;#testing&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-04T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/testing-go-clis-with-testscript</id>
    <title>🔗 Testing Go CLIs with testscript</title>
    <updated>2026-07-04T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/the-10x-ai-delusion-the-real-bottlenecks" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Is AI really going to create a 10x productivity boost for developers? Vasudha Prabhala argues that the real bottlenecks in software delivery are not the individual developer&apos;s capabilities, but the organizational structure and systems in place. The conversation shifts from merely generating code faster to understanding how the existing developer ecosystem struggles under pressure.&lt;/p&gt;
&lt;p&gt;Prabhala highlights insights from Adam Bender at Google, emphasizing that as AI-generated code increases, existing approval queues, compliance checks, and communication frameworks can collapse under the load. With scenarios like &lt;code&gt;agentic edit wars&lt;/code&gt;, where autonomous agents argue over code without human oversight, teams risk losing intellectual control. This could lead to a chaotic environment where testing and verification processes become overwhelmed, ultimately jeopardizing the integrity of software systems, especially in sectors like banking and healthcare. Leaders are urged to focus on strengthening their systems now to avoid a costly fallout in the future.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://vasudhaprabhala.substack.com/p/the-10x-ai-delusion-and-the-real?triedRedirect=true&quot;&gt;Continue reading on &lt;strong&gt;vasudhaprabhala.substack.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/ai&quot;&gt;#ai&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-04T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/the-10x-ai-delusion-the-real-bottlenecks</id>
    <title>🔗 The 10x AI delusion &amp; the real bottlenecks</title>
    <updated>2026-07-04T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/cli-vs-mcp-vs-api-for-ai-agents-which-integration-method-should-you-use" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Different integration methods for AI agents can significantly impact workflow efficiency. Could choosing the wrong one create friction as your agents become more advanced? Whether it’s a Command-Line Interface (CLI), Model Context Protocol (MCP), or an Application Programming Interface (API), understanding the tradeoffs is essential.&lt;/p&gt;
&lt;p&gt;The article provides a detailed comparison of these methods, revealing that CLIs often outshine the others—even in the age of APIs. They offer simplicity, speed, and are ideally suited for local tools. In contrast, while APIs enhance scalability and provide structured output, they introduce complexity. MCPs aim to standardize interactions between AI models and data sources but are still maturing.&lt;/p&gt;
&lt;p&gt;This comprehensive breakdown helps determine which method fits best for your AI workflows.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://www.mindstudio.ai/blog/cli-vs-mcp-vs-api-ai-agents&quot;&gt;Continue reading on &lt;strong&gt;www.mindstudio.ai&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/pattern&quot;&gt;#pattern&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/tools&quot;&gt;#tools&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/http&quot;&gt;#http&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/ai&quot;&gt;#ai&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-04T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/cli-vs-mcp-vs-api-for-ai-agents-which-integration-method-should-you-use</id>
    <title>🔗 CLI vs MCP vs API for AI agents: which integration method should you use?</title>
    <updated>2026-07-04T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/elixir-v1-20-released-now-a-gradually-typed-language" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Elixir has entered a new era with the release of version 1.20, where it has embraced gradual typing. This update allows for type inference and checks on existing Elixir code without the need for type annotations. It effectively identifies dead code and potential runtime errors, which enhances code reliability with minimal developer overhead. The dynamic type introduced offers compatibility and narrowing capabilities that enable precise type management without overwhelming false positives. This means that Elixir can adaptively learn and refine types as code executes, ensuring a better development experience while maintaining its dynamic roots. The collaborative effort involved notable institutions and promises future enhancements, ensuring that Elixir continues to evolve with robust type systems.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://elixir-lang.org/blog/2026/06/03/elixir-v1-20-0-released/&quot;&gt;Continue reading on &lt;strong&gt;elixir-lang.org&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/elixir&quot;&gt;#elixir&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/announcement&quot;&gt;#announcement&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-03T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/elixir-v1-20-released-now-a-gradually-typed-language</id>
    <title>🔗 Elixir v1.20 released: now a gradually typed language</title>
    <updated>2026-07-03T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/5-faster-ways-to-copy-large-or-millions-of-files-in-linux" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Copying files in Linux just got more efficient. Using the &lt;code&gt;cp&lt;/code&gt; command may feel familiar, but it lacks essential features for handling large datasets.&lt;/p&gt;
&lt;p&gt;The article showcases five alternative methods that significantly enhance speed and reliability.&lt;/p&gt;
&lt;p&gt;From &lt;code&gt;rsync&lt;/code&gt;, which supports resuming interrupted transfers, to &lt;code&gt;pv&lt;/code&gt; providing progress indicators, these tools are built for performance. The article emphasizes how using &lt;code&gt;parallel&lt;/code&gt; with &lt;code&gt;rsync&lt;/code&gt; can drastically cut transfer times for directories filled with small files.&lt;/p&gt;
&lt;p&gt;Each method is broken down with installation commands and usage examples, focusing on not just copying, but ensuring integrity with checksum verification.&lt;/p&gt;
&lt;p&gt;Using these techniques, especially in critical environments, can save time and prevent costly errors.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://www.tecmint.com/copy-large-files-faster-linux/&quot;&gt;Continue reading on &lt;strong&gt;www.tecmint.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/tools&quot;&gt;#tools&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/linux&quot;&gt;#linux&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-03T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/5-faster-ways-to-copy-large-or-millions-of-files-in-linux</id>
    <title>🔗 5 faster ways to copy large or millions of files in Linux</title>
    <updated>2026-07-03T13:00:00Z</updated>
  </entry>
</feed>