<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Simple Enough Blog ! on Simple Enough Blog</title><link>https://blog.dev.simpleenough.net/</link><description>Recent content in Simple Enough Blog ! on Simple Enough Blog</description><generator>Hugo</generator><language>en</language><lastBuildDate>Wed, 22 Jul 2026 10:00:00 +0200</lastBuildDate><atom:link href="https://blog.dev.simpleenough.net/index.xml" rel="self" type="application/rss+xml"/><item><title>Coffee at the Office: The Boost That Hides Your Fatigue</title><link>https://blog.dev.simpleenough.net/blog/coffee/</link><pubDate>Wed, 22 Jul 2026 10:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/coffee/</guid><description>&lt;p>Look around you on an ordinary day at the office. The first morning coffee, the 10 a.m. break one, the last little cup before the big meeting. Many people drink several a day, take real pleasure in it, and would swear they &lt;em>need&lt;/em> it to keep going. Nothing alarming there. But one observation is intriguing: why, when they skip their coffee, does a sudden — sometimes fierce — fatigue set in? This article starts from that everyday behavior and descends, layer by layer, toward what the science says.&lt;/p></description></item><item><title>MTTR: The Metric That Saves Your Nights</title><link>https://blog.dev.simpleenough.net/blog/mttr/</link><pubDate>Tue, 21 Jul 2026 10:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/mttr/</guid><description>&lt;p>It&amp;rsquo;s three in the morning, an alert fires, and the only question that matters isn&amp;rsquo;t &amp;ldquo;why did it break?&amp;rdquo; but &amp;ldquo;how long until it&amp;rsquo;s fixed?&amp;rdquo;. Trying to prevent every outage is an illusion: complex systems always end up failing. The real measure of a team&amp;rsquo;s maturity isn&amp;rsquo;t its ability to never fail, but its ability to &lt;strong>recover fast&lt;/strong>. That&amp;rsquo;s what MTTR measures — provided you know how to read it.&lt;/p></description></item><item><title>Testing Your Bus Factor: The Muted Expert Exercise</title><link>https://blog.dev.simpleenough.net/blog/bus_factor/</link><pubDate>Mon, 20 Jul 2026 17:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/bus_factor/</guid><description>&lt;p>Throughout this series, we&amp;rsquo;ve seen how to pass knowledge on: in real time, in writing, through organization. One question remains, and it&amp;rsquo;s the one we carefully avoid: &lt;strong>does it actually work?&lt;/strong> You believe a team is robust because it documents and pairs — until the day a departure reveals the gaps. This article suggests not waiting for that day, and measuring your vulnerability while there&amp;rsquo;s still time.&lt;/p>
&lt;hr>




&lt;h2 id="i-what-is-the-bus-factor" class="heading">I. What is the &lt;em>bus factor&lt;/em>?&lt;a href="#i-what-is-the-bus-factor" aria-labelledby="i-what-is-the-bus-factor">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>The &lt;em>bus factor&lt;/em> answers a blunt question: &lt;strong>how many people would have to disappear for a project to grind to a halt?&lt;/strong> The name comes from a deliberately crude image — how many team members could be hit by a bus before the work becomes impossible.&lt;/p></description></item><item><title>The Setups That Make Knowledge Circulate: Rotation, Game Days and Guilds</title><link>https://blog.dev.simpleenough.net/blog/dispositifstransmission/</link><pubDate>Mon, 20 Jul 2026 16:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/dispositifstransmission/</guid><description>&lt;p>In the guide to collaboration modes, we saw how to pass knowledge on in real time (the tacit) and in writing (the explicit). But a team can master all these practices and still watch its knowledge concentrate in a few people. The reason is structural: without a setup that forces it, knowledge follows the natural slope of specialization. This article deals with the organizational layer — not &lt;em>how&lt;/em> we work together, but &lt;em>how we arrange things&lt;/em> so that knowledge circulates by default.&lt;/p></description></item><item><title>Sharing Knowledge Asynchronously: Code Review, ADRs and Docs-as-Code</title><link>https://blog.dev.simpleenough.net/blog/modeasynchrone/</link><pubDate>Mon, 20 Jul 2026 15:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/modeasynchrone/</guid><description>&lt;p>In the guide to collaboration modes, we set out a rule: explicit knowledge travels asynchronously. Where synchronous modes pass on intuition through contact, asynchronous modes capture what can be written down — and produce a trace that &lt;strong>survives departures&lt;/strong>. But you still have to avoid the classic trap: documentation that no one reads and no one keeps up to date. This article details the practices that work, and why.&lt;/p>
&lt;hr>




&lt;h2 id="i-the-strength-and-the-limit-of-writing" class="heading">I. The strength and the limit of writing&lt;a href="#i-the-strength-and-the-limit-of-writing" aria-labelledby="i-the-strength-and-the-limit-of-writing">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Writing has an advantage no synchronous mode matches: it &lt;strong>depends on no one&lt;/strong>. It can be read at three in the morning during an incident, six months after its author has left, by someone who wasn&amp;rsquo;t there when the decision was made. It&amp;rsquo;s the bedrock of a team&amp;rsquo;s memory.&lt;/p></description></item><item><title>Working Together in Real Time: Pair, Mob, Shadowing and Swarming</title><link>https://blog.dev.simpleenough.net/blog/modesynchrone/</link><pubDate>Mon, 20 Jul 2026 14:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/modesynchrone/</guid><description>&lt;p>In the guide to collaboration modes, we set out a rule: tacit knowledge travels only through contact. Synchronous modes are therefore irreplaceable — but they come at a cost, and that cost is scary. &amp;ldquo;Two people on a single task means halving productivity.&amp;rdquo; This article proves the opposite and details the four main ways of working together in real time, with their variants and their pitfalls.&lt;/p>
&lt;hr>




&lt;h2 id="i-why-synchronous-work-is-irreplaceable" class="heading">I. Why synchronous work is irreplaceable&lt;a href="#i-why-synchronous-work-is-irreplaceable" aria-labelledby="i-why-synchronous-work-is-irreplaceable">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>An expert diagnosing an outage isn&amp;rsquo;t following a procedure: they eliminate hypotheses at a speed they couldn&amp;rsquo;t even describe themselves. Ask them to write down their method and they&amp;rsquo;ll hand you an impoverished list. That knowledge — the order in which you look at things, what triggers a suspicion — exists only &lt;strong>in action&lt;/strong>.&lt;/p></description></item><item><title>Sharing Knowledge in a Tech Team: A Guide to Collaboration Modes</title><link>https://blog.dev.simpleenough.net/blog/modetransmissions/</link><pubDate>Mon, 20 Jul 2026 13:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/modetransmissions/</guid><description>&lt;p>In &amp;ldquo;When the last expert disappears,&amp;rdquo; we saw &lt;em>why&lt;/em> a team&amp;rsquo;s memory is an invisible form of technical debt. What remains is &lt;em>how&lt;/em> to fix it. Pair programming, mob, shadowing, code review, ADRs, on-call rotation: there is no shortage of practices, and that is precisely the problem — you don&amp;rsquo;t know which one to pick. This guide maps them out and gives a simple rule for deciding.&lt;/p>
&lt;hr>




&lt;h2 id="i-two-kinds-of-knowledge-tacit-and-explicit" class="heading">I. Two kinds of knowledge: tacit and explicit&lt;a href="#i-two-kinds-of-knowledge-tacit-and-explicit" aria-labelledby="i-two-kinds-of-knowledge-tacit-and-explicit">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Before choosing a practice, you need to know &lt;strong>what you are passing on&lt;/strong>. All team knowledge falls into two families, and they don&amp;rsquo;t obey the same laws.&lt;/p></description></item><item><title>When the Last Expert Leaves</title><link>https://blog.dev.simpleenough.net/blog/dernierexpert/</link><pubDate>Mon, 20 Jul 2026 12:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/dernierexpert/</guid><description>&lt;p>In almost every organization there is a system people talk about in hushed tones. It has been running for ten years, it is critical, and exactly one person truly knows how it works. The day that person leaves — retirement, resignation, transfer — it isn&amp;rsquo;t just a colleague walking out: it&amp;rsquo;s an entire library closing down without ever having been copied. That lost knowledge is a form of technical debt, the most insidious of all, because it shows up on no dashboard.&lt;/p></description></item><item><title>Making Your Charts Accessible to Everyone</title><link>https://blog.dev.simpleenough.net/blog/graphicaccessibility/</link><pubDate>Mon, 20 Jul 2026 03:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/graphicaccessibility/</guid><description>&lt;p>You spend an hour polishing a chart, it&amp;rsquo;s perfect on your screen… and yet part of your readers won&amp;rsquo;t understand a thing. Your colorblind colleague can&amp;rsquo;t tell your two lines apart. The black-and-white printout flattens all your colors. The reader on mobile, in full sunlight, sees only a gray blur. As for the screen-reader user, they hear a single word: &amp;ldquo;image.&amp;rdquo; Making a chart accessible isn&amp;rsquo;t about ticking a regulatory box: it&amp;rsquo;s about keeping all your work from getting lost along the way.&lt;/p></description></item><item><title>7 Common Mistakes in Data Visualization</title><link>https://blog.dev.simpleenough.net/blog/graphic7mistakes/</link><pubDate>Tue, 14 Jul 2026 13:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/graphic7mistakes/</guid><description>&lt;p>A chart is meant to clarify an idea. Poorly designed, it does the opposite: it confuses, or worse, it misleads — sometimes with no bad intent at all. The good news is that most failures come from the same handful of mistakes, easy to spot and fix. Here are seven, from the most misleading to the most subtle, with the remedy for each.&lt;/p>
&lt;hr>




&lt;h2 id="i-the-truncated-axis-that-exaggerates-everything" class="heading">I. The truncated axis that exaggerates everything&lt;a href="#i-the-truncated-axis-that-exaggerates-everything" aria-labelledby="i-the-truncated-axis-that-exaggerates-everything">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>The problem:&lt;/strong> starting the vertical axis somewhere other than zero. A 2% difference can then look like a dramatic gap. It&amp;rsquo;s the most misleading mistake — and the most common in &amp;ldquo;loaded&amp;rdquo; charts.&lt;/p></description></item><item><title>10 Free Tools to Create Charts Online</title><link>https://blog.dev.simpleenough.net/blog/graphicfree/</link><pubDate>Tue, 07 Jul 2026 12:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/graphicfree/</guid><description>&lt;p>You know which chart you want — now you just have to produce it. Good news: there&amp;rsquo;s a wealth of free sites to create a clean visualization without installing anything, and without writing a line of code. Here&amp;rsquo;s a selection of 10 tools, ordered from simplest to most advanced, with what each does best and the limits worth knowing.&lt;/p>
&lt;hr>




&lt;h2 id="i-before-choosing-a-tool-choose-the-chart" class="heading">I. Before choosing a tool: choose the chart&lt;a href="#i-before-choosing-a-tool-choose-the-chart" aria-labelledby="i-before-choosing-a-tool-choose-the-chart">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>An essential reminder: &lt;strong>the tool doesn&amp;rsquo;t make the right chart, you do.&lt;/strong> Before opening any of these sites, identify your need first — compare, show change over time, a breakdown, a correlation? If it&amp;rsquo;s not clear, start with our guide &amp;ldquo;Which chart to choose for your data.&amp;rdquo; Once the type is decided, the tools below are just a matter of execution.&lt;/p></description></item><item><title>Which Chart to Choose for Your Data: The Complete Guide</title><link>https://blog.dev.simpleenough.net/blog/graphicchoose/</link><pubDate>Tue, 30 Jun 2026 11:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/graphicchoose/</guid><description>&lt;p>Faced with a dataset, the same question always comes up: &amp;ldquo;which chart should I use?&amp;rdquo; We hesitate, try a pie chart, then bars, and often pick the one that &amp;ldquo;looks best&amp;rdquo; rather than the one that tells the truth. Yet the right chart depends neither on fashion nor aesthetics: it depends on &lt;strong>the question your data must answer&lt;/strong>. This guide gives you a simple method to choose with confidence.&lt;/p>
&lt;hr>




&lt;h2 id="i-start-from-the-need-not-the-chart" class="heading">I. Start from the need, not the chart&lt;a href="#i-start-from-the-need-not-the-chart" aria-labelledby="i-start-from-the-need-not-the-chart">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>The most common mistake is choosing a chart for its shape. The right approach is the opposite: start from the &lt;strong>intent&lt;/strong>. Most visualizations answer one of these five questions:&lt;/p></description></item><item><title>The Invisible Part of the Iceberg: AWS Security Hub</title><link>https://blog.dev.simpleenough.net/blog/securityhubiceberg/</link><pubDate>Wed, 24 Jun 2026 10:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/securityhubiceberg/</guid><description>&lt;p>When we talk about security on AWS, we first think of the visible services: GuardDuty detecting threats, Macie watching sensitive data, Inspector scanning vulnerabilities. These are the tips of the iceberg poking above the water. But beneath the surface lies a far larger mass: hundreds of scattered &lt;em>findings&lt;/em>, compliance rules to follow, multiple accounts to correlate. &lt;strong>AWS Security Hub&lt;/strong> is precisely the service that makes that invisible part usable, by gathering it into a single view.&lt;/p></description></item><item><title>MCP Servers: Integration and Ecosystem</title><link>https://blog.dev.simpleenough.net/blog/mcpecosystem/</link><pubDate>Wed, 17 Jun 2026 10:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/mcpecosystem/</guid><description>&lt;p>In the first article, we laid the groundwork for the Model Context Protocol; in the second, we built a server from end to end. That leaves the question that turns a prototype into an everyday tool: &lt;strong>how do you integrate an MCP server into your working environment, reusing the existing ecosystem, without opening a security hole?&lt;/strong> That&amp;rsquo;s the subject of this final article.&lt;/p>
&lt;hr>




