<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Aymen Furter | Senior Software Engineer</title><link>http://example.org/</link><description>Recent content on Aymen Furter | Senior Software Engineer</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 09 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://example.org/index.xml" rel="self" type="application/rss+xml"/><item><title>AI Engineer Coach</title><link>http://example.org/projects/ai-engineer-coach/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://example.org/projects/ai-engineer-coach/</guid><description/></item><item><title>Microagents Framework</title><link>http://example.org/projects/microagents/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://example.org/projects/microagents/</guid><description/></item><item><title>Monaco Copilot Demo</title><link>http://example.org/projects/monaco-copilot/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://example.org/projects/monaco-copilot/</guid><description/></item><item><title>SlideFinder</title><link>http://example.org/projects/slidefinder/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://example.org/projects/slidefinder/</guid><description/></item><item><title>Building an AI-Powered Slide Discovery Tool with Microsoft Agent Framework</title><link>http://example.org/articles/building-an-ai-powered-slide-discovery-tool-with-microsoft-agent-framework/</link><pubDate>Mon, 15 Dec 2025 00:00:00 +0000</pubDate><guid>http://example.org/articles/building-an-ai-powered-slide-discovery-tool-with-microsoft-agent-framework/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/slide1.png" alt="Building an AI-Powered Slide Discovery Tool"&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve all been there. A tight schedule, back-to-back meetings, and suddenly you find yourself staring at a blank PowerPoint slide, needing to prepare a presentation for an upcoming workshop. You dig through old decks, message colleagues, and search shared folders, hoping to find something—a diagram, a bulleted list, a reference architecture—that you can reuse to get started.&lt;/p&gt;
&lt;p&gt;In the corporate world, especially when presenting products or services, the goal isn&amp;rsquo;t usually to design a masterpiece from scratch. &lt;strong&gt;The goal is to not start from zero.&lt;/strong&gt; It is about efficiency: finding the right existing slide that explains a concept perfectly so you don&amp;rsquo;t have to redraw it.&lt;/p&gt;</description></item><item><title>Databricks-SQL at Your Agent's Fingertips via MCP in GitHub Copilot</title><link>http://example.org/articles/databricks-sql-at-your-agents-fingertips-via-mcp-in-github-copilot/</link><pubDate>Sat, 05 Jul 2025 00:00:00 +0000</pubDate><guid>http://example.org/articles/databricks-sql-at-your-agents-fingertips-via-mcp-in-github-copilot/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/databricks-mcp-cover.png" alt="Databricks-SQL at Your Agent&amp;rsquo;s Fingertips via MCP in GitHub Copilot"&gt;&lt;/p&gt;
&lt;p&gt;In my &lt;a href="https://www.linkedin.com/pulse/build-tools-prompts-extend-github-copilot-agents-aymen-furter-yo2ie/?trackingId=9mhY20H2RvaJ81RU21xBnw%3D%3D"&gt;previous post&lt;/a&gt; we built a custom tool to make ETL output order consistent. This time we keep the idea of purpose built tooling but let Copilot talk to an Azure Databricks instance through the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The result is a small Python server that runs inside VS Code and gives Copilot three new superpowers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQL execution&lt;/li&gt;
&lt;li&gt;table inspection&lt;/li&gt;
&lt;li&gt;table to table diffing with progressive sampling&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="why-this-is-awesome"&gt;Why this is awesome&lt;/h2&gt;
&lt;h3 id="higher-abstraction-for-copilot"&gt;Higher abstraction for Copilot&lt;/h3&gt;
&lt;p&gt;The server downloads both tables and runs the classic Unix diff for you. Copilot receives a concise unified diff instead of raw columns, so it can reason about differences without scrolling through thousands of lines.&lt;/p&gt;</description></item><item><title>Build Tools, Not Prompts – Extend GitHub Copilot with Task-Specific Agents</title><link>http://example.org/articles/build-tools-not-prompts-extend-github-copilot-with-task-specific-agents/</link><pubDate>Sun, 05 Jan 2025 00:00:00 +0000</pubDate><guid>http://example.org/articles/build-tools-not-prompts-extend-github-copilot-with-task-specific-agents/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/build-tools-copilot-architecture.png" alt="Architecture overview showing how GitHub Copilot interacts with MCP tools and Azure AI Agent Service"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.blog/changelog/2025-05-19-github-copilot-coding-agent-in-public-preview/"&gt;GitHub.com&lt;/a&gt; recently announced the public preview of its &lt;strong&gt;Copilot coding agent&lt;/strong&gt;, which can take ownership of entire issues, plan the steps, and work through them autonomously. Similarly, &lt;a href="https://openai.com/index/introducing-codex/"&gt;Codex&lt;/a&gt; from OpenAI has shown how models can interact with codebases directly when connected to a repository.&lt;/p&gt;
&lt;p&gt;These capabilities are promising, but not all tasks should be delegated to autonomous agents. The two main challenges are:&lt;/p&gt;</description></item><item><title>You Can Now Connect Your Own Model for GitHub Copilot 🤯</title><link>http://example.org/articles/you-can-now-connect-your-own-model-for-github-copilot/</link><pubDate>Sat, 04 Jan 2025 00:00:00 +0000</pubDate><guid>http://example.org/articles/you-can-now-connect-your-own-model-for-github-copilot/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/copilot-custom-model-interface.png" alt="GitHub Copilot custom model integration interface"&gt;&lt;/p&gt;
&lt;p&gt;GitHub Copilot Chat has taken a big leap forward by letting you connect your own custom AI model - for instance powered by &lt;strong&gt;Azure AI Foundry&lt;/strong&gt; - to the chat interface. This guide will walk you through deploying the DeepSeek R1 model (or any Azure AI Foundry-supported OSS model) and using a local LiteLLM proxy (exposing an ollama-like API) to enable this integration in VSCode Insiders, currently supported in Copilot chat, but not yet for code suggestion.&lt;/p&gt;</description></item><item><title>Document Creation with AI Agent Workflows</title><link>http://example.org/articles/document-creation-with-ai-agent-workflows/</link><pubDate>Fri, 03 Jan 2025 00:00:00 +0000</pubDate><guid>http://example.org/articles/document-creation-with-ai-agent-workflows/</guid><description>&lt;p&gt;Organizations manage a broad spectrum of official documents, from internal memos and client proposals to compliance submissions and operational guidelines. Creating these documents often demands considerable time and attention to consistency, accuracy, and compliance with standards. Recent advances in generative AI offer new ways to simplify and accelerate this process. By using multiple AI agents working together through frameworks such as Microsoft&amp;rsquo;s Semantic Kernel combined with Azure OpenAI Service, companies can automate the creation, validation, and formatting of documents more effectively.&lt;/p&gt;</description></item><item><title>Generating Easy-to-Understand Changelogs for Document Revisions</title><link>http://example.org/articles/generating-easy-to-understand-changelogs-for-document-revisions/</link><pubDate>Mon, 09 Dec 2024 00:00:00 +0000</pubDate><guid>http://example.org/articles/generating-easy-to-understand-changelogs-for-document-revisions/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/generating-changelogs-cover.png" alt="Generating Easy-to-Understand Changelogs for Document Revisions"&gt;&lt;/p&gt;
&lt;p&gt;I often see customers eager to leverage generative AI to better understand and reason over their existing data. One common scenario is comparing different revisions of a single long-form document. While developers easily track code changes and even get commit messages suggested by tools like &lt;a href="https://github.com/features/copilot"&gt;GitHub Copilot&lt;/a&gt;, handling similar insights for text documents like Word files can be tricky. Changelogs in documents are best practice, but they&amp;rsquo;re often missing, incomplete, or hard to follow.&lt;/p&gt;</description></item><item><title>The Future is Composable: Building Interoperable AI Systems with MCP and A2A Protocols</title><link>http://example.org/articles/the-future-is-composable-building-interoperable-ai-systems-with-mcp-and-a2a-protocols/</link><pubDate>Mon, 14 Jul 2025 00:00:00 +0000</pubDate><guid>http://example.org/articles/the-future-is-composable-building-interoperable-ai-systems-with-mcp-and-a2a-protocols/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/architecture.png" alt="The Future is Composable: Building Interoperable AI Systems"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;My views here are my own and do not reflect any employer or organization I may be affiliated with. Disclaimer: this article was written in July 2025. The landscape may change after this date.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Special thanks to Sanjeev Kumar and Mike Blöchlinger for the insightful discussions and collaboration throughout this project. Your perspective helped refine the architecture and pushed the thinking beyond the usual boundaries.&lt;/p&gt;</description></item><item><title>Building an Interactive Text-to-Podcast Experience with GPT-4o Real Time API</title><link>http://example.org/articles/building-an-interactive-text-to-podcast-experience-with-gpt-4o-real-time-api/</link><pubDate>Sat, 19 Oct 2024 00:00:00 +0000</pubDate><guid>http://example.org/articles/building-an-interactive-text-to-podcast-experience-with-gpt-4o-real-time-api/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/article-cover.png" alt="Building an Interactive Text-to-Podcast Experience with GPT-4o Real Time API"&gt;&lt;/p&gt;
&lt;p&gt;Before diving into the article, there&amp;rsquo;s also a podcast version available! 😉&lt;/p&gt;
&lt;p&gt;&lt;a href="https://soundcloud.com/aymen-furter/ai-generated-podcast-demo-1"&gt;🔊 Listen to the Podcast&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve all been there &amp;mdash; you have an article or a training you want to dive into, but your day is packed, and you just can&amp;rsquo;t seem to fit it in. Much of the content we consume daily is only available in one format. It might be a YouTube video, an article, or a podcast. However, the form of content often depends more on the author&amp;rsquo;s preference than on the nature of the topic itself. But wouldn&amp;rsquo;t it be convenient if you could switch between formats as needed, so that article you&amp;rsquo;ve been wanting to read could turn into something you can listen to while doing the dishes?&lt;/p&gt;</description></item><item><title>Elevating RAG with Multi-Agent Systems</title><link>http://example.org/articles/elevating-rag-with-multi-agent-systems/</link><pubDate>Sun, 30 Jun 2024 00:00:00 +0000</pubDate><guid>http://example.org/articles/elevating-rag-with-multi-agent-systems/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/elevating-rag-cover.png" alt="Elevating RAG with Multi-Agent Systems"&gt;&lt;/p&gt;
&lt;p&gt;In the wake of the generative AI revolution, we&amp;rsquo;ve witnessed a surge in AI-powered applications promising to transform how we interact with computers. Many of these apps fall short of user expectations. Today, I&amp;rsquo;d like to share my thoughts on improving Retrieval-Augmented Generation (RAG) applications, focusing on enhanced multi-modal indexing techniques and the exciting potential of multi-agent systems.&lt;/p&gt;
&lt;p&gt;To demonstrate these concepts, I&amp;rsquo;ve developed a prototype application called &amp;ldquo;&lt;a href="https://github.com/aymenfurter/smartrag"&gt;SmartRAG&lt;/a&gt;.&amp;rdquo; This system leverages cloud-native capabilities and mature AI frameworks to create a more robust and nuanced RAG experience.&lt;/p&gt;</description></item><item><title>11 Tips to Supercharge Your Pet Projects on Azure Kubernetes Without Emptying Your Wallet!</title><link>http://example.org/articles/11-tips-to-supercharge-your-pet-projects-on-azure-kubernetes-without-emptying-your-wallet/</link><pubDate>Sat, 24 Jun 2023 00:00:00 +0000</pubDate><guid>http://example.org/articles/11-tips-to-supercharge-your-pet-projects-on-azure-kubernetes-without-emptying-your-wallet/</guid><description>&lt;p&gt;Before we start, remember &lt;strong&gt;these tips are meant for fun projects that can handle some downtime&lt;/strong&gt;. We are trying to cut costs and this may mean your project won&amp;rsquo;t always be available. If you are working on a serious project that needs to be available all the time, you&amp;rsquo;ll need a different plan.&lt;/p&gt;
&lt;p&gt;Running a pet project on Azure is a great opportunity to learn. Azure Kubernetes Service (AKS) isn&amp;rsquo;t typically known for its cost-effectiveness. It requires dedicated resources allocated to your cluster, i.e. having Virtual Machine Scale Sets (VMSS) deployed. This can make it seem a bit daunting for those on a budget.&lt;/p&gt;</description></item><item><title>Azure API Management: Validating Multiple OIDC Issuers for a Single API</title><link>http://example.org/articles/azure-api-management-validating-multiple-oidc-issuers-for-a-single-api/</link><pubDate>Thu, 08 Jun 2023 00:00:00 +0000</pubDate><guid>http://example.org/articles/azure-api-management-validating-multiple-oidc-issuers-for-a-single-api/</guid><description>&lt;p&gt;Azure API Management can give you security-in-depth by already identifying invalid requests containing no or invalid JWT tokens on your requests before they even reach your backend.&lt;/p&gt;
&lt;p&gt;You can use the &lt;a href="https://learn.microsoft.com/en-us/azure/api-management/validate-jwt-policy"&gt;validate-jwt policy&lt;/a&gt; to validate any OIDC provider and specify the required claims, audiences, issuers, and signing keys. However, there might be situations where a single API should support multiple issuers. In that case, you can use the &lt;a href="https://learn.microsoft.com/en-us/azure/api-management/choose-policy"&gt;choose policy&lt;/a&gt; to apply different validation rules based on the issuer claim.&lt;/p&gt;</description></item><item><title>No Humans Needed: How ChatGPT Builds Apps Without You</title><link>http://example.org/articles/no-humans-needed-how-chatgpt-builds-apps-without-you/</link><pubDate>Sun, 19 Mar 2023 00:00:00 +0000</pubDate><guid>http://example.org/articles/no-humans-needed-how-chatgpt-builds-apps-without-you/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/chatgpt-autopilot.png" alt="ChatGPT Autopilot"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: I&amp;rsquo;m just experimenting with this as a personal hobby / for fun.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There has been a lot of buzz lately surrounding the ReAct Prompt Technique (&lt;a href="https://react-lm.github.io/"&gt;https://react-lm.github.io/&lt;/a&gt;), enabling LLMs to engage in reasoning and build thought processes. Additionally, ReAct provides a means for LLMs to articulate when they intend to execute an action, such as calling an API.&lt;/p&gt;
&lt;h2 id="chatgpt-on-autopilot-connecting-chatgpt-with-a-linux-shell"&gt;ChatGPT-On-Autopilot: Connecting ChatGPT With a Linux Shell&lt;/h2&gt;
&lt;p&gt;What would happen if we were to use the ReAct Prompt technique and grant ChatGPT access to a Linux shell (i.e. forwarding all of its &amp;lsquo;Actions&amp;rsquo; to a shell and then returning the output)? I&amp;rsquo;ve built a tool called &amp;ldquo;ChatGPT-on-autopilot&amp;rdquo; that does exactly that.&lt;/p&gt;</description></item><item><title>Himawari-8 Live Background in i3</title><link>http://example.org/articles/himawari-8-live-background-in-i3/</link><pubDate>Sun, 04 Mar 2018 00:00:00 +0000</pubDate><guid>http://example.org/articles/himawari-8-live-background-in-i3/</guid><description>&lt;p&gt;Himawari-8 provides free live feed images (every 10 minutes) from geostationary orbit. I&amp;rsquo;ve put together a small script to get it as a &amp;ldquo;live wallpaper&amp;rdquo; in i3.&lt;/p&gt;
&lt;p&gt;You can get the one-line script on GitHub: &lt;a href="https://github.com/aymenfurter/i3-himawari-bg"&gt;https://github.com/aymenfurter/i3-himawari-bg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The end result looks stunning with real-time satellite imagery of Earth updating every 10 minutes as your desktop background.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works&lt;/h2&gt;
&lt;p&gt;The script automatically downloads the latest Himawari-8 satellite images and sets them as the desktop background in the i3 window manager. The satellite provides high-resolution images of Earth from a geostationary orbit, offering a unique perspective of our planet with real weather patterns and cloud formations.&lt;/p&gt;</description></item><item><title>Looking Glass</title><link>http://example.org/articles/looking-glass/</link><pubDate>Thu, 21 Dec 2017 00:00:00 +0000</pubDate><guid>http://example.org/articles/looking-glass/</guid><description>&lt;p&gt;No, I&amp;rsquo;m not talking about Mozilla&amp;rsquo;s newest mass-roll-outed Mr Robot Addon. Looking Glass is a Linux app developed by Geoffrey McRae of HostFission. It lets you relay frames rendered within a virtual machine (with a Pass-through GPU) to the host machine in a very fast fashion. It also handles mouse and keyboard input.&lt;/p&gt;
&lt;h2 id="what-is-looking-glass"&gt;What is Looking Glass?&lt;/h2&gt;
&lt;p&gt;Looking Glass is a revolutionary application that allows you to run a virtual machine with GPU passthrough while seamlessly displaying the VM&amp;rsquo;s output on your host system. This is particularly useful for running Windows games or applications on a Linux host without the typical performance penalties associated with traditional virtualization.&lt;/p&gt;</description></item><item><title>Upscale Photos using Neural Enhance online</title><link>http://example.org/articles/upscale-photos-using-neural-enhance-online/</link><pubDate>Thu, 01 Jun 2017 00:00:00 +0000</pubDate><guid>http://example.org/articles/upscale-photos-using-neural-enhance-online/</guid><description>&lt;p&gt;Neural Enhance is a fantastic Machine Learning Showcase. It lets you upscale photos by &amp;lsquo;inventing&amp;rsquo; details using machine learning. Neural Enhance provides a docker container for easy deployment. However, for non-technical people (with slow computers) this might be a bit tricky. That&amp;rsquo;s the reason why I created a web app which lets you use the basic functionality online.&lt;/p&gt;
&lt;h2 id="about-neural-enhance"&gt;About Neural Enhance&lt;/h2&gt;
&lt;p&gt;Neural Enhance represents a breakthrough in image processing technology, using deep learning algorithms to intelligently upscale images while adding realistic details that weren&amp;rsquo;t present in the original. Unlike traditional upscaling methods that simply interpolate pixels, Neural Enhance actually &amp;ldquo;imagines&amp;rdquo; what additional details should look like based on patterns learned from thousands of high-resolution images.&lt;/p&gt;</description></item><item><title>Flexible Webservice Orchestration on Talend ESB using Apache Camel's Content Enricher Functionality</title><link>http://example.org/articles/flexible-webservice-orchestration-on-talend-esb-using-apache-camels-content-enricher-functionality/</link><pubDate>Sun, 30 Apr 2017 00:00:00 +0000</pubDate><guid>http://example.org/articles/flexible-webservice-orchestration-on-talend-esb-using-apache-camels-content-enricher-functionality/</guid><description>&lt;p&gt;A couple of months ago, I presented how to implement a simple orchestration case on Talend ESB using Apache Camel and Apache CXF. This reference implementation expects all endpoints to be available at all time, otherwise the request would fail. Often, a target system might not always be reachable or mandatory for the required orchestration case.&lt;/p&gt;
&lt;h2 id="the-challenge-with-traditional-orchestration"&gt;The Challenge with Traditional Orchestration&lt;/h2&gt;
&lt;p&gt;In traditional service orchestration patterns, all endpoints are typically treated as required dependencies. This creates several issues:&lt;/p&gt;</description></item><item><title>Pushing Data to Elastic Search in Apache Camel</title><link>http://example.org/articles/pushing-data-to-elastic-search-in-apache-camel/</link><pubDate>Fri, 17 Mar 2017 00:00:00 +0000</pubDate><guid>http://example.org/articles/pushing-data-to-elastic-search-in-apache-camel/</guid><description>&lt;p&gt;There are several options how to push data from within a camel route to Elastic Search. If your goal is to additionally pipe your data which goes through a route into Elastic, the Wire Tab Integration Pattern comes in handy.&lt;/p&gt;
&lt;h2 id="integration-approaches"&gt;Integration Approaches&lt;/h2&gt;
&lt;h3 id="camel-http4--camel-jackson"&gt;Camel-http4 &amp;amp; Camel-Jackson&lt;/h3&gt;
&lt;p&gt;This option is my personal preference. For everything but POCs / prototyping, I recommend this approach.&lt;/p&gt;
&lt;p&gt;This method provides several advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Production Ready&lt;/strong&gt;: Robust and battle-tested for enterprise environments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible JSON Handling&lt;/strong&gt;: Full control over data transformation with Jackson&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP Protocol&lt;/strong&gt;: Uses standard REST APIs for reliable communication&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error Handling&lt;/strong&gt;: Comprehensive error handling and retry mechanisms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Efficient HTTP connection pooling and management&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="wire-tap-integration-pattern"&gt;Wire Tap Integration Pattern&lt;/h3&gt;
&lt;p&gt;The Wire Tap pattern is particularly useful when you want to:&lt;/p&gt;</description></item><item><title>Visualize Talend Service Activity Monitoring using SAMvisual</title><link>http://example.org/articles/visualize-talend-service-activity-monitoring-using-samvisual/</link><pubDate>Fri, 20 Jan 2017 00:00:00 +0000</pubDate><guid>http://example.org/articles/visualize-talend-service-activity-monitoring-using-samvisual/</guid><description>&lt;p&gt;The subscription version of Talend ESB comes with so called &amp;ldquo;Event Logging&amp;rdquo;. Event Logging can give you valuable insight into the activity of your platform. Especially if you also use Service Activity Monitoring (In Short: SAM) – In combination with Elastic Search and Kibana. However, the feature set lacks some kind of &amp;ldquo;High Level Visualization&amp;rdquo;, showing the web service flows across your distributed system.&lt;/p&gt;
&lt;h2 id="the-challenge-with-standard-sam"&gt;The Challenge with Standard SAM&lt;/h2&gt;
&lt;p&gt;While Talend ESB&amp;rsquo;s Service Activity Monitoring provides comprehensive logging capabilities, it has some limitations:&lt;/p&gt;</description></item><item><title>Is Magnolia-CMS the right fit for Microsites?</title><link>http://example.org/articles/is-magnolia-cms-the-right-fit-for-microsites/</link><pubDate>Thu, 29 Dec 2016 00:00:00 +0000</pubDate><guid>http://example.org/articles/is-magnolia-cms-the-right-fit-for-microsites/</guid><description>&lt;p&gt;Magnolia CMS – typically used in Enterprise environments – is a powerful, java based CMS. The community edition comes pre-packed with an Apache Tomcat Runtime. Is it only suitable for Big Web Portals?&lt;/p&gt;
&lt;h2 id="the-right-tool-for-the-right-job"&gt;The Right Tool for the Right Job&lt;/h2&gt;
&lt;p&gt;A wise policy in the IT world. It is not enough that something can be done – it should also make sense from various perspectives including cost, complexity, and long-term maintainability.&lt;/p&gt;</description></item><item><title>RescueBomb – A multiplayer Bomberman/Rescue the princess game</title><link>http://example.org/articles/rescuebomb-a-multiplayer-bomberman/rescue-the-princess-game/</link><pubDate>Tue, 20 Dec 2016 00:00:00 +0000</pubDate><guid>http://example.org/articles/rescuebomb-a-multiplayer-bomberman/rescue-the-princess-game/</guid><description>&lt;p&gt;This year, PRODYNA hosted a company-internal Hackathon. All employees of our branch (Switzerland) were divided into teams of three to four members. The teams then received a couple of tasks. One of this task was the creation of a simple game.&lt;/p&gt;
&lt;h2 id="game-requirements"&gt;Game Requirements&lt;/h2&gt;
&lt;p&gt;The required features were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Maze Generation&lt;/strong&gt;: Procedurally generated game levels&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Controllable Player Character&lt;/strong&gt;: Responsive player movement and controls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Goal Objective&lt;/strong&gt;: Clear win conditions and gameplay objectives&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiplayer Support&lt;/strong&gt;: Multiple players in the same game session&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="rescuebomb-game-concept"&gt;RescueBomb: Game Concept&lt;/h2&gt;
&lt;p&gt;We developed a unique hybrid game that combines classic Bomberman mechanics with a rescue mission objective:&lt;/p&gt;</description></item><item><title>Reviewing SSH Activity using Elastic Search / Kibana</title><link>http://example.org/articles/reviewing-ssh-activity-using-elastic-search-/-kibana/</link><pubDate>Sun, 11 Dec 2016 00:00:00 +0000</pubDate><guid>http://example.org/articles/reviewing-ssh-activity-using-elastic-search-/-kibana/</guid><description>&lt;p&gt;Keeping an eye on your server&amp;rsquo;s SSH activity from time to time is recommended. I created a dashboard using Kibana/Elastic Search to quickly review and potentially identify any suspicious activity. It is available on GitHub (&lt;a href="https://github.com/aymenfurter/kibana-sshactivity/"&gt;https://github.com/aymenfurter/kibana-sshactivity/&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id="why-monitor-ssh-activity"&gt;Why Monitor SSH Activity?&lt;/h2&gt;
&lt;p&gt;SSH monitoring is crucial for server security because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Attack Detection&lt;/strong&gt;: Identify brute force attacks and unauthorized access attempts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compliance Requirements&lt;/strong&gt;: Many regulations require audit trails of system access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forensic Analysis&lt;/strong&gt;: Understand what happened during security incidents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational Insights&lt;/strong&gt;: Monitor legitimate user behavior and system usage patterns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Early Warning System&lt;/strong&gt;: Detect anomalies before they become serious security breaches&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dashboard-architecture"&gt;Dashboard Architecture&lt;/h2&gt;
&lt;h3 id="data-collection"&gt;Data Collection&lt;/h3&gt;
&lt;p&gt;The solution processes SSH logs to extract:&lt;/p&gt;</description></item><item><title>Orchestration on Talend ESB using Apache Camel &amp; Apache CXF</title><link>http://example.org/articles/orchestration-on-talend-esb-using-apache-camel-apache-cxf/</link><pubDate>Thu, 10 Nov 2016 00:00:00 +0000</pubDate><guid>http://example.org/articles/orchestration-on-talend-esb-using-apache-camel-apache-cxf/</guid><description>&lt;p&gt;Orchestration is a key feature of every modern ESB. According to Wikipedia, the definition goes: &amp;ldquo;Orchestration is the automated arrangement, coordination, and management of computer systems, middleware, and services.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;When we are talking about SOA, Orchestration means usually to simplify multiple webservice calls – which may or may not depend on each other – behind an easy-to-use interface.&lt;/p&gt;
&lt;h2 id="understanding-service-orchestration"&gt;Understanding Service Orchestration&lt;/h2&gt;
&lt;p&gt;Service orchestration addresses the complexity that arises in service-oriented architectures where business processes require coordination across multiple services:&lt;/p&gt;</description></item><item><title>Integrating AI-Powered Coding Assistance into Your Custom Web IDE</title><link>http://example.org/articles/integrating-ai-powered-coding-assistance-into-your-custom-web-ide/</link><pubDate>Wed, 10 Apr 2024 00:00:00 +0000</pubDate><guid>http://example.org/articles/integrating-ai-powered-coding-assistance-into-your-custom-web-ide/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/ai-powered-coding-assistance.png" alt="Integrating AI-Powered Coding Assistance into Your Custom Web IDE"&gt;&lt;/p&gt;
&lt;p&gt;Over the past few weeks, it has been my privilege to collaborate with my distinguished colleagues, &lt;a href="https://ch.linkedin.com/in/damianocuria"&gt;Damiano Curia&lt;/a&gt;, &lt;a href="https://ch.linkedin.com/in/carlosgarcialalicata"&gt;Carlos Garcia Lalicata&lt;/a&gt;, &lt;a href="https://ch.linkedin.com/in/frarin"&gt;Francesco Rinaldi&lt;/a&gt;, &lt;a href="https://ch.linkedin.com/in/rolf-egli-32251513a"&gt;Rolf Egli&lt;/a&gt; and &lt;a href="https://ch.linkedin.com/in/yasmin-sarbaoui"&gt;Yasmin Sarbaoui&lt;/a&gt;, on investigating ways to incorporate Generative AI capabilities into Monaco-based Web IDEs.&lt;/p&gt;
&lt;p&gt;Before diving deeper into our project, I want to pause and reflect on the tools that we used to build it. If you asked me what my favorite coding tool is, I&amp;rsquo;d say &lt;a href="https://code.visualstudio.com/"&gt;VSCode&lt;/a&gt; without hesitation. And my favorite extension? That&amp;rsquo;d be &lt;a href="https://github.com/features/copilot"&gt;GitHub Copilot&lt;/a&gt;, closely followed by &lt;a href="https://github.com/VSCodeVim/Vim"&gt;VSCodeVim&lt;/a&gt;. I estimate that 80% of my code is written with the help of GitHub Copilot. It&amp;rsquo;s like it&amp;rsquo;s right at home with me, living directly in my code editor and offering me multiple lines of code suggestions as I type. I can even tailor its behavior further by being more specific with my requests to my AI coding companion, instructing it directly in my code through specific comments. Using Copilot&amp;rsquo;s chat experience lets me ask questions about the code I&amp;rsquo;m writing, keeping me in the coding flow and focused.&lt;/p&gt;</description></item><item><title>Relevance and Recency in AI Apps</title><link>http://example.org/articles/relevance-and-recency-in-ai-apps/</link><pubDate>Mon, 30 Oct 2023 00:00:00 +0000</pubDate><guid>http://example.org/articles/relevance-and-recency-in-ai-apps/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/relevance-recency-ai-apps.png" alt="Relevance and Recency in AI Apps"&gt;&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://www.linkedin.com/pulse/journey-crafting-ai-chatbot-aymen-furter/"&gt;past articles&lt;/a&gt;, I talked about making a chatbot called &amp;ldquo;Upskiller&amp;rdquo; that uses the vast information from YouTube videos about Azure. While it effectively handles specific queries such as &amp;ldquo;How can I integrate an Azure Function into a Virtual Network?&amp;rdquo;, it struggles with time-sensitive queries like &amp;ldquo;What&amp;rsquo;s new on Azure Functions?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://example.org/images/chatbot-hallucination.png" alt="Chatbot Hallucination Example"&gt;&lt;/p&gt;
&lt;h2 id="but-why-is-that-"&gt;But why is that? 🤔&lt;/h2&gt;
&lt;p&gt;The answer has two parts. Firstly, the model isn&amp;rsquo;t aware of the current time. Keep in mind, when we use the RAG Pattern (Retrieval Augmented Generation), we&amp;rsquo;re adding relevant context to the prompt. Even if we provide the correct context (like including up-to-date and relevant data), the model might not recognize that the data is recent because it&amp;rsquo;s unaware of the present time. This issue can be resolved by adding the current date and time to the prompt. In Semantic Kernel, this can be done with the built-in TimeSkill.&lt;/p&gt;</description></item><item><title>Chat with Your Photos: Revolutionizing Asset Cataloging with GPT-4 Vision</title><link>http://example.org/articles/chat-with-your-photos-revolutionizing-asset-cataloging-with-gpt-4-vision/</link><pubDate>Sun, 18 Feb 2024 00:00:00 +0000</pubDate><guid>http://example.org/articles/chat-with-your-photos-revolutionizing-asset-cataloging-with-gpt-4-vision/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/chat-with-photos.png" alt="Chat with Your Photos: Revolutionizing Asset Cataloging with GPT-4 Vision"&gt;&lt;/p&gt;
&lt;p&gt;In the digital era, extensive libraries of images have become ubiquitous across multiple industries, such as e-commerce, education, marketing, and online media. Often, these valuable image databases lack comprehensive tagging and captions, making pinpointing the desired assets a cumbersome task. Enter GPT-4 Vision, which stands to revolutionize how we interact with untagged image repositories. This article explores how GPT-4 Vision can transform these collections into interactive, searchable databases, allowing users to engage in a chat with your photos experience.&lt;/p&gt;</description></item><item><title>Integrate PromptFlow into a CI/CD pipeline (On-Agent)</title><link>http://example.org/articles/integrate-promptflow-into-a-ci/cd-pipeline-on-agent/</link><pubDate>Sat, 30 Dec 2023 00:00:00 +0000</pubDate><guid>http://example.org/articles/integrate-promptflow-into-a-ci/cd-pipeline-on-agent/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/promptflow-cicd-header.png" alt="Integrate PromptFlow into a CI/CD pipeline (On-Agent)"&gt;&lt;/p&gt;
&lt;p&gt;With the ongoing updates in Large Language Models (LLMs) and their orchestration libraries, it is important to recognize and prepare for potential changes that may arise when upgrading to newer releases. These changes can manifest in two key areas: first, updating to a newer version of a library might alter how the AI app functions or handles prompts; second, newer versions of large language models themselves may respond differently to the same prompts, leading to variations in outputs.&lt;/p&gt;</description></item><item><title>The Journey of Crafting an AI Chatbot</title><link>http://example.org/articles/the-journey-of-crafting-an-ai-chatbot/</link><pubDate>Sun, 13 Aug 2023 00:00:00 +0000</pubDate><guid>http://example.org/articles/the-journey-of-crafting-an-ai-chatbot/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/crafting-ai-chatbot-header.png" alt="The Journey of Crafting an AI Chatbot"&gt;&lt;/p&gt;
&lt;p&gt;I often study a lot of material to understand the details of Azure services. Interestingly, I&amp;rsquo;ve found that sometimes the most insightful resources aren&amp;rsquo;t always in written form. Instead, they are presented in the form of videos. These videos might be meticulously crafted by professionals pursuing it as a passion project, or they could be official recordings from industry events and meetups available on YouTube.&lt;/p&gt;</description></item><item><title>One Window Is All You Need</title><link>http://example.org/articles/one-window-is-all-you-need/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0000</pubDate><guid>http://example.org/articles/one-window-is-all-you-need/</guid><description>&lt;p&gt;Almost every customer conversation I have lately lands on the same point: the
productivity gains from coding agents are real. A developer paired with a few
agents ships a lot more than that same developer working alone. Nobody really
argues with that anymore.&lt;/p&gt;
&lt;p&gt;What I find more interesting is where the bottleneck went.&lt;/p&gt;
&lt;p&gt;It used to be people. There were only so many work items a team could take on at
once. That&amp;rsquo;s no longer the constraint. Now the constraint is what you can
actually review and merge in a given window. And if you don&amp;rsquo;t scale the rest of
the software development lifecycle to match, you end up with stale work: changes
that may well be production-ready but never land, because nobody has the time to
review them while keeping quality where it needs to be.&lt;/p&gt;</description></item><item><title>A Data-Driven Approach to Agentic Engineering</title><link>http://example.org/articles/a-data-driven-approach-to-agentic-engineering/</link><pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate><guid>http://example.org/articles/a-data-driven-approach-to-agentic-engineering/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/ai-engineer-coach-dashboard.png" alt="AI Engineer Coach Dashboard"&gt;&lt;/p&gt;
&lt;p&gt;The way we build software keeps changing, and not in a way that ever settles. Models get better every few weeks. Harnesses ship new features faster than you can read the release notes. For any developer using AI seriously, this turns into a min-max problem: how much of your time goes into doing the work with the tools you already know, and how much goes into figuring out whether your workflow is actually any good?&lt;/p&gt;</description></item><item><title>Recursive Language Models: When Your Agent Explores Data Like a Developer</title><link>http://example.org/articles/recursive-language-models-when-your-agent-explores-data-like-a-developer/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><guid>http://example.org/articles/recursive-language-models-when-your-agent-explores-data-like-a-developer/</guid><description>&lt;p&gt;&lt;img src="https://github.com/aymenfurter/rlm-on-azure/raw/main/docs/screenshot-trace.png" alt="RLM trace view showing iterative code execution"&gt;&lt;/p&gt;
&lt;p&gt;LLMs are getting better at writing and executing code with every release. Not just generating snippets, but actually exploring file systems, reading output, adjusting their approach, and trying again. This capability generalizes far beyond writing software.&lt;/p&gt;
&lt;p&gt;I was recently looking into &lt;strong&gt;Recursive Language Models (RLM)&lt;/strong&gt; as proposed by Zhang, Kraska &amp;amp; Khattab (2026) in their paper &lt;a href="https://arxiv.org/abs/2512.24601"&gt;&lt;em&gt;Recursive Language Models&lt;/em&gt;&lt;/a&gt;. The core idea: instead of feeding the full prompt into the model&amp;rsquo;s context window, you give the LLM a sandboxed Python REPL with the corpus loaded as a variable and let it write code to explore, filter, extract, and compose an answer. The model decides how to navigate the data. A virtual filesystem pattern where the agent controls its own search strategy.&lt;/p&gt;</description></item><item><title>When Your AI Agent Has Admin Rights – Defense in Depth for Autonomous Copilots</title><link>http://example.org/articles/when-your-ai-agent-has-admin-rights-defense-in-depth-for-autonomous-copilots/</link><pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate><guid>http://example.org/articles/when-your-ai-agent-has-admin-rights-defense-in-depth-for-autonomous-copilots/</guid><description>&lt;p&gt;&lt;img src="https://raw.githubusercontent.com/aymenfurter/polyclaw/27a2972f9d654a0630ec394ad0996e0178d6b163/app/frontend/public/layered-security.svg" alt="Layered security model"&gt;&lt;/p&gt;
&lt;p&gt;In my &lt;a href="http://example.org/articles/building-an-ai-copilot-that-plans-remembers-and-calls-you-on-the-phone/"&gt;previous article&lt;/a&gt; I introduced Polyclaw — an autonomous AI copilot inspired by &lt;a href="https://github.com/openclaw/openclaw"&gt;OpenClaw&lt;/a&gt; and rebuilt to be Azure-native. It schedules its own work, builds long-term memory, and can call you on the phone. The follow-up question everyone asks is always the same: &lt;em&gt;but how do you keep it from going rogue?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Fair question. The honest answer is that there is no single switch you flip. Security for an autonomous agent is a dial, not a toggle. What I will walk through here is a set of layered controls — leveraging Azure-native services like Entra ID, Azure AI Content Safety, and Container Apps Dynamic Sessions — that you can tune based on how much autonomy your situation actually warrants.&lt;/p&gt;</description></item><item><title>Building an AI Copilot That Plans, Remembers, and Calls You on the Phone</title><link>http://example.org/articles/building-an-ai-copilot-that-plans-remembers-and-calls-you-on-the-phone/</link><pubDate>Sat, 21 Feb 2026 00:00:00 +0000</pubDate><guid>http://example.org/articles/building-an-ai-copilot-that-plans-remembers-and-calls-you-on-the-phone/</guid><description>&lt;p&gt;&lt;img src="https://aymenfurter.github.io/polyclaw/screenshots/web-newchat-try-asking.png" alt="Polyclaw web chat interface"&gt;&lt;/p&gt;
&lt;p&gt;What if your AI assistant didn&amp;rsquo;t forget everything the moment you closed the tab? What if it could check on things while you sleep, text you on Telegram when something breaks, and — if it&amp;rsquo;s serious enough — &lt;em&gt;call you on the phone&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;These questions have been stuck in my head for months. Today&amp;rsquo;s consumer AI assistants are brilliant in the moment but fundamentally amnesiac. Every session starts from zero. No calendar, no persistent workspace, no way for the agent to reach out proactively. They are reactive, short-lived, and forgetful. I wanted to see what happens when you remove those constraints.&lt;/p&gt;</description></item><item><title>Environment Engineering: Platform Engineering for AI Agents</title><link>http://example.org/articles/environment-engineering-platform-engineering-for-ai-agents/</link><pubDate>Wed, 15 Oct 2025 00:00:00 +0000</pubDate><guid>http://example.org/articles/environment-engineering-platform-engineering-for-ai-agents/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/header-pe.png" alt="Environment Engineering Header"&gt;&lt;/p&gt;
&lt;h2 id="what-problem-are-we-solving"&gt;What problem are we solving&lt;/h2&gt;
&lt;p&gt;Many agent failures are not caused by weak prompts or undertrained models, but by poor environments. The most capable agent can still fail if the world it operates in is chaotic, underspecified, or unsafe.&lt;/p&gt;
&lt;p&gt;A common pattern of failure is when tools are designed without clear feedback. If a function returns only a generic error, the agent wastes cycles trying to debug instead of executing the user&amp;rsquo;s task. Another example is an NL2SQL agent with access to every table in a database — it spends more time exploring irrelevant data than answering the query. In both cases, the problem is environmental, not cognitive.&lt;/p&gt;</description></item><item><title>Eclipse as a Firefox / Thunderbird Extension IDE</title><link>http://example.org/articles/eclipse-as-a-firefox-/-thunderbird-extension-ide/</link><pubDate>Tue, 14 Jul 2009 00:00:00 +0000</pubDate><guid>http://example.org/articles/eclipse-as-a-firefox-/-thunderbird-extension-ide/</guid><description>&lt;p&gt;Currently, Firefox and Thunderbird Extensions are very popular. Scripting an Extension is quite simple. All the information you need about the basic setup, you can find at the &lt;a href="https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons"&gt;Mozilla Dev Wiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this article I want to show how you can use Eclipse for developing Extensions.&lt;/p&gt;
&lt;p&gt;First of all, you need to get Eclipse. You can download it at the &lt;a href="https://www.eclipse.org/"&gt;official Page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Since Firefox/Thunderbird-Extensions are &lt;strong&gt;JavaScript based&lt;/strong&gt;, it&amp;rsquo;s strongly recommended to use the &lt;a href="https://www.eclipse.org/webtools/"&gt;Web Tools Platform&lt;/a&gt; (WTP) Plugin. It&amp;rsquo;s already installed in the JEE Package and it supports &lt;strong&gt;JavaScript-Highlighting&lt;/strong&gt; and &lt;strong&gt;Auto Completion&lt;/strong&gt;. If you like to edit the XUL-Files (GUI-Elements) and modify the rdf-Files &lt;strong&gt;directly in Eclipse&lt;/strong&gt; you will need the XUL Booster-Plugin for Eclipse.&lt;/p&gt;</description></item><item><title>Deep Research on your own data with Microsoft Foundry</title><link>http://example.org/articles/deep-research-on-your-own-data-with-microsoft-foundry/</link><pubDate>Tue, 20 Jan 2026 00:00:00 +0000</pubDate><guid>http://example.org/articles/deep-research-on-your-own-data-with-microsoft-foundry/</guid><description>&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Disclaimer&lt;/strong&gt;: The features discussed in this article, specifically the &lt;code&gt;o3-deep-research&lt;/code&gt; model and certain Foundry capabilities, are currently in &lt;strong&gt;Preview&lt;/strong&gt;. This architecture is intended for experimental and learning purposes and is &lt;strong&gt;not ready for production usage&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Today, I released my new set of labs that everyone can try: &lt;a href="https://github.com/aymenfurter/AI-Engineer-Zero-to-Hero"&gt;&lt;strong&gt;Microsoft Foundry for AI Engineers: Zero to Hero&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Those who know me personally know that I&amp;rsquo;m a big fan of all things space - the history, the engineering, the sheer scale of it. So naturally, all my labs have a bit of a space theme. The goal of this repository is to take you on a journey, learning not just what’s possible with AI, and how to use the tools found in Microsoft Foundry.&lt;/p&gt;</description></item><item><title>Stop Micromanaging Your AI with Ralph</title><link>http://example.org/articles/stop-micromanaging-your-ai-with-ralph/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate><guid>http://example.org/articles/stop-micromanaging-your-ai-with-ralph/</guid><description>&lt;p&gt;Recently, a new programming pattern for AI coding agents has emerged. It is called the &lt;strong&gt;Ralph technique&lt;/strong&gt; (pioneered by Geoffrey Huntley).&lt;/p&gt;
&lt;p&gt;The core idea addresses a friction point we all feel today: agent micromanagement. Currently, we guide our agents through tasks one by one. We decide where to start, we often decide the order, and we decide when to flush the context. We effectively act as the project manager for a junior developer who is brilliant but needs constant supervision.&lt;/p&gt;</description></item><item><title>How to Effectively Use Opus 4.5 in Copilot</title><link>http://example.org/articles/how-to-effectively-use-opus-4.5-in-copilot/</link><pubDate>Wed, 07 Jan 2026 00:00:00 +0000</pubDate><guid>http://example.org/articles/how-to-effectively-use-opus-4.5-in-copilot/</guid><description>&lt;p&gt;Recently, Anthropic released their new flagship model, &lt;strong&gt;Opus 4.5&lt;/strong&gt;. The holiday season provided a quiet window to really experiment with it, and after putting it through its paces, it is becoming clear that this model isn&amp;rsquo;t just an incremental upgrade. It is fundamentally changing how we use AI to ship software.&lt;/p&gt;
&lt;p&gt;Before Opus 4.5, my personal workflow was heavily centered on the mid-sized Sonnet model. I had little reason to switch to the full-size legacy Opus. I treated the larger model as a specialized tool for specific scenarios, usually when I hit a bug or a roadblock that the faster, lighter model couldn&amp;rsquo;t resolve. It was a troubleshooting device, not a primary author.&lt;/p&gt;</description></item><item><title>Agent Routing with Azure AI Foundry and Microsoft Purview</title><link>http://example.org/articles/agent-routing-with-azure-ai-foundry-and-microsoft-purview/</link><pubDate>Thu, 18 Sep 2025 00:00:00 +0000</pubDate><guid>http://example.org/articles/agent-routing-with-azure-ai-foundry-and-microsoft-purview/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/IMG_0014.png" alt="Agent Routing with Azure AI Foundry and Microsoft Purview"&gt;&lt;/p&gt;
&lt;p&gt;As AI apps become more complex, a pattern emerges: we move from a single monolithic agent to a collection of smaller, specialized agents. One agent may be an expert in searching internal documents, another excels at querying structured data in Microsoft Fabric, and a third can browse the web for recent information. This pattern is powerful, but it introduces a new challenge: how do you route a user&amp;rsquo;s query to the right agent?&lt;/p&gt;</description></item><item><title>Building AI Agents That Users Trust</title><link>http://example.org/articles/building-ai-agents-that-users-trust/</link><pubDate>Mon, 11 Aug 2025 00:00:00 +0000</pubDate><guid>http://example.org/articles/building-ai-agents-that-users-trust/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/IMG_0012.png" alt="Building AI Agents That Users Trust"&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve all been there. The AI team is proud; they&amp;rsquo;ve just launched a new AI agent. They ran load tests and ensured the infrastructure can handle the traffic. For the first few days, utilization looks great. Most people are curious about what this new AI application can do. But as time passes, adoption flatlines. A few power users know exactly how to query the app, but the initial wave of users never returns.&lt;/p&gt;</description></item><item><title>Agentic Web Crawling &amp; NL2SQL with Microsoft Fabric's Data Agent</title><link>http://example.org/articles/agentic-web-crawling-nl2sql-with-microsoft-fabrics-data-agent/</link><pubDate>Tue, 05 Aug 2025 00:00:00 +0000</pubDate><guid>http://example.org/articles/agentic-web-crawling-nl2sql-with-microsoft-fabrics-data-agent/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/IMG_0008.png" alt="Agentic Web Crawling"&gt;&lt;/p&gt;
&lt;p&gt;In the initial wave of AI adoption, the focus was on making unstructured data discoverable. We used techniques like chunking and vector search to find the relevant parts of documents to answer a question, then provided that as context to the model.&lt;/p&gt;
&lt;p&gt;What I&amp;rsquo;ve seen since are more complex use cases: giving agents not only access to knowledge but also the capability to execute actions. A great example is the ability to run SQL queries, allowing LLMs to tap into structured data, not just unstructured content. While this is a popular use case in hackathons and demos, I&amp;rsquo;ve seen these kinds of projects often get stuck in PoC land, unlike standard RAG implementations. Getting most queries right is surprisingly simple, but Text-to-SQL solutions can be sneaky, and incorrect answers don&amp;rsquo;t always throw errors.&lt;/p&gt;</description></item><item><title>Document Your AI Agents Like Code: A GitHub Template for A2A Agent Inventories</title><link>http://example.org/articles/document-your-ai-agents-like-code-a-github-template-for-a2a-agent-inventories/</link><pubDate>Sun, 20 Jul 2025 00:00:00 +0000</pubDate><guid>http://example.org/articles/document-your-ai-agents-like-code-a-github-template-for-a2a-agent-inventories/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/IMG_0006.png" alt="Agent Directory"&gt;&lt;/p&gt;
&lt;p&gt;Many years ago, I was part of a project migrating legacy APIs from an old XML-based protocol to modern, REST-based OpenAPI specs. A lesson that has stuck with me from that experience is that while you&amp;rsquo;re building, everything feels clean and modern. You might take shortcuts to meet a deadline, telling yourself you&amp;rsquo;ll clean it up later. But &amp;ldquo;later&amp;rdquo; rarely comes. The team&amp;rsquo;s focus shifts, new deadlines appear, and the small documentation gaps become permanent technical debt.&lt;/p&gt;</description></item><item><title>Azure OpenAI with APIM 🕵️</title><link>http://example.org/articles/azure-openai-with-apim-%EF%B8%8F/</link><pubDate>Thu, 18 May 2023 00:00:00 +0000</pubDate><guid>http://example.org/articles/azure-openai-with-apim-%EF%B8%8F/</guid><description>&lt;p&gt;Over the past few months, we all witnessed a surge in popularity of Large Language Models.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve personally worked on several proof-of-concepts (PoCs) revolving around OpenAI. One such instance is &lt;a href="https://github.com/aymenfurter/x"&gt;X&lt;/a&gt;. This app utilizes the power of GPT-4 and LLM-Chains to automate complex tasks, such as writing and testing code. All in your terminal.&lt;/p&gt;
&lt;p&gt;Another project I worked on is &lt;a href="https://github.com/aymenfurter/florencellm"&gt;florenceLLM&lt;/a&gt;. It is an intelligent chatbot designed to locate an individual who can assist with a specific subject based on GitHub commit analysis. This ability to connect users with the right expert in real-time showcases the transformative potential of AI.&lt;/p&gt;</description></item><item><title>Exploring the Capabilities of Large Language Models: Analyzing Unstructured Text 🕵️</title><link>http://example.org/articles/exploring-the-capabilities-of-large-language-models-analyzing-unstructured-text-%EF%B8%8F/</link><pubDate>Mon, 27 Feb 2023 00:00:00 +0000</pubDate><guid>http://example.org/articles/exploring-the-capabilities-of-large-language-models-analyzing-unstructured-text-%EF%B8%8F/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/exploring-llm-capabilities.gif" alt="Exploring LLM Capabilities"&gt;&lt;/p&gt;
&lt;p&gt;Recently, there has been a lot of hype around large language models and their application in chatbots. However, there is so much more that this technology can offer. Since the Large Language Models were introduced, I was curious about their potential for analyzing unstructured text. That was the reason why I decided to build InsightGPT, to see if it would be possible to reason over this type of data. As a test drive, I analyzed two specific use cases — accident and ufo sightings reports.&lt;/p&gt;</description></item><item><title>Running a window manager on top of WSL2</title><link>http://example.org/articles/running-a-window-manager-on-top-of-wsl2/</link><pubDate>Sun, 22 Jan 2023 00:00:00 +0000</pubDate><guid>http://example.org/articles/running-a-window-manager-on-top-of-wsl2/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/wsl2-window-manager.png" alt="WSL2 Window Manager"&gt;&lt;/p&gt;
&lt;p&gt;WSL2 is the optimal solution for bringing the Linux command line experience to Windows. The user experience when using the Windows Terminal is great. Still — As a long-time user of i3wm, I was curious about the possibility of running i3wm within WSL2. Installing it is straightforward; the default WSL2 installation is Ubuntu, and i3wm is readily available in the repositories. But, how can you run it? WSL was not designed to run a window manager.&lt;/p&gt;</description></item><item><title>Building a Unity game in one day using ChatGPT and DALL·E 2</title><link>http://example.org/articles/building-a-unity-game-in-one-day-using-chatgpt-and-dalle-2/</link><pubDate>Sun, 01 Jan 2023 00:00:00 +0000</pubDate><guid>http://example.org/articles/building-a-unity-game-in-one-day-using-chatgpt-and-dalle-2/</guid><description>&lt;p&gt;I recently built a Unity game with the help of ChatGPT, an amazing tool for developers. I included DALLE-2 for graphics and video game backgrounds. DALLE-2 provides an outpainting capability which allowed me to create truly incredible game world.&lt;/p&gt;
&lt;p&gt;Years ago, I decided to build a multiplayer game named &lt;a href="https://github.com/aymenfurter/rescuebomb"&gt;Rescuebomb&lt;/a&gt; using HTML and Vanilla Javascript. It ended up being a lot of fun during the event. Since then, I wanted to explore the more advanced possibilities of Unity.&lt;/p&gt;</description></item><item><title>Some Experiments with ChatGPT</title><link>http://example.org/articles/some-experiments-with-chatgpt/</link><pubDate>Sun, 04 Dec 2022 00:00:00 +0000</pubDate><guid>http://example.org/articles/some-experiments-with-chatgpt/</guid><description>&lt;p&gt;&lt;a href="https://chat.openai.com/chat"&gt;ChatGPT&lt;/a&gt; is a GPT-based chatbot developed by OpenAI that allows users to engage in natural language conversations with a virtual assistant. This technology has numerous potential applications, but in this article, we will focus on three entertaining ways you can use ChatGPT.&lt;/p&gt;
&lt;h2 id="play-an-rpg-game"&gt;Play an RPG Game!&lt;/h2&gt;
&lt;p&gt;With ChatGPT, users can transform the AI language model into an interactive role-playing game (RPG).&lt;/p&gt;
&lt;p&gt;Use the following ChatGPT prompt to get going:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🐕 can be moved with the input &amp;ldquo;LEFT&amp;rdquo;, &amp;ldquo;RIGHT&amp;rdquo;, &amp;ldquo;UP&amp;rdquo;, and &amp;ldquo;DOWN&amp;rdquo; to be moved around the map. The 🐕 is allowed to move on 🌱.&lt;/p&gt;</description></item><item><title>Accessing ARM preview features in Terraform</title><link>http://example.org/articles/accessing-arm-preview-features-in-terraform/</link><pubDate>Thu, 01 Dec 2022 00:00:00 +0000</pubDate><guid>http://example.org/articles/accessing-arm-preview-features-in-terraform/</guid><description>&lt;p&gt;Terraform helps users get the most out of their cloud when provisioning infrastructure in an automated and repeatable way. Azure Resource Manager (ARM) forms the basis for Azure&amp;rsquo;s Infrastructure as Code solution, and internally, Terraform communicates with ARM. However, because of the separation between Azure&amp;rsquo;s own internal representation and Terraform&amp;rsquo;s own internal representation of Azure&amp;rsquo;s API, certain preview features may not be immediately accessible to users. When features are not available in the azurerm provider, users can take advantage of the &lt;a href="https://registry.terraform.io/providers/azure/azapi/latest/docs"&gt;AzAPI Provider&lt;/a&gt; instead to access those new features — including any previews — since it exists as a thin layer over ARM. For those ready to move to GA eventually, &lt;a href="https://github.com/Azure/azapi2azurerm"&gt;a migration tool&lt;/a&gt; is available to easily shift from AzAPI Provider over to the standard azurerm Provider.&lt;/p&gt;</description></item><item><title>Application Insights for Java Applications: Triggering Profiling Sessions Automatically</title><link>http://example.org/articles/application-insights-for-java-applications-triggering-profiling-sessions-automatically/</link><pubDate>Sun, 30 Oct 2022 00:00:00 +0000</pubDate><guid>http://example.org/articles/application-insights-for-java-applications-triggering-profiling-sessions-automatically/</guid><description>&lt;p&gt;Profiling applications can be a difficult and time-consuming process, but it is essential for understanding how an application is performing and where potential bottlenecks may exist.&lt;/p&gt;
&lt;p&gt;During &lt;a href="https://techcommunity.microsoft.com/t5/azure-observability-blog/announcing-preview-java-profiler-for-azure-monitor-application/ba-p/3650053"&gt;Microsoft Ignite&lt;/a&gt;, a new feature within Application Insight was announced, which aims to make collecting profiling information for java applications much easier.&lt;/p&gt;
&lt;h2 id="accessing-the-profiler-feature"&gt;Accessing the Profiler Feature&lt;/h2&gt;
&lt;p&gt;To access the feature, navigate to the &amp;ldquo;Performance&amp;rdquo; section within Application insight. Next click on the &amp;ldquo;Profiler&amp;rdquo; button.&lt;/p&gt;</description></item><item><title>Setting App Configuration Values with Special Characters using Azure CLI</title><link>http://example.org/articles/setting-app-configuration-values-with-special-characters-using-azure-cli/</link><pubDate>Sat, 01 Oct 2022 00:00:00 +0000</pubDate><guid>http://example.org/articles/setting-app-configuration-values-with-special-characters-using-azure-cli/</guid><description>&lt;p&gt;I recently ran into an issue when setting app settings via the &lt;code&gt;az functionapp config appsettings&lt;/code&gt; command. The issue specifically occurs when there are spaces or special characters in the values:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;az functionapp config appsettings set --name MyFunctionApp --resource-group MyResourceGroup --subscription MySubscription --settings &lt;span style="color:#e6db74"&gt;&amp;#34;MyAppSetting=This has a # sign&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="the-solution"&gt;The Solution&lt;/h2&gt;
&lt;p&gt;If you are running into the same issue, the solution is to put the whole command in a string and then call it with eval. This will ensure that the quotes are handled correctly and your settings will be applied successfully.&lt;/p&gt;</description></item><item><title>Spinning up a temporary desktop environment within GitHub Codespaces</title><link>http://example.org/articles/spinning-up-a-temporary-desktop-environment-within-github-codespaces/</link><pubDate>Thu, 01 Sep 2022 00:00:00 +0000</pubDate><guid>http://example.org/articles/spinning-up-a-temporary-desktop-environment-within-github-codespaces/</guid><description>&lt;p&gt;As developers, we are always looking for ways to be more productive. An iPad with &lt;strong&gt;GitHub Codespaces&lt;/strong&gt; is a great developer experience. The iPad is portable so it can be taken anywhere.&lt;/p&gt;
&lt;p&gt;I was skeptical at first, but after using it for a while, I was convinced that it was a great way to develop software independent of location. Now, I use GitHub codespaces for everything. Building User Interfaces using TypeScript and Angular, Writing Microservices using Java, and even selenium-based automation. It has really helped me to streamline my work and get things done faster. Furthermore, I recommend this setup for developers who want to get work done while they&amp;rsquo;re away from their desktops.&lt;/p&gt;</description></item><item><title>Using Selenium within GitHub Actions</title><link>http://example.org/articles/using-selenium-within-github-actions/</link><pubDate>Mon, 01 Aug 2022 00:00:00 +0000</pubDate><guid>http://example.org/articles/using-selenium-within-github-actions/</guid><description>&lt;p&gt;When working with GitHub Actions it can be useful to use Selenium. A common use case is for example the verification of a deployment (e.g. checking if a SPA is rendered correctly). With Selenium code, a user using a browser can be simulated.&lt;/p&gt;
&lt;h2 id="setting-up-the-chrome-driver"&gt;Setting up the Chrome Driver&lt;/h2&gt;
&lt;p&gt;The Chrome Driver must be set up specifically to work correctly within a GitHub Action Runtime. This is the configuration I am currently using:&lt;/p&gt;</description></item><item><title>Using an iPad for Coding</title><link>http://example.org/articles/using-an-ipad-for-coding/</link><pubDate>Fri, 01 Jul 2022 00:00:00 +0000</pubDate><guid>http://example.org/articles/using-an-ipad-for-coding/</guid><description>&lt;p&gt;It is probably no surprise for you if I tell you that I am writing this on an iPad. Recently I was looking into &lt;a href="https://github.com/features/codespaces"&gt;GitHub Codespaces&lt;/a&gt;. A tool that makes your development experience independent of your physical device or location. It is based on a browser-based VSCode instance, paired with surprisingly powerful dev containers (Even supporting &amp;ldquo;docker in docker&amp;rdquo;).&lt;/p&gt;
&lt;h2 id="the-keyboard-layout"&gt;The Keyboard Layout&lt;/h2&gt;
&lt;p&gt;The first issue I&amp;rsquo;ve experienced is the keyboard layout. The typical issue is the missing Escape key. However, I found that not to be a big problem for me personally. iOS offers the ability to bind other keys to &amp;ldquo;Escape&amp;rdquo; (I use the 🌐 key). As I like to write my code using the de_CH keyboard, the bigger problem was actually the bracket keys ({ } [ ]). On a de_CH mac keyboard you get some little used letters like æ and ¶ instead of curly brackets. Since I am using the &lt;a href="https://marketplace.visualstudio.com/items?itemName=vscodevim.vim"&gt;VIM Plugin&lt;/a&gt; for VSCode, those letters can be rebound through configuration easily.&lt;/p&gt;</description></item><item><title>Reading From Sheets During a Batch Job</title><link>http://example.org/articles/reading-from-sheets-during-a-batch-job/</link><pubDate>Wed, 01 Jun 2022 00:00:00 +0000</pubDate><guid>http://example.org/articles/reading-from-sheets-during-a-batch-job/</guid><description>&lt;p&gt;One would usually use an interactive login to access the Google Sheets on behalf of a user. This approach works perfectly if the user is sitting in front of the computer at the time of access. However, if we want to access Google Sheet information during a batch job (or during the runtime of a Github action, for example), this approach won&amp;rsquo;t work. An alternative way is to use service accounts.&lt;/p&gt;</description></item><item><title>Lessons learned from moving to linux-arm64</title><link>http://example.org/articles/lessons-learned-from-moving-to-linux-arm64/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>http://example.org/articles/lessons-learned-from-moving-to-linux-arm64/</guid><description>&lt;p&gt;&lt;img src="http://example.org/images/lessons-learned-linux-arm64.jpeg" alt="Lessons learned from moving to linux-arm64"&gt;&lt;/p&gt;
&lt;p&gt;I recently moved to a Macbook M1 as my daily driver (running Linux on top). It came to my surprise how well everything worked it was.&lt;/p&gt;
&lt;h2 id="virtualization"&gt;&lt;strong&gt;Virtualization&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;There are currently three options for how to run a Linux VM on top of macOS on the M1. Parallels, VMWare Fusion and UTM. I used all of them in the past, they all work fine. UTM is based on qemu and has generally more sharp edges.&lt;/p&gt;</description></item><item><title>Extract named entities using Azure Cognitive Services</title><link>http://example.org/articles/extract-named-entities-using-azure-cognitive-services/</link><pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate><guid>http://example.org/articles/extract-named-entities-using-azure-cognitive-services/</guid><description>&lt;p&gt;This year I helped to build &lt;a href="https://github.com/drugpug/drugpug"&gt;drugplug&lt;/a&gt; as part of &lt;a href="https://hackzurich.com/"&gt;Hack Zurich&lt;/a&gt;. One key feature of the app is the extraction of relevant information or warnings out of a drug leaflet. We used Azure Cognitive Services in combination with fuse.js (for fuzzy search) for this purpose.&lt;/p&gt;
&lt;p&gt;Integrating Text Analytics into our &amp;ldquo;data pipeline&amp;rdquo; was super easy. The following code will extract the named entities and store them as an array.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;entityResults&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;client&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;recognizeEntities&lt;/span&gt;( [&lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;] );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; document &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;entityResults&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (document.&lt;span style="color:#a6e22e"&gt;entities&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;processedEntities&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;entity&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;entities&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;drug&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;element&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;drug&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;element&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tag&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;tag&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;entity&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;tag&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;category&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;entity&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;category&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;drug&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;element&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;tag&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We then displayed those entities within our Single Page Application:&lt;/p&gt;</description></item><item><title>Annotate pictures using imagemagick</title><link>http://example.org/articles/annotate-pictures-using-imagemagick/</link><pubDate>Tue, 01 Mar 2022 00:00:00 +0000</pubDate><guid>http://example.org/articles/annotate-pictures-using-imagemagick/</guid><description>&lt;p&gt;Recently I&amp;rsquo;ve started to publish sticker designs on &lt;a href="https://www.redbubble.com/"&gt;redbubble&lt;/a&gt;. As I am after the &amp;ldquo;&lt;a href="https://www.investopedia.com/terms/l/long-tail.asp"&gt;long-tail&lt;/a&gt;&amp;rdquo; items, I planned to generate hundreds of personalized stickers. You can apply this pattern for all kinds of use cases (for instance to generate stickers for each birthday).&lt;/p&gt;
&lt;p&gt;First, we start by creating a template image. This image will be the background on top we add the text.&lt;/p&gt;
&lt;p&gt;Next, we execute the following command to write text on top of the image (You may have to tweak the geometry parameter):&lt;/p&gt;</description></item><item><title>Log4j Vulnerabilities and Apache Karaf (CVE-2021–44228)</title><link>http://example.org/articles/log4j-vulnerabilities-and-apache-karaf-cve-202144228/</link><pubDate>Wed, 12 Jan 2022 00:00:00 +0000</pubDate><guid>http://example.org/articles/log4j-vulnerabilities-and-apache-karaf-cve-202144228/</guid><description>&lt;p&gt;In this article, we are going to take a look at the impact of the recent log4j Zero-Day on Apache Karaf based apps. The situation is evolving, I recommend &lt;a href="https://logging.apache.org/log4j/2.x/security.html"&gt;this page&lt;/a&gt; to stay up-to-date.&lt;/p&gt;
&lt;h2 id="what-log4j-version-am-i-using"&gt;What Log4j Version am I using?&lt;/h2&gt;
&lt;p&gt;Apache Karaf uses Log4j indirectly through &lt;a href="https://github.com/ops4j/org.ops4j.pax.logging"&gt;PAX Logging&lt;/a&gt;.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Karaf Version&lt;/th&gt;
					&lt;th&gt;PAX Logging Version&lt;/th&gt;
					&lt;th&gt;log4j2 version&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;3.0.10&lt;/td&gt;
					&lt;td&gt;1.8.4&lt;/td&gt;
					&lt;td&gt;not in use *&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4.0.10&lt;/td&gt;
					&lt;td&gt;1.10.0&lt;/td&gt;
					&lt;td&gt;not in use *&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4.1.6&lt;/td&gt;
					&lt;td&gt;1.10.1&lt;/td&gt;
					&lt;td&gt;2.8.2&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4.2.12&lt;/td&gt;
					&lt;td&gt;1.11.9&lt;/td&gt;
					&lt;td&gt;2.14.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4.3.3&lt;/td&gt;
					&lt;td&gt;2.0.10&lt;/td&gt;
					&lt;td&gt;2.14.0&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;*includes a log4j2 jar, but not in use in karaf default logger&lt;/p&gt;</description></item><item><title>How to Upgrade log4j</title><link>http://example.org/articles/how-to-upgrade-log4j/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>http://example.org/articles/how-to-upgrade-log4j/</guid><description>&lt;p&gt;With the recent &lt;a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=2021-44228"&gt;log4j vulnerability&lt;/a&gt;, everyone is currently patching their Java Applications. In this article, we&amp;rsquo;re going to take a look how such a patch can look like.&lt;/p&gt;
&lt;p&gt;Usually, we don&amp;rsquo;t use log4j directly, but get it through another maven dependency transiently. To identify what log4j version we are using, the following command can be used:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ mvn dependency:tree | grep log4j
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This command will print the complete tree of dependencies, then filter for the term &amp;ldquo;log4j&amp;rdquo;. The output may look something like that:&lt;/p&gt;</description></item><item><title>Impressum</title><link>http://example.org/impressum/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://example.org/impressum/</guid><description>&lt;h1 id="impressum"&gt;Impressum&lt;/h1&gt;
&lt;h2 id="information-according-to-swiss-law"&gt;Information according to Swiss Law&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Responsible for the content:&lt;/strong&gt;&lt;br&gt;
Aymen Furter&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contact:&lt;/strong&gt;&lt;br&gt;
Email: aymen[dot]furter[at]gmail[dot]com&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer of Liability&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The author assumes no liability for the correctness, accuracy, timeliness, reliability, and completeness of the information provided.&lt;/p&gt;
&lt;p&gt;Liability claims regarding damage caused by the use of any information provided, including any kind of information which is incomplete or incorrect, will therefore be rejected.&lt;/p&gt;
&lt;p&gt;All offers are non-binding. Parts of the pages or the complete publication including all offers and information might be extended, changed, or partly or completely deleted by the author without separate announcement.&lt;/p&gt;</description></item></channel></rss>