&lt;h2 id="i-connecting-a-server-to-claude-and-claude-code" class="heading">I. Connecting a server to Claude and Claude Code&lt;a href="#i-connecting-a-server-to-claude-and-claude-code" aria-labelledby="i-connecting-a-server-to-claude-and-claude-code">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>In the tutorial, we connected our server to Claude Desktop through &lt;code>claude_desktop_config.json&lt;/code>. &lt;strong>Claude Code&lt;/strong>, the command-line assistant, offers an even more direct approach with the &lt;code>claude mcp&lt;/code> subcommand:&lt;/p></description></item><item><title>Tutorial: Building Your First MCP Server in Python</title><link>https://blog.dev.simpleenough.net/blog/mcptuto/</link><pubDate>Wed, 10 Jun 2026 10:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/mcptuto/</guid><description>&lt;p>In the first article on Model Context Protocol servers, we laid the groundwork: its host / client / server architecture and its three primitives (tools, resources, prompts). Now for the practical part. In this tutorial, we build a small MCP server in Python from end to end, exposing one &lt;strong>tool&lt;/strong> and one &lt;strong>resource&lt;/strong>, then we connect it to a host to watch a model use it.&lt;/p>
&lt;hr>




&lt;h2 id="i-prerequisites-and-installation" class="heading">I. Prerequisites and installation&lt;a href="#i-prerequisites-and-installation" aria-labelledby="i-prerequisites-and-installation">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>You need &lt;strong>Python 3.10 or higher&lt;/strong>. The official SDK also ships a handy command-line utility to test and install a server.&lt;/p></description></item><item><title>MCP Servers: Understanding the Model Context Protocol</title><link>https://blog.dev.simpleenough.net/blog/mcp/</link><pubDate>Wed, 03 Jun 2026 10:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/mcp/</guid><description>&lt;p>Language models are brilliant at reasoning over text, but by nature they are cut off from the world. A model cannot read your files, query your database, or call an API unless it is explicitly given the means to do so. The &lt;strong>Model Context Protocol (MCP)&lt;/strong> is the standard that solves this problem in a generic way. This first article lays the groundwork; the next ones will dive into building a server and integrating it into an ecosystem.&lt;/p></description></item><item><title>What is a Harness for AI Agents? Understanding the Infrastructure Behind Claude Code and Cursor</title><link>https://blog.dev.simpleenough.net/blog/harness_intro/</link><pubDate>Wed, 27 May 2026 15:55:01 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/harness_intro/</guid><description>&lt;h2 id="i-what-is-a-harness-for-ai-agents" class="heading">I. What is a Harness for AI Agents?&lt;a href="#i-what-is-a-harness-for-ai-agents" aria-labelledby="i-what-is-a-harness-for-ai-agents">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>When you first discover tools like &lt;strong>Claude Code&lt;/strong>, &lt;strong>Cursor&lt;/strong>, or &lt;strong>OpenAI Codex&lt;/strong>, it is easy to assume that a simple language model is capable of understanding an entire codebase, fixing bugs, executing commands, and running tests autonomously.&lt;/p>
&lt;p>However, the technical reality is far more interesting.&lt;/p>
&lt;p>The AI model is often only one piece of the system. Behind these tools lies a much more important layer than it first appears: the &lt;strong>harness&lt;/strong>.&lt;/p></description></item><item><title>EC2 Checklist: 7 Things to Do After Launching an Instance</title><link>https://blog.dev.simpleenough.net/blog/ec2_checklist/</link><pubDate>Wed, 20 May 2026 19:30:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/ec2_checklist/</guid><description>&lt;h1 id="ec2-checklist-7-things-to-do-after-launching-an-instance" class="heading">EC2 Checklist: 7 Things to Do After Launching an Instance&lt;a href="#ec2-checklist-7-things-to-do-after-launching-an-instance" aria-labelledby="ec2-checklist-7-things-to-do-after-launching-an-instance">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h1>
&lt;p>Launching an EC2 instance is easy.&lt;/p>
&lt;p>A few clicks in the AWS Console, and your machine is running.&lt;/p>
&lt;p>In reality, however, &lt;strong>a launched instance is not a production-ready instance&lt;/strong>.&lt;/p>
&lt;p>Many production incidents stem from small details that were overlooked immediately after launch:&lt;/p>
&lt;ul>
&lt;li>Misconfigured security groups&lt;/li>
&lt;li>No backups&lt;/li>
&lt;li>No monitoring&lt;/li>
&lt;li>Missing IAM role&lt;/li>
&lt;li>Poor SSH configuration&lt;/li>
&lt;li>Insufficient storage&lt;/li>
&lt;li>Missing tags&lt;/li>
&lt;/ul>
&lt;p>Here is a simple and practical checklist of &lt;strong>7 things you should verify immediately after launching an EC2 instance&lt;/strong>.&lt;/p></description></item><item><title>Nx Is Not a JavaScript Tool: It Is a Work Orchestrator</title><link>https://blog.dev.simpleenough.net/blog/nx/</link><pubDate>Wed, 13 May 2026 12:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/nx/</guid><description>&lt;h2 id="i-nx-is-not-a-javascript-tool-it-is-a-work-orchestrator" class="heading">I. Nx Is Not a JavaScript Tool: It Is a Work Orchestrator&lt;a href="#i-nx-is-not-a-javascript-tool-it-is-a-work-orchestrator" aria-labelledby="i-nx-is-not-a-javascript-tool-it-is-a-work-orchestrator">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Nx is often presented — and perceived — as a JavaScript tool.&lt;br>
“A thing for Angular,” or at best “a monorepo runner for Node.”&lt;/p>
&lt;p>That perception is understandable…&lt;br>
but &lt;strong>fundamentally incorrect&lt;/strong>.&lt;/p>
&lt;p>Nx is not a JS tool.&lt;br>
&lt;strong>Nx is a work orchestrator.&lt;/strong>&lt;/p>
&lt;p>And that is precisely why it appears almost naturally
as soon as a repository becomes &lt;strong>polyglot&lt;/strong>.&lt;/p></description></item><item><title>Introduction to AWS Lambda: the complete guide for beginners and developers</title><link>https://blog.dev.simpleenough.net/blog/lambda_intro/</link><pubDate>Wed, 06 May 2026 10:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/lambda_intro/</guid><description>&lt;h2 id="i-what-is-aws-lambda" class="heading">I. What is AWS Lambda?&lt;a href="#i-what-is-aws-lambda" aria-labelledby="i-what-is-aws-lambda">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>AWS Lambda is a &lt;strong>serverless compute&lt;/strong> service launched by Amazon in 2014.&lt;br>
The idea is simple: you provide a function (a piece of code), and AWS runs it on demand, without you having to manage any servers.&lt;/p>
&lt;p>You don’t provision servers, you don’t maintain an OS, and you don’t configure autoscaling manually.&lt;/p></description></item><item><title>Why Is Docker Cache Insufficient for a Monorepo?</title><link>https://blog.dev.simpleenough.net/blog/cache_docker/</link><pubDate>Tue, 28 Apr 2026 10:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/cache_docker/</guid><description>&lt;h2 id="i-why-is-docker-cache-insufficient-for-a-monorepo" class="heading">I. Why Is Docker Cache Insufficient for a Monorepo?&lt;a href="#i-why-is-docker-cache-insufficient-for-a-monorepo" aria-labelledby="i-why-is-docker-cache-insufficient-for-a-monorepo">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Docker is everywhere.&lt;br>
And with it, a widely shared idea:&lt;/p>





 &lt;blockquote class="blockquote">
 &lt;p>&lt;em>“If we structure our Dockerfiles well, Docker cache will speed up our CI.”&lt;/em>&lt;/p>
 &lt;/blockquote>
&lt;p>That is &lt;strong>true&lt;/strong>&amp;hellip; but only &lt;strong>up to a certain point&lt;/strong>.&lt;/p>
&lt;p>As soon as you work in a &lt;strong>monorepo&lt;/strong> — with multiple projects, multiple languages, and multiple logical pipelines — Docker cache quickly shows its limits.&lt;/p></description></item><item><title>What Should You Really Cache in a CI/CD Pipeline?</title><link>https://blog.dev.simpleenough.net/blog/cache_cicd/</link><pubDate>Tue, 21 Apr 2026 10:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/cache_cicd/</guid><description>&lt;h2 id="i-introduction" class="heading">I. Introduction&lt;a href="#i-introduction" aria-labelledby="i-introduction">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>When trying to speed up a CI/CD pipeline, the first idea that almost always comes up is:&lt;/p>





 &lt;blockquote class="blockquote">
 &lt;p>&lt;em>“we need to add cache”&lt;/em>&lt;/p>
 &lt;/blockquote>
&lt;p>But very quickly, another question appears:&lt;br>
&lt;strong>what exactly are we caching?&lt;/strong>&lt;/p>
&lt;p>Files? Folders? Docker images? Dependencies?&lt;br>
And above all: &lt;strong>which cache has a real impact, and which one just makes the system more complex?&lt;/strong>&lt;/p></description></item><item><title>How to create a security group that allows only traffic coming from CloudFront?</title><link>https://blog.dev.simpleenough.net/blog/gs_cloudfront/</link><pubDate>Tue, 14 Apr 2026 17:52:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/gs_cloudfront/</guid><description>&lt;h1 id="how-to-create-a-security-group-that-allows-only-traffic-coming-from-cloudfront" class="heading">How to create a security group that allows only traffic coming from CloudFront?&lt;a href="#how-to-create-a-security-group-that-allows-only-traffic-coming-from-cloudfront" aria-labelledby="how-to-create-a-security-group-that-allows-only-traffic-coming-from-cloudfront">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h1>




&lt;h2 id="why-this-question-keeps-coming-back" class="heading">Why this question keeps coming back&lt;a href="#why-this-question-keeps-coming-back" aria-labelledby="why-this-question-keeps-coming-back">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>In the AWS world, some questions come up again and again.&lt;br>
Not because they are poorly phrased, but because they point to a &lt;strong>real friction between security, networking, and application architecture&lt;/strong>.&lt;/p></description></item><item><title>Thinking Top-Down in a Complex World</title><link>https://blog.dev.simpleenough.net/blog/top_down/</link><pubDate>Tue, 07 Apr 2026 17:30:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/top_down/</guid><description>&lt;h2 id="i-two-fundamental-ways-of-reasoning" class="heading">I. Two Fundamental Ways of Reasoning&lt;a href="#i-two-fundamental-ways-of-reasoning" aria-labelledby="i-two-fundamental-ways-of-reasoning">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>When we observe how we design &lt;strong>complex systems&lt;/strong> today — DevOps infrastructures, distributed platforms, modern software, or even educational pathways — we almost always find the same intellectual tension. On one side, there is a &lt;strong>progressive and incremental&lt;/strong> approach, which starts from the basics and moves toward something more elaborate. On the other, there is an &lt;strong>outcome-oriented&lt;/strong> approach, which begins by defining a &lt;strong>goal&lt;/strong>, then works backward to determine what is needed to achieve it.&lt;/p></description></item><item><title>A Step Toward Technology</title><link>https://blog.dev.simpleenough.net/blog/steptechnologie/</link><pubDate>Mon, 30 Mar 2026 13:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/steptechnologie/</guid><description>&lt;p>Growing old in Europe is not just about “having more years.” It also means having to navigate a world where access to rights, healthcare, and social connections increasingly happens through screens.&lt;br>
Technology is no longer background scenery. It has become a daily life tool… but also a factor of exclusion when poorly designed.&lt;/p>
&lt;hr>




&lt;h2 id="i-an-ageing-society" class="heading">I. An ageing society&lt;a href="#i-an-ageing-society" aria-labelledby="i-an-ageing-society">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>In France and across Europe, around &lt;strong>22% of the population is aged 65 or over&lt;/strong> (estimate as of January 1, 2026).&lt;/p></description></item><item><title>Everyday Chaos Engineering: Learning to Love the Wave</title><link>https://blog.dev.simpleenough.net/blog/wave/</link><pubDate>Tue, 24 Mar 2026 10:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/wave/</guid><description>&lt;p>We all dream of a stable, predictable, “calm” system.
And yet, the reality of a modern platform is a living sea: deployments, external dependencies, cloud quotas, flaky networks, traffic spikes, human error—and sometimes… just “something” that should never have happened.&lt;/p>
&lt;p>Chaos engineering is often presented as a spectacular discipline—“we cut an AWS zone,” “we kill a cluster,” “we take Kafka down.”
In real life (and especially in small teams), that’s neither necessary nor desirable at the beginning.&lt;/p></description></item><item><title>DevOps Cycle or a Misunderstanding of the Role?</title><link>https://blog.dev.simpleenough.net/blog/devops_cycle/</link><pubDate>Tue, 17 Mar 2026 11:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/devops_cycle/</guid><description>&lt;h2 id="introduction" class="heading">Introduction&lt;a href="#introduction" aria-labelledby="introduction">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>The term &lt;em>DevOps&lt;/em> is frequently used to describe a heterogeneous set of topics: CI/CD, cloud, Kubernetes, security, observability, incident management, cost management, and more. This breadth of meanings creates a recurring confusion: an organization expresses a need for “DevOps” without specifying the expected value, the associated responsibilities, or the target operating model.&lt;/p>
&lt;p>The outcome is well known: a succession of urgent periods, followed by automation initiatives, and then a gradual return to the same difficulties. This is often described as the “DevOps cycle.” In many cases, this cycle is not intrinsic to DevOps itself, but rather the indicator of a &lt;strong>misunderstanding of the role&lt;/strong>: DevOps is used as a compensating function (support, firefighting, implicit ownership of production) instead of as a structuring organizational capability.&lt;/p></description></item><item><title>ADR (Architecture Decision Record): documenting decisions that matter</title><link>https://blog.dev.simpleenough.net/blog/adr/</link><pubDate>Tue, 10 Mar 2026 11:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/adr/</guid><description>&lt;p>Engineering teams spend a lot of time discussing, arbitrating, choosing… and then forgetting &lt;em>why&lt;/em> they made certain decisions.&lt;br>
The outcome is familiar:&lt;/p>
&lt;ul>
&lt;li>the same debates come back every three months,&lt;/li>
&lt;li>decisions get challenged without the original context,&lt;/li>
&lt;li>onboarding depends on “the people who know,”&lt;/li>
&lt;li>and unnecessary migrations are born from a simple loss of memory.&lt;/li>
&lt;/ul>
&lt;p>An &lt;strong>ADR (Architecture Decision Record)&lt;/strong> exists to avoid that. It’s not a “big architecture doc,” nor a requirements spec: it’s a &lt;strong>short note&lt;/strong> that captures an important decision, with just enough context to keep it understandable and reusable.&lt;/p></description></item><item><title>Working Remote: Freedom, Efficiency… and the Conditions for Success</title><link>https://blog.dev.simpleenough.net/blog/remote/</link><pubDate>Sat, 07 Mar 2026 10:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/remote/</guid><description>&lt;p>Remote work has become a common topic, but it’s still often approached in a caricatured way:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>“Remote = maximum productivity”&lt;/strong>&lt;/li>
&lt;li>&lt;strong>“Remote = isolation and loss of culture”&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>The truth is simpler: &lt;strong>remote work amplifies what already exists&lt;/strong>. A well-organized team often becomes excellent. A fuzzy, unclear team becomes chaotic fast.&lt;/p>
&lt;hr>




&lt;h2 id="i-what-remote-work-enables" class="heading">I. What remote work enables&lt;a href="#i-what-remote-work-enables" aria-labelledby="i-what-remote-work-enables">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>




&lt;h3 id="1-more-autonomy-fewer-interruptions" class="heading">1) More autonomy, fewer interruptions&lt;a href="#1-more-autonomy-fewer-interruptions" aria-labelledby="1-more-autonomy-fewer-interruptions">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;p>On-site, you often deal with:&lt;/p></description></item><item><title>The Real Cost of a Bad CI Workflow: Cognitive Load</title><link>https://blog.dev.simpleenough.net/blog/chargecognitiveci/</link><pubDate>Wed, 25 Feb 2026 10:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/chargecognitiveci/</guid><description>&lt;h2 id="i-the-real-cost-of-a-bad-ci-workflow-cognitive-load" class="heading">I. The Real Cost of a Bad CI Workflow: Cognitive Load&lt;a href="#i-the-real-cost-of-a-bad-ci-workflow-cognitive-load" aria-labelledby="i-the-real-cost-of-a-bad-ci-workflow-cognitive-load">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>People talk a lot about CI pipeline performance.&lt;br>
We measure minutes.&lt;br>
We optimize caches.&lt;br>
We parallelize.&lt;/p>
&lt;p>But the real cost of a bad CI workflow is not machine time.&lt;/p>
&lt;p>It is &lt;strong>cognitive load&lt;/strong>.&lt;/p>
&lt;p>And it is far more expensive.&lt;/p>
&lt;hr>




&lt;h2 id="ii-the-invisible-problem" class="heading">II. The Invisible Problem&lt;a href="#ii-the-invisible-problem" aria-labelledby="ii-the-invisible-problem">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>An inefficient CI pipeline is visible:&lt;/p></description></item><item><title>AWS multi-accounts: architectural solution or disguised organizational debt?</title><link>https://blog.dev.simpleenough.net/blog/multiaccounts_aws/</link><pubDate>Wed, 18 Feb 2026 17:30:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/multiaccounts_aws/</guid><description>&lt;h2 id="i-introduction" class="heading">I. Introduction&lt;a href="#i-introduction" aria-labelledby="i-introduction">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Creating multiple AWS accounts is now widely presented as a &lt;strong>near-universal best practice&lt;/strong>.&lt;br>
It is often introduced through simple, console-oriented tutorials that give the impression that the problem boils down to a few clicks.&lt;/p>
&lt;p>This view is misleading.&lt;/p>
&lt;p>&lt;strong>Multi-account&lt;/strong> is not an implementation detail, but a &lt;strong>fundamental architectural choice&lt;/strong>.&lt;br>
It directly impacts:&lt;/p>
&lt;ul>
&lt;li>how teams work,&lt;/li>
&lt;li>how security is enforced,&lt;/li>
&lt;li>cost visibility,&lt;/li>
&lt;li>the ability to automate,&lt;/li>
&lt;li>and organizational resilience to human error.&lt;/li>
&lt;/ul>
&lt;p>When misunderstood, it creates &lt;strong>organizational debt&lt;/strong> just as costly as traditional technical debt.&lt;/p></description></item><item><title>Upgrading Your Computer Components: Method, Compatibility, Benchmarks… and Mistakes to Avoid</title><link>https://blog.dev.simpleenough.net/blog/componentcomputer/</link><pubDate>Wed, 11 Feb 2026 10:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/componentcomputer/</guid><description>&lt;h1 id="upgrading-your-computer-components-method-compatibility-and-benchmarks" class="heading">Upgrading Your Computer Components: Method, Compatibility, and Benchmarks&lt;a href="#upgrading-your-computer-components-method-compatibility-and-benchmarks" aria-labelledby="upgrading-your-computer-components-method-compatibility-and-benchmarks">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h1>
&lt;p>Upgrading your computer hardware often feels like a &lt;strong>simple and logical process&lt;/strong>:&lt;br>
you identify what feels slow, buy a more powerful component, and install it.&lt;/p>
&lt;p>In practice, many upgrades:&lt;/p>
&lt;ul>
&lt;li>bring &lt;strong>no noticeable performance gain&lt;/strong>,&lt;/li>
&lt;li>introduce &lt;strong>compatibility issues&lt;/strong>,&lt;/li>
&lt;li>or simply move the problem elsewhere.&lt;/li>
&lt;/ul>
&lt;p>So how should you approach it properly?&lt;/p></description></item><item><title>Entering the Cloud: The Gates of Hell</title><link>https://blog.dev.simpleenough.net/blog/hell/</link><pubDate>Wed, 04 Feb 2026 09:10:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/hell/</guid><description>&lt;p>Entering the cloud is rarely experienced as a simple infrastructure change.&lt;br>
For many organizations, it is a brutal—almost violent—break
with their habits, tools, and mental models.&lt;/p>
&lt;p>What was supposed to bring simplicity instead reveals a complexity
that had long been hidden.&lt;br>
And this complexity is not only technical.&lt;/p>
&lt;hr>




&lt;h2 id="i-the-call-of-the-cloud" class="heading">I. The Call of the Cloud&lt;a href="#i-the-call-of-the-cloud" aria-labelledby="i-the-call-of-the-cloud">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>The cloud always begins with a seductive promise.&lt;/p></description></item><item><title>Latency: Understanding, Perceiving, and Mastering an Invisible Delay</title><link>https://blog.dev.simpleenough.net/blog/latency/</link><pubDate>Wed, 28 Jan 2026 09:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/latency/</guid><description>&lt;p>Latency is one of those ubiquitous terms in computing, often used to explain a negative feeling — &lt;em>“it lags”&lt;/em>, &lt;em>“it’s slow”&lt;/em> — without its real meaning being clearly understood.&lt;br>
Yet latency is neither a bug nor a simple performance issue: it is a &lt;strong>structural constraint&lt;/strong> of modern computer systems.&lt;/p>
&lt;p>This article offers a comprehensive view of latency:&lt;/p>
&lt;ul>
&lt;li>what it is from a &lt;strong>general perspective&lt;/strong>,&lt;/li>
&lt;li>its &lt;strong>technical definition&lt;/strong>,&lt;/li>
&lt;li>how it is &lt;strong>perceived by users&lt;/strong>,&lt;/li>
&lt;li>the &lt;strong>trade-offs&lt;/strong> it imposes,&lt;/li>
&lt;li>and above all, &lt;strong>how to master it architecturally&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;hr>




&lt;h2 id="i-what-is-latency" class="heading">I. What Is Latency?&lt;a href="#i-what-is-latency" aria-labelledby="i-what-is-latency">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>




&lt;h3 id="1-general-definition" class="heading">1. General definition&lt;a href="#1-general-definition" aria-labelledby="1-general-definition">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;p>In its simplest sense, &lt;strong>latency&lt;/strong> refers to the &lt;strong>waiting time between an action and the system’s first reaction&lt;/strong>.&lt;/p></description></item><item><title>AI, Code, and Design: Why the Most Important Thing Hasn’t Changed</title><link>https://blog.dev.simpleenough.net/blog/codedesign/</link><pubDate>Wed, 21 Jan 2026 10:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/codedesign/</guid><description>&lt;h2 id="i-introduction" class="heading">I. Introduction&lt;a href="#i-introduction" aria-labelledby="i-introduction">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>AI-powered coding assistants are now capable of producing:&lt;/p>
&lt;ul>
&lt;li>syntactically valid code,&lt;/li>
&lt;li>working code,&lt;/li>
&lt;li>and even a certain form of reasoning about code structure.&lt;/li>
&lt;/ul>
&lt;p>Faced with this, a legitimate question arises:&lt;br>
&lt;strong>do we still need to learn how to code, or is it enough to learn design and leave the rest to AI?&lt;/strong>&lt;/p>
&lt;p>This question lies at the heart of a video titled &lt;em>“The Skill That Separates Good Developers from GREAT Ones”&lt;/em> by &lt;strong>Emily Bache&lt;/strong>, which offers a nuanced answer deeply rooted in the fundamentals of software engineering.&lt;/p></description></item><item><title>Test-Driven Infrastructure: Applying TDD to Infrastructure as Code</title><link>https://blog.dev.simpleenough.net/blog/infratdd/</link><pubDate>Wed, 14 Jan 2026 13:45:30 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/infratdd/</guid><description>&lt;h1 id="test-driven-infrastructure" class="heading">Test-Driven Infrastructure&lt;a href="#test-driven-infrastructure" aria-labelledby="test-driven-infrastructure">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h1>




&lt;h2 id="applying-tdd-to-infrastructure-as-code" class="heading">Applying TDD to Infrastructure as Code&lt;a href="#applying-tdd-to-infrastructure-as-code" aria-labelledby="applying-tdd-to-infrastructure-as-code">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>Test-Driven Development (TDD)&lt;/strong> is now well established on the application side.&lt;br>
However, when it comes to &lt;strong>infrastructure&lt;/strong>, many still consider TDD unnecessary, too complex, or unsuitable.&lt;/p>
&lt;p>That is a mistake.&lt;/p>
&lt;p>&lt;strong>TDD applied to infrastructure&lt;/strong> already exists, often without being named as such. When properly understood, it becomes a major lever for &lt;strong>securing, structuring, and evolving a cloud platform&lt;/strong>.&lt;/p></description></item><item><title>Developing with AI: What Changes, What Stays, and What Becomes Critical</title><link>https://blog.dev.simpleenough.net/blog/ia/</link><pubDate>Wed, 07 Jan 2026 10:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/ia/</guid><description>&lt;h2 id="i-introduction" class="heading">I. Introduction&lt;a href="#i-introduction" aria-labelledby="i-introduction">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>AI-powered coding assistants have profoundly changed developers’ day-to-day work.&lt;br>
They generate working code in seconds, propose complete implementations, and drastically reduce the time spent on repetitive tasks.&lt;/p>
&lt;p>This evolution raises a central question:&lt;/p>





 &lt;blockquote class="blockquote">
 &lt;p>&lt;strong>If code can be produced easily, where does the developer’s value now lie?&lt;/strong>&lt;/p>
 &lt;/blockquote>
&lt;p>To answer it, we must look not at what AI &lt;em>can&lt;/em> do, but at &lt;strong>what it does not take responsibility for&lt;/strong>.&lt;/p></description></item><item><title>“It’s slow”, “it lags”, “it bugs”: but in the end, what does it really mean?</title><link>https://blog.dev.simpleenough.net/blog/cabug/</link><pubDate>Tue, 30 Dec 2025 10:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/cabug/</guid><description>&lt;h2 id="introduction" class="heading">Introduction&lt;a href="#introduction" aria-labelledby="introduction">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>In a family, at work, or within a technical team, it is very common to hear: &lt;strong>“it’s slow”&lt;/strong>, &lt;strong>“it lags”&lt;/strong>, or &lt;strong>“it bugs”&lt;/strong>. These expressions are often used interchangeably… &lt;strong>wrongly&lt;/strong>. They mix together problems that actually have nothing to do with each other.&lt;/p>
&lt;p>Understanding the difference between these three situations makes it possible to &lt;strong>explain what is happening more clearly&lt;/strong>, to &lt;strong>react more quickly&lt;/strong>, and above all to &lt;strong>avoid bad solutions&lt;/strong>. A performance issue is not solved like a bug, and a bug never disappears just because the machine has been made more powerful.&lt;/p></description></item><item><title>Using Constants in TDD with Go</title><link>https://blog.dev.simpleenough.net/blog/consttdd/</link><pubDate>Tue, 23 Dec 2025 10:08:49 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/consttdd/</guid><description>&lt;h2 id="best-practices-pitfalls-and-design-signals" class="heading">Best Practices, Pitfalls, and Design Signals&lt;a href="#best-practices-pitfalls-and-design-signals" aria-labelledby="best-practices-pitfalls-and-design-signals">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>Test-Driven Development (TDD)&lt;/strong> is not only about writing tests.&lt;br>
Its primary purpose is to &lt;strong>design software&lt;/strong>.&lt;/p>
&lt;p>In Go, the use of &lt;strong>constants&lt;/strong> is often misunderstood in TDD:&lt;/p>
&lt;ul>
&lt;li>should they be exposed?&lt;/li>
&lt;li>tested?&lt;/li>
&lt;li>injected?&lt;/li>
&lt;li>avoided?&lt;/li>
&lt;/ul>
&lt;p>This article proposes a &lt;strong>pragmatic and idiomatic Go approach&lt;/strong>, based on real-world experience, to understand &lt;strong>when a constant represents good design&lt;/strong>… and &lt;strong>when it hides a deeper problem&lt;/strong>.&lt;/p></description></item><item><title>Interfaces, Functions and Modules in Go: Structuring Your Code for TDD Without Adding Unnecessary Complexity</title><link>https://blog.dev.simpleenough.net/blog/go-tdd-interfaces-functions/</link><pubDate>Mon, 15 Dec 2025 10:08:49 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/go-tdd-interfaces-functions/</guid><description>&lt;h2 id="i-introduction" class="heading">I. Introduction&lt;a href="#i-introduction" aria-labelledby="i-introduction">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Go is a minimalist language, but this simplicity can sometimes make developers feel like something is “missing” — especially when dealing with more advanced architectures, Test-Driven Development, or the need to mock dependencies. Developers coming from Java, C#, or Python often ask the same questions:&lt;/p>
&lt;ul>
&lt;li>&lt;em>Should I turn all my functions into structs + interfaces to test them?&lt;/em>&lt;/li>
&lt;li>&lt;em>How should I organize my packages to keep them modular and testable?&lt;/em>&lt;/li>
&lt;li>&lt;em>Where should interfaces live — in the provider or the consumer?&lt;/em>&lt;/li>
&lt;li>&lt;em>How do I isolate a package that only exports functions?&lt;/em>&lt;/li>
&lt;li>&lt;em>How does Go automatically detect signature changes?&lt;/em>&lt;/li>
&lt;/ul>
&lt;hr>




&lt;h2 id="ii-gos-model-simple-modular-but-different" class="heading">II. Go&amp;rsquo;s Model: Simple, Modular, but Different&lt;a href="#ii-gos-model-simple-modular-but-different" aria-labelledby="ii-gos-model-simple-modular-but-different">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Unlike Java or C#, Go does not rely on inheritance, classes, or heavy dependency injection frameworks.&lt;/p></description></item><item><title>Consumer-Reported Dependency Health</title><link>https://blog.dev.simpleenough.net/blog/dependencyhealth/</link><pubDate>Mon, 08 Dec 2025 11:18:06 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/dependencyhealth/</guid><description>&lt;h2 id="i-rethinking-how-we-evaluate-the-health-of-distributed-systems" class="heading">I. Rethinking How We Evaluate the Health of Distributed Systems&lt;a href="#i-rethinking-how-we-evaluate-the-health-of-distributed-systems" aria-labelledby="i-rethinking-how-we-evaluate-the-health-of-distributed-systems">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>In modern distributed architectures, a system’s health depends as much — if not more — on the state of its &lt;strong>dependencies&lt;/strong> as on its own internal state. Yet most monitoring strategies still rely on synthetic or dedicated healthchecks: &lt;code>/health&lt;/code> endpoints, liveness/readiness probes, external scripts, and similar mechanisms.&lt;/p></description></item><item><title>Why AWS Spot Instances Become Impossible to Get in December</title><link>https://blog.dev.simpleenough.net/blog/spotdecember/</link><pubDate>Mon, 01 Dec 2025 17:08:49 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/spotdecember/</guid><description>&lt;h1 id="i-why-aws-spot-instances-become-impossible-to-get-in-december" class="heading">I. Why AWS Spot Instances Become Impossible to Get in December&lt;a href="#i-why-aws-spot-instances-become-impossible-to-get-in-december" aria-labelledby="i-why-aws-spot-instances-become-impossible-to-get-in-december">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h1>
&lt;p>&lt;strong>EC2 Spot Instances&lt;/strong> are a fantastic way to save 50–70% on your AWS compute costs.&lt;br>
They use the unused capacity of AWS data centers… but in &lt;strong>December&lt;/strong>, this unused capacity almost completely disappears.&lt;/p>
&lt;p>Result:&lt;/p>
&lt;ul>
&lt;li>Auto Scaling Groups fail to launch new instances&lt;/li>
&lt;li>deployments get stuck&lt;/li>
&lt;li>“insufficient capacity” everywhere&lt;/li>
&lt;li>Spot interruptions become much more frequent&lt;/li>
&lt;/ul>
&lt;p>If you’ve experienced this, rest assured: it’s &lt;strong>not your fault&lt;/strong>, and not a configuration issue.&lt;br>
It’s a &lt;strong>seasonal phenomenon&lt;/strong>, and it happens every single year.&lt;/p></description></item><item><title>Karpenter: The Intelligent Autoscaler for EKS</title><link>https://blog.dev.simpleenough.net/blog/karpenter/</link><pubDate>Mon, 24 Nov 2025 11:18:06 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/karpenter/</guid><description>&lt;h2 id="i-what-is-karpenter" class="heading">I. What is Karpenter?&lt;a href="#i-what-is-karpenter" aria-labelledby="i-what-is-karpenter">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>Karpenter&lt;/strong> is an open-source autoscaler for Kubernetes, created by AWS.&lt;br>
Its purpose is to &lt;strong>automatically adjust the EC2 node capacity of an EKS cluster based on real workload demand.&lt;/strong>&lt;/p>
&lt;p>In short:&lt;/p>
&lt;ul>
&lt;li>When your cluster is short on resources, &lt;strong>Karpenter adds new nodes.&lt;/strong>&lt;/li>
&lt;li>When nodes become unnecessary, &lt;strong>it removes them.&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>But more importantly:&lt;/p>
&lt;p>It does this &lt;strong>faster&lt;/strong>, &lt;strong>more intelligently&lt;/strong>, and &lt;strong>more efficiently&lt;/strong> than Kubernetes’ traditional autoscaler (&lt;strong>Cluster Autoscaler&lt;/strong>).&lt;/p></description></item><item><title>How to Handle Optional Parameters in Go</title><link>https://blog.dev.simpleenough.net/blog/optiongo/</link><pubDate>Sat, 15 Nov 2025 10:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/optiongo/</guid><description>&lt;h1 id="i-how-to-handle-optional-parameters-in-go" class="heading">I. How to Handle Optional Parameters in Go&lt;a href="#i-how-to-handle-optional-parameters-in-go" aria-labelledby="i-how-to-handle-optional-parameters-in-go">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h1>
&lt;p>In most modern languages, you can define default values for function parameters or overload functions to cover various use cases.&lt;br>
Go, however, offers &lt;strong>no optional parameters&lt;/strong>, &lt;strong>no overloading&lt;/strong>, and &lt;strong>no default values&lt;/strong> in function signatures.&lt;br>
Yet the needs remain the same: creating readable, stable APIs that can evolve without breaking users.&lt;/p></description></item><item><title>Landing Pages: definition, types and best practices to boost your conversions</title><link>https://blog.dev.simpleenough.net/blog/landingpage/</link><pubDate>Mon, 10 Nov 2025 14:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/landingpage/</guid><description>&lt;h2 id="i-introduction" class="heading">I. Introduction&lt;a href="#i-introduction" aria-labelledby="i-introduction">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Today, any effective digital marketing strategy relies on a key element: the &lt;strong>landing page&lt;/strong>.&lt;br>
Whether you want to sell a product, collect email leads or promote an event, these pages play a decisive role in turning visitors into customers.&lt;/p>
&lt;p>In this article, we’ll look at &lt;strong>what a landing page is&lt;/strong>, &lt;strong>how to design one&lt;/strong>, &lt;strong>where to promote it&lt;/strong>, and &lt;strong>how to measure its performance&lt;/strong>.&lt;br>
At the end, you’ll also find a practical guide to &lt;strong>create your own landing page for free with HubSpot&lt;/strong>.&lt;/p></description></item><item><title>The Essential SEO Glossary: Key Terms Explained Simply</title><link>https://blog.dev.simpleenough.net/blog/glossaryseo/</link><pubDate>Mon, 03 Nov 2025 16:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/glossaryseo/</guid><description>&lt;h1 id="seo-glossary-key-terms-explained-simply" class="heading">SEO Glossary: Key Terms Explained Simply&lt;a href="#seo-glossary-key-terms-explained-simply" aria-labelledby="seo-glossary-key-terms-explained-simply">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h1>
&lt;p>&lt;strong>Search Engine Optimization (SEO)&lt;/strong> is built on many technical, semantic, and strategic concepts.&lt;br>
This glossary helps you understand the &lt;strong>key terms&lt;/strong> used by SEO experts and developers so you can better interpret reports, tools, and performance data.&lt;/p>
&lt;hr>




&lt;h2 id="a--c" class="heading">A — C&lt;a href="#a--c" aria-labelledby="a--c">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>




&lt;h3 id="anchor-text" class="heading">&lt;strong>Anchor Text&lt;/strong>&lt;a href="#anchor-text" aria-labelledby="anchor-text">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;p>The clickable text of a hyperlink.&lt;br>
It helps search engines understand the &lt;strong>context of the link&lt;/strong>.&lt;/p></description></item><item><title>GitHub Pages vs AWS S3: Which One to Choose for Hosting Your Static Website?</title><link>https://blog.dev.simpleenough.net/blog/githubvss3/</link><pubDate>Tue, 28 Oct 2025 11:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/githubvss3/</guid><description>&lt;h2 id="i-introduction-context-and-challenges" class="heading">I. Introduction: Context and Challenges&lt;a href="#i-introduction-context-and-challenges" aria-labelledby="i-introduction-context-and-challenges">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>In today’s web landscape, &lt;strong>static websites&lt;/strong> (HTML/CSS/JS with no backend) are highly valued for their simplicity, speed, and minimal cost. Two main solutions lead the discussion for free or low-cost hosting: &lt;strong>GitHub Pages&lt;/strong> and &lt;strong>AWS S3&lt;/strong>.&lt;br>
This article compares the two approaches in terms of technology, cost, performance, and scalability to help you choose the one that best fits your needs.&lt;/p></description></item><item><title>The Fundamental Pillars of SEO: Semantic, Technical, and Authority</title><link>https://blog.dev.simpleenough.net/blog/pilliersseo/</link><pubDate>Tue, 21 Oct 2025 16:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/pilliersseo/</guid><description>&lt;h3 id="the-fundamental-pillars-of-seo" class="heading">The Fundamental Pillars of SEO&lt;a href="#the-fundamental-pillars-of-seo" aria-labelledby="the-fundamental-pillars-of-seo">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;p>Search Engine Optimization (SEO) rests on three inseparable pillars:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Semantic&lt;/strong>: content and its structure.&lt;/li>
&lt;li>&lt;strong>Technical&lt;/strong>: performance, security, and accessibility.&lt;/li>
&lt;li>&lt;strong>Authority&lt;/strong>: popularity, brand mentions, and inbound links (backlinks).&lt;/li>
&lt;/ol>
&lt;p>In 2025, these pillars are more complementary than ever: search engines continuously evaluate &lt;strong>meaning&lt;/strong>, &lt;strong>technical quality&lt;/strong>, and &lt;strong>trust&lt;/strong>.&lt;/p>
&lt;hr>




&lt;h2 id="i-semantic-pillar" class="heading">I. Semantic Pillar&lt;a href="#i-semantic-pillar" aria-labelledby="i-semantic-pillar">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>The semantic pillar is the heart of your &lt;strong>content&lt;/strong> strategy: precisely address search intent and make the topic clear for users and search engines alike.&lt;/p></description></item><item><title>SEO: What Are the Best Tools Available?</title><link>https://blog.dev.simpleenough.net/blog/seotools/</link><pubDate>Tue, 21 Oct 2025 14:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/seotools/</guid><description>&lt;h2 id="i-recommended-tools-technical-checklist" class="heading">I. Recommended Tools: Technical Checklist&lt;a href="#i-recommended-tools-technical-checklist" aria-labelledby="i-recommended-tools-technical-checklist">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>This list focuses on &lt;strong>reliable, actively maintained tools&lt;/strong> that are widely used by SEO and product teams.&lt;br>
For each category, you’ll find &lt;strong>its main purpose&lt;/strong>, &lt;strong>what it measures&lt;/strong>, and &lt;strong>when to use it&lt;/strong>.&lt;/p>
&lt;hr>




&lt;h3 id="1-test-page-speed-and-core-web-vitals" class="heading">1. Test Page Speed and Core Web Vitals&lt;a href="#1-test-page-speed-and-core-web-vitals" aria-labelledby="1-test-page-speed-and-core-web-vitals">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>
 








 

&lt;a href="https://pagespeed.web.dev/">PageSpeed Insights&lt;/a>:&lt;br>
Analyzes both real-user (field) and lab performance data, providing actionable recommendations.&lt;br>
Measures &lt;strong>Core Web Vitals&lt;/strong> — &lt;strong>INP&lt;/strong>, &lt;strong>LCP&lt;/strong>, and &lt;strong>CLS&lt;/strong>.&lt;br>
Use it to prioritize performance improvements on key pages (homepages, product pages, blog articles).&lt;/p></description></item><item><title>Case Study: SEO Analysis of Websites and the SERP</title><link>https://blog.dev.simpleenough.net/blog/studycaseseo/</link><pubDate>Tue, 14 Oct 2025 14:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/studycaseseo/</guid><description>&lt;h2 id="i-introduction" class="heading">I. Introduction&lt;a href="#i-introduction" aria-labelledby="i-introduction">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>After presenting the theoretical principles of how search engines work, it’s essential to move on to practice. Analyzing real cases helps explain how websites appear (or fail to appear) in the SERP depending on their technical optimization, content, and authority.&lt;/p>
&lt;p>In this section, we focus on the theme of &lt;strong>blogs&lt;/strong>, examining several sites ranked on Google. The goal is to highlight:&lt;/p></description></item><item><title>The Basics of SEO: How Search Engines Work</title><link>https://blog.dev.simpleenough.net/blog/baseseo/</link><pubDate>Tue, 07 Oct 2025 14:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/baseseo/</guid><description>&lt;h2 id="i-introduction" class="heading">I. Introduction&lt;a href="#i-introduction" aria-labelledby="i-introduction">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>In the world of &lt;strong>modern web development&lt;/strong>, it’s no longer enough to build fast and well-structured websites — they also need to be &lt;strong>visible&lt;/strong>. Whether you’re a &lt;strong>frontend&lt;/strong> or &lt;strong>backend&lt;/strong> developer, your technical choices can strengthen – or limit – how a site is &lt;strong>crawled, indexed, and ranked&lt;/strong> by search engines.&lt;/p>
&lt;p>&lt;strong>SEO&lt;/strong> stands for &lt;em>Search Engine Optimization&lt;/em>. It’s the set of techniques and practices aimed at improving a website’s visibility in search engine results. Although often seen as a marketing discipline, it largely relies on &lt;strong>technical foundations&lt;/strong> that directly involve developers: &lt;strong>code structure, performance, security, mobile accessibility, and structured data&lt;/strong>.&lt;/p></description></item><item><title>How to Host a Static Website for Free with AWS S3</title><link>https://blog.dev.simpleenough.net/blog/hosts3/</link><pubDate>Tue, 30 Sep 2025 14:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/hosts3/</guid><description>&lt;h2 id="i-why-choose-aws-s3-to-host-a-static-website-for-free" class="heading">I. Why Choose &lt;strong>AWS S3&lt;/strong> to Host a &lt;strong>Static Website for Free&lt;/strong>?&lt;a href="#i-why-choose-aws-s3-to-host-a-static-website-for-free" aria-labelledby="i-why-choose-aws-s3-to-host-a-static-website-for-free">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Amazon S3&lt;/strong> allows hosting of &lt;strong>fully static websites&lt;/strong> (HTML, CSS, JavaScript).&lt;/li>
&lt;li>With the &lt;strong>AWS Free Tier&lt;/strong>, a small site can stay &lt;strong>free for 12 months&lt;/strong> (up to 5 GB of storage, 20,000 GET requests &amp;amp; 2,000 PUT requests per month).&lt;/li>
&lt;li>Highly resilient, scalable, and &lt;strong>serverless&lt;/strong>, S3 provides &lt;strong>99.999999999% durability&lt;/strong> and handles traffic spikes effortlessly.&lt;/li>
&lt;li>For HTTPS and custom domains, Amazon recommends using &lt;strong>Amazon CloudFront + Route 53&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;hr>




&lt;h2 id="ii-prerequisites-and-initial-setup" class="heading">II. Prerequisites and Initial Setup&lt;a href="#ii-prerequisites-and-initial-setup" aria-labelledby="ii-prerequisites-and-initial-setup">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Create a bucket&lt;/li>
&lt;li>Disable public access restrictions&lt;/li>
&lt;li>Add a public access policy&lt;/li>
&lt;/ul>
&lt;p>Before deploying a static site with S3, basic configuration is required. Here&amp;rsquo;s the step-by-step setup:&lt;/p></description></item><item><title>How to Host a Static Website for Free with GitHub Pages</title><link>https://blog.dev.simpleenough.net/blog/hostgithub/</link><pubDate>Tue, 23 Sep 2025 10:30:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/hostgithub/</guid><description>&lt;h2 id="i-why-choose-github-pages-to-host-a-static-website" class="heading">I. Why Choose &lt;strong>GitHub Pages&lt;/strong> to Host a &lt;strong>Static Website&lt;/strong>?&lt;a href="#i-why-choose-github-pages-to-host-a-static-website" aria-labelledby="i-why-choose-github-pages-to-host-a-static-website">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>GitHub Pages&lt;/strong> is a free service provided by GitHub to host &lt;strong>static-only websites&lt;/strong> (HTML, CSS, JavaScript), with no backend or dynamic server.&lt;/li>
&lt;li>It is particularly well-suited for &lt;strong>portfolios&lt;/strong>, &lt;strong>project documentation&lt;/strong>, or &lt;strong>simple blogs&lt;/strong>, especially for developers familiar with GitHub.&lt;/li>
&lt;li>The service includes a free &lt;strong>&lt;code>.github.io&lt;/code> domain&lt;/strong>, supports &lt;strong>custom domains&lt;/strong>, and has built-in &lt;strong>HTTPS&lt;/strong>.&lt;/li>
&lt;li>Limitations: max size ~1 GB, bandwidth ~100 GB/month, no support for PHP, databases, or other server-side languages.&lt;/li>
&lt;/ul>
&lt;hr>




&lt;h2 id="ii-prerequisites-and-initial-setup" class="heading">II. Prerequisites and Initial Setup&lt;a href="#ii-prerequisites-and-initial-setup" aria-labelledby="ii-prerequisites-and-initial-setup">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Create a &lt;strong>GitHub account&lt;/strong> (if you don’t already have one).&lt;/li>
&lt;li>Create a &lt;strong>public repository&lt;/strong> named &lt;code>USERNAME.github.io&lt;/code> for a user or organization site, or a generic repository for a project site.&lt;/li>
&lt;li>Add initial files like &lt;code>README.md&lt;/code> or &lt;code>index.html&lt;/code>.&lt;/li>
&lt;li>Make sure &lt;strong>GitHub Actions&lt;/strong> is enabled to allow build workflows (e.g., Jekyll generation).&lt;/li>
&lt;/ul>
&lt;p>Before deploying a static site with GitHub Pages, you need to configure the repository. Here&amp;rsquo;s how:&lt;/p></description></item><item><title>CSS Color Palette: How to Choose and Combine Colors Effectively</title><link>https://blog.dev.simpleenough.net/blog/colorpalette/</link><pubDate>Tue, 16 Sep 2025 15:13:06 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/colorpalette/</guid><description>&lt;h2 id="i-why-a-well-thought-css-color-palette-matters" class="heading">I. Why a Well-Thought CSS &lt;strong>Color Palette&lt;/strong> Matters&lt;a href="#i-why-a-well-thought-css-color-palette-matters" aria-labelledby="i-why-a-well-thought-css-color-palette-matters">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>A well-designed palette ensures &lt;strong>visual consistency&lt;/strong>, reinforces &lt;strong>brand identity&lt;/strong>, and provides a &lt;strong>smooth user experience&lt;/strong>. It simplifies code maintenance, avoids redundant colors, and allows for &lt;strong>easy theme adaptation&lt;/strong> (light/dark). Following best practices also enhances &lt;strong>accessibility&lt;/strong>: sufficient contrast, and visual cues beyond just color.&lt;/p>
&lt;hr>




&lt;h2 id="ii-understanding-css-color-formats-hex-rgb-hsl-keywords" class="heading">II. Understanding CSS &lt;strong>Color Formats&lt;/strong> (hex, RGB, HSL, keywords)&lt;a href="#ii-understanding-css-color-formats-hex-rgb-hsl-keywords" aria-labelledby="ii-understanding-css-color-formats-hex-rgb-hsl-keywords">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>CSS offers several formats to define colors:&lt;/p></description></item><item><title>Amazon Macie: A Comprehensive Solution for Data Security and Privacy</title><link>https://blog.dev.simpleenough.net/blog/macie/</link><pubDate>Wed, 10 Sep 2025 08:00:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/macie/</guid><description>&lt;h2 id="i-introduction-to-amazon-macie" class="heading">I. Introduction to Amazon Macie&lt;a href="#i-introduction-to-amazon-macie" aria-labelledby="i-introduction-to-amazon-macie">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Amazon Macie is a fully managed &lt;strong>data security&lt;/strong> service provided by AWS. It uses &lt;strong>machine learning&lt;/strong> and &lt;strong>pattern matching&lt;/strong> to automatically discover, classify, and protect sensitive data stored in Amazon S3. It provides &lt;strong>risk visibility&lt;/strong>, generates &lt;strong>findings&lt;/strong> when security or privacy issues are detected, and automates protective actions. A 30-day free trial is included for automated S3 bucket evaluation and data scanning.&lt;/p></description></item><item><title>Organizing Your Frontend Project: Clean and Simple Folder Structure</title><link>https://blog.dev.simpleenough.net/blog/organization_frontend/</link><pubDate>Fri, 05 Sep 2025 12:09:45 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/organization_frontend/</guid><description>&lt;h2 id="i-why-organize-your-frontend-project" class="heading">I. Why Organize Your Frontend Project?&lt;a href="#i-why-organize-your-frontend-project" aria-labelledby="i-why-organize-your-frontend-project">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>When you&amp;rsquo;re starting with web development, it&amp;rsquo;s common to place all your files in one folder. However, &lt;strong>good organization&lt;/strong> quickly becomes essential as the project grows, whether for:&lt;/p>
&lt;ul>
&lt;li>Navigating your codebase easily.&lt;/li>
&lt;li>Collaborating effectively with other developers.&lt;/li>
&lt;li>Making maintenance and updates easier.&lt;/li>
&lt;li>Saving time in the long run.&lt;/li>
&lt;/ul>
&lt;hr>




&lt;h2 id="ii-recommended-structure-for-a-simple-project" class="heading">II. Recommended Structure for a Simple Project&lt;a href="#ii-recommended-structure-for-a-simple-project" aria-labelledby="ii-recommended-structure-for-a-simple-project">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Here’s a classic, clean structure for an HTML/CSS/JS project without a framework:&lt;/p></description></item><item><title>Introduction to Amazon Inspector</title><link>https://blog.dev.simpleenough.net/blog/inspector/</link><pubDate>Wed, 03 Sep 2025 11:18:06 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/inspector/</guid><description>&lt;h2 id="i-overview-of-amazon-inspector" class="heading">I. Overview of Amazon Inspector&lt;a href="#i-overview-of-amazon-inspector" aria-labelledby="i-overview-of-amazon-inspector">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Amazon Inspector is an &lt;strong>automated vulnerability management&lt;/strong> service on AWS that automatically discovers workloads such as EC2 instances, container images in ECR, and Lambda functions, and continuously scans them for software vulnerabilities and unexpected network exposures.&lt;br>
It generates &lt;em>findings&lt;/em> used to prioritize patches based on a &lt;strong>contextualized risk score&lt;/strong>, which adapts the CVSS score according to the environment (e.g., absence of open ports).&lt;/p></description></item><item><title>AWS Containers</title><link>https://blog.dev.simpleenough.net/blog/container/</link><pubDate>Fri, 29 Aug 2025 09:09:45 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/container/</guid><description>&lt;h2 id="i-introduction" class="heading">I. Introduction&lt;a href="#i-introduction" aria-labelledby="i-introduction">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>Containers&lt;/strong> encapsulate an application and all its dependencies in an isolated and reproducible environment. Unlike virtual machines, containers share the host system&amp;rsquo;s kernel, making them &lt;strong>lighter&lt;/strong>, &lt;strong>faster to start&lt;/strong>, and &lt;strong>easier to deploy&lt;/strong>.&lt;/p>
&lt;p>This approach has revolutionized the software lifecycle by improving the &lt;strong>portability&lt;/strong> of applications between environments (development, testing, production).&lt;/p>
&lt;p>&lt;strong>AWS&lt;/strong> offers several services to build, manage, orchestrate, and run containers. Each service fits a specific &lt;strong>level of control&lt;/strong>, &lt;strong>user expertise&lt;/strong>, or &lt;strong>application type&lt;/strong>.&lt;/p></description></item><item><title>Report: Amazon GuardDuty Malware Protection for S3</title><link>https://blog.dev.simpleenough.net/blog/guardduty/</link><pubDate>Wed, 20 Aug 2025 10:09:45 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/guardduty/</guid><description>&lt;h2 id="i-what-is-amazon-guardduty" class="heading">I. What is Amazon GuardDuty?&lt;a href="#i-what-is-amazon-guardduty" aria-labelledby="i-what-is-amazon-guardduty">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>Amazon GuardDuty&lt;/strong> is an AI-based security service that continuously monitors AWS accounts and workloads.&lt;br>
It uses machine learning algorithms to detect suspicious activities, abnormal behaviors, and potential threats in your cloud environment.&lt;br>
GuardDuty integrates seamlessly with other AWS services like S3, EC2, and IAM to provide a comprehensive view of your infrastructure&amp;rsquo;s security posture.&lt;br>
It also works alongside AWS CloudTrail and AWS Config to gather additional context and trigger automatic responses to threats.&lt;/p></description></item><item><title>Global Availability of EC2 Instance Types</title><link>https://blog.dev.simpleenough.net/blog/dispoec2/</link><pubDate>Wed, 13 Aug 2025 07:57:39 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/dispoec2/</guid><description>&lt;h2 id="i-introduction" class="heading">I. Introduction&lt;a href="#i-introduction" aria-labelledby="i-introduction">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>When designing infrastructure on &lt;strong>AWS&lt;/strong>, one of the first technical decisions involves the &lt;strong>EC2 instance types&lt;/strong> used. However, this decision cannot be made in isolation: the &lt;strong>regional availability&lt;/strong> of instance types varies by geographic location, impacting your architecture’s resilience, scalability, and cost.&lt;/p>
&lt;p>This article explains in detail how to understand and anticipate this global availability, with a clear approach directly applicable by developers, DevOps engineers, and data scientists.&lt;/p></description></item><item><title>Understanding the CSS Box Model</title><link>https://blog.dev.simpleenough.net/blog/boxmodel/</link><pubDate>Mon, 04 Aug 2025 16:09:45 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/boxmodel/</guid><description>&lt;h2 id="i-what-is-the-css-box-model" class="heading">I. What is the CSS Box Model?&lt;a href="#i-what-is-the-css-box-model" aria-labelledby="i-what-is-the-css-box-model">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>In CSS, &lt;strong>every HTML element is treated as a rectangular box&lt;/strong>. This is called the &lt;strong>box model&lt;/strong>.&lt;/p>
&lt;p>The box model defines &lt;strong>how an element&amp;rsquo;s total size is calculated&lt;/strong>, and how it interacts with surrounding elements.&lt;/p>
&lt;p>An HTML element consists of &lt;strong>4 main areas&lt;/strong>:&lt;/p>
&lt;div class="mb-3 syntax-highlight">&lt;pre tabindex="0">&lt;code>+-------------------------------+
| margin (outer) |
| +-------------------------+ |
| | border (border) | |
| | +-------------------+ | |
| | | padding (space) | | |
| | | +---------------+ | | |
| | | | content | | | |
| | | +---------------+ | | |
| | +-------------------+ | |
| +-------------------------+ |
+-------------------------------+&lt;/code>&lt;/pre>&lt;/div>&lt;hr>




&lt;h2 id="ii-the-4-parts-of-the-box-model" class="heading">II. The 4 Parts of the Box Model&lt;a href="#ii-the-4-parts-of-the-box-model" aria-labelledby="ii-the-4-parts-of-the-box-model">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>




&lt;h3 id="1-content" class="heading">1. &lt;code>content&lt;/code>&lt;a href="#1-content" aria-labelledby="1-content">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;p>The &lt;strong>actual content&lt;/strong> of the element (text, image, button…).&lt;/p></description></item><item><title>Responsive vs Adaptive: Two Strategies, One Common Goal</title><link>https://blog.dev.simpleenough.net/blog/responsivevsadaptative/</link><pubDate>Mon, 28 Jul 2025 12:14:54 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/responsivevsadaptative/</guid><description>&lt;h2 id="i-introduction" class="heading">I. Introduction&lt;a href="#i-introduction" aria-labelledby="i-introduction">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>Responsive design&lt;/strong> and &lt;strong>adaptive design&lt;/strong> are two widely used approaches to creating web interfaces that are accessible across a variety of devices. In a world where screen size diversity — from smartphones to 4K monitors — is the norm, understanding the differences between these strategies is essential for any frontend developer or designer. This article offers a clear, comparative, and well-documented overview of both methodologies, including concrete use cases and practical recommendations.&lt;/p></description></item><item><title>How to Build a Responsive Flutter Interface for the Web</title><link>https://blog.dev.simpleenough.net/blog/responsive/</link><pubDate>Mon, 21 Jul 2025 12:30:00 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/responsive/</guid><description>&lt;h2 id="i-introduction" class="heading">I. Introduction&lt;a href="#i-introduction" aria-labelledby="i-introduction">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Flutter is known for its ability to produce cross-platform applications from a single codebase. While the framework was originally designed for mobile, its web capabilities have improved significantly. However, building a &lt;strong>responsive&lt;/strong> web interface with Flutter requires a thoughtful approach tailored to multi-screen navigation constraints.&lt;/p>
&lt;p>In this in-depth guide, we&amp;rsquo;ll explore:&lt;/p>
&lt;ul>
&lt;li>Core best practices.&lt;/li>
&lt;li>Key widgets and tools to master.&lt;/li>
&lt;li>Code examples for each approach.&lt;/li>
&lt;li>Common pitfalls and how to avoid them.&lt;/li>
&lt;/ul>
&lt;hr>




&lt;h2 id="ii-understanding-the-challenges-of-responsive-flutter-design" class="heading">II. Understanding the Challenges of Responsive Flutter Design&lt;a href="#ii-understanding-the-challenges-of-responsive-flutter-design" aria-labelledby="ii-understanding-the-challenges-of-responsive-flutter-design">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>




&lt;h3 id="declarative-nature-of-layouts" class="heading">Declarative Nature of Layouts&lt;a href="#declarative-nature-of-layouts" aria-labelledby="declarative-nature-of-layouts">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;p>Flutter works differently from HTML/CSS:&lt;/p></description></item><item><title>Optimizing Flutter Performance: build(), keys, and const Widgets</title><link>https://blog.dev.simpleenough.net/blog/optimisationflutter/</link><pubDate>Tue, 15 Jul 2025 09:24:42 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/optimisationflutter/</guid><description>&lt;p>This article proposes performance improvements by focusing on three fundamental aspects:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The build() cycle&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Keys&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Const widgets&lt;/strong>&lt;/li>
&lt;/ul>
&lt;hr>




&lt;h2 id="i-the-build-cycle-understanding-to-optimize" class="heading">I. The build() cycle: understanding to optimize&lt;a href="#i-the-build-cycle-understanding-to-optimize" aria-labelledby="i-the-build-cycle-understanding-to-optimize">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>The &lt;strong>build()&lt;/strong> process is at the core of rendering in Flutter. When a state changes or a widget is rebuilt, the &lt;strong>build()&lt;/strong> method is called. Mismanaging this method can cause significant slowdowns.&lt;/p>




&lt;h3 id="a-when-is-build-triggered" class="heading">A. When is build() triggered?&lt;a href="#a-when-is-build-triggered" aria-labelledby="a-when-is-build-triggered">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;ol>
&lt;li>During the first widget creation.&lt;/li>
&lt;li>When calling &lt;strong>setState()&lt;/strong>.&lt;/li>
&lt;li>When a parent widget is rebuilt.&lt;/li>
&lt;/ol>




&lt;h3 id="b-techniques-to-reduce-the-build-impact" class="heading">B. Techniques to reduce the build() impact&lt;a href="#b-techniques-to-reduce-the-build-impact" aria-labelledby="b-techniques-to-reduce-the-build-impact">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>Use const in the constructor&lt;/strong>: Creates immutable instances.&lt;/li>
&lt;li>&lt;strong>Break down the build&lt;/strong>: Split the UI into subcomponents to reduce the impact zone.&lt;/li>
&lt;li>&lt;strong>Avoid heavy calculations in build()&lt;/strong>: Delegate tasks to pre-computed functions or separate methods.&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Example: Optimization with subcomponents&lt;/strong>&lt;/p></description></item><item><title>Flutter &amp; Redux: A Well-Organized Recipe with Dispatch</title><link>https://blog.dev.simpleenough.net/blog/dispatch/</link><pubDate>Sun, 22 Jun 2025 19:38:55 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/dispatch/</guid><description>&lt;h2 id="i-introduction-to-redux-in-flutter" class="heading">I. Introduction to Redux in Flutter&lt;a href="#i-introduction-to-redux-in-flutter" aria-labelledby="i-introduction-to-redux-in-flutter">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Inspired by the unidirectional data flow model, Redux allows you to centralize the application&amp;rsquo;s state and modify it through clear, predictable, and testable actions.&lt;/p>
&lt;p>The core of Redux is based on three concepts:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Store&lt;/strong>: the global state.&lt;/li>
&lt;li>&lt;strong>Action&lt;/strong>: an event describing a change.&lt;/li>
&lt;li>&lt;strong>Reducer&lt;/strong>: a function that transforms the state based on the action.&lt;/li>
&lt;/ul>
&lt;p>The goal of this article is to understand &lt;strong>how to use &lt;code>dispatch&lt;/code> with Redux in Flutter&lt;/strong>, with a simple, educational, and rigorous approach.&lt;/p></description></item><item><title>Interview EC2</title><link>https://blog.dev.simpleenough.net/blog/ec2/</link><pubDate>Mon, 09 Jun 2025 15:55:01 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/ec2/</guid><description>&lt;h2 id="i-what-is-amazon-ec2-and-what-is-it-used-for" class="heading">I. What is Amazon EC2 and what is it used for?&lt;a href="#i-what-is-amazon-ec2-and-what-is-it-used-for" aria-labelledby="i-what-is-amazon-ec2-and-what-is-it-used-for">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>





 &lt;blockquote class="blockquote">
 &lt;p>&lt;strong>AWS Expert&lt;/strong>: Amazon EC2 (Elastic Compute Cloud) is an &lt;strong>on-demand infrastructure service&lt;/strong> that allows you to launch virtual servers — called &lt;em>instances&lt;/em> — in the cloud. It is used to host web applications, run data processing, serve as development environments, or simulate production loads.&lt;/p>
 &lt;/blockquote>
&lt;p>What makes EC2 powerful is its &lt;strong>scalability&lt;/strong> and &lt;strong>flexibility&lt;/strong>. You can start with a small instance for testing, then scale up to high-capacity clusters without switching platforms. Developers also love the &lt;strong>full control&lt;/strong> they get over configuration, open ports, attached disks, and more.&lt;/p></description></item><item><title>This is who IAM</title><link>https://blog.dev.simpleenough.net/blog/iam/</link><pubDate>Tue, 27 May 2025 15:33:47 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/iam/</guid><description>&lt;h2 id="i-iam-core-components-and-concepts" class="heading">I. IAM: Core Components and Concepts&lt;a href="#i-iam-core-components-and-concepts" aria-labelledby="i-iam-core-components-and-concepts">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>IAM is based on &lt;strong>entities&lt;/strong> and &lt;strong>policies&lt;/strong>.&lt;/p>




&lt;h3 id="iam-entities" class="heading">IAM Entities&lt;a href="#iam-entities" aria-labelledby="iam-entities">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Users&lt;/strong>: Represent people or applications. Example: a developer named &amp;ldquo;alice&amp;rdquo;.&lt;/li>
&lt;li>&lt;strong>Groups&lt;/strong>: Collections of users sharing the same permissions.&lt;/li>
&lt;li>&lt;strong>Roles&lt;/strong>: IAM entities that can be temporarily assumed by others. Ideal for &lt;strong>federation&lt;/strong> or services like EC2 or Lambda.&lt;/li>
&lt;li>&lt;strong>Policies&lt;/strong>: JSON documents that define permissions attached to an entity.&lt;/li>
&lt;/ul>




&lt;h3 id="sample-json-policy" class="heading">Sample JSON Policy&lt;a href="#sample-json-policy" aria-labelledby="sample-json-policy">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;div class="mb-3 syntax-highlight">&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;Version&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;2012-10-17&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;Statement&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;Effect&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Allow&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;Action&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;s3:ListBucket&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;Resource&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;arn:aws:s3:::example_bucket&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;p>This IAM policy allows an AWS entity (user, role, or group) to list the objects in a specific S3 bucket named &lt;code>example_bucket&lt;/code>. It uses the standard IAM version format (&lt;code>2012-10-17&lt;/code>) and allows the &lt;code>s3:ListBucket&lt;/code> action on the resource identified by its ARN. It lets the entity see the list of objects (names, sizes, metadata), but not read or modify them—unless additional permissions are granted. This minimal policy is often used for inventory or bucket navigation via the AWS Console or API.&lt;/p></description></item><item><title>Flutter Hot Reload: Why Is It So Fast?</title><link>https://blog.dev.simpleenough.net/blog/hotreload/</link><pubDate>Mon, 19 May 2025 13:45:30 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/hotreload/</guid><description>&lt;h2 id="i-what-is-hot-reload-in-flutter" class="heading">I. What Is Hot Reload in Flutter?&lt;a href="#i-what-is-hot-reload-in-flutter" aria-labelledby="i-what-is-hot-reload-in-flutter">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>Hot reload&lt;/strong> is a Flutter feature that allows developers to quickly reload modified code in a running app without a full restart. This operation retains the current app state, unlike a traditional restart.&lt;/p>
&lt;p>&lt;strong>Key benefits:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Saves time when developing UIs.&lt;/li>
&lt;li>Maintains state: ideal for testing changes without re-navigating.&lt;/li>
&lt;li>Shorter development cycles.&lt;/li>
&lt;/ul>
&lt;p>Flutter supports hot reload thanks to the Dart engine architecture, which allows &lt;strong>dynamic code injection&lt;/strong> into a running application.&lt;/p></description></item><item><title>Flutter for True Beginners: What It Is, What It’s For, and How to Try It</title><link>https://blog.dev.simpleenough.net/blog/flutterstart/</link><pubDate>Mon, 12 May 2025 10:10:48 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/flutterstart/</guid><description>&lt;h2 id="i-what-is-flutter" class="heading">I. What is Flutter?&lt;a href="#i-what-is-flutter" aria-labelledby="i-what-is-flutter">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Flutter is an &lt;strong>open-source framework&lt;/strong> developed by Google, designed to build &lt;strong>native user interfaces&lt;/strong> for &lt;strong>Android&lt;/strong>, &lt;strong>iOS&lt;/strong>, &lt;strong>Web&lt;/strong>, and &lt;strong>desktop&lt;/strong> from a &lt;strong>single codebase&lt;/strong>. It uses the &lt;strong>Dart&lt;/strong> language and allows developers to build smooth, high-performance, and visually appealing apps.&lt;/p>
&lt;p>Flutter stands out thanks to its integrated rendering engine and ability to display animations at 60 fps or higher. It doesn&amp;rsquo;t rely on native platform UI components, which ensures &lt;strong>visual consistency&lt;/strong> across platforms.&lt;/p></description></item><item><title>3 Simple Ways to Save Up to 90% on EC2 Costs: Spot Instances</title><link>https://blog.dev.simpleenough.net/blog/spot/</link><pubDate>Fri, 02 May 2025 17:08:49 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/spot/</guid><description>&lt;h2 id="i-introduction-to-spot-instances" class="heading">I. Introduction to Spot Instances&lt;a href="#i-introduction-to-spot-instances" aria-labelledby="i-introduction-to-spot-instances">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>Amazon EC2 Spot Instances&lt;/strong> offer a powerful way to drastically reduce cloud computing costs. Designed to utilize unused Amazon EC2 capacity, these instances are available at a &lt;strong>price up to 90% lower&lt;/strong> than On-Demand instances.&lt;/p>
&lt;p>While these savings are appealing, Spot Instances are not suitable for all workloads. They are ideal for &lt;strong>flexible, interruption-tolerant&lt;/strong>, or distributed jobs such as data processing, machine learning training, or performance testing.&lt;/p></description></item><item><title>A problem. Don’t panic, prepare a support ticket</title><link>https://blog.dev.simpleenough.net/blog/assistance/</link><pubDate>Fri, 25 Apr 2025 13:10:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/assistance/</guid><description>&lt;h2 id="i-identify-and-reproduce-the-problem-precisely" class="heading">I. Identify and Reproduce the Problem Precisely&lt;a href="#i-identify-and-reproduce-the-problem-precisely" aria-labelledby="i-identify-and-reproduce-the-problem-precisely">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Before contacting AWS Support, it&amp;rsquo;s crucial to clearly document the observed behavior. The goal is to enable the &lt;strong>support team&lt;/strong> to quickly analyze the context. Start by identifying the service involved: EC2, S3, Lambda, or another component of your cloud infrastructure. Documenting an incident clearly is key to avoiding unnecessary back-and-forth.&lt;/p></description></item><item><title>Why and how to use Git submodules</title><link>https://blog.dev.simpleenough.net/blog/gitsubmodules/</link><pubDate>Tue, 22 Apr 2025 10:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/gitsubmodules/</guid><description>&lt;h2 id="i-introduction-to-git-submodules" class="heading">I. Introduction to Git Submodules&lt;a href="#i-introduction-to-git-submodules" aria-labelledby="i-introduction-to-git-submodules">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>&lt;strong>Git submodules&lt;/strong> are a built-in feature that lets you include one Git repository inside another. This approach is useful when you need to manage &lt;strong>dependencies&lt;/strong> between different codebases while keeping them autonomous.&lt;/p>
&lt;p>Submodules point to a &lt;strong>specific commit&lt;/strong> of an external repository. This ensures that every version of the main project uses exactly the same revision of its submodules, providing &lt;strong>consistency and reproducibility&lt;/strong>.&lt;/p></description></item><item><title>Real-Time, Real-Easy: Deploying WebSockets</title><link>https://blog.dev.simpleenough.net/blog/websocket/</link><pubDate>Mon, 21 Apr 2025 16:06:29 +0200</pubDate><guid>https://blog.dev.simpleenough.net/blog/websocket/</guid><description>&lt;h2 id="i-websocket-protocol-architecture-and-workflow" class="heading">I. WebSocket Protocol Architecture and Workflow&lt;a href="#i-websocket-protocol-architecture-and-workflow" aria-labelledby="i-websocket-protocol-architecture-and-workflow">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Establishing a WebSocket involves an initial &lt;strong>HTTP(S) handshake&lt;/strong>, followed by a &lt;strong>protocol upgrade&lt;/strong> to WebSocket.&lt;/p>




&lt;h3 id="main-steps" class="heading">Main Steps:&lt;a href="#main-steps" aria-labelledby="main-steps">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>






 






&lt;table class="table">
 &lt;thead>
 
 
 &lt;tr>
 &lt;th >Step&lt;/th>
 &lt;th >Description&lt;/th>
 &lt;/tr>
 
 &lt;/thead>
 &lt;tbody>
 
 
 &lt;tr>
 &lt;td >1. HTTP Upgrade&lt;/td>
 &lt;td >The client sends an HTTP request with the &lt;code>Upgrade: websocket&lt;/code> header.&lt;/td>
 &lt;/tr>
 
 
 
 &lt;tr>
 &lt;td >2. Acceptance&lt;/td>
 &lt;td >The server validates the upgrade and switches to WebSocket mode.&lt;/td>
 &lt;/tr>
 
 
 
 &lt;tr>
 &lt;td >3. Communication&lt;/td>
 &lt;td >Data is exchanged in &lt;strong>frames&lt;/strong>, asynchronously and bidirectionally.&lt;/td>
 &lt;/tr>
 
 &lt;/tbody>
&lt;/table>&lt;p>Example upgrade request:&lt;/p></description></item><item><title>Writing a Prompt: Technical Guide</title><link>https://blog.dev.simpleenough.net/blog/prompt/</link><pubDate>Fri, 18 Apr 2025 11:02:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/prompt/</guid><description>&lt;h2 id="i-understanding-what-a-prompt-is-in-langchain" class="heading">I. Understanding What a Prompt Is in LangChain&lt;a href="#i-understanding-what-a-prompt-is-in-langchain" aria-labelledby="i-understanding-what-a-prompt-is-in-langchain">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>In LangChain, a &lt;em>prompt&lt;/em> is a textual structure designed to guide a language model. A well-constructed prompt includes several key components:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Instruction&lt;/strong>: What you explicitly ask the model to do.&lt;/li>
&lt;li>&lt;strong>Context&lt;/strong>: Additional information to frame the answer.&lt;/li>
&lt;li>&lt;strong>Input Data&lt;/strong>: The specific input provided at runtime.&lt;/li>
&lt;li>&lt;strong>Output Indicator&lt;/strong>: What kind of output is expected.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>This format enables clear, framed, and reproducible queries.&lt;br>
Here’s another example using &lt;code>LangChain&lt;/code> in Python with this structure:&lt;/p></description></item><item><title>Hallucinating with LangChain</title><link>https://blog.dev.simpleenough.net/blog/hallucination/</link><pubDate>Mon, 07 Apr 2025 09:22:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/hallucination/</guid><description>&lt;h2 id="i-what-is-a-hallucination" class="heading">I What is a hallucination?&lt;a href="#i-what-is-a-hallucination" aria-labelledby="i-what-is-a-hallucination">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>A hallucination refers to a response generated by a language model that is factually incorrect, invented, or misinterprets reality. It can range from a minor inaccuracy to a completely fabricated citation or even a made-up technical or historical claim.&lt;/p>
&lt;p>Example:&lt;/p>





 &lt;blockquote class="blockquote">
 &lt;p>“Einstein discovered general relativity in 1975.”&lt;/p>
 &lt;/blockquote>
&lt;p>That’s incorrect (it was in 1915), but the model might produce this kind of statement if it lacks the proper context or is too confident in its reasoning.&lt;/p></description></item><item><title>How to Count Tokens Effectively</title><link>https://blog.dev.simpleenough.net/blog/token/</link><pubDate>Tue, 01 Apr 2025 17:52:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/token/</guid><description>&lt;h2 id="i-what-is-a-token" class="heading">I. What Is a Token?&lt;a href="#i-what-is-a-token" aria-labelledby="i-what-is-a-token">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>A &lt;strong>token&lt;/strong> is a unit of text that the model processes. It could be a full word, part of a word, or even a special character.&lt;/p>




&lt;h3 id="concrete-examples" class="heading">Concrete Examples&lt;a href="#concrete-examples" aria-labelledby="concrete-examples">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>






 






&lt;table class="table">
 &lt;thead>
 
 
 &lt;tr>
 &lt;th >Text&lt;/th>
 &lt;th >Number of Tokens&lt;/th>
 &lt;/tr>
 
 &lt;/thead>
 &lt;tbody>
 
 
 &lt;tr>
 &lt;td >Hello&lt;/td>
 &lt;td >1&lt;/td>
 &lt;/tr>
 
 
 
 &lt;tr>
 &lt;td >I am a developer&lt;/td>
 &lt;td >4&lt;/td>
 &lt;/tr>
 
 
 
 &lt;tr>
 &lt;td >Artificial intelligence is fascinating!&lt;/td>
 &lt;td >5&lt;/td>
 &lt;/tr>
 
 
 
 &lt;tr>
 &lt;td >GPT is a powerful model.&lt;/td>
 &lt;td >6&lt;/td>
 &lt;/tr>
 
 &lt;/tbody>
&lt;/table>



&lt;h3 id="specifics-of-tokenization" class="heading">Specifics of Tokenization&lt;a href="#specifics-of-tokenization" aria-labelledby="specifics-of-tokenization">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>In English, short words are often 1 token (e.g., &lt;code>&amp;quot;Hello&amp;quot;&lt;/code> = 1 token).&lt;/li>
&lt;li>In French and other languages, longer words can be split into multiple tokens (e.g., &lt;code>&amp;quot;développeur&amp;quot;&lt;/code> or &lt;code>&amp;quot;intelligence&amp;quot;&lt;/code> = 2 tokens).&lt;/li>
&lt;li>Punctuation also counts as tokens.&lt;/li>
&lt;li>Spaces are included with the following word.&lt;/li>
&lt;li>Acronyms are usually treated as 1 token.&lt;/li>
&lt;/ul>
&lt;p>On average, 100 tokens correspond to roughly 75 words, though this can vary depending on the language and writing style.&lt;/p></description></item><item><title>1000: The Magic Number in the World of LLMs</title><link>https://blog.dev.simpleenough.net/blog/chunk/</link><pubDate>Wed, 26 Mar 2025 09:05:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/chunk/</guid><description>&lt;h2 id="i-chunk-size-why-1000-tokens" class="heading">I. Chunk Size: Why ~1000 Tokens?&lt;a href="#i-chunk-size-why-1000-tokens" aria-labelledby="i-chunk-size-why-1000-tokens">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>The default value of &lt;strong>1000 tokens per chunk&lt;/strong> is not arbitrary:&lt;/p>
&lt;ul>
&lt;li>A chunk of this size generally contains &lt;strong>enough information to remain semantically coherent&lt;/strong> without being too large.&lt;/li>
&lt;li>It remains &lt;strong>compatible with the context window&lt;/strong> of modern LLMs (4k, 8k, 32k, or even 1M tokens).&lt;/li>
&lt;li>It helps avoid &lt;strong>diluting meaning&lt;/strong> or breaking semantic units.&lt;/li>
&lt;/ul>
&lt;p>In some cases, other sizes may be more appropriate:&lt;/p></description></item><item><title>Introduction to AWS ELB</title><link>https://blog.dev.simpleenough.net/blog/elb/</link><pubDate>Sat, 15 Mar 2025 21:11:49 +0000</pubDate><guid>https://blog.dev.simpleenough.net/blog/elb/</guid><description>&lt;h2 id="i-introduction-to-load-balancers-in-aws" class="heading">I. Introduction to Load Balancers in AWS&lt;a href="#i-introduction-to-load-balancers-in-aws" aria-labelledby="i-introduction-to-load-balancers-in-aws">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>An Elastic Load Balancer (ELB) acts as a traffic distributor, automatically spreading incoming traffic across multiple target resources such as &lt;strong>EC2 instances&lt;/strong>, &lt;strong>containers&lt;/strong>, or &lt;strong>IP addresses&lt;/strong>.&lt;/p>
&lt;p>This functionality is a cornerstone of fault-tolerant and highly available cloud application design. AWS offers three types of ELB tailored to different use cases, each with specific features.&lt;/p></description></item><item><title>Amazon EventBridge vs Amazon SNS: Which Solution to Choose?</title><link>https://blog.dev.simpleenough.net/blog/eventdriven/</link><pubDate>Tue, 11 Mar 2025 10:05:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/eventdriven/</guid><description>&lt;h2 id="introduction" class="heading">Introduction&lt;a href="#introduction" aria-labelledby="introduction">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>In this article, we will compare these two services, explore their use cases, and see how to integrate them effectively into an AWS architecture.&lt;/p>
&lt;hr>




&lt;h2 id="i-comparison-of-amazon-eventbridge-vs-amazon-sns" class="heading">I. Comparison of Amazon EventBridge vs Amazon SNS&lt;a href="#i-comparison-of-amazon-eventbridge-vs-amazon-sns" aria-labelledby="i-comparison-of-amazon-eventbridge-vs-amazon-sns">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>






 






&lt;table class="table">
 &lt;thead>
 
 
 &lt;tr>
 &lt;th >&lt;strong>Feature&lt;/strong>&lt;/th>
 &lt;th >&lt;strong>Amazon EventBridge&lt;/strong>&lt;/th>
 &lt;th >&lt;strong>Amazon SNS&lt;/strong>&lt;/th>
 &lt;/tr>
 
 &lt;/thead>
 &lt;tbody>
 
 
 &lt;tr>
 &lt;td >&lt;strong>Communication Type&lt;/strong>&lt;/td>
 &lt;td >Event-Driven&lt;/td>
 &lt;td >Publish-Subscribe (Pub/Sub)&lt;/td>
 &lt;/tr>
 
 
 
 &lt;tr>
 &lt;td >&lt;strong>Use Cases&lt;/strong>&lt;/td>
 &lt;td >Event routing between AWS services and SaaS applications&lt;/td>
 &lt;td >Sending notifications to subscribers (emails, SMS, Lambda, SQS, etc.)&lt;/td>
 &lt;/tr>
 
 
 
 &lt;tr>
 &lt;td >&lt;strong>Message Sources&lt;/strong>&lt;/td>
 &lt;td >AWS Services, SaaS applications, custom applications&lt;/td>
 &lt;td >Applications, users, AWS services&lt;/td>
 &lt;/tr>
 
 
 
 &lt;tr>
 &lt;td >&lt;strong>Targeting Consumers&lt;/strong>&lt;/td>
 &lt;td >Advanced filtering rules to send an event to one or multiple targets&lt;/td>
 &lt;td >Sends the same message to all topic subscribers&lt;/td>
 &lt;/tr>
 
 
 
 &lt;tr>
 &lt;td >&lt;strong>Supported Protocols&lt;/strong>&lt;/td>
 &lt;td >AWS Lambda, SQS, API Gateway, Kinesis, Step Functions, etc.&lt;/td>
 &lt;td >Emails, SMS, Lambda, SQS, HTTP(S) endpoints, mobile applications (FCM, APN)&lt;/td>
 &lt;/tr>
 
 
 
 &lt;tr>
 &lt;td >&lt;strong>Message Filtering&lt;/strong>&lt;/td>
 &lt;td >Advanced filtering based on JSON rules&lt;/td>
 &lt;td >Limited filtering based on message attributes&lt;/td>
 &lt;/tr>
 
 
 
 &lt;tr>
 &lt;td >&lt;strong>Architecture&lt;/strong>&lt;/td>
 &lt;td >Event-driven and integrates with other AWS services&lt;/td>
 &lt;td >Notification-based messaging between producers and consumers&lt;/td>
 &lt;/tr>
 
 
 
 &lt;tr>
 &lt;td >&lt;strong>Durability &amp;amp; Message Retention&lt;/strong>&lt;/td>
 &lt;td >No native storage (events are routed immediately)&lt;/td>
 &lt;td >Messages stored for 4 days (up to 14 days with Extended Retention)&lt;/td>
 &lt;/tr>
 
 
 
 &lt;tr>
 &lt;td >&lt;strong>Message Ordering&lt;/strong>&lt;/td>
 &lt;td >Not guaranteed (messages may arrive out of order)&lt;/td>
 &lt;td >FIFO ordering available with SNS FIFO&lt;/td>
 &lt;/tr>
 
 &lt;/tbody>
&lt;/table>



&lt;h2 id="ii-detailed-use-cases" class="heading">II. Detailed Use Cases&lt;a href="#ii-detailed-use-cases" aria-labelledby="ii-detailed-use-cases">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>




&lt;h3 id="a-amazon-eventbridge-use-case-orchestrating-events-between-services" class="heading">A. &lt;strong>Amazon EventBridge Use Case&lt;/strong>: Orchestrating Events Between Services&lt;a href="#a-amazon-eventbridge-use-case-orchestrating-events-between-services" aria-labelledby="a-amazon-eventbridge-use-case-orchestrating-events-between-services">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;p>EventBridge is ideal for &lt;strong>connecting different AWS services and SaaS applications&lt;/strong>.&lt;/p></description></item><item><title>The 5 Must-Read Whitepapers</title><link>https://blog.dev.simpleenough.net/blog/whitepaper/</link><pubDate>Sat, 01 Mar 2025 10:56:41 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/whitepaper/</guid><description>&lt;h1 id="prepare-for-your-first-aws-certification-with-these-essential-whitepapers" class="heading">Prepare for Your First AWS Certification with These Essential Whitepapers&lt;a href="#prepare-for-your-first-aws-certification-with-these-essential-whitepapers" aria-labelledby="prepare-for-your-first-aws-certification-with-these-essential-whitepapers">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h1>
&lt;p>AWS whitepapers help you gain an in-depth understanding of best practices and cloud architectures. These free resources are invaluable for anyone looking to pass their certification exam successfully.&lt;/p>
&lt;p>In this article, we introduce the key whitepapers for your preparation and explain how to use them effectively.&lt;/p>




&lt;h2 id="i-why-read-aws-whitepapers" class="heading">I. Why Read AWS Whitepapers?&lt;a href="#i-why-read-aws-whitepapers" aria-labelledby="i-why-read-aws-whitepapers">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>AWS whitepapers are written by cloud experts and provide practical guidance on designing, managing, and securing AWS infrastructures. They cover topics ranging from general architecture principles to performance and security best practices. Reading these documents allows you to deepen your knowledge beyond simple tutorials and better understand the requirements of AWS fundamental or associate-level exams.&lt;/p></description></item><item><title>Reverse</title><link>https://blog.dev.simpleenough.net/projects/reverse-project/</link><pubDate>Tue, 25 Feb 2025 00:00:00 +0000</pubDate><guid>https://blog.dev.simpleenough.net/projects/reverse-project/</guid><description>&lt;p>Visualization tool.
Triggering a scan to generate IaC for AWS.
Infrastructure History.&lt;/p></description></item><item><title>How to Filter S3 Events by Object Size?</title><link>https://blog.dev.simpleenough.net/blog/sortsizes3/</link><pubDate>Tue, 18 Feb 2025 17:16:31 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/sortsizes3/</guid><description>&lt;h2 id="i-when-do-you-need-to-filter-s3-events-by-object-size" class="heading">I. When Do You Need to Filter S3 Events by Object Size?&lt;a href="#i-when-do-you-need-to-filter-s3-events-by-object-size" aria-labelledby="i-when-do-you-need-to-filter-s3-events-by-object-size">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>Filtering S3 events by object size is useful in various scenarios, especially when triggered actions depend on file volume. Here are some concrete use cases where this filtering is relevant:&lt;/p>




&lt;h3 id="1-cost-optimization-and-storage-management" class="heading">1. Cost Optimization and Storage Management&lt;a href="#1-cost-optimization-and-storage-management" aria-labelledby="1-cost-optimization-and-storage-management">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Automatically deleting oversized files&lt;/strong>: Prevents the accumulation of unnecessary files that take up space and generate extra costs.&lt;/li>
&lt;li>&lt;strong>Automatically moving files to lower-cost storage&lt;/strong> (e.g., Glacier) when they exceed a certain size.&lt;/li>
&lt;/ul>




&lt;h3 id="2-process-automation" class="heading">2. Process Automation&lt;a href="#2-process-automation" aria-labelledby="2-process-automation">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Executing a specific process on large files&lt;/strong> (e.g., video/audio conversion, compression, splitting large files into smaller chunks).&lt;/li>
&lt;li>&lt;strong>Triggering a Lambda function to index only relevant files&lt;/strong> based on their size.&lt;/li>
&lt;/ul>




&lt;h3 id="3-security-and-compliance" class="heading">3. Security and Compliance&lt;a href="#3-security-and-compliance" aria-labelledby="3-security-and-compliance">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Avoiding the storage of excessively large files in public buckets&lt;/strong>, which could lead to abuse (e.g., uploading large archives by malicious users).&lt;/li>
&lt;li>&lt;strong>Triggering an alert or blocking uploads&lt;/strong> if a user exceeds a defined size limit.&lt;/li>
&lt;/ul>




&lt;h3 id="4-data-flow-optimization" class="heading">4. Data Flow Optimization&lt;a href="#4-data-flow-optimization" aria-labelledby="4-data-flow-optimization">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Directing small files to real-time processing&lt;/strong> (Lambda, Kinesis) and larger files to batch processing to optimize system efficiency.&lt;/li>
&lt;li>&lt;strong>Redirecting files based on their size to different buckets&lt;/strong> (e.g., files &amp;lt; 1MB to a high-speed access bucket, files &amp;gt; 100MB to cold storage).&lt;/li>
&lt;/ul>




&lt;h3 id="5-monitoring-and-reporting" class="heading">5. Monitoring and Reporting&lt;a href="#5-monitoring-and-reporting" aria-labelledby="5-monitoring-and-reporting">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Generating reports on storage usage&lt;/strong> by filtering objects exceeding a critical size.&lt;/li>
&lt;li>&lt;strong>Detecting anomalies&lt;/strong>, such as sudden uploads of very large files, which could indicate an issue (e.g., massive log errors, data leaks, etc.).&lt;/li>
&lt;/ul>
&lt;hr>




&lt;h2 id="ii-how-to-filter-s3-events-by-object-size-c3-methods" class="heading">II. How to Filter S3 Events by Object Size? c3 Methods&lt;a href="#ii-how-to-filter-s3-events-by-object-size-c3-methods" aria-labelledby="ii-how-to-filter-s3-events-by-object-size-c3-methods">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>




&lt;h3 id="1-filtering-via-aws-eventbridge-and-aws-lambda" class="heading">1. Filtering via AWS EventBridge and AWS Lambda&lt;a href="#1-filtering-via-aws-eventbridge-and-aws-lambda" aria-labelledby="1-filtering-via-aws-eventbridge-and-aws-lambda">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;p>AWS S3 sends events to EventBridge or an AWS Lambda function. Unfortunately, EventBridge rules do not directly allow filtering by object size. However, you can configure an &lt;strong>AWS Lambda&lt;/strong> function to process events and apply filtering based on size.&lt;/p></description></item><item><title>What is a Bundle? Understanding the Concept</title><link>https://blog.dev.simpleenough.net/blog/bundleconcept/</link><pubDate>Mon, 03 Feb 2025 10:00:00 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/bundleconcept/</guid><description>&lt;p>The term &lt;strong>&amp;ldquo;bundle&amp;rdquo;&lt;/strong> is widely used in web development and DevOps. It refers to a &lt;strong>grouping of files, resources, or elements&lt;/strong> to simplify their management and improve performance.&lt;/p>
&lt;p>However, a &lt;strong>bundle&lt;/strong> does not have the same meaning everywhere. In this article, we will explore its &lt;strong>different uses&lt;/strong> in three key areas:&lt;/p>
&lt;p>&lt;strong>Hugo (static site generator)&lt;/strong>&lt;br>
&lt;strong>CSS &amp;amp; JavaScript (front-end development)&lt;/strong>&lt;br>
&lt;strong>DevOps (Docker, Kubernetes, Helm, etc.)&lt;/strong>&lt;/p>
&lt;hr>




&lt;h2 id="1-bundle-in-hugo-organizing-files-smartly" class="heading">1. Bundle in Hugo: Organizing Files Smartly&lt;a href="#1-bundle-in-hugo-organizing-files-smartly" aria-labelledby="1-bundle-in-hugo-organizing-files-smartly">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>
&lt;p>In Hugo, a &lt;strong>bundle&lt;/strong> is a folder containing a page and its associated resources (images, JSON files, etc.). There are two types of &lt;strong>Page Bundles&lt;/strong>:&lt;/p></description></item><item><title>Demystifying AWS KMS</title><link>https://blog.dev.simpleenough.net/blog/demystifying-aws-kms/</link><pubDate>Sun, 19 Jan 2025 09:56:41 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/demystifying-aws-kms/</guid><description>&lt;h2 id="i-introduction-to-aws-kms" class="heading">I. Introduction to AWS KMS&lt;a href="#i-introduction-to-aws-kms" aria-labelledby="i-introduction-to-aws-kms">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h2>




&lt;h3 id="a-what-is-aws-kms" class="heading">&lt;strong>A. What is AWS KMS?&lt;/strong>&lt;a href="#a-what-is-aws-kms" aria-labelledby="a-what-is-aws-kms">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;p>AWS KMS, short for &lt;strong>Key Management Service&lt;/strong>, is a fully managed service designed to simplify the creation, management, and control of encryption keys. Everytime encryption is mentioned in AWS services like EBS, S3, RDS, or SSM, AWS KMS is probably involved. This service integrates seamlessly with IAM and, of course, it also ensures robust access control and auditing through CloudTrail.&lt;/p></description></item><item><title>A Brief History of AWS Architectures</title><link>https://blog.dev.simpleenough.net/blog/history/</link><pubDate>Fri, 20 Dec 2024 09:56:41 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/history/</guid><description>&lt;h1 id="i-the-early-days-of-aws-and-cloud-computing-2002---2006" class="heading">I. The Early Days of AWS and Cloud Computing (2002 - 2006)&lt;a href="#i-the-early-days-of-aws-and-cloud-computing-2002---2006" aria-labelledby="i-the-early-days-of-aws-and-cloud-computing-2002---2006">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h1>




&lt;h3 id="context-the-origin-of-the-aws-project" class="heading">Context: The Origin of the AWS Project&lt;a href="#context-the-origin-of-the-aws-project" aria-labelledby="context-the-origin-of-the-aws-project">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h3>
&lt;p>Before AWS became a cloud giant, Amazon.com (the e-commerce site) had to manage a massive IT infrastructure to support its rapid growth. The company invested in expensive data centers and had to anticipate server capacity for peak traffic periods (such as Black Friday). However, much of this capacity remained unused outside of high-demand periods.&lt;/p></description></item><item><title>Learn AWS by Yourself? 10 Services to Know</title><link>https://blog.dev.simpleenough.net/blog/learnaws/</link><pubDate>Wed, 20 Nov 2024 09:56:41 +0100</pubDate><guid>https://blog.dev.simpleenough.net/blog/learnaws/</guid><description>&lt;h5 id="here-are-the-10-essential-services-to-master-to-fully-leverage-aws" class="heading">Here are the 10 essential services to master to fully leverage AWS.&lt;a href="#here-are-the-10-essential-services-to-master-to-fully-leverage-aws" aria-labelledby="here-are-the-10-essential-services-to-master-to-fully-leverage-aws">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h5>




&lt;h1 id="1-iam-identity-and-access-management" class="heading">1. IAM (Identity and Access Management)&lt;a href="#1-iam-identity-and-access-management" aria-labelledby="1-iam-identity-and-access-management">
&lt;!-- &lt;i class="fas fa-link anchor">&lt;/i> -->
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 640 512">&lt;use href="#fas-link">&lt;/use>&lt;/svg>&amp;nbsp;
 &lt;/a>
&lt;/h1>
&lt;p>IAM is the AWS service that allows you to manage access to your account&amp;rsquo;s resources. It plays a crucial role in security by controlling who can do what on your cloud infrastructure. With IAM, you can create individual users or group multiple users into groups. You can also define roles that allow other AWS services to interact with each other.&lt;/p></description></item><item><title/><link>https://blog.dev.simpleenough.net/blog/lastexpert/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.dev.simpleenough.net/blog/lastexpert/</guid><description/></item></channel></rss>