<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Rick van Lieshout ~ Mastermindzh]]></title><description><![CDATA[Rick van Lieshout ~ Mastermindzh]]></description><link>http://github.com/dylang/node-rss</link><generator>GatsbyJS</generator><lastBuildDate>Mon, 18 May 2026 18:34:15 GMT</lastBuildDate><item><title><![CDATA[Skillful, reusable AI workflows from files you own]]></title><description><![CDATA[What Skillful is, why I built it, and how I use it to manage reusable AI workflows locally.]]></description><link>https://www.rickvanlieshout.com/posts/2026/introducing-skillful/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2026/introducing-skillful/</guid><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A few weeks ago I started building a tool called Skillful.&lt;/p&gt;
&lt;p&gt;It didn’t start as a product idea.&lt;/p&gt;
&lt;p&gt;It started as friction.&lt;/p&gt;
&lt;h2 id=&quot;the-problem-ai-workflows-are-everywhere-and-nowhere&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-problem-ai-workflows-are-everywhere-and-nowhere&quot; aria-label=&quot;the problem ai workflows are everywhere and nowhere permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Problem: AI Workflows are everywhere and nowhere&lt;/h2&gt;
&lt;p&gt;If you use AI tools regularly, you probably recognise this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;prompts live in ChatGPT&lt;/li&gt;
&lt;li&gt;some live in Cursor&lt;/li&gt;
&lt;li&gt;some are buried in Obsidian&lt;/li&gt;
&lt;li&gt;some are in random &lt;code class=&quot;language-text&quot;&gt;.md&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;screenshots live somewhere else entirely and you copy-paste them into your prompt when required&lt;/li&gt;
&lt;li&gt;helper scripts are in a repo you forgot about&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything works… until you try to reuse it.
Or worse, until you try to &lt;strong&gt;share it across tools&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That’s where things fall apart.&lt;/p&gt;
&lt;p&gt;You end up copying the same workflow five times:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;once for ChatGPT&lt;/li&gt;
&lt;li&gt;once for Cursor&lt;/li&gt;
&lt;li&gt;once for a markdown note&lt;/li&gt;
&lt;li&gt;once for a repo&lt;/li&gt;
&lt;li&gt;once for “just in case”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And now you have five slightly different versions.&lt;/p&gt;
&lt;p&gt;None of them are “the source of truth”.&lt;/p&gt;
&lt;h2 id=&quot;the-idea-files-as-the-source-of-truth&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-idea-files-as-the-source-of-truth&quot; aria-label=&quot;the idea files as the source of truth permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Idea: Files as the Source Of Truth&lt;/h2&gt;
&lt;p&gt;Skillful is built around a very simple idea:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Your workflows should just be files.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Not a database.
Not a SaaS backend.
Not tied to a single tool.&lt;/p&gt;
&lt;p&gt;Just files on disk.&lt;/p&gt;
&lt;p&gt;Each “skill” or “agent” is a folder.&lt;/p&gt;
&lt;p&gt;Inside that folder you can have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;prompts&lt;/li&gt;
&lt;li&gt;markdown notes&lt;/li&gt;
&lt;li&gt;screenshots&lt;/li&gt;
&lt;li&gt;helper scripts&lt;/li&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And that folder becomes the &lt;strong&gt;single source of truth&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;From there, Skillful handles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;installing it into tools (Cursor, VS Code, etc.)&lt;/li&gt;
&lt;li&gt;linking everything together&lt;/li&gt;
&lt;li&gt;keeping things in sync&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No copies.
No drift.&lt;/p&gt;
&lt;h2 id=&quot;filesystem-first-by-design&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#filesystem-first-by-design&quot; aria-label=&quot;filesystem first by design permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Filesystem-First By Design&lt;/h2&gt;
&lt;p&gt;This is probably the most important architectural choice.&lt;/p&gt;
&lt;p&gt;Skillful is filesystem-first.&lt;/p&gt;
&lt;p&gt;That means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;your data stays on your machine&lt;/li&gt;
&lt;li&gt;no accounts&lt;/li&gt;
&lt;li&gt;no sync service&lt;/li&gt;
&lt;li&gt;no telemetry&lt;/li&gt;
&lt;li&gt;no lock-in&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If Skillful disappears tomorrow, your files are still there.&lt;/p&gt;
&lt;p&gt;You can open them with any editor.
Version them with Git.
Move them anywhere.&lt;/p&gt;
&lt;p&gt;Skillful is just a layer on top.&lt;/p&gt;
&lt;p&gt;Not a dependency.&lt;/p&gt;
&lt;h2 id=&quot;how-i-actually-use-it&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-i-actually-use-it&quot; aria-label=&quot;how i actually use it permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How I Actually Use It&lt;/h2&gt;
&lt;p&gt;The easiest way to understand Skillful is through usage.&lt;/p&gt;
&lt;h3 id=&quot;1-create-a-skill&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-create-a-skill&quot; aria-label=&quot;1 create a skill permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Create A Skill&lt;/h3&gt;
&lt;p&gt;I start with a folder:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;txt&quot;&gt;&lt;pre class=&quot;language-txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;skills/
  api-review/
    SKILL.md
    notes.md
    examples/
    scripts/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Inside &lt;code class=&quot;language-text&quot;&gt;SKILL.md&lt;/code&gt; lives the actual prompt I use.
&lt;code class=&quot;language-text&quot;&gt;notes.md&lt;/code&gt; contains context, edge cases, things I learned.&lt;/p&gt;
&lt;p&gt;Sometimes I add:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sample inputs&lt;/li&gt;
&lt;li&gt;expected outputs&lt;/li&gt;
&lt;li&gt;helper scripts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That folder becomes a reusable unit.&lt;/p&gt;
&lt;h3 id=&quot;2-link-it-to-tools&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-link-it-to-tools&quot; aria-label=&quot;2 link it to tools permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Link It To Tools&lt;/h3&gt;
&lt;p&gt;Skillful lets me “install” that skill into different tools.&lt;/p&gt;
&lt;p&gt;Instead of copying the prompt, it links it.&lt;/p&gt;
&lt;p&gt;So:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Codex sees it&lt;/li&gt;
&lt;li&gt;Claude sees it&lt;/li&gt;
&lt;li&gt;other tools see it&lt;/li&gt;
&lt;li&gt;updates propagate automatically&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Change the file once, everything updates.&lt;/p&gt;
&lt;p&gt;That’s the key difference.&lt;/p&gt;
&lt;h3 id=&quot;3-reuse-everywhere&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-reuse-everywhere&quot; aria-label=&quot;3 reuse everywhere permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Reuse Everywhere&lt;/h3&gt;
&lt;p&gt;Now the same workflow can be used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;inside editors&lt;/li&gt;
&lt;li&gt;inside AI tools&lt;/li&gt;
&lt;li&gt;inside scripts&lt;/li&gt;
&lt;li&gt;inside repos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without duplication.&lt;/p&gt;
&lt;p&gt;Without drift.&lt;/p&gt;
&lt;h2 id=&quot;one-source-every-tool&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#one-source-every-tool&quot; aria-label=&quot;one source every tool permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;One Source, Every Tool&lt;/h2&gt;
&lt;p&gt;One thing I didn’t expect initially is how valuable this becomes over time.&lt;/p&gt;
&lt;p&gt;Once you have a growing library of skills:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;you stop rewriting prompts&lt;/li&gt;
&lt;li&gt;you start refining them&lt;/li&gt;
&lt;li&gt;you start composing them&lt;/li&gt;
&lt;li&gt;you start trusting them&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And because everything is file-based, it’s trivial to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;version control them&lt;/li&gt;
&lt;li&gt;share them&lt;/li&gt;
&lt;li&gt;review them&lt;/li&gt;
&lt;li&gt;evolve them&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It starts feeling less like prompts and more like actual software.&lt;/p&gt;
&lt;h2 id=&quot;why-not-just-use-notion--chatgpt--x&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-not-just-use-notion--chatgpt--x&quot; aria-label=&quot;why not just use notion  chatgpt  x permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why Not Just Use Notion / ChatGPT / X?&lt;/h2&gt;
&lt;p&gt;Because those tools are not designed for reuse across environments.&lt;/p&gt;
&lt;p&gt;They are designed for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;interaction&lt;/li&gt;
&lt;li&gt;storage&lt;/li&gt;
&lt;li&gt;sometimes collaboration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But not for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cross-tool installation&lt;/li&gt;
&lt;li&gt;filesystem ownership&lt;/li&gt;
&lt;li&gt;reproducibility&lt;/li&gt;
&lt;li&gt;composability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Skillful is not trying to replace those tools.&lt;/p&gt;
&lt;p&gt;It sits next to them.&lt;/p&gt;
&lt;p&gt;It makes the workflows portable.&lt;/p&gt;
&lt;h2 id=&quot;break-proof-installs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#break-proof-installs&quot; aria-label=&quot;break proof installs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Break-Proof Installs&lt;/h2&gt;
&lt;p&gt;One small but important feature is how installs behave.&lt;/p&gt;
&lt;p&gt;Instead of copying files into tools, Skillful links them.&lt;/p&gt;
&lt;p&gt;That means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;no duplication&lt;/li&gt;
&lt;li&gt;no stale versions&lt;/li&gt;
&lt;li&gt;no mystery bugs from “which version is this?”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And if something breaks?&lt;/p&gt;
&lt;p&gt;You can repair it in a click.&lt;/p&gt;
&lt;p&gt;Or just delete and re-link.&lt;/p&gt;
&lt;p&gt;Because the source is always your folder.&lt;/p&gt;
&lt;h2 id=&quot;your-library-your-disk&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#your-library-your-disk&quot; aria-label=&quot;your library your disk permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Your Library, Your Disk&lt;/h2&gt;
&lt;p&gt;This is probably the most important part philosophically.&lt;/p&gt;
&lt;p&gt;Skillful does not own your data.&lt;/p&gt;
&lt;p&gt;You do.&lt;/p&gt;
&lt;p&gt;There is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;no cloud dependency&lt;/li&gt;
&lt;li&gt;no vendor lock-in&lt;/li&gt;
&lt;li&gt;no hidden sync&lt;/li&gt;
&lt;li&gt;no background services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything stays local.&lt;/p&gt;
&lt;p&gt;Which also means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;it works offline&lt;/li&gt;
&lt;li&gt;it’s fast&lt;/li&gt;
&lt;li&gt;it’s predictable&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;final-thoughts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-thoughts&quot; aria-label=&quot;final thoughts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Skillful isn’t trying to be a massive platform.&lt;/p&gt;
&lt;p&gt;It’s trying to solve one very specific problem:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How do I make AI workflows reusable without losing control over them?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For me, the answer ended up being surprisingly simple:&lt;/p&gt;
&lt;p&gt;Files.&lt;/p&gt;
&lt;p&gt;Plain files.
On disk.
As the source of truth.&lt;/p&gt;
&lt;p&gt;Everything else builds on top of that.
If that resonates with how you work, you can check it out here: &lt;a href=&quot;https://skillful.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Skillful&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And if nothing else, maybe it gives you a different way to think about managing your own workflows.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAABtklEQVR42gGrAVT+AEQ4YjQqTyQYQhgNOR0QPSQWRCMURCscRyccRzovXpqUtJ6Vwp+Ww5qPvp6TxqGWyZ+Vwol3sJ6VvnRtmgBORGhANlk7MVNIQF89NFchFD8jFEMtH00rHVBPQm3//v38+/r8+/r18/X08/P19fT8+/r08fj///+zr8YAZF53WFBwU0d0ZFmCWU15OSpeIhZEKR5MJhpMSD5n5+Xs6+jx7Ojz5uLs5uLt5+Pt5eDr6ufu////rKi9ADo0UzMrTzMoVjYqWjMoVzkuXSkfTCYbSRsRQUY9Zero7uzo8fDs9eTh4+Li5OXk5uzr7vLy9P///7GrvwAoHUkcFTkxJVIaEzYzJlQqH0wlG0koHUsiF0dGPWXo5uvr6O/t6fPd2+DOzdLS0Nbc2t/e3OLr6u2spbwAKCJCIBo8Jh5CIBg9KiFHKB9GIhlFKR9MJRpKSD1o7+b56t/38+z78PLu6urp7u7t+Pn49ff2////t7DFACMeOiEbOxkTNR8ZOx4WOiAYOyEYQCMaRh4UQDMpVIV9noJ4nod/oYqFoIqCoI+Eo5aIqpaHqpyPrXRjjl/12DMzQPjKAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/0c5f1b8ed2da8ccdf641573763eafeac/8ac56/snapcraft.webp 240w,
/static/0c5f1b8ed2da8ccdf641573763eafeac/d3be9/snapcraft.webp 480w,
/static/0c5f1b8ed2da8ccdf641573763eafeac/e46b2/snapcraft.webp 960w,
/static/0c5f1b8ed2da8ccdf641573763eafeac/f992d/snapcraft.webp 1440w,
/static/0c5f1b8ed2da8ccdf641573763eafeac/882b9/snapcraft.webp 1920w,
/static/0c5f1b8ed2da8ccdf641573763eafeac/129b4/snapcraft.webp 2172w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/0c5f1b8ed2da8ccdf641573763eafeac/8ff5a/snapcraft.png 240w,
/static/0c5f1b8ed2da8ccdf641573763eafeac/e85cb/snapcraft.png 480w,
/static/0c5f1b8ed2da8ccdf641573763eafeac/d9199/snapcraft.png 960w,
/static/0c5f1b8ed2da8ccdf641573763eafeac/07a9c/snapcraft.png 1440w,
/static/0c5f1b8ed2da8ccdf641573763eafeac/29114/snapcraft.png 1920w,
/static/0c5f1b8ed2da8ccdf641573763eafeac/6976b/snapcraft.png 2172w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/0c5f1b8ed2da8ccdf641573763eafeac/d9199/snapcraft.png&quot;
            alt=&quot;snap promotional image&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[I wanted a lighter runtime like Electrobun, shipping reality chose Electron]]></title><description><![CDATA[Why [Skillful](https://github.com/mastermindzh/skillful) switched from Electrobun back to Electron, and what that taught me about desktop architecture, packaging and runtime seams.]]></description><link>https://www.rickvanlieshout.com/posts/2026/wanted-electrobun-shipping-chose-electron/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2026/wanted-electrobun-shipping-chose-electron/</guid><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;About a month ago I started building a new application called &lt;a href=&quot;https://github.com/mastermindzh/skillful&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Skillful&lt;/a&gt;). &lt;br /&gt;
Originally, the idea was quite simple: I wanted an excuse to try Electrobun.&lt;/p&gt;
&lt;p&gt;For those unfamiliar with it, Electrobun is essentially an Electron-like desktop runtime built around Bun instead of Chromium + Node.js. The biggest selling point is obvious immediately: no embedded Chromium browser. Smaller runtime, potentially lower memory usage, less “Electron bloat”.&lt;/p&gt;
&lt;p&gt;And honestly? That attracted me.&lt;/p&gt;
&lt;p&gt;People love complaining about Electron applications shipping half a browser with every app. Personally, I’ve always thought that criticism was slightly overblown. RAM exists to be used, and modern desktop applications are expected to behave like modern applications. Still, the idea of a lightweight filesystem-first desktop app built on Bun sounded genuinely interesting.&lt;/p&gt;
&lt;p&gt;So I gave it a shot.&lt;/p&gt;
&lt;p&gt;At first, it actually went pretty well.&lt;/p&gt;
&lt;p&gt;Then I tried to ship it.&lt;/p&gt;
&lt;h2 id=&quot;the-reality-of-desktop-applications&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-reality-of-desktop-applications&quot; aria-label=&quot;the reality of desktop applications permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Reality Of Desktop Applications&lt;/h2&gt;
&lt;p&gt;One thing became painfully clear very quickly:&lt;/p&gt;
&lt;p&gt;Building a desktop application is not the hard part anymore. &lt;strong&gt;Shipping&lt;/strong&gt; one is.&lt;/p&gt;
&lt;p&gt;Packaging, updating, shortcuts, desktop integration, installers, Linux distributions, release channels, runtime quirks, auto-updates, platform conventions… &lt;em&gt;that&lt;/em&gt; is the real product surface of a desktop application.&lt;/p&gt;
&lt;p&gt;And this is where Electrobun started falling apart. &lt;br /&gt;
Not because it was fundamentally bad. In fact, the runtime itself was perfectly fine most of the time.&lt;/p&gt;
&lt;p&gt;The problem was that I kept ending up in runtime land instead of product land.&lt;/p&gt;
&lt;p&gt;Issues looked like product bugs but turned out to be packaging problems.
Or updater problems.
Or launcher problems.
Or Linux runtime problems.&lt;/p&gt;
&lt;p&gt;Every single one costs time, every single one is annoying.&lt;/p&gt;
&lt;h2 id=&quot;why-i-chose-electrobun&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-i-chose-electrobun&quot; aria-label=&quot;why i chose electrobun permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why I Chose Electrobun&lt;/h2&gt;
&lt;p&gt;Before I explain why I moved away from it, it’s important to explain why I chose it in the first place.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/mastermindzh/skillful&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Skillful&lt;/a&gt; is intentionally filesystem-first.&lt;/p&gt;
&lt;p&gt;The application manages local AI skills, local models, local assets and local workflows. The disk is effectively the source of truth. I wanted an actual desktop application that happened to have a modern UI, normally I’d use Electron but I wanted to try Electrobun. (hell, the whole idea of &lt;a href=&quot;https://github.com/mastermindzh/skillful&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Skillful&lt;/a&gt; was born because I wanted to use Electrobun)&lt;/p&gt;
&lt;p&gt;Electrobun felt ideologically aligned with that.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Smaller runtime.&lt;/li&gt;
&lt;li&gt;Fast startup.&lt;/li&gt;
&lt;li&gt;Native feeling.&lt;/li&gt;
&lt;li&gt;Bun tooling.&lt;/li&gt;
&lt;li&gt;No Chromium baggage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And architecturally, it fit extremely well. And it also delivered on speed, the filesystem was fast without me applying any efficiency standards. It truly felt well.&lt;/p&gt;
&lt;p&gt;One of the best decisions I made early on was separating the runtime shell from the actual application logic.&lt;br /&gt;
The project structure looked roughly like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;txt&quot;&gt;&lt;pre class=&quot;language-txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;src/
  main/           -&gt; business logic
  shared/         -&gt; shared RPC + contracts
  mainview/       -&gt; renderer/frontend
  desktop/        -&gt; runtime abstraction layer&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The important part here is that &lt;code class=&quot;language-text&quot;&gt;src/main/&lt;/code&gt; never cared about the runtime.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Filesystem scanning.&lt;/li&gt;
&lt;li&gt;Libraries.&lt;/li&gt;
&lt;li&gt;Archives.&lt;/li&gt;
&lt;li&gt;Settings.&lt;/li&gt;
&lt;li&gt;Collections.&lt;/li&gt;
&lt;li&gt;AI skill metadata.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of that was runtime-agnostic.
The runtime only needed to satisfy a few interfaces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;open file dialogs&lt;/li&gt;
&lt;li&gt;reveal paths in the file manager&lt;/li&gt;
&lt;li&gt;perform updates&lt;/li&gt;
&lt;li&gt;expose IPC&lt;/li&gt;
&lt;li&gt;manage windows&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That architectural seam ended up saving the project later.
At the time though, it just felt like good engineering hygiene.&lt;/p&gt;
&lt;h2 id=&quot;the-packaging-disaster-begins&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-packaging-disaster-begins&quot; aria-label=&quot;the packaging disaster begins permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Packaging Disaster Begins&lt;/h2&gt;
&lt;p&gt;The first warning signs appeared once I started packaging builds.
Every platform had sharp edges.&lt;/p&gt;
&lt;p&gt;Windows especially became a rabbit hole of custom glue code and weird packaging hacks.&lt;/p&gt;
&lt;p&gt;I ended up maintaining:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;custom launcher scripts&lt;/li&gt;
&lt;li&gt;bundled &lt;code class=&quot;language-text&quot;&gt;bin/bun&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;bundled runtime files&lt;/li&gt;
&lt;li&gt;zstd-compressed payloads&lt;/li&gt;
&lt;li&gt;manual patch generation&lt;/li&gt;
&lt;li&gt;update archive handling&lt;/li&gt;
&lt;li&gt;custom extraction logic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the frustrating part is:&lt;/p&gt;
&lt;p&gt;none of this had anything to do with &lt;a href=&quot;https://github.com/mastermindzh/skillful&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Skillful&lt;/a&gt; itself.&lt;/p&gt;
&lt;p&gt;I wasn’t building features anymore.
I wasn’t building infrastructure around the runtime.&lt;/p&gt;
&lt;p&gt;The Linux packaging story also became especially painful because there wasn’t really a conventional ecosystem around Electrobun releases yet, worse, it doesn’t align with other Linux packaging guidelines.&lt;/p&gt;
&lt;p&gt;Electron, meanwhile, has had years of people solving these exact problems already.
That difference matters far more than people think.&lt;/p&gt;
&lt;h2 id=&quot;electron-won-by-being-boring&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#electron-won-by-being-boring&quot; aria-label=&quot;electron won by being boring permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Electron Won By Being Boring&lt;/h2&gt;
&lt;p&gt;Eventually I switched the project back to Electron.&lt;/p&gt;
&lt;p&gt;Not because Electron was elegant.
Not because Electron was lightweight.
But because Electron made the difficult parts boring again.&lt;/p&gt;
&lt;p&gt;And boring infrastructure is one of the best things you can have.&lt;/p&gt;
&lt;p&gt;Using &lt;a href=&quot;https://www.electron.build/index.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;electron-builder&lt;/a&gt;, a single configuration now produces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;macOS &lt;code class=&quot;language-text&quot;&gt;.dmg&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;.zip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Windows NSIS installers&lt;/li&gt;
&lt;li&gt;Linux &lt;code class=&quot;language-text&quot;&gt;.deb&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;.rpm&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;.AppImage&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;.pacman&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;.snap&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;.flatpak&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is an absurd amount of packaging complexity solved by one ecosystem.
Previously the Linux story was basically:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“here’s a tarball, good luck.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now releases are conventional.&lt;br /&gt;
Predictable.&lt;br /&gt;
Expected.&lt;/p&gt;
&lt;p&gt;That matters.&lt;/p&gt;
&lt;h2 id=&quot;desktop-integration-should-not-be-a-side-quest&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#desktop-integration-should-not-be-a-side-quest&quot; aria-label=&quot;desktop integration should not be a side quest permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Desktop Integration Should Not Be A Side Quest&lt;/h2&gt;
&lt;p&gt;Another thing Electron completely solved was native desktop integration.
Things I spent days wrestling with before became one-liners:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre class=&quot;language-ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;dialog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;showOpenDialog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
shell&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;showItemInFolder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
shell&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;openExternal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Icons?&lt;br /&gt;
Handled.&lt;/p&gt;
&lt;p&gt;Start menu entries?&lt;br /&gt;
Handled.&lt;/p&gt;
&lt;p&gt;Desktop files?&lt;br /&gt;
Handled.&lt;/p&gt;
&lt;p&gt;Uninstallers?&lt;br /&gt;
Handled. (and actually used.. Electrobun produced an &lt;code class=&quot;language-text&quot;&gt;Uninstall.reg&lt;/code&gt; but never applied it)&lt;/p&gt;
&lt;p&gt;I cannot overstate how valuable it is when platform integration stops being your problem.&lt;/p&gt;
&lt;h2 id=&quot;the-funny-ipc-bug&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-funny-ipc-bug&quot; aria-label=&quot;the funny ipc bug permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Funny IPC Bug&lt;/h2&gt;
&lt;p&gt;Ironically, one of the most interesting bugs happened &lt;em&gt;after&lt;/em&gt; migrating.
Electron prepends this wonderful little string to IPC errors:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;txt&quot;&gt;&lt;pre class=&quot;language-txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;Error invoking remote method &apos;rpc:call&apos;:&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which sounds harmless.
Except the domain-specific error transport depended on a sentinel existing at the start of &lt;code class=&quot;language-text&quot;&gt;error.message&lt;/code&gt;.
So suddenly the custom &lt;code class=&quot;language-text&quot;&gt;AppError&lt;/code&gt; rehydration stopped working.&lt;/p&gt;
&lt;p&gt;The fix itself was hilariously small:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre class=&quot;language-ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token function&quot;&gt;startsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;became:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre class=&quot;language-ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token function&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;One-line fix.&lt;/p&gt;
&lt;p&gt;But the important part was the lesson:&lt;/p&gt;
&lt;p&gt;runtime-specific bugs absolutely exist, and the only reason I caught this one was because I ran tests against the actual packaged runtime.&lt;/p&gt;
&lt;p&gt;Not just unit tests.&lt;/p&gt;
&lt;p&gt;Real packaged application tests.&lt;/p&gt;
&lt;p&gt;Without that, I probably would have shipped it without the fix first.&lt;/p&gt;
&lt;h2 id=&quot;the-runtime-seam-saved-me&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-runtime-seam-saved-me&quot; aria-label=&quot;the runtime seam saved me permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Runtime Seam Saved me&lt;/h2&gt;
&lt;p&gt;The best thing to come out of the Electrobun experiment was honestly the runtime abstraction layer.&lt;/p&gt;
&lt;p&gt;Switching runtimes ended up taking about a single evening.&lt;/p&gt;
&lt;p&gt;Not because Electron migration is inherently easy, but because the architecture isolated the runtime shell from the actual application.&lt;/p&gt;
&lt;p&gt;The domain layer stayed untouched.&lt;/p&gt;
&lt;p&gt;The renderer stayed mostly untouched.&lt;/p&gt;
&lt;p&gt;The filesystem model stayed untouched.&lt;/p&gt;
&lt;p&gt;The only things rewritten were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;runtime adapters&lt;/li&gt;
&lt;li&gt;packaging&lt;/li&gt;
&lt;li&gt;IPC wiring&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is exactly what you want from architecture.
The runtime became an implementation detail.
Which, honestly, it should have been from day one.&lt;/p&gt;
&lt;h2 id=&quot;what-i-learned&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-i-learned&quot; aria-label=&quot;what i learned permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What I Learned&lt;/h2&gt;
&lt;p&gt;Looking back, I think the biggest lesson here is this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Runtime minimalism is a false economy if you end up rebuilding the ecosystem yourself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Saving some memory usage on paper is meaningless if your release pipeline needs babysitting every week.
Electron absolutely uses more memory.
Nobody serious denies that.
But the application now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ships reliably&lt;/li&gt;
&lt;li&gt;updates reliably&lt;/li&gt;
&lt;li&gt;packages reliably&lt;/li&gt;
&lt;li&gt;integrates with the OS properly&lt;/li&gt;
&lt;li&gt;behaves conventionally&lt;/li&gt;
&lt;li&gt;is dramatically easier to reason about&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That trade-off was worth it, instantly.
And funnily enough, the filesystem-first architecture survived the migration almost untouched.&lt;/p&gt;
&lt;p&gt;Because filesystem-first was never really about Electrobun.&lt;/p&gt;
&lt;p&gt;It was an architectural decision.
Not a runtime one.&lt;/p&gt;
&lt;h2 id=&quot;final-thoughts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-thoughts&quot; aria-label=&quot;final thoughts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;If I had to do it all again?&lt;/p&gt;
&lt;p&gt;I’d probably start on Electron immediately.
Not because Electron is technologically superior.
But because desktop application development is overwhelmingly operational work once the product itself exists.&lt;/p&gt;
&lt;p&gt;The runtime you choose should make packaging, updates and desktop integration boring.&lt;/p&gt;
&lt;p&gt;Electron does.&lt;/p&gt;
&lt;p&gt;And after spending weeks deep inside launcher scripts, patch files and packaging edge cases…
boring started sounding really, really attractive.&lt;/p&gt;
&lt;h3 id=&quot;would-i-use-electrobun-again&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#would-i-use-electrobun-again&quot; aria-label=&quot;would i use electrobun again permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Would I Use Electrobun Again?&lt;/h3&gt;
&lt;p&gt;Honestly?&lt;/p&gt;
&lt;p&gt;Yes, probably.&lt;/p&gt;
&lt;p&gt;Despite everything in this post, I actually still like the idea behind Electrobun a lot.&lt;/p&gt;
&lt;p&gt;The runtime itself was not the problem. In many ways it was refreshingly straightforward. Startup times felt great, Bun is genuinely pleasant to work with, and the smaller runtime story still appeals to me philosophically.&lt;/p&gt;
&lt;p&gt;But desktop applications are judged on the parts &lt;em&gt;around&lt;/em&gt; the runtime.&lt;/p&gt;
&lt;p&gt;Users do not care what JavaScript engine powers your application.
They care whether:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;installing works&lt;/li&gt;
&lt;li&gt;updating works&lt;/li&gt;
&lt;li&gt;file associations work&lt;/li&gt;
&lt;li&gt;uninstalling works&lt;/li&gt;
&lt;li&gt;icons work&lt;/li&gt;
&lt;li&gt;shortcuts work&lt;/li&gt;
&lt;li&gt;the application feels native&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Electron has years of ecosystem maturity solving exactly those things.
Electrobun is simply not there yet.
I would absolutely consider using it again once a few things mature further.&lt;/p&gt;
&lt;h4 id=&quot;native-packaging-needs-to-become-the-default&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#native-packaging-needs-to-become-the-default&quot; aria-label=&quot;native packaging needs to become the default permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Native Packaging Needs To Become The Default&lt;/h4&gt;
&lt;p&gt;The biggest one for me is installation strategy.
Desktop applications should install using conventional OS-native mechanisms.&lt;/p&gt;
&lt;p&gt;Not:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“extract this tarball somewhere and run the launcher.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That may be technically acceptable for developers, but it is not acceptable for mainstream desktop software.
The moment your installer story becomes custom, you inherit years of operational complexity yourself.&lt;br /&gt;
Electron ecosystems solved this years ago.&lt;/p&gt;
&lt;h4 id=&quot;desktop-integration-needs-to-be-assumed&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#desktop-integration-needs-to-be-assumed&quot; aria-label=&quot;desktop integration needs to be assumed permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Desktop Integration Needs To Be Assumed&lt;/h4&gt;
&lt;p&gt;Basic OS integration should not require detective work.&lt;/p&gt;
&lt;p&gt;Things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;application icons&lt;/li&gt;
&lt;li&gt;Start Menu entries&lt;/li&gt;
&lt;li&gt;uninstall registration&lt;/li&gt;
&lt;li&gt;desktop files&lt;/li&gt;
&lt;li&gt;external URL opening&lt;/li&gt;
&lt;li&gt;native dialogs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;should simply work.&lt;/p&gt;
&lt;p&gt;Not “work with a helper script”.
Not “work if you manually patch the generated output”.
Not “work after reading three GitHub issues”.&lt;/p&gt;
&lt;p&gt;Just work.&lt;/p&gt;
&lt;p&gt;One of the nicest feelings during the Electron migration was deleting workaround code instead of writing more of it.
That alone said a lot.&lt;/p&gt;
&lt;h4 id=&quot;the-chromium-embedded-suggestion-scared-me&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-chromium-embedded-suggestion-scared-me&quot; aria-label=&quot;the chromium embedded suggestion scared me permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Chromium Embedded Suggestion Scared Me&lt;/h4&gt;
&lt;p&gt;One thing that genuinely surprised me was seeing the documentation suggest bundling Chromium Embedded Framework (CEF) for Linux packaging scenarios.&lt;/p&gt;
&lt;p&gt;At that point I had a bit of an existential moment.
Because if the solution to packaging problems becomes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“ship Chromium anyway”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;then we’ve effectively lost the entire original value proposition.
The whole reason I explored Electrobun was to avoid shipping massive browser runtimes in the first place.&lt;/p&gt;
&lt;p&gt;Once we start reintroducing pieces of Chromium manually, things become very difficult to justify operationally.&lt;/p&gt;
&lt;h3 id=&quot;the-ecosystem-needs-time&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-ecosystem-needs-time&quot; aria-label=&quot;the ecosystem needs time permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Ecosystem Needs Time&lt;/h3&gt;
&lt;p&gt;And honestly, this is probably the fairest conclusion.&lt;/p&gt;
&lt;p&gt;Electron is old.
Very old.&lt;/p&gt;
&lt;p&gt;Which means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;millions of edge cases already happened&lt;/li&gt;
&lt;li&gt;somebody already solved most packaging problems&lt;/li&gt;
&lt;li&gt;updater pipelines are battle-tested&lt;/li&gt;
&lt;li&gt;CI examples exist for everything&lt;/li&gt;
&lt;li&gt;installers are predictable&lt;/li&gt;
&lt;li&gt;desktop conventions are well understood&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Electrobun simply has not had time to accumulate that maturity yet.
That is normal.&lt;br /&gt;
I think the project has potential.
I genuinely do.&lt;/p&gt;
&lt;p&gt;But for Skillful, where reliable releases mattered more than runtime ideology, maturity beat elegance.
And right now, Electron is still overwhelmingly the more mature choice.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The Reality of Distributed Systems: Everything Gets Harder]]></title><description><![CDATA[Distributed systems promise scalability and flexibility, but they come with a cost. Once you cross that boundary, everything gets harder.]]></description><link>https://www.rickvanlieshout.com/posts/2026/the-reality-of-distributed-systems/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2026/the-reality-of-distributed-systems/</guid><pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the previous articles we explored how systems evolve, how they communicate, and where to draw boundaries. All of those decisions eventually lead to one moment:&lt;/p&gt;
&lt;p&gt;The moment where your system is no longer a single unit.
The moment where it becomes distributed.&lt;/p&gt;
&lt;p&gt;On paper, that often looks like progress. More scalable, more flexible, more future-proof.
That might well be true, but in practice, it is also the moment where everything gets harder.&lt;/p&gt;
&lt;h2 id=&quot;the-moment-things-change&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-moment-things-change&quot; aria-label=&quot;the moment things change permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The moment things change&lt;/h2&gt;
&lt;p&gt;Moving to a distributed system does not feel like a big shift at first.
You extract a service. You move some logic out. You introduce an event or an API call. Everything still works. The system behaves roughly the same.&lt;/p&gt;
&lt;p&gt;Until it doesn’t.&lt;/p&gt;
&lt;p&gt;The difference is subtle, but fundamental. You are no longer working within a single process. You are working across network boundaries.
That means you are no longer dealing with function calls. You are dealing with unreliable communication.&lt;/p&gt;
&lt;p&gt;And &lt;strong&gt;that&lt;/strong&gt; changes everything.&lt;/p&gt;
&lt;h2 id=&quot;debugging-is-no-longer-local&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#debugging-is-no-longer-local&quot; aria-label=&quot;debugging is no longer local permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Debugging is no longer local&lt;/h2&gt;
&lt;p&gt;In a monolith, debugging is straightforward. Something goes wrong, you follow the stack trace, inspect the state, and you usually find your answer.&lt;/p&gt;
&lt;p&gt;In a distributed system, there is no single place to look.
A request might start in one service, pass through two others, trigger an asynchronous process, and eventually fail somewhere completely unexpected. By the time you notice, the original context is gone.&lt;/p&gt;
&lt;p&gt;Now you are searching across logs, correlating timestamps, and trying to reconstruct what actually happened.
This is where tools like tracing and telemetry become essential. Not because they are nice to have, but because without them, you are effectively blind.
Even with good tooling, it takes time to build the mental model needed to debug these systems.&lt;/p&gt;
&lt;p&gt;I have seen this firsthand in every place I worked with a distributed system.&lt;/p&gt;
&lt;p&gt;When new engineers join, especially those coming from more traditional or monolithic environments, this is one of the hardest things to teach. It is not just about reading logs, it is about understanding flows that are no longer linear.
We have had to invest in internal sessions, tooling like SigNoz, and shared practices just to get people comfortable with distributed debugging.&lt;/p&gt;
&lt;p&gt;And even then, it takes time.&lt;/p&gt;
&lt;h2 id=&quot;failure-is-everywhere&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#failure-is-everywhere&quot; aria-label=&quot;failure is everywhere permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Failure is everywhere&lt;/h2&gt;
&lt;p&gt;In a monolith, failure is usually binary. Something works, or it throws an error.&lt;/p&gt;
&lt;p&gt;In a distributed system, failure is everywhere, and often partial.
A service might respond slowly. Another might time out. A third might process a message twice.
A fourth might never process it at all.
None of these are exceptional situations. They are normal.&lt;/p&gt;
&lt;p&gt;This forces you to think differently..&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You need retries, but retries can cause duplicates.&lt;/li&gt;
&lt;li&gt;You need idempotency, but that adds complexity.&lt;/li&gt;
&lt;li&gt;You need timeouts, but choosing them is not trivial.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You are no longer designing for success. You are designing for failure.
And if you ignore that, your system will behave unpredictably under real-world conditions.&lt;/p&gt;
&lt;h2 id=&quot;time-becomes-a-problem&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#time-becomes-a-problem&quot; aria-label=&quot;time becomes a problem permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Time becomes a problem&lt;/h2&gt;
&lt;p&gt;In a single system, time is mostly implicit. Operations happen in sequence. State changes are immediate.
In a distributed system, time becomes one of the hardest problems to reason about.
Messages can arrive out of order. Events can be delayed. Systems can temporarily disagree on what the current state is.&lt;/p&gt;
&lt;p&gt;This is where eventual consistency stops being a nice concept and becomes a real constraint.
You might process an order, publish an event, and have another service react to it seconds later. Or minutes. Or after a retry.
If your system assumes everything is always in sync, it will break.&lt;/p&gt;
&lt;p&gt;Designing for this means accepting that different parts of your system will see different realities at different times.
That is not a bug. That is the system working as designed.&lt;/p&gt;
&lt;h2 id=&quot;observability-is-not-optional&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#observability-is-not-optional&quot; aria-label=&quot;observability is not optional permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Observability is not optional&lt;/h2&gt;
&lt;p&gt;In a distributed system, logging alone is not enough.
You need to be able to answer questions like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Where did this request go?&lt;/li&gt;
&lt;li&gt;Which services were involved?&lt;/li&gt;
&lt;li&gt;Where did it slow down?&lt;/li&gt;
&lt;li&gt;Where did it fail?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This requires more than logs. It requires structured logging, tracing, correlation IDs, and metrics that actually tell a story.
Without that, you are guessing.
With it, you are still working, but at least you are working with context.&lt;/p&gt;
&lt;p&gt;The difference between those two states is enormous.&lt;/p&gt;
&lt;h2 id=&quot;the-team-impact-is-real&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-team-impact-is-real&quot; aria-label=&quot;the team impact is real permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The team impact is real&lt;/h2&gt;
&lt;p&gt;This is where things often get underestimated.&lt;/p&gt;
&lt;p&gt;Distributed systems are not just harder technically. They are harder for &lt;strong&gt;teams&lt;/strong&gt;.
Not only does the context of the application become larger, and thus harder to grasp. But onboarding new members (or colleagues!) becomes more difficult. New engineers need to understand not just code, but interactions between multiple services, asynchronous flows, and failure scenarios.&lt;/p&gt;
&lt;p&gt;We have seen this very clearly.&lt;/p&gt;
&lt;p&gt;As our system evolved, we had to adjust how we hire and onboard at Frontliners. It was no longer enough to look for someone who knew the stack. We needed people who could adapt, reason about systems, and build a mental model of something that is not immediately visible.&lt;/p&gt;
&lt;p&gt;We also had to upskill existing teams.
For example, engineers coming from environments like Clarion or ASP.NET had to learn not just a new language like TypeScript, but a completely different way of thinking about systems. Distributed debugging, eventual consistency, and asynchronous flows are not things you pick up overnight.&lt;/p&gt;
&lt;p&gt;This takes &lt;em&gt;deliberate&lt;/em&gt; effort.&lt;/p&gt;
&lt;p&gt;Training, internal sessions, shared knowledge, and a culture where asking questions is encouraged all become essential.&lt;/p&gt;
&lt;h2 id=&quot;the-trap&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-trap&quot; aria-label=&quot;the trap permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The trap&lt;/h2&gt;
&lt;p&gt;One of the biggest traps in architecture is underestimating this shift.
It is easy to say “we will figure it out later” or “we will add retries” or “we will just log everything”.&lt;/p&gt;
&lt;p&gt;These are not solutions. They are placeholders.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adding retries without thinking about idempotency creates duplicate processing.&lt;/li&gt;
&lt;li&gt;Logging everything without structure creates noise, not insight.&lt;/li&gt;
&lt;li&gt;Ignoring failure modes works, until it doesn’t.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another common trap is distributing too early.
If your system does not yet need the benefits of distribution, you are taking on complexity without getting much in return.
Simplicity is still a valid choice.&lt;/p&gt;
&lt;p&gt;Just like with the modular monolith, starting simple is often the right move. If you reach a point where that simplicity becomes a bottleneck, that is a good problem to have.&lt;/p&gt;
&lt;p&gt;But if you start complex, you are committing to a problem space that requires experience, discipline, and tooling to handle well. I’m not saying you shouldn’t… your situation might require it. But best be prepared!&lt;/p&gt;
&lt;h2 id=&quot;visualising-the-difference&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#visualising-the-difference&quot; aria-label=&quot;visualising the difference permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Visualising the difference&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACJElEQVR42j1Si1LbMBC0Lcl6vyzLkh07TuikJAwUKIFQYGin//9RPQfKzI18I89q93avKJGqkC4Ktrk4PL/8OT3/Pj2/7w93N7ePr29/H44vULd3p+Pj29Pp/fj4mvuLohQV1gVSBYDL5SO5CG1cp7wdVt+meb/bP/y4fz1cP93c/po2hyau+3EX80bprqgAossvMJBzn/RqIsIVBS0qXlaiLDkU8DjmRm46qgZuBbUA/qwPWsy8jpPp1qqdoIcfIGx5FxqkpOpi/t7P9z6stepsbTUxC7g4MxMdWRjluIUTy7DAsK6wgSqJF6rlZvD5ErOGyyTMVJZiYUXE+rimLolmHC6veTNy37swAcyF0Ya52xyVWzE9uP6KiEhlYmaStcbgGchjssU6IhGEzVh3xEQuY0UMFQ2h3vhJcgfKfdpJ03OVqMicaAQZnWcWSAUsWzttseqQDMVZFcIWYQ9jM2qp6m3a1zICnsq+4UYxW3y6InztsksznBUHAEgSQq6MuYBUKmS5ndr5J1UZSuqxqTUDz85RaVRbzENJbEUd9NU5RrCD1A7DJVmYQ9pR2VHecpkZ2PkRFRgrfb9a79u0paJF1INbkAKndnJpCkPvck19J5u5ySuXKPNA839JsBYur7dX47ynMi78i5OqJqZVoVFtB0GyppEhmdjqqEUoIcKvDSO8MW7QNlcL0pTn1YUneG05dZr5urYMdoN5xRyBaWGuSv0DO+MuUDC0zRkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/881543fb5d7b9bf04df8d9e38bcc4e08/8ac56/software-architecture-distributed-reality.webp 240w,
/static/881543fb5d7b9bf04df8d9e38bcc4e08/d3be9/software-architecture-distributed-reality.webp 480w,
/static/881543fb5d7b9bf04df8d9e38bcc4e08/e46b2/software-architecture-distributed-reality.webp 960w,
/static/881543fb5d7b9bf04df8d9e38bcc4e08/f992d/software-architecture-distributed-reality.webp 1440w,
/static/881543fb5d7b9bf04df8d9e38bcc4e08/0abaa/software-architecture-distributed-reality.webp 1536w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/881543fb5d7b9bf04df8d9e38bcc4e08/8ff5a/software-architecture-distributed-reality.png 240w,
/static/881543fb5d7b9bf04df8d9e38bcc4e08/e85cb/software-architecture-distributed-reality.png 480w,
/static/881543fb5d7b9bf04df8d9e38bcc4e08/d9199/software-architecture-distributed-reality.png 960w,
/static/881543fb5d7b9bf04df8d9e38bcc4e08/07a9c/software-architecture-distributed-reality.png 1440w,
/static/881543fb5d7b9bf04df8d9e38bcc4e08/71c1d/software-architecture-distributed-reality.png 1536w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/881543fb5d7b9bf04df8d9e38bcc4e08/d9199/software-architecture-distributed-reality.png&quot;
            alt=&quot;Single system vs distributed complexity&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;a-grounded-takeaway&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-grounded-takeaway&quot; aria-label=&quot;a grounded takeaway permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A grounded takeaway&lt;/h2&gt;
&lt;p&gt;Distributed systems are powerful. &lt;strong&gt;Very&lt;/strong&gt; powerful. &lt;br /&gt;
They allow you to scale, to decouple, and to build systems that can evolve independently.&lt;/p&gt;
&lt;p&gt;But they demand more from you.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More discipline.&lt;/li&gt;
&lt;li&gt;More awareness.&lt;/li&gt;
&lt;li&gt;More investment in tooling and people.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They are not something you casually adopt.
If you are not ready to deal with failure, time, and complexity as first-class concerns, you are better off staying simple for a little longer.
And that is not a step back. That is a conscious decision.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#wrapping-up&quot; aria-label=&quot;wrapping up permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Moving to a distributed system is not just a technical change. It is a shift in how you think about software.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You stop assuming things will work, and start designing for when they don’t.&lt;/li&gt;
&lt;li&gt;You stop relying on immediate consistency, and start working with eventual outcomes.&lt;/li&gt;
&lt;li&gt;You stop debugging locally, and start reasoning about flows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That shift takes time.
It takes experience.
And it takes a willingness to accept that things are no longer simple.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Boundaries: Where to Draw the Line]]></title><description><![CDATA[Most architectural problems are boundary problems. Knowing where to draw the line, and when to redraw it, is one of the hardest parts of building software systems.]]></description><link>https://www.rickvanlieshout.com/posts/2026/boundaries-where-to-draw-the-line/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2026/boundaries-where-to-draw-the-line/</guid><pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the previous articles we explored how systems evolve structurally, and how they communicate. Both of those topics depend on one underlying concept: &lt;strong&gt;boundaries&lt;/strong&gt;. &lt;br /&gt;
Where you draw them determines how your system behaves.&lt;/p&gt;
&lt;p&gt;Get them right, and everything feels simpler. Get them wrong, and no amount of tooling, patterns, or infrastructure will save you.&lt;/p&gt;
&lt;h2 id=&quot;most-problems-are-boundary-problems&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#most-problems-are-boundary-problems&quot; aria-label=&quot;most problems are boundary problems permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Most problems are boundary problems&lt;/h2&gt;
&lt;p&gt;A lot of architectural discussions focus on technology choices. Frameworks, messaging systems, deployment strategies. After all, that is also really fun to talk about.
In practice, however, most real problems have very little to do with those things.&lt;/p&gt;
&lt;p&gt;They come from boundaries that were drawn in the wrong place.&lt;/p&gt;
&lt;p&gt;Services that depend on each other for basic logic. Data that is shared across parts of the system that were meant to be independent. Teams stepping on each other’s toes because ownership is unclear.
Or the most frustrating one: systems that were split up, but nothing actually became simpler.&lt;/p&gt;
&lt;p&gt;That is almost always a boundary problem.&lt;/p&gt;
&lt;h2 id=&quot;what-is-a-boundary-really&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-a-boundary-really&quot; aria-label=&quot;what is a boundary really permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is a boundary, really?&lt;/h2&gt;
&lt;p&gt;A boundary is not a folder, a repository, or a service.&lt;/p&gt;
&lt;p&gt;It is a decision about ownership.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Who owns this logic?&lt;/li&gt;
&lt;li&gt;Who owns this data?&lt;/li&gt;
&lt;li&gt;Who decides how it evolves?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can draw boundaries inside a modular monolith, or across multiple services. The shape does not matter as much as the clarity. A good boundary reduces the need for communication. A bad boundary creates it.&lt;/p&gt;
&lt;h2 id=&quot;start-from-the-core&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#start-from-the-core&quot; aria-label=&quot;start from the core permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Start from the core&lt;/h2&gt;
&lt;p&gt;In many systems, there is a central process that everything revolves around.
At my current employer’s world, that is planning.&lt;/p&gt;
&lt;p&gt;Customers are planning how to move loads from one place to another. They are optimising routes, combining shipments, and trying to make that process as efficient as possible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;That&lt;/strong&gt; is the core of the business.&lt;/p&gt;
&lt;p&gt;When boundaries are not defined carefully, everything starts to leak into that core. Suddenly, planning is responsible for things it should not care about. Notifications, integrations, data transformations, and edge cases all start piling up.
At that point, it becomes harder to change, harder to understand, and harder to scale.&lt;/p&gt;
&lt;p&gt;The goal of boundaries is not to split everything evenly. It is to protect the core.&lt;/p&gt;
&lt;h2 id=&quot;data-ownership-is-the-real-boundary&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#data-ownership-is-the-real-boundary&quot; aria-label=&quot;data ownership is the real boundary permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Data ownership is the real boundary&lt;/h2&gt;
&lt;p&gt;One of the clearest ways to define a boundary is through data ownership.&lt;/p&gt;
&lt;p&gt;If two parts of your system share the same data freely, they are not truly separate. They are coupled, whether you acknowledge it or not.&lt;/p&gt;
&lt;p&gt;That is why a strong default is simple:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Each boundary owns its data.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That does not mean you can never be pragmatic. There are situations where sharing data is the least bad option. But those should be conscious decisions, not the default.&lt;/p&gt;
&lt;p&gt;If you start from shared data and try to separate later, you will feel the pain immediately.
If you start with ownership, you at least have the option to relax it when needed.&lt;/p&gt;
&lt;h2 id=&quot;teams-define-boundaries-whether-you-like-it-or-not&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#teams-define-boundaries-whether-you-like-it-or-not&quot; aria-label=&quot;teams define boundaries whether you like it or not permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Teams define boundaries, whether you like it or not&lt;/h2&gt;
&lt;p&gt;Architecture does not exist in isolation.&lt;/p&gt;
&lt;p&gt;The way your teams are structured will shape your system. This is often referred to as Conway’s Law, but you do not need the name to see it in practice… If multiple teams need to work on the same part of the system every day, your boundaries are probably wrong.&lt;/p&gt;
&lt;p&gt;If one team owns a domain end-to-end, including its data and behaviour, things tend to move faster and cleaner.&lt;/p&gt;
&lt;p&gt;This also ties into maturity.&lt;/p&gt;
&lt;p&gt;A highly experienced team can handle more complex boundaries, more decoupling, and more asynchronous communication. A less experienced team will struggle if the system requires too much coordination or implicit knowledge.&lt;/p&gt;
&lt;p&gt;Good architecture meets teams where they are, not where you wish they were.&lt;/p&gt;
&lt;h2 id=&quot;where-things-go-wrong&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#where-things-go-wrong&quot; aria-label=&quot;where things go wrong permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Where things go wrong&lt;/h2&gt;
&lt;p&gt;There are a few patterns that show up again and again.
One of the most common is “&lt;em&gt;&lt;strong&gt;everything is a service&lt;/strong&gt;&lt;/em&gt;”.
Every feature becomes its own service, often without clear ownership or responsibility. The system looks nicely split on paper, but in reality everything depends on everything else.
You end up with a distributed system that behaves like a monolith, but with all the downsides of distribution.&lt;/p&gt;
&lt;p&gt;Another common issue is &lt;em&gt;&lt;strong&gt;shared databases across supposed boundaries&lt;/strong&gt;&lt;/em&gt;. &lt;br /&gt;
Two services, two repositories, maybe even two teams, all reading and writing to the same tables. At that point, the separation is an illusion.
Changes ripple through the system in unpredictable ways, and coordination becomes unavoidable.&lt;/p&gt;
&lt;p&gt;Then there are &lt;em&gt;&lt;strong&gt;boundaries defined by technology instead of domain&lt;/strong&gt;&lt;/em&gt;.&lt;br /&gt;
A service for the API, a service for the database, a service for background jobs. These are technical slices, not business boundaries. They tend to create more communication, not less.&lt;/p&gt;
&lt;p&gt;And finally, the most subtle one: &lt;em&gt;&lt;strong&gt;boundaries that looked right at the time, but were never revisited&lt;/strong&gt;&lt;/em&gt;.&lt;br /&gt;
Systems evolve. Teams evolve. What made sense a year ago might not make sense today. If boundaries stay fixed whilst everything else changes, they slowly become a source of friction.&lt;/p&gt;
&lt;h2 id=&quot;drawing-better-boundaries&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#drawing-better-boundaries&quot; aria-label=&quot;drawing better boundaries permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Drawing better boundaries&lt;/h2&gt;
&lt;p&gt;There is no formula that guarantees the right answer, but there are good starting points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Look at your core processes. Where does the business logic naturally group together?&lt;/li&gt;
&lt;li&gt;Look at your data. Who should own it, and who should not?&lt;/li&gt;
&lt;li&gt;Look at your teams. Where can you give ownership without constant coordination?&lt;/li&gt;
&lt;li&gt;And most importantly, look at where your system hurts today. Boundaries should reduce that pain, not introduce new kinds of it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;it-is-an-ongoing-process&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#it-is-an-ongoing-process&quot; aria-label=&quot;it is an ongoing process permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It is an ongoing process&lt;/h2&gt;
&lt;p&gt;Just like everything else in architecture, boundaries are not a one-time decision.
They shift over time.&lt;/p&gt;
&lt;p&gt;As your system grows, you will discover that some boundaries were too broad, others too narrow. Some will need to be split, others merged. That is normal.&lt;/p&gt;
&lt;p&gt;The goal is not to get it perfect from the start. The goal is to make decisions that can evolve.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#wrapping-up&quot; aria-label=&quot;wrapping up permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB5klEQVR42lVSh27bMBCluIeWtSXbGpSXktqAkTZBU3QEaP8l//8FOcqxmwAPh7vHG7xHIkGNoP6MgBHDsGYeWMOJz7HPSQC8IFdg48L3fINc9kxRzwzd4e5wvj+cbTctSzu0U1PZuhjWzXZZ2aYYAFrErrWr0ohiybCiniJIQgvNY4DikWQhWMVmZ7aShmD55XZQgiWiniSI+zrLsz4wOYTUEx5iHqLEE5A3M46EkDpI+u4IV0yxyXK73T/V9c7IOFksq2pTFENgCriRS0ACBoB1jscpAHFwgDPb6XuzPsXxOk3aKKyh0WDPdjxHUU2JZixg1KdYEQxjHDAWBF8mYwkFSTokqS3KTWe/rtrzYtEpmWJE46bbPP9aHh+SdmymY9qNaT/ah8fV/YkLH8F00CDNd8PuRzs+bqefh+NLa79JviBISBXFZRvXQ5Cv93/+ZuPeT+q03fhpzYhC8w6qXn85nF42d7+zYgqjXsvrtp7AiDMRJP323+vr8PTMwwxC7CTgyGkIr0UCKfIwGoNo1LKEH3JVVVIiuQxUUvqrXtetiKAYJJBOsNsbgF2EZVV0sAVxqt54Jyxkp3GlRYhnnclF7dljFwiqFXT9wFzhUiU3jMiP/KdiDBEiBL7H/4ybT+EIfzpib+IEJ1l4CMFlAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/1decb1640b0d330b6e0caeabd839bc5c/8ac56/software-architecture-boundaries.webp 240w,
/static/1decb1640b0d330b6e0caeabd839bc5c/d3be9/software-architecture-boundaries.webp 480w,
/static/1decb1640b0d330b6e0caeabd839bc5c/e46b2/software-architecture-boundaries.webp 960w,
/static/1decb1640b0d330b6e0caeabd839bc5c/f992d/software-architecture-boundaries.webp 1440w,
/static/1decb1640b0d330b6e0caeabd839bc5c/0abaa/software-architecture-boundaries.webp 1536w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/1decb1640b0d330b6e0caeabd839bc5c/8ff5a/software-architecture-boundaries.png 240w,
/static/1decb1640b0d330b6e0caeabd839bc5c/e85cb/software-architecture-boundaries.png 480w,
/static/1decb1640b0d330b6e0caeabd839bc5c/d9199/software-architecture-boundaries.png 960w,
/static/1decb1640b0d330b6e0caeabd839bc5c/07a9c/software-architecture-boundaries.png 1440w,
/static/1decb1640b0d330b6e0caeabd839bc5c/71c1d/software-architecture-boundaries.png 1536w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/1decb1640b0d330b6e0caeabd839bc5c/d9199/software-architecture-boundaries.png&quot;
            alt=&quot;Clean boundaries vs tangled boundaries&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I repeat: Most architectural problems are boundary problems.
When boundaries are clear, communication becomes intentional. Systems become easier to understand, easier to change, and easier to scale.&lt;/p&gt;
&lt;p&gt;When boundaries are unclear, everything becomes harder. Not because the technology is wrong, but because the structure does not match the reality of the system.&lt;/p&gt;
&lt;p&gt;Start with ownership. Protect your core. Be pragmatic when needed, but deliberate in your decisions.&lt;/p&gt;
&lt;p&gt;And most importantly, revisit your boundaries over time. Because the system you are building today is not the system you will have a year from now.&lt;/p&gt;
&lt;p&gt;In the next article, we will look at what it really means to run a distributed system, and why things that used to be simple suddenly become much harder.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Synchronous vs Asynchronous Communication: When to Call and When to Publish]]></title><description><![CDATA[Synchronous and asynchronous communication are not opposing choices, they are complementary tools. Understanding when to use each is key to building scalable systems.]]></description><link>https://www.rickvanlieshout.com/posts/2026/sync-vs-async/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2026/sync-vs-async/</guid><pubDate>Tue, 06 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the previous article we explored the difference between data events and domain events, and how mixing them creates confusion. This time we take a step back and look at a broader question: how should services communicate in the first place?&lt;/p&gt;
&lt;p&gt;Because once your system becomes distributed, communication is no longer an implementation detail. It is part of your architecture.&lt;/p&gt;
&lt;h2 id=&quot;the-false-debate&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-false-debate&quot; aria-label=&quot;the false debate permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The false debate&lt;/h2&gt;
&lt;p&gt;Much like the monolith versus microservices discussion, synchronous versus asynchronous communication often turns into a debate.&lt;/p&gt;
&lt;p&gt;You will hear things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“We should not call other services”&lt;/li&gt;
&lt;li&gt;“Everything should be event-driven”&lt;/li&gt;
&lt;li&gt;“Just make an API call, it is simpler”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of these are universally correct.&lt;/p&gt;
&lt;p&gt;They are simplifications of a much more nuanced problem.&lt;/p&gt;
&lt;p&gt;Synchronous and asynchronous communication are not competing approaches. They solve different problems. Treating them as interchangeable, or worse, treating one as superior, is where things start to break down.&lt;/p&gt;
&lt;h2 id=&quot;what-synchronous-communication-really-is&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-synchronous-communication-really-is&quot; aria-label=&quot;what synchronous communication really is permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What synchronous communication really is&lt;/h2&gt;
&lt;p&gt;Synchronous communication is straightforward. One service calls another and waits for a response. A request goes out, a response comes back.
This creates a direct dependency. &lt;code class=&quot;language-text&quot;&gt;Service A&lt;/code&gt; depends on &lt;code class=&quot;language-text&quot;&gt;Service B&lt;/code&gt; being available and responding in time.&lt;/p&gt;
&lt;p&gt;That sounds like a downside, but it also provides clarity.
Failures are immediate. Latency is visible. The flow of data is easy to follow.
This makes synchronous communication a good fit when you need certainty.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Validating input before processing&lt;/li&gt;
&lt;li&gt;Fetching data needed to complete a request&lt;/li&gt;
&lt;li&gt;Checking permissions or business rules&lt;/li&gt;
&lt;li&gt;Anything that requires an immediate answer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you need to know something before you can continue, a synchronous call is usually the right choice.&lt;/p&gt;
&lt;h2 id=&quot;what-asynchronous-communication-really-is&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-asynchronous-communication-really-is&quot; aria-label=&quot;what asynchronous communication really is permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What asynchronous communication really is&lt;/h2&gt;
&lt;p&gt;Asynchronous communication works differently. Instead of asking for something, you publish that something happened.
You do &lt;strong&gt;not&lt;/strong&gt; wait for a response. You move on. &lt;br /&gt;
Other services can react to that event in their own time, independently of the original request.&lt;/p&gt;
&lt;p&gt;This removes the direct dependency between services, but introduces a different kind of complexity.
Failures are no longer immediate. They can be delayed, retried, or even silently ignored if you are not careful.&lt;/p&gt;
&lt;p&gt;That does not make asynchronous communication worse. It just makes it different.
It shines in scenarios where you are reacting to something that already happened.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sending emails or notifications&lt;/li&gt;
&lt;li&gt;Updating search indexes&lt;/li&gt;
&lt;li&gt;Triggering downstream processes&lt;/li&gt;
&lt;li&gt;Integrating with external systems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In these cases, you do not need an immediate answer. You just need to make sure the reaction eventually happens.&lt;/p&gt;
&lt;h2 id=&quot;a-simple-example&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-simple-example&quot; aria-label=&quot;a simple example permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A simple example&lt;/h2&gt;
&lt;p&gt;Consider placing an order.&lt;/p&gt;
&lt;p&gt;The initial request might look like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Validate the order&lt;/li&gt;
&lt;li&gt;Check inventory&lt;/li&gt;
&lt;li&gt;Store the order&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These steps are typically synchronous. You need to know whether they succeed before you can respond to the user.&lt;/p&gt;
&lt;p&gt;Once the order is placed, a different set of actions follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Send a confirmation email&lt;/li&gt;
&lt;li&gt;Update analytics&lt;/li&gt;
&lt;li&gt;Notify other systems&lt;/li&gt;
&lt;li&gt;Trigger fulfillment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are not part of the immediate request. They are reactions to something that already happened.&lt;/p&gt;
&lt;p&gt;This is where asynchronous communication fits naturally.&lt;/p&gt;
&lt;p&gt;Trying to force everything into one model quickly becomes awkward.&lt;/p&gt;
&lt;p&gt;If you make everything synchronous, your request chain grows longer and more fragile. If you make everything asynchronous, you lose control over what is actually completed when the request finishes.&lt;/p&gt;
&lt;h2 id=&quot;where-things-go-wrong&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#where-things-go-wrong&quot; aria-label=&quot;where things go wrong permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Where things go wrong&lt;/h2&gt;
&lt;p&gt;Most issues do not come from choosing one approach over the other. They come from using the wrong one for the problem at hand.
One common mistake is using asynchronous communication for things that require an immediate answer.&lt;/p&gt;
&lt;p&gt;Publishing an event and hoping another service processes it in time is not a replacement for a direct call. It introduces uncertainty where you actually need guarantees. On the other side, teams often overuse synchronous calls across service boundaries.&lt;/p&gt;
&lt;p&gt;A calls B, B calls C, C calls D. Everything works, until one service slows down or fails. Now your entire request chain is affected.
This creates cascading failures that are difficult to debug and even harder to recover from.&lt;/p&gt;
&lt;p&gt;There is also a more subtle problem…&lt;/p&gt;
&lt;p&gt;Making something asynchronous does not make it simpler. It moves the complexity elsewhere.
Retries, ordering, idempotency, and observability all become your responsibility. If you do not design for that, failures become invisible and behaviour becomes unpredictable.&lt;/p&gt;
&lt;h2 id=&quot;the-real-trade-offs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-real-trade-offs&quot; aria-label=&quot;the real trade offs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The real trade-offs&lt;/h2&gt;
&lt;p&gt;Synchronous communication is easier to reason about. You see the full flow, you get immediate feedback, and failures are explicit.
But it comes with tighter coupling and less flexibility. Services depend on each other being available at the same time.&lt;/p&gt;
&lt;p&gt;Asynchronous communication decouples services and allows systems to scale more naturally. It enables independent processing and reduces direct dependencies.
But it makes the system harder to understand. Debugging becomes more complex, and failures are no longer obvious.&lt;/p&gt;
&lt;p&gt;Neither is better.
They are trade-offs.&lt;/p&gt;
&lt;h2 id=&quot;how-they-work-together&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-they-work-together&quot; aria-label=&quot;how they work together permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How they work together&lt;/h2&gt;
&lt;p&gt;In practice, most well-designed systems use both.&lt;/p&gt;
&lt;p&gt;Synchronous communication is often used within a bounded context, where clarity and immediate feedback matter.&lt;br /&gt;
Asynchronous communication is used between contexts, where independence and scalability are more important.&lt;/p&gt;
&lt;p&gt;A common pattern looks like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A request comes in&lt;/li&gt;
&lt;li&gt;Services communicate synchronously to complete the core action&lt;/li&gt;
&lt;li&gt;Once done, an event is published&lt;/li&gt;
&lt;li&gt;Other services react asynchronously&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This keeps the core flow predictable, whilst allowing the system to evolve and scale around it.&lt;/p&gt;
&lt;h2 id=&quot;a-simple-rule&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-simple-rule&quot; aria-label=&quot;a simple rule permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A simple rule&lt;/h2&gt;
&lt;p&gt;If there is one guideline that holds up in most cases, it is this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you need an answer now, make a call. &lt;/br&gt;
If something already happened, publish an event.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It is not perfect, but it is a good starting point.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#wrapping-up&quot; aria-label=&quot;wrapping up permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Just like with architectural styles, communication patterns are not about choosing the “right” one upfront.
They are about understanding the problem you are solving.&lt;/p&gt;
&lt;p&gt;Synchronous communication gives you certainty and simplicity. Asynchronous communication gives you flexibility and scalability.
Good architecture is not about picking one. It is about knowing when to use each, and how they fit together.&lt;/p&gt;
&lt;p&gt;Teams that treat this as a strict rule tend to struggle. Teams that understand the trade-offs tend to build systems that are easier to evolve.
And just like everything else in architecture, this is not a one-time decision. It changes as your system grows.&lt;/p&gt;
&lt;p&gt;In the next article, we will look at one of the hardest problems in software architecture: where to draw boundaries, and why getting that wrong hurts more than almost anything else.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Data Events vs Domain Events: Stop Mixing Them]]></title><description><![CDATA[Data events and domain events both have their place, but mixing them is one of the fastest ways to create confusion in event-driven systems.]]></description><link>https://www.rickvanlieshout.com/posts/2025/data-events-vs-domain-events/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2025/data-events-vs-domain-events/</guid><pubDate>Tue, 23 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the previous article we explored how systems evolve structurally, from modular monoliths to distributed systems and eventually microservices. This time we move one level deeper, into how those systems communicate.&lt;/p&gt;
&lt;p&gt;Once your system becomes distributed, communication is everything. This is where things often start to break down.&lt;/p&gt;
&lt;h2 id=&quot;where-it-usually-goes-wrong&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#where-it-usually-goes-wrong&quot; aria-label=&quot;where it usually goes wrong permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Where it usually goes wrong&lt;/h2&gt;
&lt;p&gt;Most teams do not set out to build a confusing event-driven system. They start simple. A change happens in a service, an event is published, and another service reacts.&lt;/p&gt;
&lt;p&gt;Something like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;CustomerUpdated
OrderChanged
EntityUpdated&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It feels clean at first. Generic, reusable, flexible.&lt;/p&gt;
&lt;p&gt;Until it isn’t.&lt;/p&gt;
&lt;p&gt;The moment another service consumes that event, it has to answer a question: what actually happened?&lt;/p&gt;
&lt;p&gt;Was the address updated, the status changed, or something recalculated?&lt;/p&gt;
&lt;p&gt;The consumer now has to figure that out. It pulls additional data, compares state, and often keeps local copies just to understand what changed over time.&lt;/p&gt;
&lt;p&gt;At that point, meaning is no longer explicit. It has to be reconstructed.&lt;/p&gt;
&lt;p&gt;That is where the pain begins.&lt;/p&gt;
&lt;h2 id=&quot;the-real-issue-is-not-events-it-is-ambiguity&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-real-issue-is-not-events-it-is-ambiguity&quot; aria-label=&quot;the real issue is not events it is ambiguity permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The real issue is not events, it is ambiguity&lt;/h2&gt;
&lt;p&gt;Teams often blame event-driven architecture itself. Kafka becomes the problem. Asynchronous communication becomes the problem.&lt;/p&gt;
&lt;p&gt;But it is neither.&lt;/p&gt;
&lt;p&gt;The real issue is that the system is publishing &lt;strong&gt;data events&lt;/strong&gt;, whilst consumers are expecting &lt;strong&gt;domain intent&lt;/strong&gt;. That mismatch introduces complexity that spreads across the system.&lt;/p&gt;
&lt;h2 id=&quot;data-events-vs-domain-events&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#data-events-vs-domain-events&quot; aria-label=&quot;data events vs domain events permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Data events vs domain events&lt;/h2&gt;
&lt;p&gt;There is a simple but important distinction.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data events describe what changed.&lt;/strong&gt;
&lt;strong&gt;Domain events describe what happened.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A data event looks like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;CustomerUpdated
OrderRowChanged
EntityUpdated&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A domain event looks like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;CustomerAddressChanged
OrderPlaced
RouteRecalculated
InvoiceFinalised&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;One forces you to interpret. The other tells you exactly what to do.&lt;/p&gt;
&lt;p&gt;That is the difference between extracting meaning from data and being given meaning directly.&lt;/p&gt;
&lt;h2 id=&quot;data-events-are-not-wrong&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#data-events-are-not-wrong&quot; aria-label=&quot;data events are not wrong permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Data events are not wrong&lt;/h2&gt;
&lt;p&gt;Data events are not a mistake. They are useful, and often necessary.&lt;/p&gt;
&lt;p&gt;There are many scenarios where intent does not matter, only state. Filling dropdowns, synchronising reference data, updating read models, feeding search indexes, or keeping caches in sync.&lt;/p&gt;
&lt;p&gt;In those cases, a simple “CustomerUpdated” event is perfectly fine. You do not care why something changed, only that you have the latest version.&lt;/p&gt;
&lt;p&gt;This is where data events shine.&lt;/p&gt;
&lt;h2 id=&quot;where-things-go-off-the-rails&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#where-things-go-off-the-rails&quot; aria-label=&quot;where things go off the rails permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Where things go off the rails&lt;/h2&gt;
&lt;p&gt;Problems start when data events are used to drive behaviour.&lt;/p&gt;
&lt;p&gt;When a service reacts to something like “EntityUpdated”, it needs context. Because that context is not in the event, it has to rebuild it. This leads to consumers fetching additional data, keeping their own state, and implementing logic that does not belong to them.&lt;/p&gt;
&lt;p&gt;At that point, your system is no longer loosely coupled. It is tightly coupled through interpretation. You have not removed dependencies, you have just hidden them.&lt;/p&gt;
&lt;p&gt;This is where “event-driven” quietly turns into async CRUD.&lt;/p&gt;
&lt;h2 id=&quot;domain-events-change-the-conversation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#domain-events-change-the-conversation&quot; aria-label=&quot;domain events change the conversation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Domain events change the conversation&lt;/h2&gt;
&lt;p&gt;Domain events remove that ambiguity. They describe something that has already happened, in business terms.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;OrderPlaced
RouteCalculated
InvoiceApproved&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The consumer no longer needs to guess. It does not need to diff or fetch additional state just to understand intent. It simply reacts.&lt;/p&gt;
&lt;p&gt;That is what event-driven systems are supposed to feel like.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Events should describe what happened, not what changed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;kafka-does-not-fix-this-for-you&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#kafka-does-not-fix-this-for-you&quot; aria-label=&quot;kafka does not fix this for you permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kafka does not fix this for you&lt;/h2&gt;
&lt;p&gt;Kafka does not care whether your events are good or bad.&lt;/p&gt;
&lt;p&gt;You can have clean topics, proper partitioning, and great throughput, and still end up with a system that is hard to reason about. The problem is not how events are transported, it is what they represent.&lt;/p&gt;
&lt;p&gt;A topic full of “EntityUpdated” events is still a problem, no matter how well it scales.&lt;/p&gt;
&lt;h2 id=&quot;it-is-not-either-or&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#it-is-not-either-or&quot; aria-label=&quot;it is not either or permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It is not either or&lt;/h2&gt;
&lt;p&gt;In a well-designed system, you often have both.&lt;/p&gt;
&lt;p&gt;You might publish a domain event like &lt;code class=&quot;language-text&quot;&gt;OrderPlaced&lt;/code&gt;, followed by a data event like &lt;code class=&quot;language-text&quot;&gt;OrderReadModelUpdated&lt;/code&gt;. Each serves a different purpose. One drives behaviour, the other synchronises state.&lt;/p&gt;
&lt;p&gt;That is completely fine.&lt;/p&gt;
&lt;p&gt;The key is that they are not the same thing, and should never be treated as such.&lt;/p&gt;
&lt;h2 id=&quot;a-simple-rule&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-simple-rule&quot; aria-label=&quot;a simple rule permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A simple rule&lt;/h2&gt;
&lt;p&gt;If there is one thing to take away, it is this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use data events to sync state. Use domain events to drive behaviour.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;why-this-matters-more-than-it-seems&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-this-matters-more-than-it-seems&quot; aria-label=&quot;why this matters more than it seems permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why this matters more than it seems&lt;/h2&gt;
&lt;p&gt;As systems grow, these small decisions compound. A few ambiguous events turn into dozens, and a few consumers with extra logic turn into entire services built on assumptions.&lt;/p&gt;
&lt;p&gt;Before long, your architecture becomes harder to change than the monolith you started with. Event-driven architecture is supposed to give you flexibility, but without clear intent it does the opposite.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#wrapping-up&quot; aria-label=&quot;wrapping up permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Good architecture is not just about structure. It is about clarity. Clarity in boundaries, ownership, and communication.&lt;/p&gt;
&lt;p&gt;Events are one of the most powerful tools we have in distributed systems, but only if they actually communicate something meaningful.&lt;/p&gt;
&lt;p&gt;As the year comes to an end, it is a good moment to reflect on the systems we build and the decisions we carry forward.&lt;/p&gt;
&lt;p&gt;Take a step back and look at the events in your system. Ask yourself whether they describe what truly happened, or just what changed.&lt;/p&gt;
&lt;p&gt;If there is room to improve, that is a good thing. It means your system is still evolving.&lt;/p&gt;
&lt;p&gt;Wishing you a calm Christmas, and a new year filled with better decisions, simpler systems, and fewer &lt;code class=&quot;language-text&quot;&gt;EntityUpdated&lt;/code&gt; events.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Monoliths to Microservices: Finding the Right Moment]]></title><description><![CDATA[Choosing between modular monoliths and microservices is not about trends, it is about timing, team maturity, and understanding trade-offs.]]></description><link>https://www.rickvanlieshout.com/posts/2025/monoliths-to-microservices/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2025/monoliths-to-microservices/</guid><pubDate>Thu, 06 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;from-simplicity-to-scale-and-everything-in-between&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#from-simplicity-to-scale-and-everything-in-between&quot; aria-label=&quot;from simplicity to scale and everything in between permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;From simplicity to scale, and everything in between&lt;/h2&gt;
&lt;p&gt;In the previous article we explored what software architecture really is: a set of decisions that shape how a system evolves over time. This time we will look at how those decisions take shape in the structure of your system.&lt;/p&gt;
&lt;p&gt;Most discussions around architecture quickly turn into debates. Monolith versus microservices. Centralised versus distributed. Right versus wrong. In practice, it is rarely that simple.&lt;/p&gt;
&lt;p&gt;Systems evolve. Teams evolve. Context evolves. The shape of your architecture should evolve with it.&lt;/p&gt;
&lt;h2 id=&quot;start-simple-the-modular-monolith&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#start-simple-the-modular-monolith&quot; aria-label=&quot;start simple the modular monolith permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Start simple: the modular monolith&lt;/h2&gt;
&lt;p&gt;Almost every system benefits from starting as a &lt;strong&gt;modular monolith&lt;/strong&gt;. One deployable, one runtime, but with clear internal boundaries.&lt;/p&gt;
&lt;p&gt;That distinction matters. A monolith without structure becomes a problem. A modular monolith, with well-defined modules and ownership, gives you clarity without introducing unnecessary complexity.&lt;/p&gt;
&lt;p&gt;You move fast and deploy easily, without the operational overhead of distributed systems. More importantly, you learn. You learn where your real boundaries are, which parts of your system change frequently, and how your team collaborates.&lt;/p&gt;
&lt;p&gt;That learning is what enables the next step.&lt;/p&gt;
&lt;p&gt;Of course, this only works if you take the modular part seriously. If everything can call everything, you have not built a modular monolith. You have just built a smaller version of your future problems. Clear boundaries, explicit interfaces, and discipline are essential.&lt;/p&gt;
&lt;p&gt;This also applies to data. If every module shares the same database tables and freely reads from each other, your boundaries are not real. Separating database context per module, even within the same runtime, forces ownership and prevents accidental coupling.&lt;/p&gt;
&lt;p&gt;It might feel like overhead early on, but it pays off later. When parts of your system need to move independently, those boundaries become the foundation for doing so.&lt;/p&gt;
&lt;h2 id=&quot;a-good-problem-when-your-system-starts-to-feel-the-pressure&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-good-problem-when-your-system-starts-to-feel-the-pressure&quot; aria-label=&quot;a good problem when your system starts to feel the pressure permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A good problem: when your system starts to feel the pressure&lt;/h2&gt;
&lt;p&gt;At some point, a well-structured monolith will start to show strain. Not because it is poorly built, but because the system is growing.&lt;/p&gt;
&lt;p&gt;You might see long-running tasks slowing down request handling, ingestion workloads increasing, or scheduled jobs competing with user traffic. Teams may start stepping on each other’s toes.&lt;/p&gt;
&lt;p&gt;This is not a failure. It is a good problem to have.&lt;/p&gt;
&lt;p&gt;It means your product is working.&lt;/p&gt;
&lt;p&gt;The mistake many teams make at this point is jumping straight to microservices.
There is a more natural step in between, which we’ll explore below.&lt;/p&gt;
&lt;h2 id=&quot;extracting-services-evolving-beyond-the-monolith&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#extracting-services-evolving-beyond-the-monolith&quot; aria-label=&quot;extracting services evolving beyond the monolith permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Extracting services: evolving beyond the monolith&lt;/h2&gt;
&lt;p&gt;Instead of breaking everything apart, you start by extracting the parts that need it.&lt;/p&gt;
&lt;p&gt;Think of sending emails in batches, running scheduled jobs, handling heavy ingestion pipelines, or offloading compute-heavy processes. These are often isolated concerns with clear inputs and outputs, making them good candidates to run independently.&lt;/p&gt;
&lt;p&gt;Because your modular monolith already has boundaries, these parts can be moved out with relatively little friction. If a module owns its logic and data, extraction becomes straightforward. If it does not, hidden coupling quickly becomes visible.&lt;/p&gt;
&lt;p&gt;At this stage, your system becomes partially distributed, but intentionally so. The monolith still handles the core domain, whilst specific responsibilities are moved into separate services that can scale and evolve independently.&lt;/p&gt;
&lt;p&gt;This is not an accident. It is a system responding to real pressure.&lt;/p&gt;
&lt;p&gt;It is also where anti-patterns can appear if you are not careful. Services without clear ownership, fake autonomy, or excessive communication are signs that boundaries are not yet well defined.&lt;/p&gt;
&lt;h2 id=&quot;microservices-autonomy-comes-at-a-cost&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#microservices-autonomy-comes-at-a-cost&quot; aria-label=&quot;microservices autonomy comes at a cost permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Microservices: autonomy comes at a cost&lt;/h2&gt;
&lt;p&gt;Microservices promise independence. Independent deployments, scaling, and ownership.&lt;/p&gt;
&lt;p&gt;When done well, they deliver exactly that. But they are not free.&lt;/p&gt;
&lt;p&gt;You introduce network boundaries, eventual consistency, and operational complexity that simply does not exist in a monolith. Observability becomes harder, debugging becomes harder, and understanding the system as a whole becomes harder.&lt;/p&gt;
&lt;p&gt;Coordination does not disappear. It just changes form.&lt;/p&gt;
&lt;p&gt;Where you once had compile-time dependencies, you now have runtime dependencies. Where you once had local calls, you now deal with contracts, versioning, and failure scenarios.&lt;/p&gt;
&lt;p&gt;This is why starting with microservices is rarely a good idea. Unless you are building for massive scale from day one, you are taking on complexity you do not yet need.&lt;/p&gt;
&lt;p&gt;It is far better to grow into microservices. Let the system show you where separation makes sense and move boundaries only when the benefit clearly outweighs the cost.&lt;/p&gt;
&lt;p&gt;This shift introduces a different kind of complexity that teams often underestimate. Once everything is distributed, understanding what is happening becomes harder by default. Requests cross service boundaries, data flows asynchronously, and failures are no longer local.&lt;/p&gt;
&lt;p&gt;That is why, even now, when new engineers join, one of the first things we teach them is how to debug a distributed system. Once you cross that boundary, everything changes.&lt;/p&gt;
&lt;h2 id=&quot;it-is-not-a-switch-it-is-a-spectrum&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#it-is-not-a-switch-it-is-a-spectrum&quot; aria-label=&quot;it is not a switch it is a spectrum permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It is not a switch, it is a spectrum&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 45.833333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsTAAALEwEAmpwYAAABkElEQVR42lVP7XKbMBBUjEDoAwkE4lMBY4MxJWCXJtOmqdOZuEl/9xX6/g9RQTuddmbnZle3d6cF2PZ/w4WCovCu/2AwvruvdLffDkM39+37w34yEDQ2nr9+A2C0C30M/2hOYk5jThTDkYeVkYIkphpO7MA4/4EAy6QtETSNpYcsjqBYqvV/hQuWS9aKVQLG8iBqyt2sq1OUdoymrolgr7us9YLhSygfLX9ejy+GRYJQNU3/uG0euuGpHb/yoEJ2kBeD2SXjWjfjtp95UMAbipGU8pbzTPDMEIoj4AkdRHVRTUneKz0GSYuZ0vV4mB4dV+6m+fDwkcjUC7M078rmrPtzOcxlP8flEVCWMXF7/fGzHZ+53Au53WxYfbw/f37jsjhdXu6+PDtEQsjb06fx8q27Xo+vr9Pb98PTBWA3JCz3VctlTVmOHBOG29CjLM7qo5+U0BHIFo7lEaaoLLjeibLxsooECbCAy3CQhFpQZbhjURPPI2ESlZEsVKh9L4Y3xLboBiDznqoqCUuGww1AvwBpRCvwpofyvgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/df7dffd6e410d5a4e978d3a9b6a46ba3/8ac56/spectrum.webp 240w,
/static/df7dffd6e410d5a4e978d3a9b6a46ba3/d3be9/spectrum.webp 480w,
/static/df7dffd6e410d5a4e978d3a9b6a46ba3/e46b2/spectrum.webp 960w,
/static/df7dffd6e410d5a4e978d3a9b6a46ba3/f992d/spectrum.webp 1440w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/df7dffd6e410d5a4e978d3a9b6a46ba3/8ff5a/spectrum.png 240w,
/static/df7dffd6e410d5a4e978d3a9b6a46ba3/e85cb/spectrum.png 480w,
/static/df7dffd6e410d5a4e978d3a9b6a46ba3/d9199/spectrum.png 960w,
/static/df7dffd6e410d5a4e978d3a9b6a46ba3/07a9c/spectrum.png 1440w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/df7dffd6e410d5a4e978d3a9b6a46ba3/d9199/spectrum.png&quot;
            alt=&quot;Evolution from modular monolith to microservices&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;One of the biggest misconceptions is that systems are either monoliths or microservices.&lt;/p&gt;
&lt;p&gt;In reality, most systems live somewhere in between. You might have a modular monolith at the core, a few extracted services for heavy workloads, and some fully independent services where autonomy is critical.&lt;/p&gt;
&lt;p&gt;That is not a failure of design. It is a reflection of reality.&lt;/p&gt;
&lt;p&gt;Different problems require different solutions. Forcing everything into a single model often creates more problems than it solves.&lt;/p&gt;
&lt;h2 id=&quot;choosing-the-right-shape&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#choosing-the-right-shape&quot; aria-label=&quot;choosing the right shape permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Choosing the right shape&lt;/h2&gt;
&lt;p&gt;So how do you decide?&lt;/p&gt;
&lt;p&gt;You look at your context. How mature your team is, how well you understand the domain, where your system is under pressure, and what kind of change you expect.&lt;/p&gt;
&lt;p&gt;Then you make a trade-off.&lt;/p&gt;
&lt;p&gt;Start simple. Build a modular monolith with clear boundaries. Pay attention to where pressure builds and act just before it turns into pain.&lt;/p&gt;
&lt;h2 id=&quot;my-reflection-on-how-we-dealt-with-it-at-inforit--frontliners&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#my-reflection-on-how-we-dealt-with-it-at-inforit--frontliners&quot; aria-label=&quot;my reflection on how we dealt with it at inforit  frontliners permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;My reflection on how we dealt with it at Inforit / Frontliners&lt;/h2&gt;
&lt;p&gt;Looking back, we did not follow this path cleanly.&lt;/p&gt;
&lt;p&gt;We jumped into microservices early. There were ambitious plans that made it feel like the right thing to do, and with a small but strong team we managed to deliver multiple products in that setup.&lt;/p&gt;
&lt;p&gt;But it came with a cost. The complexity was high, the learning curve was steep, and many of the problems we were solving were not yet problems we actually had.&lt;/p&gt;
&lt;p&gt;We only really started addressing this properly at scale with the newer version of our system. That is where the focus shifted from building services to building something sustainable.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#wrapping-up&quot; aria-label=&quot;wrapping up permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Architecture is not about choosing the right structure upfront. It is about choosing the right structure for now, whilst preparing for what comes next.&lt;/p&gt;
&lt;p&gt;Start simple. Let the system grow. Evolve your architecture just ahead of your problems, not far ahead of your understanding.&lt;/p&gt;
&lt;p&gt;The moment where your modular monolith starts to struggle is not something to fear. It is a signal that you are building something meaningful.&lt;/p&gt;
&lt;p&gt;And if you have prepared your boundaries well, that next step becomes a lot more manageable.&lt;/p&gt;
&lt;p&gt;In the next article, we will look at what happens once your system becomes truly distributed, and how communication patterns shape everything that follows. We will dive into &lt;strong&gt;data events versus domain events&lt;/strong&gt;, and why that distinction matters more than it first appears.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[What is Software Architecture (Really)?]]></title><description><![CDATA[Software architecture isn’t a fixed design or a set of diagrams, it’s the evolving set of decisions that guide how a system behaves and grows with its team.]]></description><link>https://www.rickvanlieshout.com/posts/2025/what-is-software-architecture-really/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2025/what-is-software-architecture-really/</guid><pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;a-new-category-on-rickvanlieshoutcom-software-architecture&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-new-category-on-rickvanlieshoutcom-software-architecture&quot; aria-label=&quot;a new category on rickvanlieshoutcom software architecture permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A new category on rickvanlieshout.com: Software Architecture&lt;/h2&gt;
&lt;p&gt;This new category is about the &lt;em&gt;real&lt;/em&gt; side of software architecture.
Not buzzwords, not picture-perfect diagrams, but the messy, human part of designing systems that actually work.&lt;/p&gt;
&lt;p&gt;I’ve spent many years working with different kinds of architectures, from tightly coupled monoliths to sprawling microservice landscapes. Along the way, I’ve learned that architecture isn’t about doing things the “right” way, it’s about understanding &lt;em&gt;why&lt;/em&gt; you’re doing them in the first place, and how they fit into your team and product’s reality.&lt;/p&gt;
&lt;p&gt;Note that this applies both to enterprise systems as well as open-source initiatives.&lt;/p&gt;
&lt;h2 id=&quot;what-software-architecture-actually-is&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-software-architecture-actually-is&quot; aria-label=&quot;what software architecture actually is permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What software architecture actually is&lt;/h2&gt;
&lt;p&gt;Software architecture is the set of decisions that define how a system behaves, evolves, and is understood over time.
It’s not the framework, not the diagram, and not the shiny technology you picked. It’s the &lt;em&gt;reasoning&lt;/em&gt; behind those things, and how they hold up when the system changes.&lt;/p&gt;
&lt;p&gt;If software design is about the details, like how classes interact, how APIs are structured, and how code is organized, architecture is about direction.
It’s the compass that helps the team navigate change without losing its bearings.&lt;/p&gt;
&lt;p&gt;Good architecture provides just enough structure for a team to move fast, without locking them into a corner. It’s the scaffolding around the code, the &lt;strong&gt;shared mental model&lt;/strong&gt; that keeps complexity in check.&lt;/p&gt;
&lt;p&gt;But architecture doesn’t exist in isolation. The same design that works beautifully in one place can fail completely in another, which brings us to the one factor most people overlook: &lt;strong&gt;context.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;why-context-always-matters&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-context-always-matters&quot; aria-label=&quot;why context always matters permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why context always matters&lt;/h2&gt;
&lt;p&gt;There’s no single best architecture, only architectures that make sense in a specific context.
A perfect design on paper might fail completely when you drop it into the wrong environment. The right architecture depends on your product stage, your constraints, and, most importantly, your team.&lt;/p&gt;
&lt;p&gt;At Frontliners, we’ve seen this up close.
We took on the task of replacing a monolith that had been in production for more than 25 years. It was deeply intertwined with the business, used everywhere, and full of edge cases that only existed because of decades of real-world use.
To make matters worse, these edge cases are often only known to some users, others just “follow what they’ve been taught”.&lt;/p&gt;
&lt;p&gt;We didn’t have a large or deeply experienced team at the time, but we did have a strong sense of purpose.
We knew we wanted to modernize, to move toward something distributed and scalable, but we also knew we couldn’t do it all at once. That meant making tough decisions, again and again, weighing what we could achieve now against what would still make sense later. This is especially true from a technical perspective as during this tumultuous time we’ve switched both CPO and CEO multiple times. They all offered new and shiny things, and tech was left trying to realize them within increasingly shorter timelines.&lt;/p&gt;
&lt;p&gt;We focused on the people we had, their strengths, their limits, their growth potential, and built an architecture that could &lt;em&gt;grow&lt;/em&gt; with them.
It wasn’t perfect, but it gave us some momentum, and that momentum led us to something sustainable.&lt;/p&gt;
&lt;p&gt;Still, even with the best intentions, it’s easy to lose perspective once you’ve found a path that seems to work. The next challenge we faced wasn’t technical at all, it was cultural.&lt;/p&gt;
&lt;h2 id=&quot;when-good-principles-turn-into-dogma&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#when-good-principles-turn-into-dogma&quot; aria-label=&quot;when good principles turn into dogma permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;When good principles turn into dogma&lt;/h2&gt;
&lt;p&gt;During our early microservices phase, we fell into a trap many teams do.
We started creating “rules” that sounded right, but didn’t always fit reality.
Things like &lt;em&gt;“you can only do X”&lt;/em&gt; or &lt;em&gt;“you can NEVER depend on another service”&lt;/em&gt;.
And whilst I, as the architect or CTO, never called these “rules” (rather: guidelines), when they were communicated between layers of old &amp;#x3C;&gt; new developers they often turned into “rules”.
Rules like that can be comforting because they feel like control, but they’re often just fear in disguise.
Take something like route calculation. When you have hundreds of parameters and thousands of routes, you can’t pre-compute every possible scenario. Sometimes you need to depend on another service, and that’s fine. Architecture should adapt to problems, not deny their existence.&lt;/p&gt;
&lt;p&gt;The problem wasn’t the technology, it mostly never is, it was the mindset.
Without a clear product goal, people cling to certainty. Those “rules” gave us a sense of safety, but they also made change harder. We eventually had to tear those walls down and rebuild our way of thinking, together.&lt;/p&gt;
&lt;p&gt;That rebuilding forced us to look inward and ask hard questions about who we were as a team. Because architecture isn’t just about systems, it’s about people.&lt;/p&gt;
&lt;h2 id=&quot;architecture-and-team-maturity-balancing-trade-offs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#architecture-and-team-maturity-balancing-trade-offs&quot; aria-label=&quot;architecture and team maturity balancing trade offs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Architecture and team maturity: balancing trade-offs&lt;/h2&gt;
&lt;p&gt;Every architecture exists in the shadow of the team that builds it.
A highly mature, cross-functional team can handle complexity. A newer or smaller team cannot, no matter how good the intentions are.&lt;/p&gt;
&lt;p&gt;If your architecture outpaces your team’s ability to understand or maintain it, it’s not a good architecture for you.
Progress sometimes means taking two steps forward and one step back. You might accept a short-term compromise, a “bad” thing, to enable the next leap forward.&lt;/p&gt;
&lt;p&gt;And that’s okay.
Because architecture isn’t a competition, it’s a conversation. The best systems evolve through collaboration, not commandments.
Let the team make mistakes, learn, and recover. If you enforce every decision from above, you’ll gain consistency, but lose creativity and ownership.&lt;/p&gt;
&lt;p&gt;Every engineer should be part of that conversation. They don’t have to think about architecture every day, but they should &lt;em&gt;care&lt;/em&gt; about it. Curiosity and challenge keep architecture alive.&lt;/p&gt;
&lt;p&gt;Yet even with a healthy mindset, time changes everything. The longer a team works in the same system, the easier it becomes to stop questioning it.&lt;/p&gt;
&lt;h2 id=&quot;choice-blindness-and-the-value-of-fresh-eyes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#choice-blindness-and-the-value-of-fresh-eyes&quot; aria-label=&quot;choice blindness and the value of fresh eyes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Choice blindness and the value of fresh eyes&lt;/h2&gt;
&lt;p&gt;As teams settle into a certain way of working, patterns start to feel “normal.”
Pain points fade into the background, awkward workarounds become invisible (even desired!). Over time, everyone forgets that things could be different. I call this &lt;em&gt;choice blindness&lt;/em&gt;, when familiarity blinds you to your own design decisions.&lt;/p&gt;
&lt;p&gt;That’s why new hires are so valuable.
They don’t carry the same assumptions. They look at your system and ask the uncomfortable questions:
“Why does this work like that?”
“Is that rule still needed?”
“Has the context changed since we made that decision?”&lt;/p&gt;
&lt;p&gt;Sometimes those questions sting. But they’re essential, because context &lt;em&gt;does&lt;/em&gt; change.
Teams evolve, products evolve, constraints evolve, and what once was a good choice might be holding you back now.&lt;/p&gt;
&lt;p&gt;Helping teams see those patterns and guide that evolution is what good architects do best.&lt;/p&gt;
&lt;h2 id=&quot;the-role-of-the-architect&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-role-of-the-architect&quot; aria-label=&quot;the role of the architect permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The role of the architect&lt;/h2&gt;
&lt;p&gt;An architect’s job therefore isn’t to dictate (though they are often given that power), it’s to clarify.
They connect the big picture to the team’s day-to-day, make trade-offs explicit, and keep people aligned. The most valuable skill an architect has isn’t technical, it’s adaptability.&lt;/p&gt;
&lt;p&gt;A good architecture isn’t static. It bends with the product, the people, and the business.
And that adaptability only exists when the team is part of the conversation.
Architecture that’s understood by everyone lasts longer, because it belongs to everyone.&lt;/p&gt;
&lt;p&gt;And that shared ownership matters, because architecture isn’t something you finish, it’s something you &lt;em&gt;continually&lt;/em&gt; shape.&lt;/p&gt;
&lt;h2 id=&quot;architecture-is-ongoing-not-final&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#architecture-is-ongoing-not-final&quot; aria-label=&quot;architecture is ongoing not final permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Architecture is ongoing, not final&lt;/h2&gt;
&lt;p&gt;Architecture is never done. It’s a living process that shifts with each decision, sprint, and release.
That constant evolution can look chaotic from the outside. To stakeholders or customers, it might even seem like we’re changing direction all the time.&lt;/p&gt;
&lt;p&gt;But that’s exactly what makes a system resilient, it changes with its context.
You can’t plan your way to perfection, you can only &lt;em&gt;evolve&lt;/em&gt; your way there.&lt;/p&gt;
&lt;p&gt;The key is communication. When we explain &lt;em&gt;why&lt;/em&gt; we’re making architectural changes, and how they serve the product long-term, that “technical mess” starts to look like healthy adaptation.
A system that never changes is a dead one.&lt;/p&gt;
&lt;p&gt;That’s something we learned first-hand. At Frontliners, we saw how both people and systems evolve, and how one without the other simply doesn’t work.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#wrapping-up&quot; aria-label=&quot;wrapping up permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;At Frontliners, we started with a thirty-year-old monolith and a small, still-growing team.
We worked through complexity, limitations, and doubt. We made decisions that weren’t perfect, but they kept us moving.&lt;/p&gt;
&lt;p&gt;Now, we have the right people and the right balance.
We’re building something sustainable and great. What helped us wasn’t just the technical architecture, but its &lt;em&gt;ability to change with its context&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;That, to me, is what software architecture really is.&lt;/p&gt;
&lt;p&gt;In the next article, we’ll look at how these ideas translate into structure, comparing &lt;strong&gt;monoliths, distributed monoliths, and microservices&lt;/strong&gt;, and when each one actually makes sense in the real world.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A Hidden Life of Pain, Sorrow, Misery and Rampant Emotions]]></title><description><![CDATA[A deeply personal story about grief, memory, and the long road through the shadows. For anyone who’s lost someone they can never get back.]]></description><link>https://www.rickvanlieshout.com/posts/2025/a-hidden-life-of-pain-sorrow-misery-and-rampant-emotions/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2025/a-hidden-life-of-pain-sorrow-misery-and-rampant-emotions/</guid><pubDate>Sun, 04 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACzklEQVR42iXQ3U/aUBzG8XNKX0/faFFosbRUEWnBCgii4FR8GzqBKCIadZPoNGzZMp0aY6IzS5Yty27csmXJkl24ZDcuWeL8A1f0+pfP+eY8gCYxnsFFhEvIE+2krQCjCERYprIhrmDyhW6hmu56NhvbnYqu5ELNMfOkbFWT/pTGpXUB0KRHYAgvInjao0ukrTBxFRUj4k4+eDRjtsZDm3m9NR15XNArSWW32H1asSpJf0YXEhoPAhyuCkTIS/UrzJjJV+LSgiU9yfjPZo13lejlav/3ZvporncpFZiM+Tby+kEpMmvJbnbAxUmFLIaZbJCd6REW+sR0F3JUpmBwkz38waT+qWZ/WU/9fJo7r8aqTsdqVtkZ1YbDXDzI2ioLRArrlfBSDzeksb2+dn8giHI6OxMVmiPqqwnjrGR+rPdftfJXe7lva/blcvRivnt/ytzKa0DjccoDHD9Rs/kJUxhQUKyTNmX38/RcouO44pwvZ2pO58l85Nd25mYvffti6E8r+7s18mN7GPhZD41DloDZIFmPC4uWVI15H0XFYo9YTSmnjcH3u1PPJ8LzlrTexzdM9vOydb1f/Hfy8PqoBBABKReTkCdARqFW4mLZ8i0m/MOGGGSxYYNtPggvJVVdor0kzCv0y8nIadn+upW5OV8CEgXvPUdC91zQyJWEONfrHdFYx09ngmhtsKuRUnNdaFClC4aQ1znLC942srcXdSDRbeZ6hoACCSUKTIepDUesJ+T1AbmZlhv9UinCZRUyLuPdAtQ5GELgTS3192wZdDAuaDM3TuKQJ6GC4KhGTeh0LkjGJCzqhSYPDQ4zBM+4RpqCx+Dhcdm5el0GAYQF7jy6w+54MgU1Foa4diTMYzqPaTwm0+13qzFhxeYWbN9ZLfNhcxS4q6gIdtzd3M3v48adCSDoo2Eng4U4LCJ6bBkvGqju+LYK5mElfVhJ/QdeSX3/Tm8U5wAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/33279ee40bed0af9bebb6ce6d3da95ea/8ac56/cover.webp 240w,
/static/33279ee40bed0af9bebb6ce6d3da95ea/d3be9/cover.webp 480w,
/static/33279ee40bed0af9bebb6ce6d3da95ea/e46b2/cover.webp 960w,
/static/33279ee40bed0af9bebb6ce6d3da95ea/f992d/cover.webp 1440w,
/static/33279ee40bed0af9bebb6ce6d3da95ea/0abaa/cover.webp 1536w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/33279ee40bed0af9bebb6ce6d3da95ea/8ff5a/cover.png 240w,
/static/33279ee40bed0af9bebb6ce6d3da95ea/e85cb/cover.png 480w,
/static/33279ee40bed0af9bebb6ce6d3da95ea/d9199/cover.png 960w,
/static/33279ee40bed0af9bebb6ce6d3da95ea/07a9c/cover.png 1440w,
/static/33279ee40bed0af9bebb6ce6d3da95ea/71c1d/cover.png 1536w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/33279ee40bed0af9bebb6ce6d3da95ea/d9199/cover.png&quot;
            alt=&quot;A vintage heart-shaped locket rests on an old hardcover book beside a wilted pink rose, softly lit in a nostalgic and emotional scene.&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;center&gt;⚠️ &lt;strong&gt;Content Warning&lt;/strong&gt;&lt;br/&gt;
This blog contains themes of death, grief, mental health, and emotional trauma.&lt;br /&gt;
It is raw, honest, and may be deeply triggering for some.&lt;br /&gt;
Please read with care and stop if it becomes too heavy. You&apos;re not alone.&lt;/center&gt;
&lt;h2 id=&quot;a-hidden-life-of-pain-sorrow-misery-and-rampant-emotions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-hidden-life-of-pain-sorrow-misery-and-rampant-emotions&quot; aria-label=&quot;a hidden life of pain sorrow misery and rampant emotions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A Hidden Life of Pain, Sorrow, Misery and Rampant Emotions&lt;/h2&gt;
&lt;p&gt;Some kinds of missing are temporary. A friend you haven’t seen in a while. A conversation left unfinished. A plan postponed.&lt;/p&gt;
&lt;p&gt;But then there’s another kind.&lt;/p&gt;
&lt;p&gt;The kind that settles into your bones. The kind that haunts you during the quiet hours. The kind that never finds a conclusion.&lt;/p&gt;
&lt;p&gt;That kind is not absence. It’s &lt;strong&gt;&lt;em&gt;gone&lt;/em&gt;&lt;/strong&gt;. Irrevocable, final, cruel. A door slammed shut that you still find yourself knocking on, long after you’ve forgotten why you started.&lt;/p&gt;
&lt;p&gt;It never opens. And still, you try the handle every now and then.&lt;/p&gt;
&lt;h2 id=&quot;in-the-background-of-every-moment&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#in-the-background-of-every-moment&quot; aria-label=&quot;in the background of every moment permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;In the background of every moment&lt;/h2&gt;
&lt;p&gt;Losing a loved one doesn’t stay in one room of your house though, it isn’t one door that is locked. It leaks under doors and through cracks. You find it in the most unexpected places.&lt;/p&gt;
&lt;p&gt;You’re sipping coffee with someone, and they mention a trip they took. Suddenly, you’re remembering the trip &lt;em&gt;you&lt;/em&gt; never took. The one you’d planned. The one that cancer took from you.&lt;/p&gt;
&lt;p&gt;They talk about a shared playlist. You remember the song you danced to in the rain, soaking wet but laughing anyway. The same song you now skip every time it comes on because it hurts too much&lt;/p&gt;
&lt;p&gt;Someone laughs about chipped mugs. You think of the one she cracked and called “vintage,” and how it’s still at the back of your cabinet. Untouched. Sacred.&lt;/p&gt;
&lt;p&gt;It’s like walking through a museum where only &lt;em&gt;you&lt;/em&gt; know what’s behind the glass.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;They talk, they laugh, the world goes on,&lt;br /&gt;
Yet I sit with shadows, from dusk to dawn. &lt;br /&gt;
A smile here hides a silent scream,&lt;br /&gt;
A haunted heart, a broken dream.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&quot;float-right&quot; style=&quot;width: 240px&quot;&gt;
 &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 150%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAIAAACjcKk8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAEfklEQVR42l2V2Y/bVBTG4zW24/V6ibfE8RLHcZZZkum0VTvtFNBoxFAJECqg8sIT6kN5ouoj/Od85zq0gHRlWdb9nf18HokTW9RN0bBF05EcT/EjLU6NfG7OS7dqgrbzm9arl17deIvSTDM3z/QglFyGyyPRsIi3XNnzlSDSkswqKrus7UVlzxfOrLDS3MlyL8/TZZ0s67AqNceDP9znsOWKDpNcX3YYjuoFeEq2K9n8I4uMrHCqZrrZVdfX6X4vW46g6rLLOGwz0fZEbYIQBMMS8BzM+VM5TORpZhS1t+qDfpsfjtPNVrE9YWzA+ohiBmk6dFxfdAM6DsMTsBSmalbYTeeueqtuWbdhqw7wSDW4Zw7DIQogsVBkETDB8UWQUSonM21e223vtL1ZLb1uE/Y71WGj8URm4WdYYYEcJZIfDf7hU0kLrWhMuO22Xrc1q9bvd9F2P8CqDxgdchnyHIexGudSmMA5nkoyH88qkOH+Mrk4sn5nwUpLmSscVgjmtYFnNYjGWaEmMymMlTgHqZetteyTy0frV1/G5weQLi8b5az9Fzbi1Cyb8axEqmq+MJe92+2yq8dXDw+vfnyzevHSW++cVc+6Xrb+B+sWRsJeduO8lON8iLZ4+vyLn968++P9uw+/X33zgMip7G0nc88yC0aiTfBIN+2iZP1WXzToDdueVTcvn9zfv/3t1w9/fvz418evfn4zPb+EdadpKWfA5BlNdn3A1nwRbs9gW83LYH+xPhyvl83dbv3LD6/fvn/37PvvsuMjq1lZZUOeUe0g4rDNBjjYnqGfcB5t9qu6Pl4dX93ePBz2d9++3t3fxxcHtNqYl7LlCqg2G3K23JE+mcwKf7NHP7R5xfp9UVa7LLluymfn28cPX9fPb6L9+WRRa3khmY6gDUNygk0jnQ8zqKZzmAh3Z0XXrXe7/e3t9u4uPRzZeqPPFmqcSRj+04SZBAu6qSc5UpqUDZqsFzW6El0cimfPm5sXiydPKai6HWdzZZqKEwuwRLNNK8HhOLOqVp9XWCM4NxYNJhmhTs8uo/0F6qzNSiXOlCjBIgKmMguGLSAH3VTD2Cgq2ObLlGDUzHLptGuEABJbqSY5hl8OYigBVpIaLOp8gXVT8acUVZSKLJQC2mRttkAWCEGflSClIMba0OYAxvIDBkYCgOp5ARZD9qcCZIB2I8aoa/mCBj7O5DCGUb5wPmTjBHMNo9Kj4XIwFb2AhAV64EfIEOYUIhNpICESOGODwracEUknLz1MEOn6gwaJXkgZhjHOackdrlY4Y10Y66BGomYKOsHk3PK4nrnDzA4Zkk+PCxM6itKapH7k2YRn+AQPWNWHKKh5tgfdBCZ5AcFQJaiNyWFcAIzLhgXY4AWgApIJ5IMQuJhjDLEDEmpBSuxRRFwnhc+wSjCck1tUno5F9T+9n77jSBBJepmIikYUwXhD9gOvUdso8ol9So+PwCdbdA2R4j5PlsOIgT4ZxBs2h60Bpjh5LweLpx/bcHlsjIj8dChbk0YXwECe4H9IvP8L/hsfg4lCdLAFHQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source srcset=&quot;/static/7a3a42b35452202d3161d9b6fa03abd6/8ac56/the-flashback-no-one-sees.webp 240w,
/static/7a3a42b35452202d3161d9b6fa03abd6/d3be9/the-flashback-no-one-sees.webp 480w,
/static/7a3a42b35452202d3161d9b6fa03abd6/e46b2/the-flashback-no-one-sees.webp 960w,
/static/7a3a42b35452202d3161d9b6fa03abd6/a9a89/the-flashback-no-one-sees.webp 1024w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/webp&quot;&gt;
          &lt;source srcset=&quot;/static/7a3a42b35452202d3161d9b6fa03abd6/8ff5a/the-flashback-no-one-sees.png 240w,
/static/7a3a42b35452202d3161d9b6fa03abd6/e85cb/the-flashback-no-one-sees.png 480w,
/static/7a3a42b35452202d3161d9b6fa03abd6/d9199/the-flashback-no-one-sees.png 960w,
/static/7a3a42b35452202d3161d9b6fa03abd6/2bef9/the-flashback-no-one-sees.png 1024w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/png&quot;&gt;
          &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/7a3a42b35452202d3161d9b6fa03abd6/d9199/the-flashback-no-one-sees.png&quot; alt=&quot;A foggy bathroom mirror with a red lipstick kiss at the center, surrounded by a shadowy, intimate atmosphere.&quot; title=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
&lt;/figure&gt;
&lt;p&gt;These are what I call &lt;em&gt;mind pops&lt;/em&gt;. Short for Involuntary Autobiographical Memory Chains. I wrote a journal-like book once, and later a smaller one. I wanted to share them. I tried. But I was never brave enough to.&lt;/p&gt;
&lt;p&gt;Mind pops come uninvited. And they come &lt;em&gt;hard&lt;/em&gt;.
Here are some examples from my book:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The eyeliner she never quite got even.&lt;/li&gt;
&lt;li&gt;The way she tucked me in, thinking I was asleep.&lt;/li&gt;
&lt;li&gt;The fake wedding we planned just to see what colors we’d choose.&lt;/li&gt;
&lt;li&gt;Your love for Twilight. And the moment we realized, quietly, you’d never get to read the next book—if there ever was one.&lt;/li&gt;
&lt;li&gt;The mole you’ve had removed and I pretended not to notice. I did miss it so.&lt;/li&gt;
&lt;li&gt;The mixture of guilt, remorse and happiness in your eyes as conscious life ebbed away.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They’re not just memories. They’re grenades. Quiet ones. You never know when they’ll detonate. Nor whether they will ruin your entire day.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A flicker in time, unbidden and wild,&lt;br /&gt;
A whisper of laughter, a memory smiled.&lt;br /&gt;
Then tears arrive with no request,&lt;br /&gt;
The heart’s old wounds laid bare, unblessed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;unfair-doesnt-even-begin-to-cover-it&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#unfair-doesnt-even-begin-to-cover-it&quot; aria-label=&quot;unfair doesnt even begin to cover it permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Unfair doesn’t even begin to cover it&lt;/h2&gt;
&lt;p&gt;We grow up believing that the world has some kind of order to it. That bad things happen, sure—but not &lt;em&gt;this&lt;/em&gt; bad. Not &lt;em&gt;this&lt;/em&gt; unfair.
You lose someone who made life feel infinite. You watch them disappear into the haze of hospital lights and soft-spoken specialists.&lt;/p&gt;
&lt;p&gt;Cancer doesn’t care if you’re young. Or kind.&lt;br /&gt;
Or if you had a hundred plans left.
It just takes.&lt;br /&gt;
And keeps taking.&lt;/p&gt;
&lt;p&gt;And you’re left with jewelry in a drawer. Her necklace still smells like her.&lt;br /&gt;
Sometimes I take it out. I hold it. Smell it. Let it transport me. I don’t even know if I should still be doing that. But it’s a thread. One of the last ones.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This necklace, cold, rests in my hand,&lt;br /&gt;
The last soft echo of a silent land.&lt;br /&gt;
I breathe her in, though she’s not near,&lt;br /&gt;
A ghost in scent, in touch, in tear.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;the-masks-we-wear&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-masks-we-wear&quot; aria-label=&quot;the masks we wear permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The masks we wear&lt;/h2&gt;
&lt;p&gt;For a long time, no one knew. Most don’t, still.&lt;/p&gt;
&lt;p&gt;People see the version of you they expect: Smiling. Joking. Coping. Existing.&lt;br /&gt;
But behind the eyes, you’re unraveling. Constantly. Because grief doesn’t pause.&lt;br /&gt;
Not &lt;strong&gt;&lt;em&gt;really&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Sharing this is hard. Not because I don’t want to, but because it makes you so vulnerable. Because as you’re writing or speaking, memories pop up uninvited. They derail your words. They choke your sentences. They just pop in… bastards…&lt;/p&gt;
&lt;p&gt;And even when you manage to share, others often don’t understand. They compare. They say things like “I lost someone too,” but it’s different. This kind of grief? This kind of loss? It’s heavier. It cuts deeper. And hearing it treated like it’s the same as all the rest—&lt;em&gt;that&lt;/em&gt; makes you angry.&lt;/p&gt;
&lt;p&gt;Here’s something I once wrote, when I thought no one would ever read it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’m surrounded by many figures, but still alone…&lt;br /&gt;
No one sees me, nor the pain behind my mask.&lt;br /&gt;
They see the smiling, happy guy I show them.&lt;br /&gt;
You can’t blame them though, how can I let them see the darkness in my heart? &lt;br /&gt;
It would scare them, for it has been torn apart.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I didn’t want to scare people. Or burden them. So I said nothing.&lt;br /&gt;
For years.&lt;/p&gt;
&lt;h2 id=&quot;strange-rituals-of-survival&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#strange-rituals-of-survival&quot; aria-label=&quot;strange rituals of survival permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Strange rituals of survival&lt;/h2&gt;
&lt;figure class=&quot;float-right&quot; style=&quot;width: 240px&quot;&gt;
 &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 150%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAIAAACjcKk8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFdklEQVR42i1UWW8bVRS+M3e/c2ffPN4mcbzFcWMncezWS3DbpEmbUiBV06ZLgKqFIBCLBBIIkHjhhQceeOWVv8FP4D9xxql0NPId3++c75z5voM8TSOXpS7zNalHcqOk11Ltu1wwU1JTO2KzXZ2MtygnFKPuzZ0PL89n9w5uzEfK4qjs82rAqz6A6TW4nmjP4bwAG9rmnVZlb7dLGCYYtUfbZ69fLk6P+tO9AhzYNHFZ5nOo3EjUoBH1Gqm7AqtrcLt2a7ZDODEMNJyPX1x9eut4uT3bt67B1VA1Ugsqt1K12KpMh03nGswMG2h36qP9PoBNE63327PTw+3FZHBrpwA7FvEskrgUnr5NSz4vBdKx34FdT62vl1qdOmbYMFF/f/D48unNo/fau30hKRIC1wKxFglbmkISxk1tsSCwCDEA7HuyXgnyakSoiQy0HHcXi91qt9Ha2hCcICmw74pKZFnCVBL7Nhs3w52NRAkMA3M1AxZaUQAbGE0Gjb29zbCepZWIUgNxjiEciW1hwuSg7ZMb6awdBZpqYfaalawcMU4wMYH2eNS/uPjo5OFRe6tVcKHM5MwQzJDF06QEAT2TGEBbUIMJwiXlghRvqAHtuKEtXSW0xHh1z8SIEAQpJDehC62Z5wjBMMysFDvlxAXyjBbX4DjoN+t5iUkK2ZElqWfzyJOxryCyQJV8mbrcEabmhqeII00gBaktbviujGNXWNAqBoIodjhEpKmviCuwzU2HG5oZgITbkhuKF/w9QHKj5vK1xK1WkvVaGvgOErQI+GYWSEIYNY/6VpEIjtZqEICHRKA2aNKhyIWbBFU1STyraJXT4pOqopq5FrCyQzKbOMLQoiiuVhSgODTp8iIcZpSlkXKEVkM2GEEQtsRKUlBLorHNCjpixQj6h2sMqPF3ZeAHNAiYglVqk3aqDjt+J5W2onuNsF/389gqeTx2OYwA/AgiAVGpYnKm4oXn0DAl44q4leuDpnc2iF9MqseDyr1B5e5O/mjRf/3s9MXp7O6N8qQVDnIXPAsUTIQAKEERx2v0vboY16zJunPSi56MKifDKsTOuv/62cN//v7r6sFwnKv93D6f5B8vW2fLwXw6yisxyBnNUuNmhqe5tWwHj7aTl4vWxbL3YL9x0E0GeXAyqP77x6ur2+tNF3dTPe2WjubDX3787vnjB+2qhx70S88X3U8Wa0/H2aNh+NP9te+Om5cHGx+M8tGaf7vt//fnk4txGbq1FQPNjYabv/7wzZtXT/Y2a+jnz85///riq5v2kw45rJtfTKxvl/EP91tv7/WPhvXj3fX7w9q84dzppfd3aud3d799+/z7r948Pl2mgYWmzfD14dbLbetpC5816UWPf3m79mzenPbKi63y52d3vj6bf363dTnOzvvuq6FzuR8/vzNIQi1AoSFDDsdVj21EvBnzRixjByyIWpk965Zenc5+u3p89XDvsFfasI3dVnJ1vPXRTuo7wrEFym0zlchZiQ7CpigSRitk80487WYex91adLCVzXvZrJsu+rX3l7vj7UYcOUVlEG0sDUix4eKWT3oxG2RyL3fGzWjaSTuZrWlx59rtFhSM/Wo16XfqSoBihAm6Bbn4wqg7uBuzzVRtZnq77o6aESzTSaeU2IV7MTWFa/mgOEGxWaygYgEWC1RhcA+I2RcmGKudiM3MGuYeiBT+BU1heBR4Q8KSpGYGKxZWL5wpw5YioU0DTVbuRYE0c5+VPUbBgzazNQPrFymwAXuvkgUZbAxFi5R4lZLCGtQ09bjiGGwAJruuE8FuiXXoK9ezAF8ueWGgk8gO4Tu/A69YQcAMGcdgIFi9aagqiR35SiniuTIMbUinNYc12MiTwLf+B9+Tpixk5Jr8AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source srcset=&quot;/static/7cc988d4b02e601dd24cd5a7be48b1b2/8ac56/strange-rituals-of-survival.webp 240w,
/static/7cc988d4b02e601dd24cd5a7be48b1b2/d3be9/strange-rituals-of-survival.webp 480w,
/static/7cc988d4b02e601dd24cd5a7be48b1b2/e46b2/strange-rituals-of-survival.webp 960w,
/static/7cc988d4b02e601dd24cd5a7be48b1b2/a9a89/strange-rituals-of-survival.webp 1024w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/webp&quot;&gt;
          &lt;source srcset=&quot;/static/7cc988d4b02e601dd24cd5a7be48b1b2/8ff5a/strange-rituals-of-survival.png 240w,
/static/7cc988d4b02e601dd24cd5a7be48b1b2/e85cb/strange-rituals-of-survival.png 480w,
/static/7cc988d4b02e601dd24cd5a7be48b1b2/d9199/strange-rituals-of-survival.png 960w,
/static/7cc988d4b02e601dd24cd5a7be48b1b2/2bef9/strange-rituals-of-survival.png 1024w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/png&quot;&gt;
          &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/7cc988d4b02e601dd24cd5a7be48b1b2/d9199/strange-rituals-of-survival.png&quot; alt=&quot;A softly lit restaurant table for two. One plate is untouched, the other half-eaten. A single candle flickers between them, hinting at absence and memory.&quot; title=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
&lt;/figure&gt;
&lt;p&gt;Grief makes you do strange things too..&lt;br /&gt;
One of my telltale behaviors is that I start eating, lots… but there are weirder ones.&lt;br /&gt;
More unexpected ones…&lt;/p&gt;
&lt;p&gt;I’ve spoken out loud to pictures. Imagined new conversations. Tried to conjure her in dreams. I’ve spent hours crafting memories that never happened, just to feel like I got one more day.
I name items, characters, and other things in games after her.
If I eat alone, at a restaurant, I order what she would’ve. (who do I kid, I sometimes do it with company too…)&lt;/p&gt;
&lt;p&gt;And I wrote a song. It’s unfinished though—like she was.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🎵 (Refrain)&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;A strand of blonde hair, as delicate as sun,&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;A mystery found, in silence it’s spun.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;But memory, like a fleeting breeze,&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Fades away as a haze, in the time we seize.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🎶(Verse)&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;Days pass like rustling leaves,&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Stories fade, like quiet thieves.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;How swiftly memory slips away,&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Like an old melody, lost in the fray.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A mysterious gate, in the labyrinth of the mind,&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Locked and hidden, what secrets behind?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As I’m writing this blog however, I have a sudden urge to add sound to the lyrics, it’ll still be unfinished, but a little farther along.
I used both a piano and a viola to give it a more interesting sound than just the piano.&lt;/p&gt;
&lt;center&gt;
  &lt;audio controls&gt;
    &lt;source src=&quot;/fcd0e5eee481b58de198238b84d18cd7/a-strand-of-blonde-hair-as-delicate-as-sun.mp3&quot; type=&quot;audio/mpeg&quot;&gt;
  Your browser does not support the audio element.
  &lt;/audio&gt;
  &lt;br /&gt;
  &lt;a href=&quot;/d544332aff40297f47c8c372c7008e79/a-strand-of-blonde-hair-as-delicate-as-sun.pdf&quot; target=&quot;_blank&quot;&gt;score&lt;/a&gt; |
  &lt;a href=&quot;/bf0064e1f356731ce5cc72d3a1544577/a-strand-of-blonde-hair-as-delicate-as-sun.mid&quot; target=&quot;_blank&quot;&gt;midi&lt;/a&gt; |
  &lt;a href=&quot;/825666683d4699917a1faba910351e31/a-strand-of-blonde-hair-as-delicate-as-sun.flac&quot; target=&quot;_blank&quot;&gt;flac&lt;/a&gt;
&lt;/center&gt;
&lt;h2 id=&quot;the-final-moments-and-the-words-that-stayed&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-final-moments-and-the-words-that-stayed&quot; aria-label=&quot;the final moments and the words that stayed permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The final moments and the words that stayed&lt;/h2&gt;
&lt;p&gt;There are memories too hard to sit with for long. But they come back, as clear as yesterday.&lt;/p&gt;
&lt;p&gt;The quiet nights filled with endless conversation. Plans made, even though we both knew we’d never see them through. Fantasies of places we’d never travel, children we’d never have, shows we’d never finish.&lt;/p&gt;
&lt;p&gt;She once told me something that still echoes today:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“You have to grieve me, for a while… and then you move on. &lt;br /&gt;
You find someone else to love. Someone who makes you feel something again. &lt;br /&gt; You deserve that.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I shook my head. &lt;em&gt;“I can’t. I &lt;strong&gt;won’t&lt;/strong&gt;. Not because I don’t want to feel again. But because abstinence, to me, feels like remembering you as you are. Eternal.”&lt;/em&gt; &lt;br /&gt;
We both cried after that. For different reasons, I think.&lt;/p&gt;
&lt;h3 id=&quot;my-words-werent-true-though&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#my-words-werent-true-though&quot; aria-label=&quot;my words werent true though permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;My words weren’t true though&lt;/h3&gt;
&lt;p&gt;But life went on. And I did try. I did have relations after her.
And every single one felt… off. Wrong. Like stepping into a life that wasn’t meant to fit me anymore.&lt;/p&gt;
&lt;p&gt;They weren’t bad people. In fact, I think some of them really tried to care. But the weight of comparison was impossible to escape. The shadow she left was too wide.&lt;/p&gt;
&lt;p&gt;Sometimes I’m mad at myself for trying. Other times, I’m mad at myself for failing to let them in.
And always,…always,.. I feel like I betrayed her just a little.&lt;/p&gt;
&lt;p&gt;I know grief isn’t rational. It doesn’t follow clean lines.&lt;br /&gt;
And maybe that’s what hurts most of all—knowing I tried, and still came back to the same place. &lt;br /&gt;
Alone, but full of someone who isn’t here.&lt;/p&gt;
&lt;p&gt;One day… &lt;em&gt;maybe&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;why-im-finally-speaking&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-im-finally-speaking&quot; aria-label=&quot;why im finally speaking permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why I’m finally speaking&lt;/h2&gt;
&lt;p&gt;It’s taken me over a decade to find the strength to say any of this.
And maybe the only reason I can now… is her.&lt;/p&gt;
&lt;p&gt;But also—my mother.&lt;br /&gt;
She’s terminally ill. And while it’s “natural” for a parent to go before their child, it’s still excruciating. &lt;br /&gt;
We don’t know how long she’s got left, but I know we’ll make the best of it. For both of us.&lt;/p&gt;
&lt;p&gt;I do find myself ashamed to admit that it hasn’t hit me quite the same way. But it’s not lesser. It’s just different. A different wound on the same, torn, body.&lt;br /&gt;
And this time, I’m watching it happen while knowing exactly what’s coming. And I’m scared. &lt;br /&gt;
For &lt;strong&gt;everyone&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I think often of my brothers. For them, this may be their first real loss. Their first brush with the permanence of death.&lt;br /&gt;
And it breaks me in new ways to imagine them feeling what I felt, without ever seeing it coming. I’ll try to be there for them, as you do.&lt;/p&gt;
&lt;p&gt;But it’s at least part of why I’m writing now. That’s why I’m finally saying all this.&lt;br /&gt;
Because pain grows in the dark.&lt;/p&gt;
&lt;p&gt;In a moment of foolish bravery, I once planned to publish my journaled thoughts. That book. That attempt to show what this kind of loss looks like.&lt;br /&gt;
I didn’t. I &lt;strong&gt;couldn’t&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;But maybe I can share this blog.&lt;/p&gt;
&lt;h2 id=&quot;on-those-who-wanted-to-leave&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#on-those-who-wanted-to-leave&quot; aria-label=&quot;on those who wanted to leave permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;On those who want(ed) to leave&lt;/h2&gt;
&lt;p&gt;I need to say something with a very serious tone now, and I do hope you read it gently and thoroughly:&lt;/p&gt;
&lt;p&gt;I’ve met people over the years who’ve carried this same grief. And some of them have found themselves teetering.&lt;/p&gt;
&lt;p&gt;On the edge.&lt;/p&gt;
&lt;p&gt;Wondering if there’s peace on the other side of absence.&lt;br /&gt;
Let me say this clearly: I have never thought of taking that road for myself. If anything, I would &lt;em&gt;ask&lt;/em&gt; for eternal life. Even with the grief.&lt;br /&gt;
But if you are someone who has stood on that edge:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don’t. Please.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The pain is real. The grief is heavy. But life—&lt;em&gt;even broken life&lt;/em&gt;—has light in it still. And sometimes, all you need is one person willing to sit with you in the dark.&lt;/p&gt;
&lt;p&gt;Let me be that person for a moment. Just long enough to remind you: the door might be closed, but the room isn’t empty.&lt;/p&gt;
&lt;p&gt;If you are on the edge. Seek help. &lt;sup&gt;(&lt;a href=&quot;https://www.113.nl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;dutch&lt;/a&gt; | &lt;a href=&quot;https://www.113.nl/english&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;english&lt;/a&gt;)&lt;/sup&gt;
Whatever you do, don’t pass on the pain.&lt;/p&gt;
&lt;h2 id=&quot;what-help-looks-like&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-help-looks-like&quot; aria-label=&quot;what help looks like permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What help looks like&lt;/h2&gt;
&lt;p&gt;Over the past two years, I’ve slowly—&lt;em&gt;achingly&lt;/em&gt;—learned to live with it.
And honestly, I’m happier now than I’ve ever been since.&lt;/p&gt;
&lt;p&gt;I’ve had friends. Real ones. Some with the training to guide me through the murk. Others who simply sat there while I unraveled, trying their best.&lt;/p&gt;
&lt;p&gt;They didn’t try to fix me. They didn’t rush me. They just showed up.
They had always been there, I just didn’t allow them to be there for me before.&lt;/p&gt;
&lt;p&gt;I’ve learned that grief isn’t a wall to climb or a puzzle to solve. It’s a landscape.&lt;/p&gt;
&lt;p&gt;You don’t conquer it.&lt;br /&gt;
You &lt;em&gt;walk it&lt;/em&gt;. One aching step at a time.&lt;br /&gt;
And if you’re lucky… you don’t walk it alone.&lt;/p&gt;
&lt;h3 id=&quot;to-those-who-held-me-together&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#to-those-who-held-me-together&quot; aria-label=&quot;to those who held me together permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;To those who held me together&lt;/h3&gt;
&lt;p&gt;There’s a quiet kind of heroism in being the one who stays.
Not the one who fixes. Not the one with the right words.
Just… the one who stays.&lt;/p&gt;
&lt;p&gt;To those of you who sat with me in silence,
who didn’t flinch at the weight of my words,
who let me cry without needing to understand why.
thank you.&lt;/p&gt;
&lt;p&gt;To those who asked how I was and meant it.
Who asked again when I lied the first time.
Who sent messages I never responded to, but always read.
Thank you.&lt;/p&gt;
&lt;p&gt;To those who reminded me that it was okay to laugh.
To love again.
To mess up.
To heal slow.
Thank you.&lt;/p&gt;
&lt;p&gt;And to the ones who didn’t even know they helped—
you did.&lt;/p&gt;
&lt;p&gt;You all held the thread when I couldn’t anymore.
And maybe that’s the reason I’m still happy…
Still holding her memory, but not drowning in it.&lt;/p&gt;
&lt;h2 id=&quot;before-i-finally-sign-off&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#before-i-finally-sign-off&quot; aria-label=&quot;before i finally sign off permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Before I finally sign off&lt;/h2&gt;
&lt;p&gt;This entire blog was something I never thought I could write.
And what comes next,this next part, is something I swore I &lt;em&gt;never&lt;/em&gt; would share.&lt;/p&gt;
&lt;p&gt;But here we are.&lt;/p&gt;
&lt;p&gt;What follows is the foreword and some pages from the book I wrote years ago. A raw collection of thoughts, pain, patterns, and memory. I’ve always wanted to share it, and I’ve always been too scared. Too protective. Too convinced no one would understand.&lt;/p&gt;
&lt;p&gt;My grief has changed, not disappeared, never that. But shifted.
And time has a way of loosening things you once held too tight.
Of showing you that even pain deserves to breathe.&lt;/p&gt;
&lt;p&gt;So this is me, still afraid—but doing it anyway.&lt;br /&gt;
This is me, defiant in the face of silence.&lt;br /&gt;
This is me, opening the door just a little wider.&lt;/p&gt;
&lt;p&gt;What comes next is the truth as I once wrote it, in a different voice, at a different time (2021-2022)—but still very much me.&lt;/p&gt;
&lt;h3 id=&quot;a-peek-into-the-pain-and-misery&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-peek-into-the-pain-and-misery&quot; aria-label=&quot;a peek into the pain and misery permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A Peek into the Pain and Misery&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The foreword to a book I once wrote titled “A Peek into the Pain and Misery”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We, humans, perceive the vast majority of other humans we encounter as bystanders, observers and otherwise side characters in our own lives. Yet, each and every one of them has a life of comparable complexity to our own. Realizing that for the first time is an emotion called “sonder”.&lt;/p&gt;
&lt;p&gt;This book will give you a small glimpse into my life. By the end, you might find that I’m more complex than you’ve thought till now. That there’s another side to the happy, carefree guy I show the world for the majority of my time.&lt;/p&gt;
&lt;p&gt;Truth is, that life hasn’t always been easy. In fact, I’d say that after the turning point my life has never felt easy anymore. In fact, for at least 10 years now I’ve been living with prodigious amounts of a single emotion: bereavement.&lt;/p&gt;
&lt;p&gt;And though I’ve tried not to let the bereavement take over my life, or in fact make it known to others. it’s always been there. I’ve effectively come to think of it as a zit. Constantly there, constantly annoying and once it’s gone away it’s only a matter of time before it shows up again somewhere else on your body.&lt;/p&gt;
&lt;p&gt;Ten years is truly a long time. In it, I’ve tried countless things to forget my sorrow. I’ve written songs and poetry. I’ve indulged in life’s greatest things. I’ve thrown myself into the pursuit of knowledge and I’ve even tried to seclude myself, thinking that I’d become a burden to the world.
However, In trying to cope with it I’ve also made many mistakes. I’ve experienced more loss, extirpated meaningful connections and, to my deepest regret, hurt others.
And even now, 10 full years later I’m still burdened by the same emotions, though now compounded by the feelings and mistakes of the past 10 years.&lt;/p&gt;
&lt;p&gt;Furthermore, During these 10 years, on nearly every day I’ve been haunted by something I’ve come to know as Involuntary Autobiographical Memory Chains, or as I now like to call them: mind pops.
Mind pops are sudden memory flashes, seemingly triggered at random, about things I’ve experienced prior. These mind pops never seem to go away and can alter my mood for the rest of the day with the emotions they invoke.&lt;/p&gt;
&lt;p&gt;I’ve actually been able to capture the entire story of the past 10 years in a book, of sorts, titled “a hidden life of pain, sorrow, misery and rampant emotions”. And though I’ve always wanted to share the entire story, I’ve never been strong enough to do so. Not 10 years ago, not now, and maybe not ever.&lt;/p&gt;
&lt;p&gt;But… The urge to share… something… is still there.
So on the 1st of January 2021, I set out on a challenge. I wanted to, at least, share a part of the story. Not one from a distant past though, one of constant remembrance. One of pain and pleasure. One I’ve lived for every day of the entire year. One I’ll live for every day for many years to come.&lt;/p&gt;
&lt;p&gt;Every page henceforth will contain one “mind pop” that I’ve had on the date listed. So turn over this page and join me on my struggle from January 1st through December 31st of 2021.&lt;/p&gt;
&lt;figure style=&quot;width: 240px&quot;&gt;
 &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 150%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAIAAACjcKk8AAAACXBIWXMAAAsTAAALEwEAmpwYAAACnUlEQVR42q2V227TQBRF+6FIfeMBPgCpL/0QhECIv0GhpLn47vE9di527mkmk4Rlu6EhDRBVleZhbM/eZ599zhxfbVbFi9fV5UfVw7jcLPOXgFezwcN8WFIc8JeC5TIXdsfSmlq7IRejWsUTWB1vKm5VSj3Cr3Iiz4qeOhw7irwstnVWq2IrJ3DXCrf1hpfryVPmv2UjiQ+DnvDsTuSZeufO0puRb6IzDkzP6QZCc8x2KIzNgeiPnAFPRrGt3/cTYWpNYKHQY9/qJ14c2Gnk+q6mtX8Err4m4RMwfPMiJbLvdN0qiGd3AcSBJawO76HLEpGE9qPhp+Bxmsau72joRDYwHpPAZhMIPQms+Tjbqfmxu0+yi2FEJVyrA72p/fRdvdQp9DSy4TK6d8Lu4p963mFYOhklrtXuRW6n1UBkIAzcQioLL2DJYpdc5CJXz90eZj5WYRiGa60G0cjZNUshYSUbRtu4X077pzkDHg9jx2z1IocghAIJBquwgIDs4R2l/no+OlOqYhA5Rgt74ipIGjm4FXpGq/mddAJXW84Gu83szK1SVc5EIw6yqael34OEBaTnaPQMNd9Jmiw/A6YStBGLJImD/n7Pq/zHRSeNBYWAQi5z9Vw2OWMYHUJ80q6JkACY9+RM5ThzXjYfaC/qQW1IG5bAM5LQAoZ+HKEc68NlPK0zYCpBKFZWimzTYein5+jt/Wamqlt1fgyphwlmchm3ckoWW1meLvdyWsHyf8+wHDNYm2rV4wJGNvJobqn/DkBO7+V0kAWD1GdTgfNLpyfG7Pfyy+eP375+2u/XPF46eomzk9O8H15fv3n/7u14GO0eg18G3q7Hi0l2c/Ph9vZmUd2ES8H1ZC8dribW36w+D1bVkkdEr/C7eWXwL9bbh1gpZJL7AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source srcset=&quot;/static/22eff2096b50eb2a2f259667ebf5fe48/8ac56/sept-12.webp 240w,
/static/22eff2096b50eb2a2f259667ebf5fe48/d3be9/sept-12.webp 480w,
/static/22eff2096b50eb2a2f259667ebf5fe48/e46b2/sept-12.webp 960w,
/static/22eff2096b50eb2a2f259667ebf5fe48/a9a89/sept-12.webp 1024w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/webp&quot;&gt;
          &lt;source srcset=&quot;/static/22eff2096b50eb2a2f259667ebf5fe48/8ff5a/sept-12.png 240w,
/static/22eff2096b50eb2a2f259667ebf5fe48/e85cb/sept-12.png 480w,
/static/22eff2096b50eb2a2f259667ebf5fe48/d9199/sept-12.png 960w,
/static/22eff2096b50eb2a2f259667ebf5fe48/2bef9/sept-12.png 1024w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/png&quot;&gt;
          &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/22eff2096b50eb2a2f259667ebf5fe48/d9199/sept-12.png&quot; alt=&quot;page of september 12th, a teardrop at the bottom to indicate a sad memory, and the text: my colleagues and I went skiing. They didn&apos;t know it was something we had planned to do after our studies which made it infinitely more difficult for me. I didn&apos;t really like it, probably because you weren&apos;t there to share in my happiness. On the way there and back my colleague drove straight past a place where we had lunch, that hit home a just little too hard.&quot; title=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
&lt;/figure&gt;
&lt;figure style=&quot;width: 240px;&quot;&gt;
 &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 150%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAIAAACjcKk8AAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElEQVR42pVVTY/aMBDN3+6hv6JSb9UeeumpPaEeKrFaxIpCCaELhCTG4WsXCB+2kw2wkDh0kg0LSRyWSk+jMfab8bwZE8lnvQTomc2A2xisd9yVEpxsCHraAs7LUvdC3/QS5MzR0zJCYGNn2tGUO00pdZU7e9IKHCy95fEo2hMUWoo8Evrx8ujsVgZgu9Q3Cw2WiczcNgN3GDz3A3cQwwl9/vy67AfrIfic4ahyHJMhTOCY84GiyrfLUfMJ1Sa9Om7dT3F93lcejdpQ+22ZDdwuP6E/cDItGARbW92+WplieaBWxnptpFVnphxbvQr8ZvXXBNfhZEZtgI25OzxsRpuV3pFvhzrQGr1WGfzl+AF+52EJ/fPWnMgQD3SCDVDFtbrreXe70Dbzrmup20ih+MBZL0WtomEVIRiGDgWRk26huM9Hx6NpJ3EgspJgQuhFCMhMPFgC5iUy+48rSFclzBaVrjkdAh2RGyIvM/TT4LYO8CnAeC9zIqfKicJnZT4pcSJz1jnxqXBI4hCIU53TBje++3+/+vIXv/0tILLP9LgElhXsjUxQeNtJyZdv9j8/7gofPPmGj4vh/QnKUfvER5zpfFHj+o99+ZN3//lgFjhtRpWnWy2JJgSk0jh78GaV5aBomcUA7kyMtGC5fSYGZ+hlpWqtAnmsBwy//u+IBBPNA7wk12qvF+rBGXgEXTFhyYHZrbQ9MXIfBrsw25ef1Dvk7CNh15CFHyAR8j83eTnp9TVnCzkT7B/vn3MxQOnQkAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source srcset=&quot;/static/c1c7be84e07243661b28f0ecf46ff0ee/8ac56/march-19.webp 240w,
/static/c1c7be84e07243661b28f0ecf46ff0ee/d3be9/march-19.webp 480w,
/static/c1c7be84e07243661b28f0ecf46ff0ee/e46b2/march-19.webp 960w,
/static/c1c7be84e07243661b28f0ecf46ff0ee/a9a89/march-19.webp 1024w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/webp&quot;&gt;
          &lt;source srcset=&quot;/static/c1c7be84e07243661b28f0ecf46ff0ee/8ff5a/march-19.png 240w,
/static/c1c7be84e07243661b28f0ecf46ff0ee/e85cb/march-19.png 480w,
/static/c1c7be84e07243661b28f0ecf46ff0ee/d9199/march-19.png 960w,
/static/c1c7be84e07243661b28f0ecf46ff0ee/2bef9/march-19.png 1024w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/png&quot;&gt;
          &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/c1c7be84e07243661b28f0ecf46ff0ee/d9199/march-19.png&quot; alt=&quot;page of march 19th, a flower at the bottom to indicate a happy memory, and the text: The warmth you brought into a room.
A happy one&quot; title=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
&lt;/figure&gt;
&lt;figure style=&quot;width: 240px;&quot;&gt;
 &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 150%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAIAAACjcKk8AAAACXBIWXMAAAsTAAALEwEAmpwYAAACIklEQVR42qVUS4vTUBjNH3OrO0VxNwvB2QkiiC4EEXe6dCGuBTcizMrdoGJf06btpGnTvB9N2kzrTJI2rWk6M+roSaKh1Js2VThcvuZ+5zvf65aau1ouOFrgqEF0aoGrJh+p9YTln4uxcTrpATBykGNAKvT0yVDsiXVTqhsibetMXjIAsj+S+kpT52tqtzpQmdDV85IjeNpiYpz5JgCDoBy3hICvJ8mpxIhsAjlpye8zMXwzadLpJO6W30MJqT+VVjU7lg2BtpTGQGNMqSF3Khpf45kiTrQKdcLoMoVji1uM9VVlJKPxVaEF76rULseosPRHrvk5DlFVuAORLXk2n4ovkV1V4Srws+RGIgKy0jmQ2BICIRdcgYwEQ08j1hyNBElacrN7WNCFGrIFU2iVoijtsj8SUya526MeK3MViCQchBDZMnL2jgR0e9l/dc4Qd20ertDHPugC3VcP2/VPqOXv4a+Sg2gf9KXZGOn85n/eQyY5WWbiqmxWJsTKvqLyOGXdUusJQU5l0kvSseHEateRMc8fwYCrfyju710E9sp4Nyk76tnUevH88cO7u9MvcjjW83Ybft9mfbrw/tmTB7s719+9eXUxPyKKUxk5229fv7x/59bVK5eePrr3MxzOcpPV86kps8XbOzduXrtc2t/7PuunyoGzqWZkjv+qE6szNFrnUytaTGebUYGPR4+VRiL/Muesld5it7cnOzm+/KfyL8fpRqDn3+5ZAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source srcset=&quot;/static/2b76b0c012e784333599f945dd5c3207/8ac56/jan-11.webp 240w,
/static/2b76b0c012e784333599f945dd5c3207/d3be9/jan-11.webp 480w,
/static/2b76b0c012e784333599f945dd5c3207/e46b2/jan-11.webp 960w,
/static/2b76b0c012e784333599f945dd5c3207/a9a89/jan-11.webp 1024w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/webp&quot;&gt;
          &lt;source srcset=&quot;/static/2b76b0c012e784333599f945dd5c3207/8ff5a/jan-11.png 240w,
/static/2b76b0c012e784333599f945dd5c3207/e85cb/jan-11.png 480w,
/static/2b76b0c012e784333599f945dd5c3207/d9199/jan-11.png 960w,
/static/2b76b0c012e784333599f945dd5c3207/2bef9/jan-11.png 1024w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/png&quot;&gt;
          &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/2b76b0c012e784333599f945dd5c3207/d9199/jan-11.png&quot; alt=&quot;page of january 11th, a teardrop at the bottom to indicate a sad memory, and the text: Your scared helplessness which slowly transitioned into anger, to violence and back to anxiousness again.&quot; title=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;a-postscript&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-postscript&quot; aria-label=&quot;a postscript permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A postscript&lt;/h2&gt;
&lt;p&gt;If you’ve read this far—thank you.
That alone means more than you know.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;- Rick, mastermindzh, lycan, xxxroosjexxx, and other alias’ you might know me from.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Infrastructure as Code - Simplifying My Homelab Setup with Portainer GitOps]]></title><description><![CDATA[How I've simplified my homelab by combining the ease of Unraid storage management with Portainer's GitOps feature to implement Infrastructure as Code.]]></description><link>https://www.rickvanlieshout.com/posts/2025/iac-part-2-my-homelab/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2025/iac-part-2-my-homelab/</guid><pubDate>Sat, 03 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After writing my last blog post about using Infrastructure as Code for uptime monitoring with UptimeKuma, I felt inspired to dive deeper into my broader homelab story.&lt;/p&gt;
&lt;h2 id=&quot;from-complexity-to-clarity&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#from-complexity-to-clarity&quot; aria-label=&quot;from complexity to clarity permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;From Complexity to Clarity&lt;/h2&gt;
&lt;p&gt;When I started building my homelab, it was all about experimenting and having fun. Kubernetes, Ansible, HA clusters spread across multiple nodes… I dove into everything headfirst. The concept of Infrastructure as Code (IaC), something I fell deeply in love with thanks to Kubernetes, quickly became the backbone of my ideal setup.&lt;/p&gt;
&lt;p&gt;Yet, as much as I enjoyed the complexity and elegance Kubernetes brought to my experiments, I soon realized something pretty obvious: when it comes to crucial services like Jellyfin for movies or Home Assistant for managing my smart home, the last thing I needed was an over-engineered, highly available Kubernetes cluster requiring constant babysitting.&lt;/p&gt;
&lt;h2 id=&quot;the-before-times&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-before-times&quot; aria-label=&quot;the before times permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Before Times&lt;/h2&gt;
&lt;p&gt;It reminded me of simpler times, the “before times”, before Docker and Kubernetes even existed. Back then, my homelab consisted of multiple Ubuntu servers, each handling different parts of my setup, along with a single, reliable main server named “Erebus,” using Greyhole for redundancy. Even when Docker came along (and later Kubernetes), I adopted them immediately for non-critical, experimental projects, but crucial services always remained comfortably on one stable server. After all, Kubernetes-level scalability was never really necessary for my home media or automation and I could still use all the benefits of Docker.&lt;/p&gt;
&lt;h2 id=&quot;hades-the-storage-behemoth&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hades-the-storage-behemoth&quot; aria-label=&quot;hades the storage behemoth permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hades, the Storage Behemoth&lt;/h2&gt;
&lt;p&gt;Today, this philosophy still holds true. My critical services run smoothly on a single Unraid server, my trusted main storage server named “Hades.” On Hades, it’s a pleasantly chaotic mix of Unraid’s Docker plugin, community apps, and various Docker Compose files. Each container has decentralized configuration variables, with updates effortlessly handled by Unraid’s auto-update plugin.&lt;/p&gt;
&lt;p&gt;Here’s the ironic twist: despite having Kubernetes nodes running non-critical, playful stuff, all my serious storage still ends up on Hades. Honestly, nothing else compares. Hades dwarfs every other node in my network storage-wise, think around 200TB of free space at any given time. Even Kubernetes relies heavily on Hades for its back-end storage.&lt;/p&gt;
&lt;h2 id=&quot;simplifying-with-portainer-gitops&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#simplifying-with-portainer-gitops&quot; aria-label=&quot;simplifying with portainer gitops permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Simplifying with Portainer GitOps&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACoElEQVR42mPg4dWDIF4+fV5efR4ePSiCCIKQPpjU4+PRFeDREebTF+fTlxE0kRE2YwCr0OcBquAzgKuDIz4+fSDi59MXBCJBU3FRawUxGwVpN1VJBxVRKwagCh4ubR4OdR5uHZB+PgM+fgOwNj1+PgMBPgMhfkNxYXNpbgOd2Kl61fv0Q1omnHzpENsqxqnHwMujKyjlIKoZxidgxsWsws2qzsupJcRvJCJgKiFkKSlkJSVsKSVoLsSirhNQr5E8V9OrrP/wY8vwWk5WNQYuVhXV2BnO234btR3Uyl5klL9WxSZXkNNQVMBGQsBaWMCMm11bXMXPMG2JTsgUw6iF1nErzMNWyyhFcHOqM3CzauokzfY/9bX43PuuK98iD/y2LN+kI2+3PCx+c1zKzrikVkcfJYtk27oL1rlHnMpv+FfdCsi/pq5XyMWhzsDPaaQfN997948ll94fvv0hdd1H08w1/rZBXyZ1/1+x4P/KBadLiy28i61Kj1uk7HHKPe+YdsYl7qi6Ti4XpxqDMK+tbsBkl1n3vCZcipl00bXlpkHwFB42tXwL70pbnzrHwCB1a0HlYNv8k+YxO23iT7olnvBNOaeqnQXSLCRoKyRkqaTiKqvgKKfsqqrmJihoDIxnRlZNBhYg0mBiVpVQ8jfwW2DgNiOpbF9k5mbXkLUKKnHcXJrAqDLk49W3sQ52cojwcI91dYkWFjbiBqYHcPQCER+vnoCAiZBIQE3t3OPHzmzbesjFJZ9fwIaPz4ABnDD0OTi02Nk1QYhDE2gtLyTZAdMZHzDN6QoIGHNyWWRlN506dS47p5mXzwpoHFANAyQZAo0BJyZgItGHpEo4CUU8OhwcmkBrWFnByQksywCxAZxC9RAJGxPxQlM+0AKoSl49AA5asdd3m2nxAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/581d0b13dcc75b2eb2c7a1d6da843d3f/8ac56/sync.webp 240w,
/static/581d0b13dcc75b2eb2c7a1d6da843d3f/d3be9/sync.webp 480w,
/static/581d0b13dcc75b2eb2c7a1d6da843d3f/e46b2/sync.webp 960w,
/static/581d0b13dcc75b2eb2c7a1d6da843d3f/f992d/sync.webp 1440w,
/static/581d0b13dcc75b2eb2c7a1d6da843d3f/0abaa/sync.webp 1536w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/581d0b13dcc75b2eb2c7a1d6da843d3f/8ff5a/sync.png 240w,
/static/581d0b13dcc75b2eb2c7a1d6da843d3f/e85cb/sync.png 480w,
/static/581d0b13dcc75b2eb2c7a1d6da843d3f/d9199/sync.png 960w,
/static/581d0b13dcc75b2eb2c7a1d6da843d3f/07a9c/sync.png 1440w,
/static/581d0b13dcc75b2eb2c7a1d6da843d3f/71c1d/sync.png 1536w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/581d0b13dcc75b2eb2c7a1d6da843d3f/d9199/sync.png&quot;
            alt=&quot;AI generated image depicting the sync process described below&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Still, this fragmented setup felt manual and messy. I missed the simplicity and clarity of Infrastructure as Code. Thankfully, Portainer’s Ops feature came to my rescue, allowing me to blend the massive storage and ease of use from Unraid with structured IaC management. To fully leverage this, I registered for 3 free nodes of Portainer Business Edition, unlocking their powerful GitOps feature.&lt;/p&gt;
&lt;p&gt;Portainer’s GitOps polls my private Git repository for updates to Docker Compose files at regular intervals, automatically deploying any changes. It seamlessly integrates with Docker Hub, pulling the latest container images and ensuring my stacks remain updated without manual intervention. This automation keeps my services fresh and secure with minimal effort.&lt;/p&gt;
&lt;p&gt;The UptimeKuma example from my last blog is one such stack I recently migrated to this new, cleaner workflow.&lt;/p&gt;
&lt;h2 id=&quot;the-best-of-both-worlds&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-best-of-both-worlds&quot; aria-label=&quot;the best of both worlds permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Best of Both Worlds&lt;/h2&gt;
&lt;p&gt;Now, I have the best of both worlds—a robust and neatly structured setup embracing Infrastructure as Code without sacrificing ease of use or storage headaches. In other words, I could keep the things I liked best about my Kubernetes (the predictability and IaC parts) and got rid of its worst (multiple nodes, manual updates).  &lt;/p&gt;
&lt;p&gt;On to the next adventure!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Infrastructure as code - Service uptime monitoring]]></title><description><![CDATA[In this post I demonstrate how I've moved from an old and simple UptimeKuma setup to a setup with AutoKuma so I can register my monitors with 'infrastructure as code']]></description><link>https://www.rickvanlieshout.com/posts/2025/infrastructure-as-code-uptime-monitoring/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2025/infrastructure-as-code-uptime-monitoring/</guid><pubDate>Sat, 18 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If there’s one thing I’ve always embraced, it’s the philosophy of working smarter, not harder. Infrastructure as Code (IaC) has been one of the cornerstones of my career. a perfect blend of laziness and the pursuit of predictability. From my earliest days experimenting with Docker back in 2014 to leading a platform team at my current company, IaC has proven invaluable for simplifying complexity, ensuring reproducibility, and enabling automation.&lt;/p&gt;
&lt;p&gt;Below you’ll find my journey and why I think every engineer should embrace it, eventually walking you through one of the latest automations I set up at home: Automatically creating uptime monitors in UptimeKuma based on Docker labels.&lt;/p&gt;
&lt;h2 id=&quot;the-early-days-discovering-docker&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-early-days-discovering-docker&quot; aria-label=&quot;the early days discovering docker permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Early Days: Discovering Docker&lt;/h2&gt;
&lt;p&gt;Back in 2014, I stumbled upon Docker, and it was a game-changer. At the time, I was frustrated by the manual and error-prone process of setting up environments for my code (especially on other people’s machines…). Docker offered a way to reliably recreate these environments with simple, declarative configuration files. Suddenly, I could spin up a development environment in minutes and be confident it would work exactly the same on another machine.&lt;/p&gt;
&lt;p&gt;In 2017, I taught several university classes on Docker, emphasizing the importance of reproducibility. My students learned how to containerize applications and ensure their work could be shared and run anywhere, regardless of underlying infrastructure. Reproducibility wasn’t just a technical advantage; it became a mindset I encouraged in every project.&lt;/p&gt;
&lt;p&gt;And yes.. for those that know me well, I did go overboard in some of the details and even ended up explaining the entire Copy-On-Write (COW) nature of the Docker filesystem in those classes… But ah well, people learned a lot :P.&lt;/p&gt;
&lt;h2 id=&quot;home-servers-the-personal-lab&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#home-servers-the-personal-lab&quot; aria-label=&quot;home servers the personal lab permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Home Servers: The Personal Lab&lt;/h2&gt;
&lt;p&gt;My passion for IaC extended to my home servers. By 2017, nearly everything I ran at home was Docker-based. I created dozens of bash scripts and system services to orchestrate my personal infrastructure. Whether it was media servers, backup systems, or development environments, everything was automated and version-controlled. Even my own computers mostly became IaC based as I figured out that part of the Linux community was saving their setups (and install instructions, usually) in so called “dotfiles”. To this day you can still find my setup (and its changes when I switch machine) in my &lt;a href=&quot;https://github.com/Mastermindzh/dotfiles/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Dotfiles on Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All in all, my home setup became a sandbox for testing new ideas and tools, many of which eventually found their way into my professional work as well.&lt;/p&gt;
&lt;h2 id=&quot;scaling-iac-in-the-workplace&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#scaling-iac-in-the-workplace&quot; aria-label=&quot;scaling iac in the workplace permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Scaling IaC in the Workplace&lt;/h2&gt;
&lt;p&gt;At my current company, I introduced Docker about eight years ago. It was a gradual process, but within a year, we had our first Kubernetes cluster running. This transition wasn’t just about adopting new tools; it was about embedding the principles of IaC into the organization’s culture.&lt;/p&gt;
&lt;p&gt;Over time, I spearheaded the creation of a dedicated platform team. With an architect/Product Owner and four DevOps engineers, this team took IaC to the next level. They implemented robust CI/CD pipelines, infrastructure monitoring, and scalable deployment patterns. Some of these practices mirrored what I had done at home, while others were tailored to the unique needs of the business. The result was a resilient and predictable infrastructure that supports rapid development and deployment.&lt;/p&gt;
&lt;h2 id=&quot;setting-up-uptime-monitoring-with-uptimekuma&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-uptime-monitoring-with-uptimekuma&quot; aria-label=&quot;setting up uptime monitoring with uptimekuma permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting Up Uptime Monitoring with UptimeKuma&lt;/h2&gt;
&lt;p&gt;One of the most satisfying aspects of IaC is the ability to automate even the smallest tasks. Take uptime monitoring, for example. At home and at work, ensuring that services are available is critical. Recently, I’ve been using my old UptimeKuma instance, a self-hosted monitoring tool that’s as powerful as it is user-friendly, a lot more after introducing it to some friends (who started homelabbing) and at work.&lt;/p&gt;
&lt;p&gt;Setting up UptimeKuma is straightforward, you can simply use our old friend Docker:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;docker run -d --name uptime-kuma -v ./data/uptimekuma:/app/data -p 3001:3001 louislam/uptime-kuma&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And access the Dashboard by navigating to &lt;a href=&quot;http://localhost:3001&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;http://localhost:3001&lt;/a&gt; to configure your monitors.
But that isn’t automatic enough for me, I like to put my things in compose files for home usage.&lt;/p&gt;
&lt;h2 id=&quot;automating-uptime-monitors-with-autokuma&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#automating-uptime-monitors-with-autokuma&quot; aria-label=&quot;automating uptime monitors with autokuma permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Automating uptime monitors with AutoKuma&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/BigBoot/AutoKuma&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;AutoKuma&lt;/a&gt; allows us to set labels on our Docker containers that will then automatically generate monitors in UptimeKuma.&lt;/p&gt;
&lt;p&gt;One of my containers (UptimeKuma actually) has the following labels attached:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;kuma.monitoring.group.name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Monitoring&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;kuma.uptime_kuma.http.parent_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;monitoring&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;kuma.uptime_kuma.http.name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Kuma status monitoring&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;kuma.uptime_kuma.http.url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;http://${HOST_IP}:3001&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This actually does 2 things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;creates a group with the &lt;em&gt;key/id&lt;/em&gt; &lt;code class=&quot;language-text&quot;&gt;monitoring&lt;/code&gt; and the name &lt;code class=&quot;language-text&quot;&gt;Monitoring&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Adds a monitor with the &lt;em&gt;key/id&lt;/em&gt; &lt;code class=&quot;language-text&quot;&gt;uptime_kuma&lt;/code&gt; to UptimeKuma with the type &lt;code class=&quot;language-text&quot;&gt;http&lt;/code&gt;, name &lt;code class=&quot;language-text&quot;&gt;Kuma status monitoring&lt;/code&gt;, and url &lt;code class=&quot;language-text&quot;&gt;http://${HOST_IP}:3001&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Adding these labels, whilst AutoKuma is running and configured to pick up labels starting with &lt;code class=&quot;language-text&quot;&gt;kuma&lt;/code&gt; is enough for monitors to show up (after restarting the containers).
All in all, my &lt;code class=&quot;language-text&quot;&gt;docker-compose.yml&lt;/code&gt; file for both UptimeKuma and AutoKuma now looks like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;autokuma&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ghcr.io/bigboot/autokuma&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;master
    &lt;span class=&quot;token key atrule&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; unless&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;stopped
    &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;AUTOKUMA__KUMA__URL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; http&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;HOST_IP&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3001&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;AUTOKUMA__KUMA__USERNAME&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;KUMA_USERNAME&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;AUTOKUMA__KUMA__PASSWORD&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;KUMA_PASSWORD&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;AUTOKUMA__TAG_NAME&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; AutoKuma
      &lt;span class=&quot;token key atrule&quot;&gt;AUTOKUMA__TAG_COLOR&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#42C0FB&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;AUTOKUMA__DEFAULT_SETTINGS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;docker.docker_container&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;container_name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;http.max_redirects&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;
        &lt;span class=&quot;token important&quot;&gt;*.max_retries:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;AUTOKUMA__DOCKER__LABEL_PREFIX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; kuma
      &lt;span class=&quot;token key atrule&quot;&gt;AUTOKUMA__MIGRATE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;APP_DATA&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;/autokuma&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/data
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;DOCKER_SOCKET&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/var/run/docker.sock
    &lt;span class=&quot;token key atrule&quot;&gt;depends_on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; kuma

  &lt;span class=&quot;token key atrule&quot;&gt;kuma&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; louislam/uptime&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;kuma&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;APP_DATA&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;/uptimekuma&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/app/data
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;DOCKER_SOCKET&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/var/run/docker.sock
    &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; 3001&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3001&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; unless&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;stopped
    &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;kuma.monitoring.group.name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Monitoring&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;kuma.uptime_kuma.http.parent_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;monitoring&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;kuma.uptime_kuma.http.name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Kuma status monitoring&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;kuma.uptime_kuma.http.url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;http://${HOST_IP}:3001&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;problems-the-compose-file-doesnt-work-o&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#problems-the-compose-file-doesnt-work-o&quot; aria-label=&quot;problems the compose file doesnt work o permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Problems… the compose file doesn’t work :O&lt;/h2&gt;
&lt;p&gt;If you’d try to run the compose file in the previous chapter, even after replacing all the variables, things likely still won’t work.
This is because AutoKuma relies on the credentials for UptimeKuma which we setup during the initial launch of UptimeKuma.
Unfortunately, that account is the only account we can currently set up in UptimeKuma since it doesn’t have user management.
And yes, that means we &lt;strong&gt;have&lt;/strong&gt; to use these same credentials to get AutoKuma to work, which also prohibits us from enabling MFA.&lt;/p&gt;
&lt;p&gt;Anyway, after setting up the kuma account, simply adjust both the &lt;code class=&quot;language-text&quot;&gt;KUMA_USERNAME&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;KUMA_PASSWORD&lt;/code&gt; variables and restart the containers.
After doing so we should see the monitor appear in UptimeKuma:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 18.75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAABcSAAAXEgFnn9JSAAAAyklEQVR42k3Lu2rDMBhAYUMhTuzqrl93W7KtOJETSMkUaIdCoXTv3Pd/japb4RvOcprL+yv4yMBzFbiuBmWTtBFsFDYyPYj/zKBtCtdy+fmY77cmfz2EG+tMpeuxRFyN6zksR+Vjjlkw2HV435Pq8IfWaFu0e+rbPWpAJbATuEnaBC5x5bkJKiRux8+5vNjYEkEYYAqIy47wDjGsdUdFjcZdT4SaAxKY6WXdpPdumE/bbcplXM4plxrTscx5G7ZCjMPCrN9v1PpnDL9tnhgePrx1vwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/fb8b1029d82e4e4f679b667bce9df3bd/8ac56/uptimekuma.webp 240w,
/static/fb8b1029d82e4e4f679b667bce9df3bd/d3be9/uptimekuma.webp 480w,
/static/fb8b1029d82e4e4f679b667bce9df3bd/e46b2/uptimekuma.webp 960w,
/static/fb8b1029d82e4e4f679b667bce9df3bd/f992d/uptimekuma.webp 1440w,
/static/fb8b1029d82e4e4f679b667bce9df3bd/882b9/uptimekuma.webp 1920w,
/static/fb8b1029d82e4e4f679b667bce9df3bd/d3d72/uptimekuma.webp 2880w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/fb8b1029d82e4e4f679b667bce9df3bd/8ff5a/uptimekuma.png 240w,
/static/fb8b1029d82e4e4f679b667bce9df3bd/e85cb/uptimekuma.png 480w,
/static/fb8b1029d82e4e4f679b667bce9df3bd/d9199/uptimekuma.png 960w,
/static/fb8b1029d82e4e4f679b667bce9df3bd/07a9c/uptimekuma.png 1440w,
/static/fb8b1029d82e4e4f679b667bce9df3bd/29114/uptimekuma.png 1920w,
/static/fb8b1029d82e4e4f679b667bce9df3bd/d9ed5/uptimekuma.png 2880w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/fb8b1029d82e4e4f679b667bce9df3bd/d9199/uptimekuma.png&quot;
            alt=&quot;a screenshot of the UptimeKuma monitors that were automatically created with AutoKuma&quot;
            title=&quot;neat!&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;neat!&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-future-of-iac&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-future-of-iac&quot; aria-label=&quot;the future of iac permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Future of IaC&lt;/h2&gt;
&lt;p&gt;Infrastructure as Code isn’t just a technical approach; it’s a philosophy that prioritizes automation, reproducibility, and simplicity. Whether you’re managing a home lab or a global platform, IaC provides the tools and practices to build resilient systems with minimal effort.&lt;/p&gt;
&lt;p&gt;For me, IaC has been a journey of continuous learning and experimentation. From Docker to Kubernetes, from bash scripts to dedicated platform teams, the principles remain the same: automate everything, document everything, and embrace the predictability that code brings to infrastructure.&lt;/p&gt;
&lt;p&gt;If you haven’t already, give UptimeKuma and AutoKuma a try. Their combination is an excellent example of how IaC can simplify even the most mundane tasks, leaving you more time to focus on what really matters… or just to be a little lazier.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[LegoLeague - Battling it out with little robots made from Lego]]></title><description><![CDATA[At INFORIT we love to play! Be it DND, board games or in this case... Legos. Read on to find out what we've been up to this past summer vacation]]></description><link>https://www.rickvanlieshout.com/posts/2023/lego-league/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2023/lego-league/</guid><pubDate>Mon, 18 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 37.083333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAHABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAID/8QAFQEBAQAAAAAAAAAAAAAAAAAAAgP/2gAMAwEAAhADEAAAAb2IsAv/xAAYEAEAAwEAAAAAAAAAAAAAAAABAAIRIf/aAAgBAQABBQLa7UInf//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABcQAQADAAAAAAAAAAAAAAAAAAEQESH/2gAIAQEABj8Cxan/xAAZEAEAAgMAAAAAAAAAAAAAAAABABExUWH/2gAIAQEAAT8hQAjqOytalCBan//aAAwDAQACAAMAAAAQ8C//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8QjI//xAAXEQEBAQEAAAAAAAAAAAAAAAABABEh/9oACAECAQE/EE7a3//EABoQAAIDAQEAAAAAAAAAAAAAAAABESExUZH/2gAIAQEAAT8QQ/WcQJ3ePG+sREY6s//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/148c8bb69bbd92a56200542531139fc4/8ac56/board.webp 240w,
/static/148c8bb69bbd92a56200542531139fc4/d3be9/board.webp 480w,
/static/148c8bb69bbd92a56200542531139fc4/e46b2/board.webp 960w,
/static/148c8bb69bbd92a56200542531139fc4/f992d/board.webp 1440w,
/static/148c8bb69bbd92a56200542531139fc4/882b9/board.webp 1920w,
/static/148c8bb69bbd92a56200542531139fc4/0084b/board.webp 3860w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/148c8bb69bbd92a56200542531139fc4/09b79/board.jpg 240w,
/static/148c8bb69bbd92a56200542531139fc4/7cc5e/board.jpg 480w,
/static/148c8bb69bbd92a56200542531139fc4/6a068/board.jpg 960w,
/static/148c8bb69bbd92a56200542531139fc4/644c5/board.jpg 1440w,
/static/148c8bb69bbd92a56200542531139fc4/0f98f/board.jpg 1920w,
/static/148c8bb69bbd92a56200542531139fc4/6a7e6/board.jpg 3860w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/148c8bb69bbd92a56200542531139fc4/6a068/board.jpg&quot;
            alt=&quot;The 2023 LegoLeague play-mat laid out on an improvised table&quot;
            title=&quot;The 2023 LegoLeague battle board&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;The 2023 LegoLeague battle board&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;A little before the start of the summer period my colleague Jan-Kees came up to me and proposed the idea of an internal LegoLeague. After a little bit of back-and-forth about what LegoLeague exactly was I agreed it would be a great idea to bring some colleagues together and have a little fun during work hours.
Pretty much right away excitement got the better of us and we started drafting a plan… when? where? how? prizes? teams!?? A lot.
But First…&lt;/p&gt;
&lt;h2 id=&quot;what-is-legoleague&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-legoleague&quot; aria-label=&quot;what is legoleague permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is LegoLeague?&lt;/h2&gt;
&lt;p&gt;LegoLeague is an event where teams come together to build, program and test a &lt;a href=&quot;https://www.lego.com/en-nl/product/lego-education-spike-prime-set-45678&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Lego Spike robot&lt;/a&gt; to perform autonomous tasks. The tasks range from collecting “power cores”, pushing or pulling levers, to dropping Lego blocks in a hopper to get some bonus points.&lt;/p&gt;
&lt;p&gt;All of this is accompanied by a theme, in our case energy production, which adds a layer of fun to solving these challenges.
The video below shows a teaser of 2022-2023’s “SuperPowered” event, the very thing we based our LegoLeague on:&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/okR1AMFNV3Q?si=cq4KqyVVK6sAsCpY&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt; &lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;For each task a team completes successfully they will score points.
Teams get 2 minutes and 30 seconds (2:30) to score as many points as they can.
The video below outlines some of the challenges the teams have available to them with a little explanation of how they function and even some info on the scores. This video is especially useful for teams that don’t want to peruse the entire rule book but still wanted to figure out an optimal strategy.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/ILTjo0LHZQA?si=YqJvSYX3JNclPPeJ&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt; &lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;To build the robot each team gets a &lt;a href=&quot;https://www.lego.com/nl-nl/product/lego-education-spike-prime-set-45678&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Lego Spike Prime set&lt;/a&gt; and nothing more!
In the original event, teams had access to a little more Lego in various kits but for our little event at &lt;a href=&quot;https://inforit.nl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;INFORIT&lt;/a&gt;, we were only able to source the basic kits in time.
Having said that, we wouldn’t have been able to get our hands on any of the kits at all if it wasn’t for the &lt;a href=&quot;https://www.pretweesp.nl/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;“PReT” organization in Weesp&lt;/a&gt;. Thanks guys!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 649px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 70.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsSAAALEgHS3X78AAACd0lEQVR42nVS+0/TUBTeP2T8K/hBExcTE02UH1CmicEXBmMMJJiosGS8EiEBBGNkgCwaAR8BB1EMDPaA0T26ruu6la3dymB0bXe7ru2t7RZkin65uffc3POd79xzjkU/AWywFR1WZKnIF0lN4Y5fGx1MWP68qlAVJYEqstE9MhiPIbs7GyQREIQS1BT9FGpkqJlapXU266fSZAILohEkGtlFowgaI+LxZJbw8dkxXaH+SrCubJKhTBxEHiTQbYJIEgksmaKpFF5ILebijnjwHKTvmHnXZE6lDVVjk3OjXLSZyaToTJRF+wvo431vm3Wy59bSTb20oNXdIPzHn42oFUne3homvE16+Gx6q2svjW6ufHG4XqEpnyKBUATx+T21CJqmmmIWCKGiKgCIosjLQCDZ8rrbCn9YaMyVjPuZ1LZeFt1B9F5P+1Bve1vLxdjUODjk62oWni+VyyLHHZUM8ByoQqWIlcL9DIUAIfdpfnzCdhn/+cEx8mRwuHXa4+5tap49cz3m95vKAABB4I3diFKVK7osIUJlWdRzBD49aBvu6/xsv7Ezb0+ms2sba9c6Xtha7g887PruXlVVxaKqqkFTVFUSBSRDd+8Vm7x4hzdE4qH3g48+jtkK+Uzfm9cTkz2x0PKue3XW8ZLm9uHvghmyRnfmZpyjrrnWzfDbzQCF+vYPOYLMvpuZbLU1dz599rz79oj9LlNggZEdbKj24uLC0NBAOBIusDlwdGC0g8t70thXllqLRQNXr1yyXji/9G0lQ+er1WqtUvCETJJJhmEax1eDMI87Gcxp2Akc2wn4JABqDhD+r8+1VX8+Po3RNWHajbQ6+RcfttmOO+fWRgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/7ab436f5a04063b5524553dbb05cb944/8ac56/lego-spike-set.webp 240w,
/static/7ab436f5a04063b5524553dbb05cb944/d3be9/lego-spike-set.webp 480w,
/static/7ab436f5a04063b5524553dbb05cb944/df8c5/lego-spike-set.webp 649w&quot;
              sizes=&quot;(max-width: 649px) 100vw, 649px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/7ab436f5a04063b5524553dbb05cb944/8ff5a/lego-spike-set.png 240w,
/static/7ab436f5a04063b5524553dbb05cb944/e85cb/lego-spike-set.png 480w,
/static/7ab436f5a04063b5524553dbb05cb944/7762d/lego-spike-set.png 649w&quot;
            sizes=&quot;(max-width: 649px) 100vw, 649px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/7ab436f5a04063b5524553dbb05cb944/7762d/lego-spike-set.png&quot;
            alt=&quot;A Lego spike set&quot;
            title=&quot;A Lego spike set laid out on display&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;A Lego spike set laid out on display&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;As for the programming… Teams are free to use either ”&lt;a href=&quot;https://scratch.mit.edu/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;scratch&lt;/a&gt;” or “Python” to program their robots.
Scratch being much easier for those who don’t spend all day behind their computer working on software development whilst Python allows for more flexibility in what can be achieved.
Spoiler alert: all teams chose scratch, it’s much more accessible for non-developers!&lt;/p&gt;
&lt;h2 id=&quot;the-competition-at-inforit&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-competition-at-inforit&quot; aria-label=&quot;the competition at inforit permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The competition at INFORIT&lt;/h2&gt;
&lt;p&gt;So yeah, we now know what a LegoLeague is and we have the approval to host the competition at &lt;a href=&quot;https://inforit.nl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;INFORIT&lt;/a&gt;, now what?
Well, Jan-Kees got to work building the arena and setting it up and I set out to gather team members. Given that it was the summer break I had to hustle to get teams together but eventually we managed to create some beautiful teams.&lt;/p&gt;
&lt;p&gt;Fortunately, &lt;a href=&quot;https://inforit.nl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;INFORIT&lt;/a&gt; values employee happiness, autonomy and continuous improvement. As such I was able to offer the 2 Friday afternoons free of day-to-day work, to work on the robot whilst providing catering, music, and the like to the teams whilst they are participating!&lt;/p&gt;
&lt;p&gt;In the end, we were successful in creating 4 teams of at least 3 people who were all mixed with developers and non-developers to keep the balance fair. Meanwhile, Jan-Kees also finished building the arena which you can see in the header of this blog or the pictures in the picture section.&lt;/p&gt;
&lt;h2 id=&quot;pictures&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pictures&quot; aria-label=&quot;pictures permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pictures&lt;/h2&gt;
&lt;p&gt;Of course, we’ve taken loads of pictures during the event but those are mostly for internal use.
Below I’ve included some pictures of the event that are all cleared for social media distribution with a little description of what’s happening in each picture to, hopefully, convey some of the vibes of the event itself.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQBAgP/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABaxlWRguS/wD/xAAbEAABBQEBAAAAAAAAAAAAAAACAAEDERIEE//aAAgBAQABBQKTACAWzxmuiij2RL1df//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABgRAAIDAAAAAAAAAAAAAAAAAAABESFR/9oACAECAQE/AaJWn//EABsQAAIBBQAAAAAAAAAAAAAAAAABEBEhMkFx/9oACAEBAAY/Armaq9Qjkf/EABsQAQACAwEBAAAAAAAAAAAAAAEAETFxkUFh/9oACAEBAAE/IcEd3EawwDyAavhcKq/agwcIq5r5P//aAAwDAQACAAMAAAAQjN//xAAXEQEAAwAAAAAAAAAAAAAAAAABEBEx/9oACAEDAQE/EDSo/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAR8P/aAAgBAgEBPxBAbdMv/8QAHRAAAgICAwEAAAAAAAAAAAAAAREAITGBQVGRwf/aAAgBAQABPxC4CBFEupn7popvPk+KVEiCKJZY74hrFADdYY5MWhVDaf/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f8f3722f6c32bfd285309dc4f2a7e768/8ac56/robot-warrior.webp 240w,
/static/f8f3722f6c32bfd285309dc4f2a7e768/d3be9/robot-warrior.webp 480w,
/static/f8f3722f6c32bfd285309dc4f2a7e768/e46b2/robot-warrior.webp 960w,
/static/f8f3722f6c32bfd285309dc4f2a7e768/f992d/robot-warrior.webp 1440w,
/static/f8f3722f6c32bfd285309dc4f2a7e768/882b9/robot-warrior.webp 1920w,
/static/f8f3722f6c32bfd285309dc4f2a7e768/ab976/robot-warrior.webp 4080w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f8f3722f6c32bfd285309dc4f2a7e768/09b79/robot-warrior.jpg 240w,
/static/f8f3722f6c32bfd285309dc4f2a7e768/7cc5e/robot-warrior.jpg 480w,
/static/f8f3722f6c32bfd285309dc4f2a7e768/6a068/robot-warrior.jpg 960w,
/static/f8f3722f6c32bfd285309dc4f2a7e768/644c5/robot-warrior.jpg 1440w,
/static/f8f3722f6c32bfd285309dc4f2a7e768/0f98f/robot-warrior.jpg 1920w,
/static/f8f3722f6c32bfd285309dc4f2a7e768/71254/robot-warrior.jpg 4080w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f8f3722f6c32bfd285309dc4f2a7e768/6a068/robot-warrior.jpg&quot;
            alt=&quot;One of the competing robots on display. This one seems to have a little grabby arm to perform the tasks with.&quot;
            title=&quot;one of the competing robots&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;one of the competing robots&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEA//EABYBAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABMLUwlEF//8QAHBAAAgEFAQAAAAAAAAAAAAAAAQIAAxITIzEy/9oACAEBAAEFAqflztyGdjLeXDK3/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8BqP/EABwQAAEDBQAAAAAAAAAAAAAAAAARITEBAhAyQf/aAAgBAQAGPwK7aTrYaaCCH//EABkQAQADAQEAAAAAAAAAAAAAAAEAESFBUf/aAAgBAQABPyFOx4HaiiHAI24tS9HggLfai6jXKZ//2gAMAwEAAgADAAAAELwv/8QAFxEBAAMAAAAAAAAAAAAAAAAAAAERMf/aAAgBAwEBPxCNW//EABYRAQEBAAAAAAAAAAAAAAAAAAABIf/aAAgBAgEBPxDcQ//EABwQAQADAAIDAAAAAAAAAAAAAAEAESExQVFhcf/aAAgBAQABPxCxnvjqqaVzWygJYKV4r5kAgYcNYJFpdPa1HEjIXT2Q40OjVT//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/a40033b1809d2ca79b6a0a4f7593027a/8ac56/lex-counting.webp 240w,
/static/a40033b1809d2ca79b6a0a4f7593027a/d3be9/lex-counting.webp 480w,
/static/a40033b1809d2ca79b6a0a4f7593027a/e46b2/lex-counting.webp 960w,
/static/a40033b1809d2ca79b6a0a4f7593027a/f992d/lex-counting.webp 1440w,
/static/a40033b1809d2ca79b6a0a4f7593027a/882b9/lex-counting.webp 1920w,
/static/a40033b1809d2ca79b6a0a4f7593027a/ab976/lex-counting.webp 4080w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/a40033b1809d2ca79b6a0a4f7593027a/09b79/lex-counting.jpg 240w,
/static/a40033b1809d2ca79b6a0a4f7593027a/7cc5e/lex-counting.jpg 480w,
/static/a40033b1809d2ca79b6a0a4f7593027a/6a068/lex-counting.jpg 960w,
/static/a40033b1809d2ca79b6a0a4f7593027a/644c5/lex-counting.jpg 1440w,
/static/a40033b1809d2ca79b6a0a4f7593027a/0f98f/lex-counting.jpg 1920w,
/static/a40033b1809d2ca79b6a0a4f7593027a/71254/lex-counting.jpg 4080w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/a40033b1809d2ca79b6a0a4f7593027a/6a068/lex-counting.jpg&quot;
            alt=&quot;A contestant is looking at the board figuring out where the robot needs to go&quot;
            title=&quot;A contestant calculating exactly where to go. Such a pathfinder!&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;A contestant calculating exactly where to go. Such a pathfinder!&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMCBAX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAv/aAAwDAQACEAMQAAABdXi+WQMF/wD/xAAYEAEBAAMAAAAAAAAAAAAAAAABAgADEv/aAAgBAQABBQJrqUR6wuR2I6gDP//EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAEDAQE/ASf/xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BrX//xAAbEAACAQUAAAAAAAAAAAAAAAAAEQECECExUf/aAAgBAQAGPwLBNbs5ZK4aZ//EABsQAAICAwEAAAAAAAAAAAAAAAERACExQVGh/9oACAEBAAE/ITktcDeqNdiih7GIAc1Da40WIDRb2f/aAAwDAQACAAMAAAAQB8//xAAWEQEBAQAAAAAAAAAAAAAAAAAAIYH/2gAIAQMBAT8Qpr//xAAYEQACAwAAAAAAAAAAAAAAAAAAAREhcf/aAAgBAgEBPxCrhGD/xAAeEAEAAwABBQEAAAAAAAAAAAABABEhMUFRcYGx8P/aAAgBAQABPxCqgNU0RsOdeiRP1xQ8B1Ws7xo5D1AiEVFrzA4U1Xyf/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/98f7af5892befbf4a920666518cd4c5e/8ac56/testing-coding-repeat.webp 240w,
/static/98f7af5892befbf4a920666518cd4c5e/d3be9/testing-coding-repeat.webp 480w,
/static/98f7af5892befbf4a920666518cd4c5e/e46b2/testing-coding-repeat.webp 960w,
/static/98f7af5892befbf4a920666518cd4c5e/f992d/testing-coding-repeat.webp 1440w,
/static/98f7af5892befbf4a920666518cd4c5e/882b9/testing-coding-repeat.webp 1920w,
/static/98f7af5892befbf4a920666518cd4c5e/ab976/testing-coding-repeat.webp 4080w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/98f7af5892befbf4a920666518cd4c5e/09b79/testing-coding-repeat.jpg 240w,
/static/98f7af5892befbf4a920666518cd4c5e/7cc5e/testing-coding-repeat.jpg 480w,
/static/98f7af5892befbf4a920666518cd4c5e/6a068/testing-coding-repeat.jpg 960w,
/static/98f7af5892befbf4a920666518cd4c5e/644c5/testing-coding-repeat.jpg 1440w,
/static/98f7af5892befbf4a920666518cd4c5e/0f98f/testing-coding-repeat.jpg 1920w,
/static/98f7af5892befbf4a920666518cd4c5e/71254/testing-coding-repeat.jpg 4080w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/98f7af5892befbf4a920666518cd4c5e/6a068/testing-coding-repeat.jpg&quot;
            alt=&quot;two teams continuing to test their implementations&quot;
            title=&quot;code -&amp;gt; test -&amp;gt; repeat. Soooo important&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;code -&amp;gt; test -&amp;gt; repeat. Soooo important&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 59.583333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAACGUlEQVR42l1SaW/aQBD13+7Xqr+g6qeqapVKrVKoQkmUViAEgdSUxAn3GYixg8GYwzLGx97u2KQo6uxqtbMz83Z235PcdQVjn1JGj0YOk8AES06SFeODS5IQbCScuEkqDAYe51RwxjgAMiY4pDLOKOOcCxhxBDJYnC5RqI4BIEw5C0RId2vLavV9yyeasW4OoAZpNrK3u2F/rmsu8rZT0994TEQSWZlkNiVLi5qG8Xj/YJrzLxnlm1zuaKFcG6cvFub8cyqoVifbakHOvdMn6fFttdW78dBaohEnEw0rNWzqo3qza03R6Sdxmd012kGppueLCz9UPvbVXN/pytf5k/263ZPvCuVfnj+E4gi3RmHqOyXBTutb/eY2n3r6eqb8uLaLpebpe31YNHr6Up9Y90q98tN1jEVnaI7HlLoS/ArZ7fGjihyDOzu2tNVyVcn8OflQsMp5O/tmMVSCdtZ7UDbdhe8OkK8ao9HyacbhzfE/Q70QbDPbGNZyPFtlzoKrjPDmqFf4ffl6bk9R6ZXbyflz6u1HBGvTuqzWCyJi0jONwMc+8BF1Nt7qvNI4T7eGD86gfJt/qy4aYpLqlTX5RoSBisNZ4HK0JwlVR+MxnYACxBVbWrpeH5euvIs7aExEkWmG5tLmMetAO7DOYCNR8kJYB5BEJFEkmIew4x06A1zQCyXHRmmiMITpfxZfTmIt0lhk/86eC17aX/x6kMLlserBAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/fc77c4b7f219b87b55dcad873a7823a4/8ac56/complicated.webp 240w,
/static/fc77c4b7f219b87b55dcad873a7823a4/d3be9/complicated.webp 480w,
/static/fc77c4b7f219b87b55dcad873a7823a4/e46b2/complicated.webp 960w,
/static/fc77c4b7f219b87b55dcad873a7823a4/f992d/complicated.webp 1440w,
/static/fc77c4b7f219b87b55dcad873a7823a4/c53a6/complicated.webp 1601w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/fc77c4b7f219b87b55dcad873a7823a4/8ff5a/complicated.png 240w,
/static/fc77c4b7f219b87b55dcad873a7823a4/e85cb/complicated.png 480w,
/static/fc77c4b7f219b87b55dcad873a7823a4/d9199/complicated.png 960w,
/static/fc77c4b7f219b87b55dcad873a7823a4/07a9c/complicated.png 1440w,
/static/fc77c4b7f219b87b55dcad873a7823a4/c3a47/complicated.png 1601w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/fc77c4b7f219b87b55dcad873a7823a4/d9199/complicated.png&quot;
            alt=&quot;a picture of a laptop screen with lots of scratch code blocks on it&quot;
            title=&quot;This team might have overcomplicated things a tad. Looks impressive though.&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;This team might have overcomplicated things a tad. Looks impressive though.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;winners-losers-etc&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#winners-losers-etc&quot; aria-label=&quot;winners losers etc permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Winners, losers, etc&lt;/h2&gt;
&lt;p&gt;In the end, this is still a competition. People competed hard to come out on top and 1 team did so successfully.
Congratulations guys!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUBA//EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAFk7oVFNJ//xAAaEAEAAgMBAAAAAAAAAAAAAAABAAIDESIS/9oACAEBAAEFAhqLau+YW7ciz0z/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPwGI/8QAGhAAAgMBAQAAAAAAAAAAAAAAAAERIjIQMf/aAAgBAQAGPwLUHsmiykqklz//xAAbEAADAQEAAwAAAAAAAAAAAAAAAREhUTGBof/aAAgBAQABPyGeTMzUS6moVePk2OGmRwAuE9n/2gAMAwEAAgADAAAAEMg//8QAFhEAAwAAAAAAAAAAAAAAAAAAAAER/9oACAEDAQE/EKio/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8QpT//xAAdEAEAAgEFAQAAAAAAAAAAAAABABEhMUFRYZFx/9oACAEBAAE/EOK3rq+u4O5qIczptKGJrDW7yAU1CC6fI89FLfYUUyN0R//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/827f2ea5869e958d9061b98b123d26c0/8ac56/winners.webp 240w,
/static/827f2ea5869e958d9061b98b123d26c0/d3be9/winners.webp 480w,
/static/827f2ea5869e958d9061b98b123d26c0/e46b2/winners.webp 960w,
/static/827f2ea5869e958d9061b98b123d26c0/f992d/winners.webp 1440w,
/static/827f2ea5869e958d9061b98b123d26c0/882b9/winners.webp 1920w,
/static/827f2ea5869e958d9061b98b123d26c0/ab976/winners.webp 4080w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/827f2ea5869e958d9061b98b123d26c0/09b79/winners.jpg 240w,
/static/827f2ea5869e958d9061b98b123d26c0/7cc5e/winners.jpg 480w,
/static/827f2ea5869e958d9061b98b123d26c0/6a068/winners.jpg 960w,
/static/827f2ea5869e958d9061b98b123d26c0/644c5/winners.jpg 1440w,
/static/827f2ea5869e958d9061b98b123d26c0/0f98f/winners.jpg 1920w,
/static/827f2ea5869e958d9061b98b123d26c0/71254/winners.jpg 4080w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/827f2ea5869e958d9061b98b123d26c0/6a068/winners.jpg&quot;
            alt=&quot;a group picture of all the contestants, some wearing their medals and carrying their candy prize&quot;
            title=&quot;All of our winners! (excluding myself 😢)&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;All of our winners! (excluding myself 😢)&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;nah-we-are-all-winners-in-the-end&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#nah-we-are-all-winners-in-the-end&quot; aria-label=&quot;nah we are all winners in the end permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Nah, we are all winners in the end&lt;/h2&gt;
&lt;p&gt;Having 4 teams gave us the unique opportunity to reward them all with something nice. The 3 teams that got podium places all got their medals and their rewards and the team in fourth place got their consolation prize.&lt;/p&gt;
&lt;p&gt;Luckily though, we’re all winners, even the Jury members and the organizers.
This event has brought us all closer together and improved the connection between our colleagues.
I, personally, had a blast and would love to do similar things in the future.&lt;/p&gt;
&lt;p&gt;That’s it again, thanks for reading and see you next time!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Flashing the LSI-9211 to IT mode using an EFI shell]]></title><description><![CDATA[Flashing the LSI-9211 used to be way more difficult, luckily the EFI shell makes this task a lot simpler!]]></description><link>https://www.rickvanlieshout.com/posts/2023/flashing-lsi-9211-with-efi/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2023/flashing-lsi-9211-with-efi/</guid><pubDate>Wed, 12 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been building a new storage-oriented server for a while now and have yet again decided to go with (3 +1 backup) LSI 9211 raid controllers.&lt;/p&gt;
&lt;p&gt;The reason I keep going for these specific raid controllers is quite simple. The card can theoretically support (8x500MB) 4GB/s in throughput divided over 8 drives (2x SFF-8087) which is near the maximum for consumer hard drives.&lt;/p&gt;
&lt;p&gt;Using 3 of these will allow me to use 24 drives in a single chassis without an expander whilst getting pretty good performance.
The fourth card that I got, and flashed, is simply used as a backup or debug card in case of any errors.&lt;/p&gt;
&lt;h2 id=&quot;downloading-the-files&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#downloading-the-files&quot; aria-label=&quot;downloading the files permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Downloading the files&lt;/h2&gt;
&lt;p&gt;Before we can start flashing we will need to download some files.
The table below lists all the files with a brief description of what we’ll use them for.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.broadcom.com/docs/12350820&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;EFI flashing utility&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Flashing utility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.broadcom.com/docs/12348628&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;EFI ROM image&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Card ROM file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.broadcom.com/docs/12350504&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;SAS2008 Firmware&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;IR and IT firmware for the 9211&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;prepping-the-flash-drive&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#prepping-the-flash-drive&quot; aria-label=&quot;prepping the flash drive permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Prepping the flash drive&lt;/h2&gt;
&lt;p&gt;Make sure that you have a flash drive that is &lt;strong&gt;32GB&lt;/strong&gt; or smaller and that it is formatted as &lt;strong&gt;FAT32&lt;/strong&gt;.
Next, we’ll add the following files to the &lt;strong&gt;root&lt;/strong&gt; of the flash drive:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Installer_P20_for_UEFI/sas2flash_efi_ebc_rel/sas2flash.efi&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;UEFI_BSD_P20/uefi_bsd_rel/Signed/x64sas2.efi&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;9210-8i_Package_P20_IR_IT_FW_BIOS_for_MSDOS_Windows/sasbios_rel/mptsas2.rom&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;9210-8i_Package_P20_IR_IT_FW_BIOS_for_MSDOS_Windows/Firmware/HBA_9210_8i_IT/2108it.bin&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;flashing-with-efi&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#flashing-with-efi&quot; aria-label=&quot;flashing with efi permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Flashing with EFI&lt;/h2&gt;
&lt;p&gt;Because we are going to flash using EFI we don’t really need anything besides the built-in EFI shell from our motherboard. Simply insert the flash drive and go into the BIOS or use the “select boot device” functionality to select the EFI shell:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.25%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAWzZmEiA/8QAGxABAAICAwAAAAAAAAAAAAAAAQACAxAREhT/2gAIAQEAAQUCcQnmCITvbi+S+v/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EAB0QAAECBwAAAAAAAAAAAAAAAAABMQIQERIhMqH/2gAIAQEABj8CwVu4PCObLL//xAAaEAADAQEBAQAAAAAAAAAAAAAAAREhQXHh/9oACAEBAAE/IVXO9lNkH6HnZeJiy8n0ZT//2gAMAwEAAgADAAAAEOAP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQIBAT8QCf/EABsQAQEBAAMBAQAAAAAAAAAAAAERACExsVFx/9oACAEBAAE/ELuNS/k5bZToU90O4fRDzBkg6ScYdCX7yq87/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/98b2b90bc53274fcd52c8cd076443092/8ac56/boot-selector.webp 240w,
/static/98b2b90bc53274fcd52c8cd076443092/d3be9/boot-selector.webp 480w,
/static/98b2b90bc53274fcd52c8cd076443092/e46b2/boot-selector.webp 960w,
/static/98b2b90bc53274fcd52c8cd076443092/f992d/boot-selector.webp 1440w,
/static/98b2b90bc53274fcd52c8cd076443092/882b9/boot-selector.webp 1920w,
/static/98b2b90bc53274fcd52c8cd076443092/b33a3/boot-selector.webp 4032w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/98b2b90bc53274fcd52c8cd076443092/09b79/boot-selector.jpg 240w,
/static/98b2b90bc53274fcd52c8cd076443092/7cc5e/boot-selector.jpg 480w,
/static/98b2b90bc53274fcd52c8cd076443092/6a068/boot-selector.jpg 960w,
/static/98b2b90bc53274fcd52c8cd076443092/644c5/boot-selector.jpg 1440w,
/static/98b2b90bc53274fcd52c8cd076443092/0f98f/boot-selector.jpg 1920w,
/static/98b2b90bc53274fcd52c8cd076443092/d2602/boot-selector.jpg 4032w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/98b2b90bc53274fcd52c8cd076443092/6a068/boot-selector.jpg&quot;
            alt=&quot;&amp;quot;picture of the monitor showing boot options&amp;quot;&quot;
            title=&quot;selecting the EFI shell boot option&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;selecting the EFI shell boot option&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;After the shell has booted successfully you can use the &lt;code class=&quot;language-text&quot;&gt;map&lt;/code&gt; command to see all available devices. In the image below you’ll see that my flash drive is listed as &lt;code class=&quot;language-text&quot;&gt;fs1&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.25%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEEAgP/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHEHScQw//EABkQAQACAwAAAAAAAAAAAAAAAAEAAhARIf/aAAgBAQABBQK3ZbCsV3P/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAUEAEAAAAAAAAAAAAAAAAAAAAg/9oACAEBAAY/Al//xAAZEAEBAQEBAQAAAAAAAAAAAAABABFBITH/2gAIAQEAAT8hJzZHMvIz9u5Df//aAAwDAQACAAMAAAAQiB//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8QkY//xAAYEAEBAQEBAAAAAAAAAAAAAAABABEhMf/aAAgBAQABPxBMcNsoFg8uVZy0OpE63//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/479276b6aafedc10c57e60cd8f24d5b6/8ac56/map-devices.webp 240w,
/static/479276b6aafedc10c57e60cd8f24d5b6/d3be9/map-devices.webp 480w,
/static/479276b6aafedc10c57e60cd8f24d5b6/e46b2/map-devices.webp 960w,
/static/479276b6aafedc10c57e60cd8f24d5b6/f992d/map-devices.webp 1440w,
/static/479276b6aafedc10c57e60cd8f24d5b6/882b9/map-devices.webp 1920w,
/static/479276b6aafedc10c57e60cd8f24d5b6/b33a3/map-devices.webp 4032w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/479276b6aafedc10c57e60cd8f24d5b6/09b79/map-devices.jpg 240w,
/static/479276b6aafedc10c57e60cd8f24d5b6/7cc5e/map-devices.jpg 480w,
/static/479276b6aafedc10c57e60cd8f24d5b6/6a068/map-devices.jpg 960w,
/static/479276b6aafedc10c57e60cd8f24d5b6/644c5/map-devices.jpg 1440w,
/static/479276b6aafedc10c57e60cd8f24d5b6/0f98f/map-devices.jpg 1920w,
/static/479276b6aafedc10c57e60cd8f24d5b6/d2602/map-devices.jpg 4032w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/479276b6aafedc10c57e60cd8f24d5b6/6a068/map-devices.jpg&quot;
            alt=&quot;A list of devices in the EFI shell&quot;
            title=&quot;a list of devices note that `fs1` is my flash drive&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;a list of devices note that `fs1` is my flash drive&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;To switch into the drive simply enter the drive name on the command line followed by a semicolon:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;efi&quot;&gt;&lt;pre class=&quot;language-efi&quot;&gt;&lt;code class=&quot;language-efi&quot;&gt;fs1:&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Next, we’ll determine that our adapters are available and we will simultaneously take note of their identifier, we can do so by issuing the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;efi&quot;&gt;&lt;pre class=&quot;language-efi&quot;&gt;&lt;code class=&quot;language-efi&quot;&gt;sas2flash.efi -listall&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.25%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMCBAX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAEzn1xZIP/EABoQAAICAwAAAAAAAAAAAAAAAAACAREDECH/2gAIAQEAAQUCyVIxQ09bX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABkQAAMAAwAAAAAAAAAAAAAAAAABIRARQf/aAAgBAQABPyHZZMwZ0PRH/9oADAMBAAIAAwAAABBI3//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAEDAQE/EIf/xAAWEQADAAAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8QSpD/xAAcEAEAAgEFAAAAAAAAAAAAAAABABEhMUFRcbH/2gAIAQEAAT8QCVGr7CJBTzBdygyib4sT/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/7cd1d44bbc8405bf19193b4151ce8318/8ac56/list-adapters.webp 240w,
/static/7cd1d44bbc8405bf19193b4151ce8318/d3be9/list-adapters.webp 480w,
/static/7cd1d44bbc8405bf19193b4151ce8318/e46b2/list-adapters.webp 960w,
/static/7cd1d44bbc8405bf19193b4151ce8318/f992d/list-adapters.webp 1440w,
/static/7cd1d44bbc8405bf19193b4151ce8318/882b9/list-adapters.webp 1920w,
/static/7cd1d44bbc8405bf19193b4151ce8318/b33a3/list-adapters.webp 4032w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/7cd1d44bbc8405bf19193b4151ce8318/09b79/list-adapters.jpg 240w,
/static/7cd1d44bbc8405bf19193b4151ce8318/7cc5e/list-adapters.jpg 480w,
/static/7cd1d44bbc8405bf19193b4151ce8318/6a068/list-adapters.jpg 960w,
/static/7cd1d44bbc8405bf19193b4151ce8318/644c5/list-adapters.jpg 1440w,
/static/7cd1d44bbc8405bf19193b4151ce8318/0f98f/list-adapters.jpg 1920w,
/static/7cd1d44bbc8405bf19193b4151ce8318/d2602/list-adapters.jpg 4032w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/7cd1d44bbc8405bf19193b4151ce8318/6a068/list-adapters.jpg&quot;
            alt=&quot;&amp;quot;list of adapters&amp;quot;&quot;
            title=&quot;a list of adapters, I flash them one at a time so I only have card &amp;#39;0&amp;#39; available to me&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;a list of adapters, I flash them one at a time so I only have card &amp;#39;0&amp;#39; available to me&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Next, we can empty the current firmware with the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;efi&quot;&gt;&lt;pre class=&quot;language-efi&quot;&gt;&lt;code class=&quot;language-efi&quot;&gt;sas2flash.efi -o -e 6&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.25%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAEzaI0UYX//xAAYEAADAQEAAAAAAAAAAAAAAAAAAQIREP/aAAgBAQABBQK3pZhY3z//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAUEAEAAAAAAAAAAAAAAAAAAAAg/9oACAEBAAY/Al//xAAZEAEBAQADAAAAAAAAAAAAAAABABEhMUH/2gAIAQEAAT8hDtPHCIk9mXlhv//aAAwDAQACAAMAAAAQ7y//xAAWEQEBAQAAAAAAAAAAAAAAAAAAETH/2gAIAQMBAT8QxX//xAAXEQEAAwAAAAAAAAAAAAAAAAAAAREh/9oACAECAQE/EI1T/8QAHBABAAICAwEAAAAAAAAAAAAAAQARITFBUXGB/9oACAEBAAE/EAzDXJGUiu5hzNIj7Atj7Eqf/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/3f61500a2135ae29ee383a242e0d4382/8ac56/empty-firmware.webp 240w,
/static/3f61500a2135ae29ee383a242e0d4382/d3be9/empty-firmware.webp 480w,
/static/3f61500a2135ae29ee383a242e0d4382/e46b2/empty-firmware.webp 960w,
/static/3f61500a2135ae29ee383a242e0d4382/f992d/empty-firmware.webp 1440w,
/static/3f61500a2135ae29ee383a242e0d4382/882b9/empty-firmware.webp 1920w,
/static/3f61500a2135ae29ee383a242e0d4382/b33a3/empty-firmware.webp 4032w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/3f61500a2135ae29ee383a242e0d4382/09b79/empty-firmware.jpg 240w,
/static/3f61500a2135ae29ee383a242e0d4382/7cc5e/empty-firmware.jpg 480w,
/static/3f61500a2135ae29ee383a242e0d4382/6a068/empty-firmware.jpg 960w,
/static/3f61500a2135ae29ee383a242e0d4382/644c5/empty-firmware.jpg 1440w,
/static/3f61500a2135ae29ee383a242e0d4382/0f98f/empty-firmware.jpg 1920w,
/static/3f61500a2135ae29ee383a242e0d4382/d2602/empty-firmware.jpg 4032w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/3f61500a2135ae29ee383a242e0d4382/6a068/empty-firmware.jpg&quot;
            alt=&quot;Showing the result of the erasing action&quot;
            title=&quot;bye, bye firmware 😢&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;bye, bye firmware 😢&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Now we’ll simply flash the new (IT-mode) firmware on it with the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;efi&quot;&gt;&lt;pre class=&quot;language-efi&quot;&gt;&lt;code class=&quot;language-efi&quot;&gt;sas2flash.efi -o -f 2108it.bin -b mptsas2.rom&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.25%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAQX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHOXVGLGB//xAAaEAACAgMAAAAAAAAAAAAAAAAAAQIDEBEx/9oACAEBAAEFAp6bswyXT//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABUQAQEAAAAAAAAAAAAAAAAAAAEg/9oACAEBAAY/Amv/xAAYEAEBAQEBAAAAAAAAAAAAAAABABEhgf/aAAgBAQABPyH21ocg5J1uoX//2gAMAwEAAgADAAAAEAsP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFhEAAwAAAAAAAAAAAAAAAAAAAAER/9oACAECAQE/EEqQ/8QAGxAAAwACAwAAAAAAAAAAAAAAAAERITFBYbH/2gAIAQEAAT8QfKcvSyknTGhqj23RnRus1P/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f268c48c007c7a10e10df0ec0893e69f/8ac56/flash-result.webp 240w,
/static/f268c48c007c7a10e10df0ec0893e69f/d3be9/flash-result.webp 480w,
/static/f268c48c007c7a10e10df0ec0893e69f/e46b2/flash-result.webp 960w,
/static/f268c48c007c7a10e10df0ec0893e69f/f992d/flash-result.webp 1440w,
/static/f268c48c007c7a10e10df0ec0893e69f/882b9/flash-result.webp 1920w,
/static/f268c48c007c7a10e10df0ec0893e69f/b33a3/flash-result.webp 4032w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f268c48c007c7a10e10df0ec0893e69f/09b79/flash-result.jpg 240w,
/static/f268c48c007c7a10e10df0ec0893e69f/7cc5e/flash-result.jpg 480w,
/static/f268c48c007c7a10e10df0ec0893e69f/6a068/flash-result.jpg 960w,
/static/f268c48c007c7a10e10df0ec0893e69f/644c5/flash-result.jpg 1440w,
/static/f268c48c007c7a10e10df0ec0893e69f/0f98f/flash-result.jpg 1920w,
/static/f268c48c007c7a10e10df0ec0893e69f/d2602/flash-result.jpg 4032w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f268c48c007c7a10e10df0ec0893e69f/6a068/flash-result.jpg&quot;
            alt=&quot;result of flashing in the EFI shell&quot;
            title=&quot;1 card down, 3 more to go!&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;1 card down, 3 more to go!&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Wait patiently until the operations have completed. Note that it might seem like the steps repeat, just wait until it is completely done and exits back to the shell by itself.&lt;/p&gt;
&lt;h2 id=&quot;multiple-cards-and-conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#multiple-cards-and-conclusion&quot; aria-label=&quot;multiple cards and conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Multiple cards and conclusion&lt;/h2&gt;
&lt;p&gt;You can rerun the commands for different cards (by adding &lt;code class=&quot;language-text&quot;&gt;-c x&lt;/code&gt; where x is the card number from &lt;code class=&quot;language-text&quot;&gt;listall&lt;/code&gt;) or by simply physically switching the current one out for a different one.&lt;/p&gt;
&lt;p&gt;That’s all there is too it, if you need any help feel free to hit me up!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Uncovering a new hobby that might just take over my entire house]]></title><description><![CDATA[What started as a simple decoration piece to fill some empty space in my home quickly grew into a new hobby of which the remnants can be found throughout my house]]></description><link>https://www.rickvanlieshout.com/posts/2023/starting-a-new-hobby-that-might-just-take-over-my-house/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2023/starting-a-new-hobby-that-might-just-take-over-my-house/</guid><pubDate>Tue, 14 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;the-problem&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-problem&quot; aria-label=&quot;the problem permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The problem&lt;/h2&gt;
&lt;p&gt;Even though my house is fully furnished, one could say it’s quite light on decorations. You see, I’m not really one for many of the popular decoration pieces like candles, picture frames, animal skins, or decorative statues.&lt;/p&gt;
&lt;p&gt;The only thing I really like is stone and woodwork. This means that I have enough decorations to fill the downstairs, kind off.
You see, some of the decorations that I also like are plants (mainly because they go in large stone pots) but I’m not great at keeping them alive.&lt;/p&gt;
&lt;p&gt;(Un)fortunately, there is more to my house than just the downstairs. There are 2 more floors that are, once again, furnished but not really decorated.
The only room that is pretty well decorated is my office, which has various little nerdy things on little black shelves and 12 beautiful Displates.&lt;/p&gt;
&lt;p&gt;One of the main problem areas is my bedroom. I don’t have any entertainment in my bedroom (by choice.. it’s a place to sleep, not watch telly!) but I do have some &lt;a href=&quot;https://www.ikea.com/gb/en/p/fjaellbo-shelving-unit-black-70339291/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;FJallbo&lt;/a&gt; shelving units.
Of course, those shelves are mostly empty… they are only adorned by some books, clothes and a few stuffed animals.&lt;/p&gt;
&lt;h2 id=&quot;the-solution-or-so-i-thought&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-solution-or-so-i-thought&quot; aria-label=&quot;the solution or so i thought permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The solution, or so I thought&lt;/h2&gt;
&lt;figure class=&quot;float-right&quot; style=&quot;width: 240px&quot;&gt;
 &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 710px; &quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 133.33333333333331%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQP/xAAXAQEBAQEAAAAAAAAAAAAAAAAAAQID/9oADAMBAAIQAxAAAAGlJdKiQSbebY6UCEf/xAAcEAABBQADAAAAAAAAAAAAAAABAAIDETESIiP/2gAIAQEAAQUCY4F19hJxUcvlZoShamK0MGr/xAAVEQEBAAAAAAAAAAAAAAAAAAAQAf/aAAgBAwEBPwEp/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAECERAhYSD/2gAIAQEABj8CiuDKFwcls3BYd+f/xAAbEAEAAgMBAQAAAAAAAAAAAAABABEhMUFREP/aAAgBAQABPyGtGaN+2RqPkroe+SoFMtdie+MpbEKUJo7i+S3T5KRZ/9oADAMBAAIAAwAAABBQBzL/xAAZEQACAwEAAAAAAAAAAAAAAAAAARARITH/2gAIAQMBAT8Qo0Rdj//EABkRAAIDAQAAAAAAAAAAAAAAAAABEBEhMf/aAAgBAgEBPxC4TfDT/8QAHBABAAMAAwEBAAAAAAAAAAAAAQARITFBUXHR/9oACAEBAAE/ELaRaRQ/SOPZvRjgHZwzaC4ItU3CJOpeAw1fRvmMAg53tzKBSx0fE8FfZtLyrEx1UpO9z//Z&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source srcset=&quot;/static/fc45d9f3928e671e3cafd7e9264c5486/8ac56/orchids.webp 240w,
/static/fc45d9f3928e671e3cafd7e9264c5486/d3be9/orchids.webp 480w,
/static/fc45d9f3928e671e3cafd7e9264c5486/457aa/orchids.webp 710w&quot; sizes=&quot;(max-width: 710px) 100vw, 710px&quot; type=&quot;image/webp&quot;&gt;
          &lt;source srcset=&quot;/static/fc45d9f3928e671e3cafd7e9264c5486/09b79/orchids.jpg 240w,
/static/fc45d9f3928e671e3cafd7e9264c5486/7cc5e/orchids.jpg 480w,
/static/fc45d9f3928e671e3cafd7e9264c5486/67e9d/orchids.jpg 710w&quot; sizes=&quot;(max-width: 710px) 100vw, 710px&quot; type=&quot;image/jpeg&quot;&gt;
          &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/fc45d9f3928e671e3cafd7e9264c5486/67e9d/orchids.jpg&quot; alt=&quot;Lego orchids on a wooden table&quot; title=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
 &lt;figcaption&gt;Pretty little orchids!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I don’t know when exactly it happened but a few months ago I stumbled across “Lego plants” on Youtube. Plants that look quite good and don’t die.
The first plant I got was the little bonsai and the second one were the orchids.
After that, I quickly picked up the cacti and bouquet.&lt;/p&gt;
&lt;p&gt;And as you can probably figure out by now… a new hobby was born… Lego.
Lego allows me to fill up the empty space with whatever I want whilst keeping things interesting and giving me something to do to boot.&lt;/p&gt;
&lt;h2 id=&quot;christmas-times-a-coming&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#christmas-times-a-coming&quot; aria-label=&quot;christmas times a coming permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Christmas time’s a coming&lt;/h2&gt;
&lt;p&gt;After building a few smaller items I felt ready to tackle a “project”, one that would allow me to play with Legos and at the same time get a few friends and family members off my back about not having Christmas decorations.
That’s right. I set out to build a Christmas village from lego.&lt;/p&gt;
&lt;p&gt;I emptied a shelf, picked up some &lt;a href=&quot;https://www.lego.com/en-us/product/white-baseplate-11010&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;white base plates&lt;/a&gt;, procured a string of small Christmas lights, and bought some Christmassy-looking Lego sets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lego.com/en-us/product/holiday-main-street-10308&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Holiday main street&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lego.com/en-nl/product/santa-s-sleigh-40499&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Santa’s sleigh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lego.com/en-nl/product/santa-s-visit-10293&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Santa’s visit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lego.com/en-nl/product/winter-elves-scene-40564&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Winter elves scene&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20221106002040/https://www.lego.com/en-us/product/wintertime-polar-bears-40571&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Winter polar bears&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lego.com/en-nl/product/santa-s-workshop-40565?CMP=AFC-AffiliateUK-lFWN%2FyX1zOg-3425491-124738-1&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Santa’s workshop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result of a few days of work and the Christmas village has been completed:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGBdbIzjQF//8QAGRAAAgMBAAAAAAAAAAAAAAAAAQIAERIT/9oACAEBAAEFAsMpq4J0yUe4ygn/xAAVEQEBAAAAAAAAAAAAAAAAAAAAIf/aAAgBAwEBPwFH/8QAFREBAQAAAAAAAAAAAAAAAAAAACH/2gAIAQIBAT8BV//EABoQAAIDAQEAAAAAAAAAAAAAAAABERJBMjH/2gAIAQEABj8Css0benhFZOUcn//EABsQAAMAAgMAAAAAAAAAAAAAAAABESFhMVGB/9oACAEBAAE/IW7STaVs2+SJIx02OyDLFpe3pLWPMH//2gAMAwEAAgADAAAAEMfP/8QAGBEAAgMAAAAAAAAAAAAAAAAAABEBMVH/2gAIAQMBAT8QuUPB/8QAGBEAAwEBAAAAAAAAAAAAAAAAAAERIVH/2gAIAQIBAT8Q1Kk6P//EABsQAQEBAAIDAAAAAAAAAAAAAAERACExUZGx/9oACAEBAAE/EFBpaBOJ3irKKgYgfAdDVlGpQLJZMxQICovHzWB1OZBfe//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/4552ba76aff310f4cdca9a4250c97b45/8ac56/christmas.webp 240w,
/static/4552ba76aff310f4cdca9a4250c97b45/d3be9/christmas.webp 480w,
/static/4552ba76aff310f4cdca9a4250c97b45/e46b2/christmas.webp 960w,
/static/4552ba76aff310f4cdca9a4250c97b45/f992d/christmas.webp 1440w,
/static/4552ba76aff310f4cdca9a4250c97b45/882b9/christmas.webp 1920w,
/static/4552ba76aff310f4cdca9a4250c97b45/ab976/christmas.webp 4080w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/4552ba76aff310f4cdca9a4250c97b45/09b79/christmas.jpg 240w,
/static/4552ba76aff310f4cdca9a4250c97b45/7cc5e/christmas.jpg 480w,
/static/4552ba76aff310f4cdca9a4250c97b45/6a068/christmas.jpg 960w,
/static/4552ba76aff310f4cdca9a4250c97b45/644c5/christmas.jpg 1440w,
/static/4552ba76aff310f4cdca9a4250c97b45/0f98f/christmas.jpg 1920w,
/static/4552ba76aff310f4cdca9a4250c97b45/71254/christmas.jpg 4080w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/4552ba76aff310f4cdca9a4250c97b45/6a068/christmas.jpg&quot;
            alt=&quot;&amp;quot;A bookcase shelf filled with Lego Christmas builds&amp;quot;&quot;
            title=&quot;Happy little Christmas village&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Happy little Christmas village&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;a-new-room-to-build-lego&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-new-room-to-build-lego&quot; aria-label=&quot;a new room to build lego permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A new room to build Lego&lt;/h2&gt;
&lt;p&gt;Now that the Lego virus has taken hold of me I am quickly growing tired of needing to move stuff off my dining table just to build some Legos.
Likewise, I dislike having to move half-finished Lego builds just to use my dining table.
It was time to upgrade my spare bedroom with a desk and some other things to build a comfortable space.&lt;/p&gt;
&lt;p&gt;I bought the following items:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ikea.com/gb/en/p/alex-drawer-unit-white-00473546/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;3x Alex drawers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ikea.com/gb/en/p/karlby-worktop-walnut-veneer-30335191/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;2x Karlby countertop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ikea.com/gb/en/p/nissafors-trolley-black-20399777/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;1x Nissafors trolley&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ikea.com/gb/en/p/fniss-waste-bin-black-60295438/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;1x fniss waste bucket&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ikea.com/gb/en/p/skadis-pegboard-black-50534378/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;2x SKÅDIS pegboard&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ikea.com/gb/en/p/skadis-shelf-white-00320799/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;5x SKÅDIS planks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ikea.com/gb/en/p/skadis-container-white-20320798/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;3x SKÅDIS cup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ikea.com/gb/en/p/skadis-hook-white-20320802/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;5x SKÅDIS hooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ikea.com/gb/en/p/skadis-storage-basket-set-of-3-white-50517760/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;1x SKÅDIS storage baskets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ikea.com/gb/en/p/skadis-container-with-lid-white-80335909/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;2x SKÅDIS containers with lid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Which, with some effort, got turned into the following room:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAABdKvZVRGWf//EABoQAQEAAgMAAAAAAAAAAAAAAAIBAxIREzL/2gAIAQEAAQUCF4Dr2xK9dGwPpPW//8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQMBAT8Bh//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EAB0QAAEDBQEAAAAAAAAAAAAAAAABITECERIiQaH/2gAIAQEABj8CdfTQTKSnjOKTY//EAB0QAQACAQUBAAAAAAAAAAAAAAEAESExQVFhgcH/2gAIAQEAAT8hoDNBm+2OR2uZQRsaG8uCY+zGC6E//9oADAMBAAIAAwAAABAAP//EABYRAQEBAAAAAAAAAAAAAAAAABEAAf/aAAgBAwEBPxDFBf/EABcRAAMBAAAAAAAAAAAAAAAAAAABESH/2gAIAQIBAT8Qbmlp/8QAHBABAQACAgMAAAAAAAAAAAAAAREAIUFRMXGB/9oACAEBAAE/EDFA20PPvDXE8QFH7iRELelwk5oTl94SGR1ugnOSdSqms//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/441f0eff5f6a62f52e0e46269fb4583c/8ac56/room-just-built.webp 240w,
/static/441f0eff5f6a62f52e0e46269fb4583c/d3be9/room-just-built.webp 480w,
/static/441f0eff5f6a62f52e0e46269fb4583c/e46b2/room-just-built.webp 960w,
/static/441f0eff5f6a62f52e0e46269fb4583c/f992d/room-just-built.webp 1440w,
/static/441f0eff5f6a62f52e0e46269fb4583c/882b9/room-just-built.webp 1920w,
/static/441f0eff5f6a62f52e0e46269fb4583c/ab976/room-just-built.webp 4080w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/441f0eff5f6a62f52e0e46269fb4583c/09b79/room-just-built.jpg 240w,
/static/441f0eff5f6a62f52e0e46269fb4583c/7cc5e/room-just-built.jpg 480w,
/static/441f0eff5f6a62f52e0e46269fb4583c/6a068/room-just-built.jpg 960w,
/static/441f0eff5f6a62f52e0e46269fb4583c/644c5/room-just-built.jpg 1440w,
/static/441f0eff5f6a62f52e0e46269fb4583c/0f98f/room-just-built.jpg 1920w,
/static/441f0eff5f6a62f52e0e46269fb4583c/71254/room-just-built.jpg 4080w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/441f0eff5f6a62f52e0e46269fb4583c/6a068/room-just-built.jpg&quot;
            alt=&quot;Dark walnut L-shaped corner desk with 3 white drawers holding it up&quot;
            title=&quot;First build of the room, no display or audio yet&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;First build of the room, no display or audio yet&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABQAD/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAT0Sk5rSOh//xAAbEAACAgMBAAAAAAAAAAAAAAABAgADBBESE//aAAgBAQABBQKo82JaonqkReodLjk2T//EABYRAQEBAAAAAAAAAAAAAAAAAAABIf/aAAgBAwEBPwGMf//EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/AWf/xAAcEAACAQUBAAAAAAAAAAAAAAAAATIQESExUZH/2gAIAQEABj8CRAi6K2H02vD/xAAaEAADAQEBAQAAAAAAAAAAAAAAAREhYTHh/9oACAEBAAE/IaiXhSk3B/UZTxGqRaTRaVew/9oADAMBAAIAAwAAABADL//EABYRAAMAAAAAAAAAAAAAAAAAABARQf/aAAgBAwEBPxBKH//EABYRAQEBAAAAAAAAAAAAAAAAAAAhYf/aAAgBAgEBPxDCv//EABwQAQEBAQACAwAAAAAAAAAAAAERACExUWGRwf/aAAgBAQABPxDubyILaSYSmVIpcJ7XXS9S/mJXThQV+9QnykXf/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/05e5a1891a14e01c4ec63bf5785767de/8ac56/trolly.webp 240w,
/static/05e5a1891a14e01c4ec63bf5785767de/d3be9/trolly.webp 480w,
/static/05e5a1891a14e01c4ec63bf5785767de/e46b2/trolly.webp 960w,
/static/05e5a1891a14e01c4ec63bf5785767de/f992d/trolly.webp 1440w,
/static/05e5a1891a14e01c4ec63bf5785767de/882b9/trolly.webp 1920w,
/static/05e5a1891a14e01c4ec63bf5785767de/ab976/trolly.webp 4080w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/05e5a1891a14e01c4ec63bf5785767de/09b79/trolly.jpg 240w,
/static/05e5a1891a14e01c4ec63bf5785767de/7cc5e/trolly.jpg 480w,
/static/05e5a1891a14e01c4ec63bf5785767de/6a068/trolly.jpg 960w,
/static/05e5a1891a14e01c4ec63bf5785767de/644c5/trolly.jpg 1440w,
/static/05e5a1891a14e01c4ec63bf5785767de/0f98f/trolly.jpg 1920w,
/static/05e5a1891a14e01c4ec63bf5785767de/71254/trolly.jpg 4080w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/05e5a1891a14e01c4ec63bf5785767de/6a068/trolly.jpg&quot;
            alt=&quot;Black trolley with 3 shelves filled with Lego boxes&quot;
            title=&quot;A little trolley to hold the new Lego sets&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;A little trolley to hold the new Lego sets&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABQBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAcpqaBnKBP/EABoQAQADAQEBAAAAAAAAAAAAAAEAAgMTESH/2gAIAQEAAQUC5s4WVpasfueGoR3Pf//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABoQAAIDAQEAAAAAAAAAAAAAAAABITGRESL/2gAIAQEABj8CtaQcaFFHvSj/xAAZEAADAQEBAAAAAAAAAAAAAAAAAREhMZH/2gAIAQEAAT8hrJw0RUyY0opvQmnokes4g87o/9oADAMBAAIAAwAAABBjH//EABcRAAMBAAAAAAAAAAAAAAAAAAABESH/2gAIAQMBAT8QuFZ//8QAFxEBAAMAAAAAAAAAAAAAAAAAAAEhMf/aAAgBAgEBPxCdU//EABoQAQADAQEBAAAAAAAAAAAAAAEAESExQVH/2gAIAQEAAT8QtMRQoexYNode58qVlx3LngjlPFyzdhW5Mwfsv9i4qC5P/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/fec737f7399c346ecbd7ada3a4e5d1e7/8ac56/adding-a-monitor.webp 240w,
/static/fec737f7399c346ecbd7ada3a4e5d1e7/d3be9/adding-a-monitor.webp 480w,
/static/fec737f7399c346ecbd7ada3a4e5d1e7/e46b2/adding-a-monitor.webp 960w,
/static/fec737f7399c346ecbd7ada3a4e5d1e7/f992d/adding-a-monitor.webp 1440w,
/static/fec737f7399c346ecbd7ada3a4e5d1e7/882b9/adding-a-monitor.webp 1920w,
/static/fec737f7399c346ecbd7ada3a4e5d1e7/ab976/adding-a-monitor.webp 4080w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/fec737f7399c346ecbd7ada3a4e5d1e7/09b79/adding-a-monitor.jpg 240w,
/static/fec737f7399c346ecbd7ada3a4e5d1e7/7cc5e/adding-a-monitor.jpg 480w,
/static/fec737f7399c346ecbd7ada3a4e5d1e7/6a068/adding-a-monitor.jpg 960w,
/static/fec737f7399c346ecbd7ada3a4e5d1e7/644c5/adding-a-monitor.jpg 1440w,
/static/fec737f7399c346ecbd7ada3a4e5d1e7/0f98f/adding-a-monitor.jpg 1920w,
/static/fec737f7399c346ecbd7ada3a4e5d1e7/71254/adding-a-monitor.jpg 4080w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/fec737f7399c346ecbd7ada3a4e5d1e7/6a068/adding-a-monitor.jpg&quot;
            alt=&quot;A monitor arm is placed on the worktop and now holds a nice 27-inch monitor.&quot;
            title=&quot;I added a monitor so I could watch some series or listen to music.&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;I added a monitor so I could watch some series or listen to music.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQBAgP/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABslKcrhkH/8QAGhAAAwADAQAAAAAAAAAAAAAAAAECAwQREv/aAAgBAQABBQK9jirJaHxlQpR6P//EABYRAQEBAAAAAAAAAAAAAAAAAAARAf/aAAgBAwEBPwHIj//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/AVf/xAAZEAACAwEAAAAAAAAAAAAAAAABEQAQIVH/2gAIAQEABj8CYTjQ2izO1//EABkQAAMBAQEAAAAAAAAAAAAAAAABESFBMf/aAAgBAQABPyH0qnF0SkIyxCUo5Vgvdxyiwf/aAAwDAQACAAMAAAAQcM//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAwEBPxAKP//EABYRAQEBAAAAAAAAAAAAAAAAAAEQEf/aAAgBAgEBPxB0j//EAB0QAQACAgIDAAAAAAAAAAAAAAEAESExQdFRYXH/2gAIAQEAAT8QuHEDJUWH5xbeO7l8affctT+TufYW5oUOEMIjP//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/88ab67089ed040401ef94cec80e94cfc/8ac56/cable-box-and-speaker.webp 240w,
/static/88ab67089ed040401ef94cec80e94cfc/d3be9/cable-box-and-speaker.webp 480w,
/static/88ab67089ed040401ef94cec80e94cfc/e46b2/cable-box-and-speaker.webp 960w,
/static/88ab67089ed040401ef94cec80e94cfc/f992d/cable-box-and-speaker.webp 1440w,
/static/88ab67089ed040401ef94cec80e94cfc/882b9/cable-box-and-speaker.webp 1920w,
/static/88ab67089ed040401ef94cec80e94cfc/ab976/cable-box-and-speaker.webp 4080w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/88ab67089ed040401ef94cec80e94cfc/09b79/cable-box-and-speaker.jpg 240w,
/static/88ab67089ed040401ef94cec80e94cfc/7cc5e/cable-box-and-speaker.jpg 480w,
/static/88ab67089ed040401ef94cec80e94cfc/6a068/cable-box-and-speaker.jpg 960w,
/static/88ab67089ed040401ef94cec80e94cfc/644c5/cable-box-and-speaker.jpg 1440w,
/static/88ab67089ed040401ef94cec80e94cfc/0f98f/cable-box-and-speaker.jpg 1920w,
/static/88ab67089ed040401ef94cec80e94cfc/71254/cable-box-and-speaker.jpg 4080w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/88ab67089ed040401ef94cec80e94cfc/6a068/cable-box-and-speaker.jpg&quot;
            alt=&quot;A JBL boombox placed under the monitor with the cable hidden out-of-sight&quot;
            title=&quot;Sound from just the monitor won&amp;#39;t do so I added a nice JBL speaker&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Sound from just the monitor won&amp;#39;t do so I added a nice JBL speaker&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQCAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABRbyHCwkS/wD/xAAbEAADAAIDAAAAAAAAAAAAAAABAgMAEQQSIf/aAAgBAQABBQIFRgRaY8NN6Bx69Wa67//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwGtf//EABoQAAICAwAAAAAAAAAAAAAAAAABETECEGH/2gAIAQEABj8CnJMqCzhDrX//xAAcEAEAAgEFAAAAAAAAAAAAAAABABEhMWFxobH/2gAIAQEAAT8hrABIaOLZgVe40L4ESw1QzK6n/9oADAMBAAIAAwAAABBkz//EABcRAAMBAAAAAAAAAAAAAAAAAAABEWH/2gAIAQMBAT8QUJp//8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERUf/aAAgBAgEBPxBnCsP/xAAcEAEAAgMAAwAAAAAAAAAAAAABABEhMXFhwfH/2gAIAQEAAT8Q1VCRu65E1ZMKBUaFUGLPuAzdlG6X5CTL+WOdlDGOp//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/93ac385602a30892c9f311b05874e7a6/8ac56/building-the-owl.webp 240w,
/static/93ac385602a30892c9f311b05874e7a6/d3be9/building-the-owl.webp 480w,
/static/93ac385602a30892c9f311b05874e7a6/e46b2/building-the-owl.webp 960w,
/static/93ac385602a30892c9f311b05874e7a6/f992d/building-the-owl.webp 1440w,
/static/93ac385602a30892c9f311b05874e7a6/882b9/building-the-owl.webp 1920w,
/static/93ac385602a30892c9f311b05874e7a6/ab976/building-the-owl.webp 4080w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/93ac385602a30892c9f311b05874e7a6/09b79/building-the-owl.jpg 240w,
/static/93ac385602a30892c9f311b05874e7a6/7cc5e/building-the-owl.jpg 480w,
/static/93ac385602a30892c9f311b05874e7a6/6a068/building-the-owl.jpg 960w,
/static/93ac385602a30892c9f311b05874e7a6/644c5/building-the-owl.jpg 1440w,
/static/93ac385602a30892c9f311b05874e7a6/0f98f/building-the-owl.jpg 1920w,
/static/93ac385602a30892c9f311b05874e7a6/71254/building-the-owl.jpg 4080w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/93ac385602a30892c9f311b05874e7a6/6a068/building-the-owl.jpg&quot;
            alt=&quot;The finished room is in use, bags of Lego are scattered over the worktop and the Lego build itself is starting to take some form&quot;
            title=&quot;the finished room in use, building the Harry Potter special edition owl&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;the finished room in use, building the Harry Potter special edition owl&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The space I’ve created with this Ikea build works very well for building Legos!
The mounted desk light (which I got from Amazon) has also proven to be quite handy. I can move the light however I like, be it to shed some more light on the
little booklet with instructions or on the build itself to illuminate some of the darker pieces at night. (brown/black)
Turning on both lights (there’s one hidden behind the monitor/speaker) ensures that there’s enough light in the room that I don’t have to turn on the main light
which makes the room feel nice and cozy.&lt;/p&gt;
&lt;h2 id=&quot;more-of-my-creations&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#more-of-my-creations&quot; aria-label=&quot;more of my creations permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;More of my creations&lt;/h2&gt;
&lt;p&gt;I’d like to round off this blog post by showing some of the other builds I’ve since completed:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.25%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEEAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAACAf/aAAwDAQACEAMQAAABmWdBXLGKf//EABoQAQEAAgMAAAAAAAAAAAAAAAIBAAMQESL/2gAIAQEAAQUCp9U51bgMqWs8f//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABgQAAIDAAAAAAAAAAAAAAAAAAAQATGB/9oACAEBAAY/ApeFL//EABsQAQACAgMAAAAAAAAAAAAAAAEAIRFBUXHB/9oACAEBAAE/IaSjHLFNj0wyrhESstwI+oT/2gAMAwEAAgADAAAAEDMv/8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQMBAT8QCf/EABYRAAMAAAAAAAAAAAAAAAAAAAEQUf/aAAgBAgEBPxARf//EABsQAQACAwEBAAAAAAAAAAAAAAEAESExUUFx/9oACAEBAAE/EF1pYKPPIJxXsiiEUpTEvKSrbqMIsay59iRaXfZ//9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/857233cd94fb5b9aab6d253301df3d76/8ac56/rocket.webp 240w,
/static/857233cd94fb5b9aab6d253301df3d76/d3be9/rocket.webp 480w,
/static/857233cd94fb5b9aab6d253301df3d76/e46b2/rocket.webp 960w,
/static/857233cd94fb5b9aab6d253301df3d76/f992d/rocket.webp 1440w,
/static/857233cd94fb5b9aab6d253301df3d76/882b9/rocket.webp 1920w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/857233cd94fb5b9aab6d253301df3d76/09b79/rocket.jpg 240w,
/static/857233cd94fb5b9aab6d253301df3d76/7cc5e/rocket.jpg 480w,
/static/857233cd94fb5b9aab6d253301df3d76/6a068/rocket.jpg 960w,
/static/857233cd94fb5b9aab6d253301df3d76/644c5/rocket.jpg 1440w,
/static/857233cd94fb5b9aab6d253301df3d76/0f98f/rocket.jpg 1920w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/857233cd94fb5b9aab6d253301df3d76/6a068/rocket.jpg&quot;
            alt=&quot;Saturn V from lego&quot;
            title=&quot;Saturn V&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Saturn V&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.25%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAQFA//EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAABWblsB0TIs//EABoQAAEFAQAAAAAAAAAAAAAAAAIAARAREiH/2gAIAQEAAQUCI2u8rcB1l//EABYRAQEBAAAAAAAAAAAAAAAAAAABEv/aAAgBAwEBPwGsv//EABURAQEAAAAAAAAAAAAAAAAAAAAS/9oACAECAQE/AVP/xAAZEAEAAgMAAAAAAAAAAAAAAAABABARITH/2gAIAQEABj8CgaMztFf/xAAaEAEAAwADAAAAAAAAAAAAAAABABExECGR/9oACAEBAAE/IQdK8m4UBzZWDY1C23x//9oADAMBAAIAAwAAABBEL//EABYRAQEBAAAAAAAAAAAAAAAAAAEAEf/aAAgBAwEBPxAC2L//xAAWEQEBAQAAAAAAAAAAAAAAAAABABH/2gAIAQIBAT8QFLV//8QAGxABAAICAwAAAAAAAAAAAAAAAQARQZEhMWH/2gAIAQEAAT8QVdS+iFQ4LVtmVYGoBNl8xC2QsAQUJ//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/87b0612fd445f63a65be6cbcb3281c2b/8ac56/owl.webp 240w,
/static/87b0612fd445f63a65be6cbcb3281c2b/d3be9/owl.webp 480w,
/static/87b0612fd445f63a65be6cbcb3281c2b/e46b2/owl.webp 960w,
/static/87b0612fd445f63a65be6cbcb3281c2b/f992d/owl.webp 1440w,
/static/87b0612fd445f63a65be6cbcb3281c2b/882b9/owl.webp 1920w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/87b0612fd445f63a65be6cbcb3281c2b/09b79/owl.jpg 240w,
/static/87b0612fd445f63a65be6cbcb3281c2b/7cc5e/owl.jpg 480w,
/static/87b0612fd445f63a65be6cbcb3281c2b/6a068/owl.jpg 960w,
/static/87b0612fd445f63a65be6cbcb3281c2b/644c5/owl.jpg 1440w,
/static/87b0612fd445f63a65be6cbcb3281c2b/0f98f/owl.jpg 1920w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/87b0612fd445f63a65be6cbcb3281c2b/6a068/owl.jpg&quot;
            alt=&quot;&amp;quot;Harry Potter&amp;#39;s owl Hedwig perched on some books&amp;quot;&quot;
            title=&quot;Shout out to Hedwig! (and Ravenclaw)&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Shout out to Hedwig! (and Ravenclaw)&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIFAf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAAB147lUxSz/8QAHRAAAQMFAQAAAAAAAAAAAAAAAQACEwMREiIjMf/aAAgBAQABBQLljqoqKNyweRMcP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EAB4QAAIBAwUAAAAAAAAAAAAAAAABEQIxkRASIUGB/9oACAEBAAY/ApVKwbIhO6LPIufNE46P/8QAGxABAAICAwAAAAAAAAAAAAAAAQARITEQQWH/2gAIAQEAAT8hXObFq6S4ONMTuw7FusTUjxP/2gAMAwEAAgADAAAAEDA//8QAFhEAAwAAAAAAAAAAAAAAAAAAAAER/9oACAEDAQE/EEqQ/8QAFxEBAAMAAAAAAAAAAAAAAAAAAAERIf/aAAgBAgEBPxCcW//EABwQAQACAwADAAAAAAAAAAAAAAEAESExUUFhwf/aAAgBAQABPxA99MAjcpAXUKSt63yJP3TCOaAlB7iWtcV3g8hACDoNML2f/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/16c948e1aca3f57437372d5fd49bfc77/8ac56/bouquet.webp 240w,
/static/16c948e1aca3f57437372d5fd49bfc77/d3be9/bouquet.webp 480w,
/static/16c948e1aca3f57437372d5fd49bfc77/e46b2/bouquet.webp 960w,
/static/16c948e1aca3f57437372d5fd49bfc77/f992d/bouquet.webp 1440w,
/static/16c948e1aca3f57437372d5fd49bfc77/882b9/bouquet.webp 1920w,
/static/16c948e1aca3f57437372d5fd49bfc77/ab976/bouquet.webp 4080w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/16c948e1aca3f57437372d5fd49bfc77/09b79/bouquet.jpg 240w,
/static/16c948e1aca3f57437372d5fd49bfc77/7cc5e/bouquet.jpg 480w,
/static/16c948e1aca3f57437372d5fd49bfc77/6a068/bouquet.jpg 960w,
/static/16c948e1aca3f57437372d5fd49bfc77/644c5/bouquet.jpg 1440w,
/static/16c948e1aca3f57437372d5fd49bfc77/0f98f/bouquet.jpg 1920w,
/static/16c948e1aca3f57437372d5fd49bfc77/71254/bouquet.jpg 4080w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/16c948e1aca3f57437372d5fd49bfc77/6a068/bouquet.jpg&quot;
            alt=&quot;&amp;quot;A flower bouquet in a clear vase&amp;quot;&quot;
            title=&quot;The desk felt a bit empty so I added some flowers to spice things up&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;The desk felt a bit empty so I added some flowers to spice things up&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHPS9YiKRf/xAAaEAACAwEBAAAAAAAAAAAAAAABAgADEhEx/9oACAEBAAEFAlrJgRmmcyvqDxnQuf/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGn/8QAGRABAQEBAQEAAAAAAAAAAAAAAQARMRIh/9oACAEBAAY/AlD5J55Y2Sj21b//xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhUTFh/9oACAEBAAE/IQ9I5HgXTyKz7PbFfYDqqtlBs//aAAwDAQACAAMAAAAQiN//xAAXEQADAQAAAAAAAAAAAAAAAAAAAREh/9oACAEDAQE/EKonh//EABURAQEAAAAAAAAAAAAAAAAAAAAB/9oACAECAQE/ECx//8QAGxABAAMBAQEBAAAAAAAAAAAAAQARITFBYXH/2gAIAQEAAT8QHIoU5e8/ZsyKbBfYjhPYiBTwDm35PbKC6WLUFKKEon//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/14d2c340299b6662dd8bc513cb6cf946/8ac56/flower-pots.webp 240w,
/static/14d2c340299b6662dd8bc513cb6cf946/d3be9/flower-pots.webp 480w,
/static/14d2c340299b6662dd8bc513cb6cf946/e46b2/flower-pots.webp 960w,
/static/14d2c340299b6662dd8bc513cb6cf946/f992d/flower-pots.webp 1440w,
/static/14d2c340299b6662dd8bc513cb6cf946/882b9/flower-pots.webp 1920w,
/static/14d2c340299b6662dd8bc513cb6cf946/ab976/flower-pots.webp 4080w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/14d2c340299b6662dd8bc513cb6cf946/09b79/flower-pots.jpg 240w,
/static/14d2c340299b6662dd8bc513cb6cf946/7cc5e/flower-pots.jpg 480w,
/static/14d2c340299b6662dd8bc513cb6cf946/6a068/flower-pots.jpg 960w,
/static/14d2c340299b6662dd8bc513cb6cf946/644c5/flower-pots.jpg 1440w,
/static/14d2c340299b6662dd8bc513cb6cf946/0f98f/flower-pots.jpg 1920w,
/static/14d2c340299b6662dd8bc513cb6cf946/71254/flower-pots.jpg 4080w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/14d2c340299b6662dd8bc513cb6cf946/6a068/flower-pots.jpg&quot;
            alt=&quot;Two of the succulents in decorative pots with some shelves&quot;
            title=&quot;Two of the succulents in decorative pots with some shells&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Two of the succulents in decorative pots with some shells&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Adopting conventional commits and standard versions in a git and npm codebase]]></title><description><![CDATA[A dive into conventional commits and their benefit whilst releasing with standard versions.]]></description><link>https://www.rickvanlieshout.com/posts/2022/adopting-convential-commits/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2022/adopting-convential-commits/</guid><pubDate>Mon, 07 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;At my place of work, &lt;a href=&quot;https://inforit.nl/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;INFORIT&lt;/a&gt;, we are talking about adopting conventional commits as a company standard.
However… debating commits is a tricky endeavor, everyone seems to have their own opinion about it and pretty much no one is following even the basic git rules (e.g title + body). It is precisely because of all of this that an earlier proposal about standardizing commit messages brought us nothing.&lt;/p&gt;
&lt;p&gt;Now though, a solid 2 years later, our company has grown tremendously!
Not just in actual size, but also in knowledge. The developers that were resistant to standardization, hell… even git, have since come around to many of the ideas that were implemented. Especially after seeing their, often new, colleagues thrive with it.&lt;/p&gt;
&lt;p&gt;After seeing one of the new hires use conventional commits and their team being fine with it I decided to take the plunge and submit a proposal for it myself.
Though the proposal only covers “conventional commits” and generating changelog entries from it I will be explaining the entire process of adopting conventional commits and standard versions in this blog post.&lt;/p&gt;
&lt;h2 id=&quot;getting-started&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#getting-started&quot; aria-label=&quot;getting started permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Getting started&lt;/h2&gt;
&lt;p&gt;Before we can do anything we need a git repository.
I’ll be using a hosted git repository (on &lt;a href=&quot;https://github.com/Mastermindzh/conventional-commits-showcase&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Github&lt;/a&gt;) so I will clone it:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone git@github.com:Mastermindzh/conventional-commits-showcase.git&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But, if you want to follow along without a hosted repository you can also manually create it yourself:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; conventional-commits-showcase &lt;span class=&quot;token comment&quot;&gt;# create a folder with the name &quot;conventional-commits-showcase&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; conventional-commits-showcase
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; init&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;what-exactly-are-conventional-commits&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-exactly-are-conventional-commits&quot; aria-label=&quot;what exactly are conventional commits permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What exactly are “conventional commits”&lt;/h2&gt;
&lt;p&gt;”&lt;a href=&quot;https://www.conventionalcommits.org/en/v1.0.0/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Conventional commits&lt;/a&gt;” is a specification that allows developers to write commits that are easily parsable by both developers and systems alike. Or in their own words:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Conventional Commits specification is a lightweight convention on top of commit messages. It provides an easy set of rules for creating an explicit commit history; which makes it easier to write automated tools on top of. This convention dovetails with SemVer, by describing the features, fixes, and breaking changes made in commit messages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;According to the specifications the commit message should be structured as follows:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;git&quot;&gt;&lt;pre class=&quot;language-git&quot;&gt;&lt;code class=&quot;language-git&quot;&gt;&amp;lt;type&gt;[optional scope]: &amp;lt;description&gt;

[optional body]

[optional footer(s)]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The specification also allows us to specify a “footer” with breaking changes and ticket references.
A full example, with a breaking change and a fictional ticket number of &lt;code class=&quot;language-text&quot;&gt;95043&lt;/code&gt; would look like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;git&quot;&gt;&lt;pre class=&quot;language-git&quot;&gt;&lt;code class=&quot;language-git&quot;&gt;feat(api): A test title for a change to the API

I made a few changes to the API. Now I have to write a body.
This is a looooooong body.
Multiple lines :O

BREAKING CHANGE: Well, I have to write something here... so :)
fixes #95043&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;lets-get-the-dependencies-installed&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#lets-get-the-dependencies-installed&quot; aria-label=&quot;lets get the dependencies installed permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Let’s get the dependencies installed&lt;/h2&gt;
&lt;p&gt;First, let’s make sure our repository contains an npm environment.
If not, run:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; init&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now that we have a &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt; file we can start installing some dependencies:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; --save-dev husky @commitlint/cz-commitlint commitizen commitlint standard-version&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That will give us all the dependencies we need during this blog:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dependency&lt;/th&gt;
&lt;th&gt;function&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/typicode/husky&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Husky&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Allows us to easily manage and execute git hooks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/conventional-changelog/commitlint&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;commitlint&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Checks whether our commit messages meet the conventional commits specification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/conventional-changelog/commitlint&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;@commitlint/cz-commitlint&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;adapter for commitlint to use commitizen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/commitizen/cz-cli&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;commitizen&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Provides a prompt during commit to fill in necessary information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/conventional-changelog/standard-version&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;standard-version&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Semver based release management and changelog generator based on conventional commits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;setting-up-the-commitlint-and-commitizen-configuration&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-the-commitlint-and-commitizen-configuration&quot; aria-label=&quot;setting up the commitlint and commitizen configuration permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up the commitlint and commitizen configuration&lt;/h2&gt;
&lt;p&gt;First, let’s add a script to the &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt; that will do our commit for us:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;commit&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;git-cz&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, when we call &lt;code class=&quot;language-text&quot;&gt;npm run commit&lt;/code&gt; it will actually run &lt;code class=&quot;language-text&quot;&gt;git-cz&lt;/code&gt; which will start our commitizen prompt.
You can try it if you want, it won’t actually do anything but throw an error right now.
We can also configure commitizen in the package.json as well, to do so we add &lt;code class=&quot;language-text&quot;&gt;commitizen&lt;/code&gt; to the &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt;’s config object:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;config&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;commitizen&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@commitlint/cz-commitlint&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you ran &lt;code class=&quot;language-text&quot;&gt;npm run commit&lt;/code&gt; before and got an error, you can now do it again and face another, but different, error!&lt;/p&gt;
&lt;p&gt;Now we’ll set up the actual commit linting. Start by creating a file &lt;code class=&quot;language-text&quot;&gt;commitlint.config.js&lt;/code&gt; with the following content:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;rules&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;body-leading-blank&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;body-max-line-length&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;footer-leading-blank&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;footer-max-line-length&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;header-max-length&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;subject-case&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;never&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;start-case&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pascal-case&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;upper-case&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;subject-empty&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;never&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;subject-full-stop&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;never&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;type-case&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lower-case&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;type-empty&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;never&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;type-enum&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;first type&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;second type&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;questions&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;This is the first prompt!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As you can see we have configured a whole bunch of things, but there are 2 things that matter for now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a single “question” in our prompt.&lt;/li&gt;
&lt;li&gt;a few types (first and second type)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Staging a few files (&lt;code class=&quot;language-text&quot;&gt;git add &amp;lt;file&gt;&lt;/code&gt;) and running &lt;code class=&quot;language-text&quot;&gt;npm run commit&lt;/code&gt; will show us our prompt and a choice between the two types:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 662px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 34.166666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABa0lEQVR42lVPy07CUBDt0sSYGOgDBNrS121vn5Q0IFLQKgR5SC9tQgABH5HEBAKJsnRn/AC/wKWf6UXjgjMnZ86czcwQwe1qHg/H0XgajUdoOIsn83A0C4fxDXrzR9/+6stbdMPK8qG47je6jbB9Wa9VYKfZ+lhuCcGAlmmqUAOaCjQAdWjalmGZElBs3YSiks+wWVxcOpdNn2QzOZbleTFBU5u7R0I3oOM4giAoiiLLsiRJ2AAAsKqayotCjmN/gRvH7ZTlOY5k6Jf5EwFUpei6OoSe57mui9UwDMuybNvGo6ZpPM+z+8AJyVDb6TNROC275Uqp6ju2XXCccqmsAiCJ4t8JsiTvlu4jn89TKeZ1viBSiigaWk7evZFI0cc0maQpMsUksGEoTPKfSZxQSUyKoQ6ODjeTe6KjmwO9gpxqWKqhYnXgnYf1q96ZH9d7fb8Z1lsoaKOLaxR0wqAbtdCghaJO1A7an+v3H32xUa/pp40nAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/dfd7369716090a903cbadd166c594d0f/8ac56/first-config-commit.webp 240w,
/static/dfd7369716090a903cbadd166c594d0f/d3be9/first-config-commit.webp 480w,
/static/dfd7369716090a903cbadd166c594d0f/90cc3/first-config-commit.webp 662w&quot;
              sizes=&quot;(max-width: 662px) 100vw, 662px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/dfd7369716090a903cbadd166c594d0f/8ff5a/first-config-commit.png 240w,
/static/dfd7369716090a903cbadd166c594d0f/e85cb/first-config-commit.png 480w,
/static/dfd7369716090a903cbadd166c594d0f/be86f/first-config-commit.png 662w&quot;
            sizes=&quot;(max-width: 662px) 100vw, 662px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/dfd7369716090a903cbadd166c594d0f/be86f/first-config-commit.png&quot;
            alt=&quot;terminal showing the result of npm run commit&quot;
            title=&quot;output of &amp;#39;npm run commit&amp;#39;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;output of &amp;#39;npm run commit&amp;#39;&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Now, our current config isn’t very useful, so let’s add some more types and a few additional questions (the defaults):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;rules&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;body-leading-blank&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;body-max-line-length&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;footer-leading-blank&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;footer-max-line-length&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;header-max-length&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;subject-case&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;never&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;start-case&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pascal-case&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;upper-case&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;subject-empty&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;never&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;subject-full-stop&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;never&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;type-case&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lower-case&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;type-empty&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;never&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;type-enum&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;chore&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;ci&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;docs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;feat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;fix&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;perf&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;refactor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;revert&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;style&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;blog&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;questions&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Select the type of change that you&apos;re committing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;enum&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;A new piece of content&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Content&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;emoji&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;✨&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;feat&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;A new feature&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Features&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;emoji&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;✨&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;fix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;A bug fix&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bug Fixes&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;emoji&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;🐛&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;docs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Documentation only changes&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Documentation&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;emoji&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;📚&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;token string&quot;&gt;&quot;Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Styles&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;emoji&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;💎&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;refactor&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;A code change that neither fixes a bug nor adds a feature&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Code Refactoring&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;emoji&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;📦&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;perf&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;A code change that improves performance&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Performance Improvements&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;emoji&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;🚀&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Adding missing tests or correcting existing tests&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Tests&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;emoji&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;🚨&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;token string&quot;&gt;&quot;Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Builds&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;emoji&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;🛠&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;ci&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;token string&quot;&gt;&quot;Changes to our CI configuration files and scripts (example scopes: Docker, Kubernetes, npm, git)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Continuous Integrations&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;emoji&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;⚙️&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;chore&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Other changes that don&apos;t modify src or test files&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Chores&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;emoji&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;♻️&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;revert&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Reverts a previous commit&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Reverts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;emoji&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;🗑&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;What is the scope of this change (e.g. component or file name)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;subject&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Write a short, imperative tense description of the change&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Provide a longer description of the change&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;isBreaking&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Are there any breaking changes?&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;breakingBody&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token string&quot;&gt;&quot;A BREAKING CHANGE commit requires a body. Please enter a longer description of the commit itself&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;breaking&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Describe the breaking changes&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;isIssueAffected&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Does this change affect any open issues?&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;issuesBody&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token string&quot;&gt;&quot;If issues are closed, the commit requires a body. Please enter a longer description of the commit itself&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;issues&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Add issue references (e.g. &quot;fix #123&quot;, &quot;re #123&quot;.)&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As you can see we have a fair few questions, each with its own description.
The one that will be new to most people is “content”, which is a custom type that I added for this very blog.
Reenacting our example commit from before will look like this:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 661px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 104.16666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAIAAADJt1n/AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADsElEQVR42j1TyW7bVhTlBwRdtFZETSQlkqJEUooGiyLFUeKkebJl2Y4bJEgsRAHixk4Vx3YQoIsCXXRRdFugi/5A0E33/bMekW0PpMtL4k7vnPuI3R9ftrefPu52HyLsdruHh4f7u7vb+7vPV7u/Ln/6+/kvP794v71d/frmeHP28uXq6HLx9NXk4u78LeFP53mOL5VKLMvyPF8oFARBkCSJL/IFmqkXSqUkRZMpkk4w2QMyTaYymVQ2/TX5jaWaxPFyKUuSKIrILJfLQoRSBDxYgc/m6RxF0RSToxiapvEvMHmSJH3LJ4aDMeLkCE8iVKvVSqUCp16vw6Iuk2eyFJ3JZGNQFHWQOHAdjzg9Pvd9r+e64/E4CALXc8N+6Lqu7/stpdXr9eazmWFZcqPZaDRqEVBUkqX5YE6spyeqrbfbbUM3uk4XIUKxKJZEsVzG3DiIuHfL+FiOADpkUcoXWb+iEqP+VG43as1GtVGTalXN0GutZlNTmu1WU2sftluIxkEURUFDtMXpWq1WnmPbZZmYDWe6Y6lGx3CsbuAZtml5Xb1nw7G9rhf4lmWZpmnbtqZpjuNgeCiSzVHtpkysB0M/DAM/8DzPd71+GHqwQdhWVVGulIpCPC0kgOU4Dg50SWfSXUh1Pll6YTAZj8MwnEY4Oj5arVaiLOfyeYZhQG86nc79h5jtJEl2O0henvlhMBgMRqPRYrEA5+AZtE8mk0G/r+lGQ9VKgoCEOHkvNcMkU2RXM4iTwdy0rdFw2Ol0wMTh4SFEjlkBQ7EDnooRMDPyUegxmXSUDrHuz6v1WkfToBaiEQpiVFUFNyApTovXJt4cvPIcRzGMp1nE6WimdjSlpRiGgbRms4nQeM+AWBsAamMRIdt+bYsCy3NexyamvUFZElEZcciRoj2HRR8kx0sCxGwjBjrhzLgprtEjluFUlCWwH2sQB8GiG5rEyaiFO4dXzLwvhM4cOxvOiZk7LIn/biKCYNEw7vy/sPElg4+K+Lj3eS7oBsTCG+mmgSUaDoe4Blgm6KTrOsjbc8ODHY6NgIHjV47lcjTlmy46ByZSDRNS9/t9vaOjBDhHlZaiiBU5x9CZ/V5QUHhvqVjnpGe4hOcP6poKgW3HdnqOoiqoVG/Uq08qdC7HHmSERI7PJMhUAsA1xu9xIvHoq0eGohPbH397tf1ws7l6t7252dxcX757uP38cXf/3dX728vrL+sf/px8+n17cv3m9Wbz9tvTZxeri2cXL9ZHZ99vdv8A17wL6Vty/DQAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/a2c8f9d4d5a99bd1a504367d6cd4ba9b/8ac56/full-commit.webp 240w,
/static/a2c8f9d4d5a99bd1a504367d6cd4ba9b/d3be9/full-commit.webp 480w,
/static/a2c8f9d4d5a99bd1a504367d6cd4ba9b/84ccf/full-commit.webp 661w&quot;
              sizes=&quot;(max-width: 661px) 100vw, 661px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/a2c8f9d4d5a99bd1a504367d6cd4ba9b/8ff5a/full-commit.png 240w,
/static/a2c8f9d4d5a99bd1a504367d6cd4ba9b/e85cb/full-commit.png 480w,
/static/a2c8f9d4d5a99bd1a504367d6cd4ba9b/0012b/full-commit.png 661w&quot;
            sizes=&quot;(max-width: 661px) 100vw, 661px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/a2c8f9d4d5a99bd1a504367d6cd4ba9b/0012b/full-commit.png&quot;
            alt=&quot;terminal output of npm run commit showing the full commit&quot;
            title=&quot;Looking good so far!&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Looking good so far!&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;That’s pretty nice already! Creating our example commit is nice and easy now.
Next, let’s add a git hook to stop us from messing up.&lt;/p&gt;
&lt;h2 id=&quot;setting-up-git-hooks&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-git-hooks&quot; aria-label=&quot;setting up git hooks permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up git hooks&lt;/h2&gt;
&lt;p&gt;Without the git hook, we can simply make a commit that doesn’t adhere to conventional commits:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; test-files &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; test-files/test1
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;this is not conventional :O&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Yikes! That is not what we want!
Let’s quickly revert it:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; reset &lt;span class=&quot;token parameter variable&quot;&gt;--soft&lt;/span&gt; HEAD~1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, let’s add a Husky git hook to combat future commits that are unconventional:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;npx husky-init &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will automatically create the &lt;code class=&quot;language-text&quot;&gt;.husky/&lt;/code&gt; directory. Let’s create a file in it called &lt;code class=&quot;language-text&quot;&gt;commit-msg&lt;/code&gt; and add commitlint:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/usr/bin/env sh&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;dirname&lt;/span&gt; -- &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$0&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;/_/husky.sh&quot;&lt;/span&gt;

npx --no-install commitlint &lt;span class=&quot;token parameter variable&quot;&gt;--edit&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let’s try our unconventional commit again:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; test-files/test2
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; test-files/test2
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;this is not conventional :O&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 717px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 31.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABRElEQVR42g2NWXKCQABEuULKMso2KJTKMiwzMMCwqwEJhUSjJiHLV/KXygXMBXLs8Kqr+6vrMZeva3N4ee0ufdedduX5rn1qDufjaV82V3L5896et23W+meEqyAtgqSM8g3NEkI/Tx9M54YmtqMkjtIsjGOaxD4NEMaL1ZIH4pRnJ9yU5bgpxw5hBY4TeF4QbsajLc2YDmFESOgHA57nhWGIEVZVTZEVWZrPwUwCA6IkDgVEcRggAel2OtnRnHmM4+FDw0GZBMQPfL/Icg+7uqYtoaoYK8uyHGibtgMNiBHSdcO2LM3QD3nFtF0vQ2iZ0MHIQg4mHvY9l3gOxrVOj0aGTAtAoPGsIsszWeZ4frCPJuOKFsy+/0nWu/tsU+dlRfOaZk1U1Ml6S+i3mv4uymO0IaX5AJ3URiHCLrQJtOFKe9/3/5hoSflE6NYwAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/9cbd2d6a003546f98474481636cb1416/8ac56/husky-error.webp 240w,
/static/9cbd2d6a003546f98474481636cb1416/d3be9/husky-error.webp 480w,
/static/9cbd2d6a003546f98474481636cb1416/4bde0/husky-error.webp 717w&quot;
              sizes=&quot;(max-width: 717px) 100vw, 717px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/9cbd2d6a003546f98474481636cb1416/8ff5a/husky-error.png 240w,
/static/9cbd2d6a003546f98474481636cb1416/e85cb/husky-error.png 480w,
/static/9cbd2d6a003546f98474481636cb1416/0ad97/husky-error.png 717w&quot;
            sizes=&quot;(max-width: 717px) 100vw, 717px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/9cbd2d6a003546f98474481636cb1416/0ad97/husky-error.png&quot;
            alt=&quot;a commit that does not adhere to conventional commits and Husky stopping our commit&quot;
            title=&quot;nice! It throws an error :)&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;nice! It throws an error :)&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Great, our commits seem to be working.
Let’s commit all the things we have now before we move on, crucially I will be using the regular git commit and providing the conventional commit syntax myself:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ci(git): Added conventional commits and some dependencies&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;releases&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#releases&quot; aria-label=&quot;releases permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Releases&lt;/h2&gt;
&lt;p&gt;Now that we’ve successfully set up conventional commits we want to use those to release our first version and generate a changelog to boot.
First, let’s add some npm scripts again:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;release&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;standard-version&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;release:minor&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;standard-version --release-as minor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;release:patch&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;standard-version --release-as patch&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;release:major&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;standard-version --release-as major&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, let’s add a configuration file for standard-version so that it will generate changelog entries.
Create a file named &lt;code class=&quot;language-text&quot;&gt;.versionrc.json&lt;/code&gt; with the following content:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;types&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;feat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;section&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Features&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fix&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;section&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bug Fixes&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;section&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;New content&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;hidden&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;chore&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;hidden&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;docs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;hidden&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;style&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;hidden&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;refactor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;hidden&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;perf&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;hidden&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;hidden&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;commitUrlFormat&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://github.com/mastermindzh/conventional-commits-showcase/commits/{{hash}}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;compareUrlFormat&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://github.com/mastermindzh/conventional-commits-showcase/compare/{{previousTag}}...{{currentTag}}&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The first thing we declare is an array of types, for every type we can define a “section” and whether it is hidden or not.
All hidden types will not show up in the changelog, the others will be grouped by type and will have a header with the text specified in the “section” field.
Let’s try it:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; .versionrc.json package.json
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ci(git): Set up standard-version&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# and let&apos;s add a feature&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; test-files/test3
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; test-files/test3
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;feat: Feature test3&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;note:&lt;/strong&gt; Where I’ve been using &lt;code class=&quot;language-text&quot;&gt;git commit -m&lt;/code&gt; you can also use &lt;code class=&quot;language-text&quot;&gt;npm run commit&lt;/code&gt; to get the interactive git prompt.
Now, let’s release a major version:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; run release:major&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 689px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABP0lEQVR42lWQW26DMBBF2UYeNBRIDAaDbV7GQAwO4ZWkrdRKlfrbbqFdRqXuuE4+mlS6mq85994ZDdcDZ5zlBS+qjBVbIYWQeVV3Mf8pD9/Z9NKe7BGCxIMudTzqQAJR7AUpcImGSY4pD3CGMPODBNP8Im5vgnsbm4AYljebWwt9fau5bqupIZI5kLpetAahMkM481CsXICLVQhwQgCJYULdAPoKLO82t9KKqk2YajqkTCRsS+MChSn0I8VHaUXjMiRM2VlrNFtYy/+8Vm73GW/2w8N0es54XYrubJQL1cVc+4pRgaqR60fqkPny3PYK13LMy53cH5p26qcn0YwqME6rUvRxIjEVIcnFZUf9Qp12ZzhXOJLjrmll2xelqGU3jMeuH+VuGo7V++fq42v1+vbYNIPrUdNG6juG6f6F/wLCaFF4tNmeHQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/dcb1fa2ddcdde00d5d183218ac4dd9f1/8ac56/first-release.webp 240w,
/static/dcb1fa2ddcdde00d5d183218ac4dd9f1/d3be9/first-release.webp 480w,
/static/dcb1fa2ddcdde00d5d183218ac4dd9f1/2e76f/first-release.webp 689w&quot;
              sizes=&quot;(max-width: 689px) 100vw, 689px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/dcb1fa2ddcdde00d5d183218ac4dd9f1/8ff5a/first-release.png 240w,
/static/dcb1fa2ddcdde00d5d183218ac4dd9f1/e85cb/first-release.png 480w,
/static/dcb1fa2ddcdde00d5d183218ac4dd9f1/0f79a/first-release.png 689w&quot;
            sizes=&quot;(max-width: 689px) 100vw, 689px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/dcb1fa2ddcdde00d5d183218ac4dd9f1/0f79a/first-release.png&quot;
            alt=&quot;terminal output of npm run release:major&quot;
            title=&quot;our first release!&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;our first release!&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The output is kind enough to tell us how to push our changes to the remote so let’s just do it:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push --follow-tags origin master&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now let’s have a look at our &lt;code class=&quot;language-text&quot;&gt;git log&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 655px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 65.83333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACUElEQVR42m2RXW+bMBiF+QWb9hEgCWCDA8Y2hjRAQkIIYW1ovmjSpElTrR/bpG53280ut/8+p9KmTd2r10evLD/W8bH08/uPzbK62+zvL3b3y6vb5fZhc3h/ubu72t9u93e765vVtrq+r3Y38912VlW72XxTTmdp53ERSZ8OD8AEQeCHccjbXrsTxN0wjsNe0uU+N00ITVBTlZpcq6myrCqqqjQa9Zdv31T5VFrmM2iZvh9w7rsuwRgjhJpNTdN1IY3jpEEAoCgh4FgmNOWGeplOpJvxuYPRCWdR4HV8FjA3CljbIx1OQp92OBU7xr8lrqjVlbWAH9cHh7pxFPWTXhiGURT2+0k6GAyzLI4jQlzXxf+D1dXwVJonDCBHnGHME7YppU/WgAGgbhydiwc8h+W6Wg1yqRpQy0KcOB5xOHWZ6xCM3JaJj21RB9nIfAZDEeEqL6Uv2z31aC+Ohmk/6cZdMQySLB2MxEp6JyJHjwkAPPVfsLwpFtI6eQdtJKKmjAvXnvgfPxDqB23TQvVj3LpmGE3DaBiG/gdW5M3ZUlqkBUIwYITils9c6uI2pz7FR/82Eu3YFgGQGzAwoAOA/tv2eixs337wOUuT3ng0HPS6/V53nA2LkehM+O8E3PdYS9OxphPNsAUHgAVNtV5f5WfStJjU9abt4qfEKaaEeB5mxGUE2S0NGrBlWY6NsGPaLaXZkBVFkC9ev5qlY+nb/ecyK6q8nI/OlvlkMTxdjiaLbFIV83VZrYVm5Wo8WZXTi3J2PiwmaT7Ni1HS/3r4+At2iY6T/CoUpwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/b037af085e3702f6f696044728b90f67/8ac56/git-log.webp 240w,
/static/b037af085e3702f6f696044728b90f67/d3be9/git-log.webp 480w,
/static/b037af085e3702f6f696044728b90f67/09ab1/git-log.webp 655w&quot;
              sizes=&quot;(max-width: 655px) 100vw, 655px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/b037af085e3702f6f696044728b90f67/8ff5a/git-log.png 240w,
/static/b037af085e3702f6f696044728b90f67/e85cb/git-log.png 480w,
/static/b037af085e3702f6f696044728b90f67/ae6b7/git-log.png 655w&quot;
            sizes=&quot;(max-width: 655px) 100vw, 655px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/b037af085e3702f6f696044728b90f67/ae6b7/git-log.png&quot;
            alt=&quot;output of git log showing our own commits and a new commit of type chore with the release&quot;
            title=&quot;we have our own commits + a new release commit&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;we have our own commits + a new release commit&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Now, let’s also look at our changelog:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 24.166666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA6klEQVR42mWO2W7CMBBF8w0IIbXNQrPYjrPYaVD/pERUgn523qmUIkBB2R1DTJ1UfeLo6I7m4WpGCXEEIAWIIikkEBLLCUw7eHo2N59fXdte8rwsS855L+ETco5Lr8QeiTDxXeJ7suwj4Dk2Ni13Nlc/ku3P4ZCmaZZlQojhn5u4D2JEoQBjB0EboEnXgdCCGLiLhbpOdk3TFEVRVVVd190frG/40DJ+vXIlDmPqR6vw7Z2uXBjYNjZekWag2VxbJ9vz+bT/3p+OR8bY/QHFWEKpPqWqgxfNkakvZVlNNjt5Ns8v3W188rH8C2PWqlebnjG6AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/c3eeee23ee66f2e5cc8b7aa9fc36e6fe/8ac56/changelog-1.webp 240w,
/static/c3eeee23ee66f2e5cc8b7aa9fc36e6fe/d3be9/changelog-1.webp 480w,
/static/c3eeee23ee66f2e5cc8b7aa9fc36e6fe/e46b2/changelog-1.webp 960w,
/static/c3eeee23ee66f2e5cc8b7aa9fc36e6fe/f992d/changelog-1.webp 1440w,
/static/c3eeee23ee66f2e5cc8b7aa9fc36e6fe/74c35/changelog-1.webp 1521w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/c3eeee23ee66f2e5cc8b7aa9fc36e6fe/8ff5a/changelog-1.png 240w,
/static/c3eeee23ee66f2e5cc8b7aa9fc36e6fe/e85cb/changelog-1.png 480w,
/static/c3eeee23ee66f2e5cc8b7aa9fc36e6fe/d9199/changelog-1.png 960w,
/static/c3eeee23ee66f2e5cc8b7aa9fc36e6fe/07a9c/changelog-1.png 1440w,
/static/c3eeee23ee66f2e5cc8b7aa9fc36e6fe/7e881/changelog-1.png 1521w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/c3eeee23ee66f2e5cc8b7aa9fc36e6fe/d9199/changelog-1.png&quot;
            alt=&quot;the first changelog&quot;
            title=&quot;very neat!&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;very neat!&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;That looks great! &lt;code class=&quot;language-text&quot;&gt;standard-version&lt;/code&gt; automatically added a header for our version, sub-headers for our types and even linked our commits to the remote as configured in &lt;code class=&quot;language-text&quot;&gt;.versionrc.json&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;lets-play-a-little&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#lets-play-a-little&quot; aria-label=&quot;lets play a little permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Let’s play a little&lt;/h2&gt;
&lt;p&gt;Now that we have a successful setup we can try a few commits and releases. Let’s start with 2 bugfixes and a new feature:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# our first bugfix&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; test-files/test4
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; test-files/test4
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fix: fixed test 4 by doing fancy stuff&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# our second bugfix&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; test-files/test5
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; test-files/test5
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fix: test5 was difficult, but we got it&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# and finally a new feature&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; test-files/test6
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; test-files/test6
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;feat: Added feature number 6! So nice&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we’ll release this as a minor, because we added a new feature. Execute&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; run release:minor&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 839px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 120%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAYCAIAAAB1KUohAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACtElEQVR42p1Ta2/SUBg+f8Jkjl3YEByMQSm3citdkW06Pxlj/G4Wv5j5wbnE+cEfqIuQJQKblLlw2eiFXmjLpVDfdhsz0QTmc5405zR9zvs87+lBn4++HB4cHR58Ovx49H7/w97bd7MT8bxgmuZ4PDbvD9RsNovFwsnJSaFQ+PrtWJKkGfeCT9DVVbtWq52dnpVK5R+lEsuyo9FocIuhjcHQ6Btj4MAwrKUNKAC2+X5P1zS137OgdrtQXJJhSKI1kxRZFrsarxuCPpRUXVHkjg1jZCCWF+q6WT6vfz8+rv6sVsplUZzVOWqzrCB32ywHRXTdsgDGblLZwW4mNm/Tjq+3RpetVo2pVioVTdMgrXGdyhhBwqm1kSB0IKog8CLYhaCyDKkEtcepg9Foiho16vVyucwwVY7n7zyNzVnOHXU6IvSTtdFutzmOYzmO4VVB7ZvmlC0s26qq8jxoWDgAEINxUR92e8PpleHri18Xp6eVYrHIMAx0riOKsx5Vq9VqNhr1RgPaBgpo+Oz/OYKol5et89q5DHb7hjYw7nExICeU0nRryL3hvcX/fyVbzSZciW4XWq7dUdMUpacouvXWhv1+sroBwohNgtyKE1kiQcUIMpXOwSSbfbL9LE3lE8kUnUjRkWgGj6TCkTQ8MTwxIXrgT/iSOTwUDYWJYCgaIzKxeDqEx7ZfOJ6+dGF4zLnqda76Vlw+l9vvdPnm5lcnRE6nZyMQ9W1Evevhx94QPIHuNWxxKQB0LHkeOlzzC48ci+5rLix5JkTL68E4mQtH00AsnMzSO5bPeCYST+FRyxvstbzi/VNzJ17xBUh6J03mc/nndH4XxESKjicoDCe96/FgKEkkN/2B2D/1aC5MBendzSydylCZbI6it0gqn6HoV2/cr/cC2zu7/kDE5d7wrGF/i38Drts450RrjfMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/e61bc6855164c097d564087af38b1e33/8ac56/changelog-2.webp 240w,
/static/e61bc6855164c097d564087af38b1e33/d3be9/changelog-2.webp 480w,
/static/e61bc6855164c097d564087af38b1e33/0a1be/changelog-2.webp 839w&quot;
              sizes=&quot;(max-width: 839px) 100vw, 839px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/e61bc6855164c097d564087af38b1e33/8ff5a/changelog-2.png 240w,
/static/e61bc6855164c097d564087af38b1e33/e85cb/changelog-2.png 480w,
/static/e61bc6855164c097d564087af38b1e33/d26aa/changelog-2.png 839w&quot;
            sizes=&quot;(max-width: 839px) 100vw, 839px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/e61bc6855164c097d564087af38b1e33/d26aa/changelog-2.png&quot;
            alt=&quot;the changelog with different sections and their commits&quot;
            title=&quot;our updated changelog&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;our updated changelog&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id=&quot;breaking-changes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#breaking-changes&quot; aria-label=&quot;breaking changes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;breaking changes&lt;/h3&gt;
&lt;p&gt;All is well, but let’s introduce a breaking change:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; test-files/test7
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; test-files/test7
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; run commit&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; conventional-commits-showcase@1.1.0 commit
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; git-cz

cz-cli@4.2.5, @commitlint/cz-commitlint@17.2.0

? Select the &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; of change that you&lt;span class=&quot;token string&quot;&gt;&apos;re committing: feat
? What is the scope of this change (e.g. component or file name) (press enter
to skip): (max 96 chars)
 (0)
? Write a short, imperative tense description of the change: (max 96 chars)
 (38) feature 7, with a few breaking changes
? Provide a longer description of the change (press enter to skip):
 We broke some stuff, woopsie
? Are there any breaking changes?: Yes
? Describe the breaking changes:
 api endpoint &apos;&lt;/span&gt;test7&apos; now returns json instead of xml
? Does this change affect any &lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt; issues?: No
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;master e7f7b0e&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; feat: feature &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;, with a few breaking changes
 &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; changed, &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; insertions&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;+&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; deletions&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
 create mode &lt;span class=&quot;token number&quot;&gt;100644&lt;/span&gt; test-files/test7
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which gives us the following changelog:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 811px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 124.58333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADEUlEQVR42o1Ta3PSQBTN39Bq1QKlpUAgIYRXKBRqfbR1tOqM3/2jVTsORce2tDwsdJzCJpAEYgKEPMFLcHz0A+XMmTubnXuy5969i70+eLf3/BVwf/fgyeN9htlOpnILEmNZbjKZ2JY1tu3xeGyY5kjTNF1fhFgLoevmtSAKHZ5HiB2NRpOFgbVarYuLi0Kh8OHDx8PDw0ajAbtgYSFxu90xdU0dDOBMXdMG/YGsyD2pJ/+cxp8OZFnhB4agmuLQUJS+JEndrgi7GMt12L7+g+18r1WbrVaz2eQFwTRN63+Y9nhGy7ann04CxrZ5Tp9c893G5SULQKgnSYvWDPk/GpfnpbNqtQoFX11dnZyeVCqVhcQ8L6iq2m634S8Qeb6DEILO93rgQJrffOg2EkSR47hZ3tiBs7AdjufaRlAmqtfriqIYhgHzATOiTVtvDA3bsse32DYtW+n3pd4UXQeKIssDtTcyDcueJ+bafFOb1JpcsVCo1b5DqxDLLtpt1EKiKMKo6Lr+b83T9e1XhRBMRrlchnkCvTpSoWhV0xXNmu95Ku50eNM0ZAd9B8PhUBmORNXUTOsWMUzF+Xnpsl5nufZvt2Dboe1M4hxMuw0XA08SmiwKgtgVpV63KY841Zrc9rawz5+OSqdnx8UvheNisfj1uPgVYuFb6ahYPj2pl0qVchlYhXjhsFKpViq1GTEXweDJPEnSkWiKjCRiic0oncqk8tltPL/vTaYTRCTp85NrG4QvENkIUN71kHs1MCN2d4NeozbxIImHo0GcIsgYSSUCwWg8u7b9coVORt2eoMvjX3H7IdvjDT5c8d1/4J0Re7SyHqFSITKBh+N+PBoi4gGcDoZpt4d0uSmXG4eke8urwKX7HiAs/oqXfXgsnQd9JMoEQ3Q6s8NsPqbodIigwxEaD8f8AQpOm+lvEHuwHogzuVhiK53dyeSeMZmdeHKLiqVJivEH6TUfEUtukVQKDC8te26K7xBpIr+3lc0zm7lMdjubg5NziWR+9w3x9v3qi4OndCwLSu96+JFrY2b7j/gX1rdZGMZZ9fYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/58501b831dd6db681ed0b748c5ae2281/8ac56/changelog-3.webp 240w,
/static/58501b831dd6db681ed0b748c5ae2281/d3be9/changelog-3.webp 480w,
/static/58501b831dd6db681ed0b748c5ae2281/a63ac/changelog-3.webp 811w&quot;
              sizes=&quot;(max-width: 811px) 100vw, 811px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/58501b831dd6db681ed0b748c5ae2281/8ff5a/changelog-3.png 240w,
/static/58501b831dd6db681ed0b748c5ae2281/e85cb/changelog-3.png 480w,
/static/58501b831dd6db681ed0b748c5ae2281/fd28b/changelog-3.png 811w&quot;
            sizes=&quot;(max-width: 811px) 100vw, 811px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/58501b831dd6db681ed0b748c5ae2281/fd28b/changelog-3.png&quot;
            alt=&quot;changelog with a very clear breaking changes banner&quot;
            title=&quot;everyone will see this message, no users will complain, no way!&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;everyone will see this message, no users will complain, no way!&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Phew! That was quite a long post.
Hopefully, you’ve managed to set up conventional commits and/or standard-releases to your liking and if not there’s always the comment section.
The end-result can be found on &lt;a href=&quot;https://github.com/Mastermindzh/conventional-commits-showcase&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Github&lt;/a&gt;, the &lt;a href=&quot;https://github.com/Mastermindzh/conventional-commits-showcase/blob/master/CHANGELOG.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Changelog&lt;/a&gt; is especially pretty.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[My blog hasn't gotten an update in 5 years, here's why.]]></title><description><![CDATA[Good software design practices and a few perfectionistic tendencies lead to almost 5 years without any writing. This post is a deep dive into a few of the struggles of the past 5 years]]></description><link>https://www.rickvanlieshout.com/posts/2022/writing-as-a-software-architect-is-hard/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2022/writing-as-a-software-architect-is-hard/</guid><pubDate>Sun, 30 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been rebuilding the old ”&lt;a href=&quot;https://www.rickvanlieshout.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;rickvanlieshout.com&lt;/a&gt;” for over 5 years now…
But the website isn’t that big. It could be done way faster and it has been done way faster.
The thing is, I rewrote it several times, each time with a different design and updated packages.&lt;/p&gt;
&lt;h2 id=&quot;changing-the-theme-round-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#changing-the-theme-round-1&quot; aria-label=&quot;changing the theme round 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Changing the theme (round #1)&lt;/h2&gt;
&lt;p&gt;Shortly after finishing the original website its design already felt stale.
Sure, it had some nice colors and I really liked the mobile view (it read beautifully on a smartphone), but it still felt off.
Nothing on the website gave me a wow effect, most of it was “ok” and some of it was not to my liking.
I never quite put my finger on the why, but it just didn’t feel right.&lt;/p&gt;
&lt;p&gt;I did put a lot of time into optimizing and designing the bits I found important, the biggest time sinks were multi-language support and print mode.
In the end, I even ended up making a compromise on the multi-language support because I didn’t want to blog in Dutch.
One of the things I’m glad I did, however, was working on styling print mode.
It wasn’t because I expect many people to print my website or articles, it’s because I expect some of them to use “read-focus” extensions or apps like pocket as I do so often myself. I also suspect the occasional pdf download, most of which I probably did myself on my resume page though.&lt;/p&gt;
&lt;p&gt;One of the biggest annoyances that I tried solving with a new theme was dark mode.
Hell, I swung completely in the opposite direction and bought the all-dark &lt;a href=&quot;https://themeforest.net/item/hikma-portfolio-html-template/23366729&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Hikma theme&lt;/a&gt;. I rebuilt the entire site in that theme, but never published. The next chapter will explain why.&lt;/p&gt;
&lt;h2 id=&quot;moving-to-gatsby&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#moving-to-gatsby&quot; aria-label=&quot;moving to gatsby permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Moving to Gatsby&lt;/h2&gt;
&lt;p&gt;Right around the time I started thinking about uploading the new theme I also found GatsbyJS.
Gatsby was in its infancy back then, barely out of beta and a little rough around the edges.
Considering I like to live on the edge, software-wise anyway, I decided to go for it.
&lt;code class=&quot;language-text&quot;&gt;rickvanlieshout.com-hikma-gatsby&lt;/code&gt; was born and I worked on it for a few short weeks.&lt;/p&gt;
&lt;p&gt;In the end, that also burned out because, again, the theme felt stale.&lt;/p&gt;
&lt;h2 id=&quot;upgrading-to-gatsby-3-and-back-to-the-old-theme&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#upgrading-to-gatsby-3-and-back-to-the-old-theme&quot; aria-label=&quot;upgrading to gatsby 3 and back to the old theme permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Upgrading to Gatsby 3 and back to the old theme&lt;/h2&gt;
&lt;p&gt;I’d had enough! I needed to finish my website and I needed to do it quickly.
I picked up the new Gatsby V3, my old theme, and a renewed mental vigor and started coding away.
The first prototypes came into existence very quickly and looked fine.&lt;/p&gt;
&lt;p&gt;Alas, I burnt out on the project almost as quickly as I had started.
One of the reasons was the theme… but there was a more serious reason this time as well.&lt;/p&gt;
&lt;h2 id=&quot;server-side-rendering-the-old-theme-and-a-stubborn-software-architect&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#server-side-rendering-the-old-theme-and-a-stubborn-software-architect&quot; aria-label=&quot;server side rendering the old theme and a stubborn software architect permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Server-side rendering, the old theme, and a stubborn software architect&lt;/h2&gt;
&lt;p&gt;During the rewrite to Gatsby V3 I encountered various SSR issues.
The most notable of them all was not being able to save and apply the color scheme without annoying flashes on page loads.
I chalked it up to a CSS issue and left it for what it was at first, but I simply couldn’t go live like this.&lt;/p&gt;
&lt;p&gt;We just discovered my other biggest flaw. Perfectionism.
Because I am responsible for code and product quality at my job and have also heavily emphasized that part of my contributions in any of the open-source projects I’ve worked on, I felt that I couldn’t release something that wasn’t perfect.
And as most of you will know, you can chase perfection forever. There is always a flaw, always something to improve.&lt;/p&gt;
&lt;p&gt;In my mind, I could fix the quality issues, but I’d still be left with the theme.
I also realized I’d end up at the same point I started… Same design, and the same missing features, just a bunch of time later.
This wasn’t working either.&lt;/p&gt;
&lt;h2 id=&quot;finding-a-new-design-and-a-new-starting-point&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#finding-a-new-design-and-a-new-starting-point&quot; aria-label=&quot;finding a new design and a new starting point permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Finding a new design and a new starting point&lt;/h2&gt;
&lt;p&gt;One day I found myself procrastinating on a whole bunch of things by looking at fancy CSS themes.
I hadn’t really thought about it, but I’d ended up looking at new portfolios and blog designs.
I’d found a few good candidates but didn’t really make a choice yet.&lt;/p&gt;
&lt;p&gt;Was I embarking on the journey once again? Or would I give up before I started?
Eventually, I decided to organize my thoughts and figure out why things failed before, it roughly came down to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I can’t go about and make it perfect on the first try
&lt;ul&gt;
&lt;li&gt;No translations&lt;/li&gt;
&lt;li&gt;Print mode for all the important pages&lt;/li&gt;
&lt;li&gt;Dark mode can come later&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I didn’t like the design, I wanted something black and white which could be reversed for dark mode&lt;/li&gt;
&lt;li&gt;I didn’t like the previous efforts of using Gatsby for just the posts and not the static pages&lt;/li&gt;
&lt;li&gt;I needed a starting point, no matter how “good” it was, I needed a place to start writing again.&lt;/li&gt;
&lt;li&gt;I needed a new website fast because the old one was breaking down (PHP updates caused the API to break)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eventually, I stumbled upon ”&lt;a href=&quot;https://github.com/alxshelepenok/gatsby-starter-lumen&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;lumen&lt;/a&gt;”. A beautiful blog project with amazing typography and a relatively modern Gatsby setup. It wasn’t perfect, it missed a few bells and whistles, but it did tick off a lot of boxes.
I decided to fork the project and try it out, adding bits and bobs of content to see how my writing style would look with the new theme.&lt;/p&gt;
&lt;p&gt;I liked it.&lt;/p&gt;
&lt;h2 id=&quot;not-all-was-perfect-however&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#not-all-was-perfect-however&quot; aria-label=&quot;not all was perfect however permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Not all was perfect however&lt;/h2&gt;
&lt;p&gt;As with all things in life, this project would need some work. I found a few things that were lacking which I wanted to fix before releasing a new website. I was determined not to fall into the same trap as before however and structured the work better than I ever had before.&lt;/p&gt;
&lt;h3 id=&quot;things-i-changed&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#things-i-changed&quot; aria-label=&quot;things i changed permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Things I changed&lt;/h3&gt;
&lt;p&gt;Below you’ll find a list of some of the biggest things I’ve changed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I added a Dark mode with a little &lt;a href=&quot;https://github.com/aaronshaf/react-toggle&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;react-toggle&lt;/a&gt; to switch between light/dark.&lt;/li&gt;
&lt;li&gt;Blog posts now show a header that includes the “back to articles” button and my name.&lt;/li&gt;
&lt;li&gt;Added code block theming for both light and dark mode
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 20.416666666666668%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAwUlEQVR42lWPWwqDMBBF3UyLqPGtqKuytu7bxrdJvJ0MKHTgMpOPHO5xtnXFPM9YlgXTNPF9vbXWsPN59/AfTzRlibookKUphBB/CcMQnufBkcpgmFeM8suQfd9xnieDjDG8ewIGroemrvmjjQjFfV9h4KY0JDUbR0mw7c5x7FDqYOCrbeG6LqqqQk4N8zznZFmGKIoQxwlvBipt8JUD6UpSnWiP1JSU14XV7XRdB9/3URPQQi5YSupJkiAIAta2wB8vu9P0vglzOQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/1b3c48c94846e897c393cc0961478f8b/8ac56/prism_styles.webp 240w,
/static/1b3c48c94846e897c393cc0961478f8b/d3be9/prism_styles.webp 480w,
/static/1b3c48c94846e897c393cc0961478f8b/e46b2/prism_styles.webp 960w,
/static/1b3c48c94846e897c393cc0961478f8b/f992d/prism_styles.webp 1440w,
/static/1b3c48c94846e897c393cc0961478f8b/53a04/prism_styles.webp 1702w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/1b3c48c94846e897c393cc0961478f8b/8ff5a/prism_styles.png 240w,
/static/1b3c48c94846e897c393cc0961478f8b/e85cb/prism_styles.png 480w,
/static/1b3c48c94846e897c393cc0961478f8b/d9199/prism_styles.png 960w,
/static/1b3c48c94846e897c393cc0961478f8b/07a9c/prism_styles.png 1440w,
/static/1b3c48c94846e897c393cc0961478f8b/b88bf/prism_styles.png 1702w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/1b3c48c94846e897c393cc0961478f8b/d9199/prism_styles.png&quot;
            alt=&quot;&amp;quot;A block of code in both the dark and light themes&amp;quot;&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;I added support for tables with a bit of styling around them (slight indent and row styling)
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 927px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 32.916666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAs0lEQVR42n1QyxKEIAzj/79THgIFgWEFRdy4XPagZqDTQtIGmCOaJl63rfdea51QcJ5SOs/zAFo7HgA+896Dva6ltVZKEZzPSmmtrbUxRJD2B1ziEAKoyDAKeiklynlGhwvOuXF1C5ZSJKJRQAwlkTPGIoH5F+UlXi6EfzEMGyytjTHOESLa3XZhMUa8OcY0xEIIuJZK1a3uOw5a/+F+cs4Z0xDH92IsvtBhLx4Gcv682P4CWqyVg9E3yysAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/13dbb5ea71d609da9ee49e6a1e7770f5/8ac56/table.webp 240w,
/static/13dbb5ea71d609da9ee49e6a1e7770f5/d3be9/table.webp 480w,
/static/13dbb5ea71d609da9ee49e6a1e7770f5/4c2b6/table.webp 927w&quot;
              sizes=&quot;(max-width: 927px) 100vw, 927px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/13dbb5ea71d609da9ee49e6a1e7770f5/8ff5a/table.png 240w,
/static/13dbb5ea71d609da9ee49e6a1e7770f5/e85cb/table.png 480w,
/static/13dbb5ea71d609da9ee49e6a1e7770f5/e4374/table.png 927w&quot;
            sizes=&quot;(max-width: 927px) 100vw, 927px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/13dbb5ea71d609da9ee49e6a1e7770f5/e4374/table.png&quot;
            alt=&quot;a table&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;I added the ability to quote others in a beautiful way
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 918px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 25.83333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAg0lEQVR42nWPjQ4DERCEvf9zFk2qLIL6vY6Tu6TX3CfWyE7WYGNsd8QYSynbPcx7/z5QSmmtOX9IMRefCCkF9lPK5YEBBSKEwFprtdaz5vxRL4WeMQazltBmMg2HE2fvnf1HJSLEIWuJjLXWOQeFa0rpGnv8sj+ea6n4LUTZWQKti/kLDeMhsQl7TjAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/204bc85aea588965fcd4090b7c7109ee/8ac56/quote.webp 240w,
/static/204bc85aea588965fcd4090b7c7109ee/d3be9/quote.webp 480w,
/static/204bc85aea588965fcd4090b7c7109ee/56bc7/quote.webp 918w&quot;
              sizes=&quot;(max-width: 918px) 100vw, 918px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/204bc85aea588965fcd4090b7c7109ee/8ff5a/quote.png 240w,
/static/204bc85aea588965fcd4090b7c7109ee/e85cb/quote.png 480w,
/static/204bc85aea588965fcd4090b7c7109ee/e0885/quote.png 918w&quot;
            sizes=&quot;(max-width: 918px) 100vw, 918px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/204bc85aea588965fcd4090b7c7109ee/e0885/quote.png&quot;
            alt=&quot;a quote&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Medium like image zooming (click any of the images above)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;the-posts-query-bug&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-posts-query-bug&quot; aria-label=&quot;the posts query bug permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The posts query bug&lt;/h4&gt;
&lt;p&gt;Here and there I also encountered some bugs. Most of them got fixed in my copy but one of them was big enough that I felt a need to contribute to the project. The “posts query” bug.&lt;/p&gt;
&lt;p&gt;Before the fix, there was a bug in the &lt;code class=&quot;language-text&quot;&gt;post-query&lt;/code&gt; file that simply looked through all markdown files to find pages with a slug.
This, however, is troublesome if you have more than the 3 example pages because the default page sizing will fail.
You see, the code that fetches the blogs does so by filtering out real “posts”, but the pagination queries do not.
This meant that, given enough pages, the pagination would overflow and tell the user that there were more posts available than there were.
If a user were to click on “next” they would be presented with an empty page.&lt;/p&gt;
&lt;p&gt;In the end, it was a tiny bug, but I &lt;a href=&quot;https://github.com/alxshelepenok/gatsby-starter-lumen/pull/1125&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;submitted a PR&lt;/a&gt; to fix it in the upstream repository.&lt;/p&gt;
&lt;h2 id=&quot;making-it-my-own&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#making-it-my-own&quot; aria-label=&quot;making it my own permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;making it my own&lt;/h2&gt;
&lt;p&gt;Though the original codebase gave me a great starting point I have decided not to follow the upstream contributions but instead forge my own future.
Doing so allows me to keep my codebase clean and allows me to deviate from the choices made by Alexander.&lt;/p&gt;
&lt;p&gt;Alexander is slowly introducing more features than I need.
One of the newer feature commits (a dark mode) even included his own state management library “diesel” for which I see absolutely no fit in the project.&lt;/p&gt;
&lt;p&gt;As such, I have decided to simply skip pulling from upstream and maintain the website myself.&lt;/p&gt;
&lt;h2 id=&quot;the-future-is-bright&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-future-is-bright&quot; aria-label=&quot;the future is bright permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The future is bright&lt;/h2&gt;
&lt;p&gt;Now that I have this new blog it should be easier for me to write some articles.
Let’s hope I will find time to write more than I have in the past 5 years!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[My dog, Eddy, died today. He will be missed.]]></title><description><![CDATA[Today we had to give a lethal injection to my furry friend Eddy. He will be honored appropriately and this post is one of the tools to do that.]]></description><link>https://www.rickvanlieshout.com/posts/2022/ode-to-eddy/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2022/ode-to-eddy/</guid><pubDate>Fri, 30 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 682px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 150%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAeABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAgX/xAAXAQEBAQEAAAAAAAAAAAAAAAABAgAD/9oADAMBAAIQAxAAAAHmN1QMB1SVdkG+kVig3//EABsQAAIDAQEBAAAAAAAAAAAAAAECAAMSExEi/9oACAEBAAEFAqyc1oPDWCakKS4cpoQN9XZyiHydGndp/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEQEf/aAAgBAwEBPwFGX//EABcRAAMBAAAAAAAAAAAAAAAAAAABEBH/2gAIAQIBAT8BZt//xAAfEAABAgYDAAAAAAAAAAAAAAAAARECEBIhQVEiMoH/2gAIAQEABj8CjZMCZ2cai+S0nErhqQ6J7JtFj//EAB0QAAMAAgMBAQAAAAAAAAAAAAABESExUWFxQYH/2gAIAQEAAT8hVUrsbQnevAyRHgyfJoVEbafo4p4jVRgItZh+ABxLcVmFbfxeFo0dUbHpOz//2gAMAwEAAgADAAAAEDP5Q//EABcRAAMBAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8Qa6QJlR//xAAXEQADAQAAAAAAAAAAAAAAAAAAAREx/9oACAECAQE/EKWFDRD/xAAeEAEAAgICAwEAAAAAAAAAAAABABEhMUFRYYGx0f/aAAgBAQABPxBEBaL2HRMmwEOLk+R6CWtGEAFA5RhgFxVPb5BZUVnTAxsVN4md2liiliWthZng/PUbpEOlQowgS81HCRoUtn//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/d8faf5ac5800701743db92d65d2b132f/8ac56/eddy-2011.webp 240w,
/static/d8faf5ac5800701743db92d65d2b132f/d3be9/eddy-2011.webp 480w,
/static/d8faf5ac5800701743db92d65d2b132f/57e27/eddy-2011.webp 682w&quot;
              sizes=&quot;(max-width: 682px) 100vw, 682px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/d8faf5ac5800701743db92d65d2b132f/09b79/eddy-2011.jpg 240w,
/static/d8faf5ac5800701743db92d65d2b132f/7cc5e/eddy-2011.jpg 480w,
/static/d8faf5ac5800701743db92d65d2b132f/54e8a/eddy-2011.jpg 682w&quot;
            sizes=&quot;(max-width: 682px) 100vw, 682px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/d8faf5ac5800701743db92d65d2b132f/54e8a/eddy-2011.jpg&quot;
            alt=&quot;headshot of Eddy in his early years, jack-russel and fox mix&quot;
            title=&quot;This is Eddy, January 30, 2011&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;This is Eddy, January 30, 2011&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately, I’ve had to put my dog Eddy down today.
Eddy was my best friend. Not just my best furry friend, but my best friend period.
He never failed to bring me joy, he was always there when I needed him and he helped me overcome some of life’s biggest obstacles just by existing.&lt;/p&gt;
&lt;p&gt;Putting him down was very hard for me. Eddy had been in a rough shape for at least a week but I wasn’t ready to give up on him.
As a matter of fact, I didn’t want to give up until after he was put down. To say I cried like a newborn would be an understatement.
I’ve felt pain like this in my life before, and I swore I would never let it happen again but Eddy managed to nestle his way too deep in my heart.&lt;/p&gt;
&lt;p&gt;I love you Eddy. Always have. Always will. Rest in peace my friend.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Eddy&lt;/p&gt;
&lt;p&gt;2009-10-18 - 2022-09-30&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;why-eddy-had-to-be-put-down&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-eddy-had-to-be-put-down&quot; aria-label=&quot;why eddy had to be put down permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why Eddy had to be put down&lt;/h2&gt;
&lt;figure class=&quot;float-right&quot; style=&quot;width: 240px&quot;&gt;
 &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 59.583333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEFAgP/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABnUM9ZWIo/8QAGxAAAwACAwAAAAAAAAAAAAAAAQIDABIEERP/2gAIAQEAAQUCnBmfdXPeuSzjgAUX0f8A/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAHhAAAgEEAwEAAAAAAAAAAAAAAAERAhIhQTFRcYH/2gAIAQEABj8CjW2W0JY4Iqdr6PR4RLb+H//EABsQAAIDAAMAAAAAAAAAAAAAAAABESFBobHR/9oACAEBAAE/IUHzEJtCVnpzCFew+VMtJhBFWP/aAAwDAQACAAMAAAAQEO//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAwEBPxAn/8QAFREBAQAAAAAAAAAAAAAAAAAAEDH/2gAIAQIBAT8Qp//EAB0QAQACAgIDAAAAAAAAAAAAAAERIQBRQWExcfH/2gAIAQEAAT8QQ7AZkqS331hywE5qb0O+8DMwWwVN8ecMKWiS5rAALCF4CU1kBB9z/9k=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source srcset=&quot;/static/b2c0c8d01657f3f4d5a3203fc04993e2/8ac56/eddy-ribbon.webp 240w,
/static/b2c0c8d01657f3f4d5a3203fc04993e2/d3be9/eddy-ribbon.webp 480w,
/static/b2c0c8d01657f3f4d5a3203fc04993e2/e46b2/eddy-ribbon.webp 960w,
/static/b2c0c8d01657f3f4d5a3203fc04993e2/f992d/eddy-ribbon.webp 1440w,
/static/b2c0c8d01657f3f4d5a3203fc04993e2/882b9/eddy-ribbon.webp 1920w,
/static/b2c0c8d01657f3f4d5a3203fc04993e2/8df42/eddy-ribbon.webp 2048w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/webp&quot;&gt;
          &lt;source srcset=&quot;/static/b2c0c8d01657f3f4d5a3203fc04993e2/09b79/eddy-ribbon.jpg 240w,
/static/b2c0c8d01657f3f4d5a3203fc04993e2/7cc5e/eddy-ribbon.jpg 480w,
/static/b2c0c8d01657f3f4d5a3203fc04993e2/6a068/eddy-ribbon.jpg 960w,
/static/b2c0c8d01657f3f4d5a3203fc04993e2/644c5/eddy-ribbon.jpg 1440w,
/static/b2c0c8d01657f3f4d5a3203fc04993e2/0f98f/eddy-ribbon.jpg 1920w,
/static/b2c0c8d01657f3f4d5a3203fc04993e2/e1596/eddy-ribbon.jpg 2048w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/jpeg&quot;&gt;
          &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/b2c0c8d01657f3f4d5a3203fc04993e2/6a068/eddy-ribbon.jpg&quot; alt=&quot;Eddy with a ribbon penetrating his body so the wounds won&apos;t close&quot; title=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
 &lt;figcaption&gt;Such a cute boy with his ribbon, July 2016&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Of course this isn’t the first time Eddy has had some issues with his health.
During the course of a life many things can happen and some of those will inevitably be bad.
I’ve included a picture of the time Eddy had to carry a ribbon through his torso to prevent the wound from closing.
Not the prettiest sight but it was worth it because he pulled through.
Apart from that Eddy also had to take medicine twice a day for various other illnesses, and he was very good at hiding his pills too…
Later Eddy lost a lot of his teeth and also a big part of his vision.&lt;/p&gt;
&lt;p&gt;The issues with Eddy were much more serious this time though.
Eddy has had stomach ulcers for a long time now and whilst they are somewhat treatable with medication they will almost always develop to become a bigger issue.
In his last few days Eddy began spewing blood, having very dark excrements and generally being a tad cranky. Not traits usually associated with the happy little dog I knew.
Just before Eddy was put down the veterinarian pointed out a hard lump in his stomach, thought to be a cancerous growth.
I felt it and remembered feeling something very similar before. I knew then that we were making the right call.&lt;/p&gt;
&lt;h2 id=&quot;mixed-feelings&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#mixed-feelings&quot; aria-label=&quot;mixed feelings permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;mixed feelings&lt;/h2&gt;
&lt;p&gt;I am not often an emotional wreck, but today I was.
Though, after some thought I realized something that I’d realized before:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For something to cause me so much pain it had to have brought me joy. Memories are fading in and out, my vision goes blurry. I’m coming short of breath…
The only thing keeping me sane is knowing I have memories of us, the pictures captured a mere glimpse of it. But my heart captured everything.&lt;/p&gt;
&lt;p&gt;- from the poem &lt;code class=&quot;language-text&quot;&gt;thoughts&lt;/code&gt; by Rick van Lieshout&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&quot;float-left&quot; style=&quot;width: 240px&quot;&gt;
 &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAMEBQH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAgD/2gAMAwEAAhADEAAAAbubdz5ZE6a5WEDP/8QAHRAAAgEEAwAAAAAAAAAAAAAAAQIDABARIRITMf/aAAgBAQABBQKZwq9gkl2C+1HITWPua//EABcRAAMBAAAAAAAAAAAAAAAAAAABEBH/2gAIAQMBAT8BRt//xAAYEQACAwAAAAAAAAAAAAAAAAAAARARIf/aAAgBAgEBPwF6VP8A/8QAHRAAAgIBBQAAAAAAAAAAAAAAAREAEAIhMTJRYf/aAAgBAQAGPwJkOcdfaI2mPSTs1//EABsQAAIDAQEBAAAAAAAAAAAAAAABESExUUFx/9oACAEBAAE/IZIvEIqPnocyE1Nsa4stRkqSBtdG8Opic//aAAwDAQACAAMAAAAQHCj8/8QAGhEAAgIDAAAAAAAAAAAAAAAAAAEQESExcf/aAAgBAwEBPxBaycC3H//EABgRAAIDAAAAAAAAAAAAAAAAAAABEDFB/9oACAECAQE/EMhB1H//xAAdEAEAAwADAAMAAAAAAAAAAAABABEhMUFxUZGh/9oACAEBAAE/ENonPIq3X5ErrYdhCJFV0AO/UMN2g5CPYt4BpXN/OES5b2KnqXDsAa3jZR6fZ//Z&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source srcset=&quot;/static/bc249a78ab7b835429e8f4663fe88f13/8ac56/eddy-hat.webp 240w,
/static/bc249a78ab7b835429e8f4663fe88f13/d3be9/eddy-hat.webp 480w,
/static/bc249a78ab7b835429e8f4663fe88f13/e46b2/eddy-hat.webp 960w,
/static/bc249a78ab7b835429e8f4663fe88f13/f992d/eddy-hat.webp 1440w,
/static/bc249a78ab7b835429e8f4663fe88f13/882b9/eddy-hat.webp 1920w,
/static/bc249a78ab7b835429e8f4663fe88f13/e51ec/eddy-hat.webp 3024w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/webp&quot;&gt;
          &lt;source srcset=&quot;/static/bc249a78ab7b835429e8f4663fe88f13/09b79/eddy-hat.jpg 240w,
/static/bc249a78ab7b835429e8f4663fe88f13/7cc5e/eddy-hat.jpg 480w,
/static/bc249a78ab7b835429e8f4663fe88f13/6a068/eddy-hat.jpg 960w,
/static/bc249a78ab7b835429e8f4663fe88f13/644c5/eddy-hat.jpg 1440w,
/static/bc249a78ab7b835429e8f4663fe88f13/0f98f/eddy-hat.jpg 1920w,
/static/bc249a78ab7b835429e8f4663fe88f13/9568a/eddy-hat.jpg 3024w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/jpeg&quot;&gt;
          &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/bc249a78ab7b835429e8f4663fe88f13/6a068/eddy-hat.jpg&quot; alt=&quot;Eddy with a beige hat on&quot; title=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
 &lt;figcaption&gt;Very professional doggy. Early 2022&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;And though those feelings are true. I also can’t help but shake the sorrow I feel.
I realize, all too well, that I’ve lost the last thing on this planet that I chose to truly love.
Family ties are great and all, but I chose to spend my life with Eddy. I chose to take care of him and to love him until I couldn’t anymore.&lt;/p&gt;
&lt;p&gt;A little over 2 years ago I moved out of my parent’s house and I unfortunately couldn’t take Eddy with me.
Not only because my job doesn’t really allow me to take the best emotional care (9-5..) of a dog but also because Eddy is old.
Eddy simply didn’t want to move. He knew his surroundings, even though he didn’t see very well, and didn’t really want to change them up.
Though I went to see him every week (and my parents too…) I still didn’t like being away from him for the rest of the week.&lt;/p&gt;
&lt;p&gt;I have debated getting a pet of my own. But as I said before I would feel sorry for the animal because I wouldn’t be home much.
I also thought of getting a cat, but I just like dogs more.
Now that Eddy has left me completely I will just have to see where life takes me. I sure could use a buddy at times so maybe I will end up adopting a pet anyway.&lt;/p&gt;
&lt;h2 id=&quot;farewell&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#farewell&quot; aria-label=&quot;farewell permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Farewell&lt;/h2&gt;
&lt;p&gt;In the end, though, I don’t think anything can truly replace Eddy.
I got Eddy an &lt;a href=&quot;https://www.urnwinkel.nl/fotolijst-dierenurn-zwart.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;urn&lt;/a&gt; so I can have him in my life for the rest of mine.
Sleep well, friend.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIDBP/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAFEtMymsX//xAAbEAEAAgIDAAAAAAAAAAAAAAACAAEDEhETMv/aAAgBAQABBQLW52ItrLkS9apTip//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAwEBPwEn/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREv/aAAgBAgEBPwFqmT//xAAaEAEBAAMBAQAAAAAAAAAAAAABAAIRQSEx/9oACAEBAAY/AmHXJyNhM5L4cvhf/8QAGhAAAwEBAQEAAAAAAAAAAAAAAAEhEVFB4f/aAAgBAQABPyHJpXwVOZHpQgRaPR5iZffNEL4B/9oADAMBAAIAAwAAABB0L//EABURAQEAAAAAAAAAAAAAAAAAABAh/9oACAEDAQE/EIP/xAAVEQEBAAAAAAAAAAAAAAAAAAABAP/aAAgBAgEBPxBgQb//xAAdEAEAAgICAwAAAAAAAAAAAAABABEhQTFRcYGh/9oACAEBAAE/EFoagEUD5vqMo8wlA3WemC6pFKgJii05LD1uUVIGSg1ggSvkn//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/69942f58c551c18901cfb7db20855056/8ac56/eddy-post-mortem.webp 240w,
/static/69942f58c551c18901cfb7db20855056/d3be9/eddy-post-mortem.webp 480w,
/static/69942f58c551c18901cfb7db20855056/e46b2/eddy-post-mortem.webp 960w,
/static/69942f58c551c18901cfb7db20855056/f992d/eddy-post-mortem.webp 1440w,
/static/69942f58c551c18901cfb7db20855056/882b9/eddy-post-mortem.webp 1920w,
/static/69942f58c551c18901cfb7db20855056/4dbdc/eddy-post-mortem.webp 2598w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/69942f58c551c18901cfb7db20855056/09b79/eddy-post-mortem.jpg 240w,
/static/69942f58c551c18901cfb7db20855056/7cc5e/eddy-post-mortem.jpg 480w,
/static/69942f58c551c18901cfb7db20855056/6a068/eddy-post-mortem.jpg 960w,
/static/69942f58c551c18901cfb7db20855056/644c5/eddy-post-mortem.jpg 1440w,
/static/69942f58c551c18901cfb7db20855056/0f98f/eddy-post-mortem.jpg 1920w,
/static/69942f58c551c18901cfb7db20855056/4a95b/eddy-post-mortem.jpg 2598w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/69942f58c551c18901cfb7db20855056/6a068/eddy-post-mortem.jpg&quot;
            alt=&quot;Eddy lying on a blue towel at the veterinarian after receiving the lethal injection. He looks peaceful&quot;
            title=&quot;Eddy peacefully &amp;quot;sleeping&amp;quot; post mortem&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Eddy peacefully &amp;quot;sleeping&amp;quot; post mortem&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-urn&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-urn&quot; aria-label=&quot;the urn permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The urn&lt;/h2&gt;
&lt;p&gt;It took way too long for the urn to be filled with pictures but in the end, I’ve gotten it done and I hung Eddy’s urn in my bedroom.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.5%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAECA//EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAGXg5qDQT//xAAZEAEBAQADAAAAAAAAAAAAAAABEQIAAzH/2gAIAQEAAQUC67NWqjDm/chP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERMQIQQZH/2gAIAQEABj8CxlzJ30dorVH/xAAbEAEAAQUBAAAAAAAAAAAAAAABABEhMUGRcf/aAAgBAQABPyE1Kbb4gogdIZPgsv4cgG8JqE//2gAMAwEAAgADAAAAENMf/8QAFhEAAwAAAAAAAAAAAAAAAAAAARAx/9oACAEDAQE/EBF//8QAFxEAAwEAAAAAAAAAAAAAAAAAARARMf/aAAgBAgEBPxA7F//EABsQAQADAQADAAAAAAAAAAAAAAEAESFRMUHh/9oACAEBAAE/EDWBeTDD8mYBXLNuqyYdKbFMO7KsHTxDihDFJavt4T//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/d91e262577a8781b6e1f17c7f0d7497e/8ac56/eddy-urn.webp 240w,
/static/d91e262577a8781b6e1f17c7f0d7497e/d3be9/eddy-urn.webp 480w,
/static/d91e262577a8781b6e1f17c7f0d7497e/e46b2/eddy-urn.webp 960w,
/static/d91e262577a8781b6e1f17c7f0d7497e/f992d/eddy-urn.webp 1440w,
/static/d91e262577a8781b6e1f17c7f0d7497e/882b9/eddy-urn.webp 1920w,
/static/d91e262577a8781b6e1f17c7f0d7497e/ad79e/eddy-urn.webp 3644w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/d91e262577a8781b6e1f17c7f0d7497e/09b79/eddy-urn.jpg 240w,
/static/d91e262577a8781b6e1f17c7f0d7497e/7cc5e/eddy-urn.jpg 480w,
/static/d91e262577a8781b6e1f17c7f0d7497e/6a068/eddy-urn.jpg 960w,
/static/d91e262577a8781b6e1f17c7f0d7497e/644c5/eddy-urn.jpg 1440w,
/static/d91e262577a8781b6e1f17c7f0d7497e/0f98f/eddy-urn.jpg 1920w,
/static/d91e262577a8781b6e1f17c7f0d7497e/078a6/eddy-urn.jpg 3644w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/d91e262577a8781b6e1f17c7f0d7497e/6a068/eddy-urn.jpg&quot;
            alt=&quot;A black picture frame with 4 pictures of Eddy ranging from young to old&quot;
            title=&quot;A lovely memory of Eddy&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;A lovely memory of Eddy&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Server management tips: Keep 1 sata port available]]></title><description><![CDATA[What was meant to be a simple hard drive migration turned into a long night due to a rogue sata cable]]></description><link>https://www.rickvanlieshout.com/posts/2017/keep-a-sata-port-available/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2017/keep-a-sata-port-available/</guid><pubDate>Fri, 01 Dec 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Servers… Both a joy and a pain. This week my server has just been a pain though… What should’ve been a relaxing night with some easy peasy hard drive replacements quickly turned into hours of downtime and lots of yelling and screaming :(&lt;/p&gt;
&lt;p&gt;During my holiday stay (at &lt;a href=&quot;https://www.tropical-islands.de&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Tropical Islands&lt;/a&gt; in Germany, pictures can be found &lt;a href=&quot;https://goo.gl/photos/uSCW7ciDUZtCdXY46&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;here&lt;/a&gt;), I decided I’d replace the last 3 500 GB drives in my server array (don’t ask me why I was thinking about my server on holiday). So, as soon as I got home, I decided to look around and order some of those beautiful WD Red drives. I considered upgrading my parity drive as well, but I’d have to buy 3 TB models and that seemed like more of a hassle than I was willing to take on at the moment. (I should have.)&lt;/p&gt;
&lt;p&gt;So, the drives arrived, I ran a quick benchmark followed by a quick drive test and all seemed fine with the first drive. At this point, I decide to open up the server and replace the first 500 GB hard drive. After a lot of gymnastics (trying to read drive labels while the drives are in the drive bays) I finally figured out which drive I should replace and I went to work on that drive. I was careful not to touch any of the other cables to avoid accidentally unplugging them and I thought I had done a good job. I remember thinking: “Drive replaced, cables still connected, not much hassle so far. Let’s turn it on”. And so I did.&lt;/p&gt;
&lt;h2 id=&quot;prepare-for-trouble&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#prepare-for-trouble&quot; aria-label=&quot;prepare for trouble permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Prepare for trouble&lt;/h2&gt;
&lt;p&gt;My good mood was rudely interrupted by a loud beep followed by three, rapid, beeps. At first, I thought it was the regular old “fan not spinning” error (I use several ways to limit fan speed) but on further inspection, I realised that the fan was spinning just fine. Things were about to turn bad…&lt;/p&gt;
&lt;p&gt;The drive I had inserted was fine, the OS picked it up and it was performing well. One of the other drives had failed though… So I shut it back down, reconnected the old drive (the one I replaced) and replaced the failing drive with a brand new one. A parity sync is necessary at this point.. Sigh..&lt;/p&gt;
&lt;p&gt;After replacing the “failed” drive and letting the machine run for a while I got an email from my server, emails from my server are usually bad, stating that a drive had failed. At first, I was going to dismiss it as I had just replaced one and figured the email was simply delayed. Upon closer inspection, I found out that another hard drive had failed! So I logged back into the server and inspected the problem. The new drive had failed… even though it previously passed my tests with flying colours!&lt;/p&gt;
&lt;p&gt;Something was up… and after countless hours of fighting with my server I finally figured it out. The SATA port on the controller was faulty. It didn’t error, it didn’t smoke, it looked fine. It even held on to the cable just fine (cause of those tiny little lips on SATA cables) so it was kinda hard to find out that the SATA port was faulty.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 290px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 72.91666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAgX/xAAVAQEBAAAAAAAAAAAAAAAAAAABAP/aAAwDAQACEAMQAAAB6WUUiksC/8QAGhABAQACAwAAAAAAAAAAAAAAAgEAAwQTI//aAAgBAQABBQJKCSZ6vOPqcW7V2kmE/wD/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAwEBPwFX/8QAFhEBAQEAAAAAAAAAAAAAAAAAABES/9oACAECAQE/AZWX/8QAHhAAAQQCAwEAAAAAAAAAAAAAAQACERIDQSExccH/2gAIAQEABj8Ckq+Tj4rMIDdIvymTpVmB4g0dBf/EABsQAAICAwEAAAAAAAAAAAAAAAERADEhQWGR/9oACAEBAAE/IfIvYZOCUDUbTtt9jYRQlrsMG2zaAQwIT//aAAwDAQACAAMAAAAQg+//xAAYEQACAwAAAAAAAAAAAAAAAAAAAREhcf/aAAgBAwEBPxBOFRk//8QAFxEBAQEBAAAAAAAAAAAAAAAAAQARYf/aAAgBAgEBPxB01ulv/8QAHBABAAEFAQEAAAAAAAAAAAAAAREAITFRYUHR/9oACAEBAAE/EJLQYBlaKsCRKoDvaXW2CUfVdwmF9HhOigwbiYna0ThN1GaEXCv/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/974c3efce394c23ab0bf104f14975865/8ac56/sata.webp 240w,
/static/974c3efce394c23ab0bf104f14975865/60360/sata.webp 290w&quot;
              sizes=&quot;(max-width: 290px) 100vw, 290px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/974c3efce394c23ab0bf104f14975865/09b79/sata.jpg 240w,
/static/974c3efce394c23ab0bf104f14975865/baa30/sata.jpg 290w&quot;
            sizes=&quot;(max-width: 290px) 100vw, 290px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/974c3efce394c23ab0bf104f14975865/baa30/sata.jpg&quot;
            alt=&quot;picture of a random yellow sata cable&quot;
            title=&quot;a random yellow SATA cable&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;a random yellow SATA cable&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;So, with a way to reproducibly “fail” known good drives it was just a matter of plugging the SATA cable into another port and go on with my day… or so I thought…&lt;/p&gt;
&lt;p&gt;Little did I know that my server had used up all its SATA ports! I didn’t have a single one left! In the end, I had to go out, pay way too much for a raid card that I didn’t need and work on the server till dawn in order to fix my mistakes.&lt;/p&gt;
&lt;p&gt;Please don’t make the same mistake… make sure you have a replacement SATA port (or raid card for that matter).&lt;/p&gt;
&lt;p&gt;Live and Learn I guess, Live. And. Learn.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Scala Day 4 - A challenge!]]></title><description><![CDATA[The last day of my journey with Scala is said to be a challenge]]></description><link>https://www.rickvanlieshout.com/posts/2017/scala-day-4-a-challenge/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2017/scala-day-4-a-challenge/</guid><pubDate>Wed, 05 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The book doesn’t offer a day 4, my school, however, does. Or rather, it wants us to “create” a day 4. The main objective of day 4 is to “create a &lt;a href=&quot;https://en.wikipedia.org/wiki/SMART_criteria&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;smart&lt;/a&gt; goal which fits the language and challenges you”. For this purpose I came up with the following goal:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For the “4th” day in the “Seven Languages in Seven Weeks” book, I want to create a sitemap builder which prioritises URLs based on their number of occurrences.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I picked this specific goal because Scala has awesome functionality for collections, as such it should make creating a site map a piece of cake! All the code I created for this fourth day can be found on &lt;a href=&quot;https://github.com/Mastermindzh/Seven-Languages-in-Seven-Weeks/blob/master/Scala/Day%204/src/main/scala-2.12/MyApp.scala&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Github&lt;/a&gt; or at the end of this blog post.&lt;/p&gt;
&lt;h2 id=&quot;my-journey-with-scala-and-the-book&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#my-journey-with-scala-and-the-book&quot; aria-label=&quot;my journey with scala and the book permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;My journey with Scala (and the book…)&lt;/h2&gt;
&lt;p&gt;Scala, for the most part, is pretty ok. The development tools aren’t up to par with those of say Java, Python or even .net but with a bit of hassle, we can make do. The Scala collections are wicked though! I’ve done some really crazy things using the collections already and I’m sure there is more to come. (if anyone ever wants me to write a bit of Scala that is)&lt;/p&gt;
&lt;p&gt;The concurrency chapter was a big failure, the book is old (2010) and covers the older API. This meant that I had to cast aside the book and create the examples with the new API myself. A drag, to say the least.&lt;/p&gt;
&lt;p&gt;As far as functional goes, my opinion hasn’t changed much. I still prefer OO, maybe because I grew up doing everything the OO way or maybe because functional programming is just not for me. Whatever the case I still prefer OO. But… I’ve gained a new appreciation for the functional languages so I guess you could call this experiment a success.&lt;/p&gt;
&lt;p&gt;Anyways, that was it for me guys, hope you enjoyed and see you later!&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;java&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;io&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;File&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; PrintWriter&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;collection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;immutable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/span&gt;ListMap
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;io&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/span&gt;Source

&lt;span class=&quot;token keyword&quot;&gt;object&lt;/span&gt; PageLinkLoader &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//I stole this regex from somewhere for a previous project, don&apos;t remember where&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// regex commented out because pretify can&apos;t handle it&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//val hrefRegex = &quot;&quot;&quot;&amp;lt;a\s+(?:[^&gt;]*?\s+)?href=([&quot;&apos;])(.*?)\1&quot;&quot;&quot;.r&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// merge two maps&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; mergeMap&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;A&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; B&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ms&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Map&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;A&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; B&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;f&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;B&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; B&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; B&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Map&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;A&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; B&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Map&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;A&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; B&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;m &lt;span class=&quot;token keyword&quot;&gt;&amp;lt;-&lt;/span&gt; ms&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; kv &lt;span class=&quot;token keyword&quot;&gt;&amp;lt;-&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;yield&lt;/span&gt; kv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; kv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt;
      a &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contains&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;kv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; kv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_1 &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;kv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; kv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; kv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// run through all links on a page and add them to a list&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; getLinks&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; urls &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Map&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; visited &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Map&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; content &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Source&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fromURL&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;io&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Codec&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ISO-8859-1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mkString
    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; links &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hrefRegex&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;findAllIn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matchData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;toList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;map&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;group&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;toString&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// filter out / , # , http://url and anything else not starting with http:// or www.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; filteredList &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; links&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filter&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        l &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; l&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startsWith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
        l&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startsWith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
        l&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startsWith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
      l&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contains&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;replace&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;last&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// create new mutable list and fill with visited&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; newVisited &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;collection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mutable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ListBuffer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;empty&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    newVisited &lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; visited&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filter&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;equals&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;//add to newVisited&lt;/span&gt;
    filteredList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;foreach&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;newVisited&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contains&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        newVisited &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; s
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// convert list to map, count occurrences&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; foldedLinks &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filteredList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;foldLeft&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Map&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;map&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; link &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt;
      map &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; links&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;count&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;equals&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    newVisited &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; newVisited&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filter&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;equals&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newVisited&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isEmpty&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// return merged map&lt;/span&gt;
      mergeMap&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;List&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;urls&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; foldedLinks&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; v2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; v1 &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; v2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      getLinks&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newVisited&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;mergeMap&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;List&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;urls&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; foldedLinks&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; v2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; v1 &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; v2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newVisited&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;toList&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;object&lt;/span&gt; MyApp &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; App&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; urls &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;http://servers.rickvanlieshout.com/scalatest&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; getSiteMap&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; siteMap &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Map&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Map&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url &lt;span class=&quot;token keyword&quot;&gt;&amp;lt;-&lt;/span&gt; urls&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      siteMap &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; PageLinkLoader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getLinks&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; siteMap&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      siteMap&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;foreach &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; println &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_1 &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;--&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      createSiteMap&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; siteMap&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// creates a sitemap, uses Java which is wicked.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; createSiteMap&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; urls &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Map&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// start off with a priority of 1.0 (ranges from 1.0 to 0)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; currentPriority &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1.0&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;//sort descending&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; descUrls &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ListMap&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;urls&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;toSeq&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sortWith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_2 &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;_&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// write to a file called &quot;sitemap_for_domain.txt&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; domainRegex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;^(?:https?:\/\/)?(?:[^@\/\n]+@)?(?:www\.)?([^:\/\n]+)&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;r
    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; pw &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; PrintWriter&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; File&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sitemap_for_&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;domainRegex&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;findAllIn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matchData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;toList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;map&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;group&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mkString&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.txt&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//write xml header&lt;/span&gt;
    pw&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;write&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;\n&amp;lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot;?&gt;\n&amp;lt;urlset\n      xmlns=\&quot;http://www.sitemaps.org/schemas/sitemap/0.9\&quot;\n      xmlns:xsi=\&quot;http://www.w3.org/2001/XMLSchema-instance\&quot;\n      xsi:schemaLocation=\&quot;http://www.sitemaps.org/schemas/sitemap/0.9\n            http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// for each url write an url block with priority, then decrease priority&lt;/span&gt;
    descUrls&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;foreach&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        pw&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;write&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
          &lt;span class=&quot;token string&quot;&gt;&quot;\n&amp;lt;url&gt;\n  &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;loc&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_1 &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;/loc&gt;\n&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;priority&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; currentPriority &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;/priority&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;/url&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// decrease priority if possible&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;currentPriority &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          currentPriority &lt;span class=&quot;token operator&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.1&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// write the closing statement for a sitemap&lt;/span&gt;
    pw&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;write&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;\n&amp;lt;/urlset&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    pw&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;close&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  getSiteMap&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Scala Day 3 - Concurrency is key!]]></title><description><![CDATA[A day full of functional joy and concurrency ]]></description><link>https://www.rickvanlieshout.com/posts/2017/scala-day-3-concurrency-is-key/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2017/scala-day-3-concurrency-is-key/</guid><pubDate>Tue, 04 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Day 3 promises to go into “hard things” like XML and concurrency. So far I’ve been liking Scala and if it can really simplify concurrency then it might earn a permanent slot in my toolkit.&lt;/p&gt;
&lt;h2 id=&quot;xml&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#xml&quot; aria-label=&quot;xml permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;XML&lt;/h2&gt;
&lt;p&gt;We can express XML just as easily as we do a string, the example below shows how to express some XML and how to access its inner text. Note, however, that you need to add the “scala-xml” jar file to your build solution as it no longer comes included with Scala.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; movies &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
     &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;movies&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;movie genre&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;scifi&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Star Trek&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;movie&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
     &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;movie genre&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;fairytale&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Star Wars&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;movie&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
     &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;movies&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
movies&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;xml&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Elem &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;movies&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;movie genre&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;scifi&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Star Trek&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;movie&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;movie genre&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;fairytale&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Star Wars&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;movie&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;movies&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; movies&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;text
res0&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
&quot;
Star Trek
Star Wars
&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can use the ” \ ” operator to search for specific entries, which we can then access just as with a list:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; movieNodes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; movies \ &lt;span class=&quot;token string&quot;&gt;&quot;movie&quot;&lt;/span&gt;
movieNodes&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;xml&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;NodeSeq &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; NodeSeq&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;movie genre&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;scifi&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Star Trek&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;movie&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;movie genre&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;fairytale&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Star Wars&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;movie&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; movieNodes&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
res1&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;xml&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Node &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;movie genre&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;scifi&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Star Trek&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;movie&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To check the “genre” attribute of the first item in movieNodes we run:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; movieNodes&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
res3&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;xml&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Node &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;movie genre&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;fairytale&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Star Wars&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;movie&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; movieNodes&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; \ &lt;span class=&quot;token string&quot;&gt;&quot;@genre&quot;&lt;/span&gt;
res4&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;xml&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;NodeSeq &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; fairytale&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As we can see it returned the correct genre, fairytale, for the movie “Star Wars”. So far Scala delivers on its promise to make “hard things” like XML easy. Let’s see what else we can do.&lt;/p&gt;
&lt;h2 id=&quot;pattern-matching-guards-and-regex&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pattern-matching-guards-and-regex&quot; aria-label=&quot;pattern matching guards and regex permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pattern matching, guards and Regex&lt;/h2&gt;
&lt;p&gt;Scala will use pattern matching often, such as when you parse XML or pass messages between threads.
The simplest form of pattern matching can be achieved with:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; doChore&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;chore&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; chore &lt;span class=&quot;token keyword&quot;&gt;match&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;clean dishes&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;scrub, dry&quot;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cook dinner&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;chop, sizzle&quot;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; _ &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;whine, complain&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;doChore&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;clean dishes&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;doChore&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mow lawn&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We define two chores and an alternative. We then call the method with a valid and invalid parameter. This will match the valid one and return “scrub, dry”, the second won’t match and will return “whine, complain”.&lt;/p&gt;
&lt;p&gt;Scala also supports guards in the case statement. Using this to calculate factorials, for instance, we can filter out weird numbers (like 0 and negatives) while matching all the other positive numbers to x, and thus return it’s factorial.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; factorial&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; n &lt;span class=&quot;token keyword&quot;&gt;match&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; y &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; x &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; factorial&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; n
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;factorial&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;factorial&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;factorial&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can also use regular expressions to do our matching:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; reg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;^(F|f)\w*&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;r
reg&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;util&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matching&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Regex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;F&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;f&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;\w&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;reg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;findFirstIn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Fantastic&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
Some&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Fantastic&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;reg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;findFirstIn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;not Fantastic&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
None&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can even combine XML and the matching features like so:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;movies \ &lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;foreach &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; movie &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt;
  movie &lt;span class=&quot;token keyword&quot;&gt;match&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;movie&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;movieName&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;movie&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt;
      println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;movieName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;short&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;shortName&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;short&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt;
      println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;shortName &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; (short)&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; movies &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;movies&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
   &lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;movie&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;The Incredibles&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;movie&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
   &lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;movie&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;WALL E&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;movie&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
   &lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;short&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Jack Jack Attack&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;short&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
   &lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;short&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Geri&lt;span class=&quot;token symbol&quot;&gt;&apos;s&lt;/span&gt; Game&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;short&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;movies&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will go through every item in the tree (_) and match it to either movie or short. If it’s a movie it will just print its text, otherwise, it’ll print its text + (short).&lt;/p&gt;
&lt;p&gt;In order to get this to work however I had to download the &lt;a href=&quot;https://github.com/scala/scala-xml&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;scala.xml&lt;/a&gt; library, as it no longer comes included with Scala since Scala 2.11.&lt;/p&gt;
&lt;h2 id=&quot;concurrency&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#concurrency&quot; aria-label=&quot;concurrency permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Concurrency&lt;/h2&gt;
&lt;p&gt;Finally! We get to do something with concurrency, now Scala can really show me what it’s worth!&lt;/p&gt;
&lt;p&gt;The book starts off by telling me about Actors, which have pools of threads and queues, and message passing. When you send a message (using the ! operator) you place an object on its queue. The actor then reads the message and takes action. Usually, the actor uses a pattern matcher to detect what it has to do before it starts doing something.&lt;/p&gt;
&lt;p&gt;The book provides a sample application but that plain doesn’t work. Upon investigating the issue I discovered that Scala’s built-in concurrency feature is deprecated in favour of &lt;a href=&quot;https://akka.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Akka&lt;/a&gt;. This saddens me beyond belief. I have already worked with Akka and had expected Scala to offer me something else. This also means that the rest of the book is not going to be useful anymore.&lt;/p&gt;
&lt;p&gt;Stubborn as I am, even with a closing deadline, I decided I wasn’t going to let a stupid book stop me and decided to update the code to work with Akka. All of which can be found at &lt;a href=&quot;https://github.com/Mastermindzh/Seven-Languages-in-Seven-Weeks/tree/master/Scala/Day%203/src/Concurrency&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This disaster can be summed up by a fantastic quote though (and I &lt;strong&gt;love&lt;/strong&gt; quotes):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;All that is necessary is to accept the impossible, do without the
indispensable, and bear the intolerable.&lt;/p&gt;
&lt;p&gt;- Norris, Kathleen, As quoted in: The Litchfield Co-operator, Issues 116-163 (1945)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;self-study&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#self-study&quot; aria-label=&quot;self study permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Self-study&lt;/h2&gt;
&lt;p&gt;The theoretical question for the day is: &lt;em&gt;For the sizer program, what would happen if you did not create a new actor for each link you wanted to follow? What would happen to the performance of the application?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And the answer is: it would be just as slow as the sequential one.&lt;/p&gt;
&lt;p&gt;The practical assignment is: &lt;em&gt;Take the sizer application and add a message to count the number of links on the page.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I did this by creating another Loader and calling that in my UrlActor. The code can, once again, be found on Github or in the code block below.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;object&lt;/span&gt; PageLinkLoader &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; getLinks&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; content &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Source&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fromURL&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;io&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Codec&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ISO-8859-1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mkString
    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; links &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hrefRegex&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;findAllIn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matchData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;toList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;map&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;group&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    links&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;size
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;//I stole this regex from somewhere for a previous project, don&apos;t remember where&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; hrefRegex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;&amp;lt;a\s+(?:[^&gt;]*?\s+)?href=([&quot;&apos;])(.*?)\1&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;r

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So that’s it, right? Wrong! My school assignment requires me to do one more assignment. What assignment is that? Well you’ll just have to wait on the next blog to find out! Laters!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Scala Day 2 - Let's get functional]]></title><description><![CDATA[Today we'll focus on the functional aspects of Scala]]></description><link>https://www.rickvanlieshout.com/posts/2017/scala-day-2-lets-get-functional/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2017/scala-day-2-lets-get-functional/</guid><pubDate>Mon, 03 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I feel like I covered a lot in the first chapter but that I haven’t yet found the real power of functional programming. Day 2 promises to change that by diving right into functional programming.&lt;/p&gt;
&lt;h2 id=&quot;val-vs-var&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#val-vs-var&quot; aria-label=&quot;val vs var permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Val vs Var&lt;/h2&gt;
&lt;p&gt;I’ve already looked at this on day 1, looking back at the chapter I realize I wasn’t yet meant to find out about the difference between “val vs var”. In short, val is immutable while var is mutable.&lt;/p&gt;
&lt;p&gt;The remainder of the chapter emphasizes the importance of using val, especially while designing an application with concurrency in mind.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This basic design philosophy is the key element that differentiates functional programming from object-oriented programming: mutable state limits concurrency.&lt;/p&gt;
&lt;p&gt;- Tate, Bruce, Seven Languages in seven weeks (p 155)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;collections&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#collections&quot; aria-label=&quot;collections permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Collections&lt;/h2&gt;
&lt;p&gt;In the first blog I already pointed out some of the features I had discovered about collections. I used some of these awesome features in my day 1 self-study.&lt;/p&gt;
&lt;p&gt;The second chapter goes into more detail about collections. First up are lists.&lt;/p&gt;
&lt;h2 id=&quot;lists&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#lists&quot; aria-label=&quot;lists permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Lists&lt;/h2&gt;
&lt;p&gt;Scala’s lists, of type List, are ordered collections of elements with random access. One of the things the book immediately goes into is the ability to store different types of objects in the list. Take a look at the interpreters response when I try to create a list of two strings and an integer:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;one&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;two&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
res6&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;Any&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;one&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; two&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This returns a list with data type “Any”, which is the catchall data type for Scala. To access an item we use the ”()” operator. Think of it as the list being a method on which you “call” a get function. Doing so will return an “Any” object, which to me is weird because it’s type could be inferred as well.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;one&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;two&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
res7&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Any&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Trying to access a number outside the list will throw either a “NoSuchElement” exception (if the index specified is too high) or a regular old “IndexOutOfBoundsException”. (if the index is below 0)&lt;/p&gt;
&lt;h2 id=&quot;sets&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#sets&quot; aria-label=&quot;sets permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sets&lt;/h2&gt;
&lt;p&gt;A set is like a list, but it doesn’t have any explicit order. We can specify a set with the Set keyword like so:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; animals &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Set&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;lions&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tigers&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bears&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
animals&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;collection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;immutable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Set&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;java&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lang&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Set&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;lions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tigers&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bears&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Adding or subtracting from it is as easy as using the + or - operator:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; animals &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;armadillos&quot;&lt;/span&gt;
res0&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;collection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;immutable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Set&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Set&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;lions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tigers&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bears&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; armadillos&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; res0 &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tigers&quot;&lt;/span&gt;
res2&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;collection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;immutable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Set&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Set&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;lions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bears&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; armadillos&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Combining sets can be done with the ”++” operator (or list.union) and the ”—” operator (or list.diff) will return a list of differences between the two lists:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; animals &lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt; Set&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;armadillos&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;raccoons&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
res3&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;collection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;immutable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Set&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Set&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;bears&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tigers&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; armadillos&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; raccoons&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; animals &lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt; Set&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;lions&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bears&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
res4&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;collection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;immutable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Set&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Set&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tigers&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Set intersection can be done with “List.intersect” like so:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;animals&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;intersect&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Set&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;armadillos&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;raccoons&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;lions&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tigers&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
res8&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;collection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;immutable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Set&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Set&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;lions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tigers&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As I’ve mentioned before, Sets, unlike lists, are independent of order. This rule will mean that equality for sets is different. Therefor evaluating two sets with the same elements in a different order will return true:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; Set&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; Set&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
res9&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Boolean&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;maps&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#maps&quot; aria-label=&quot;maps permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Maps&lt;/h2&gt;
&lt;p&gt;A map is a key-value pair, similar to hashmaps in Java. Specifying a map of ordinal numbers can be done with:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; ordinals &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Map&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;zero&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;one&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;two&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
ordinals&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;collection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;immutable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Map&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Map&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; zero&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; one&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; two&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can also specify the type for a HashMap like so:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;collection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mutable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/span&gt;HashMap
&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; map &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; HashMap&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can then add items like so:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;map &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;four&quot;&lt;/span&gt;
map &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;eight&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;list-methods&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#list-methods&quot; aria-label=&quot;list methods permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;List methods&lt;/h2&gt;
&lt;p&gt;Scala supports anonymous functions, I’ve used this to solve some problems in the Tic-Tac-Toe game from the first blog.&lt;/p&gt;
&lt;p&gt;Apart from the “foreach” method, there are some other useful list methods:&lt;/p&gt;
&lt;!-- prettier-ignore --&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;List.head&lt;/td&gt;
&lt;td&gt;Returns the first element&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List.tail&lt;/td&gt;
&lt;td&gt;Returns all but the first element&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List.last&lt;/td&gt;
&lt;td&gt;Returns the last element&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;list.init&lt;/td&gt;
&lt;td&gt;Returns all but the last element (recursion)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List.reverse&lt;/td&gt;
&lt;td&gt;Reverses the list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List.drop(2)&lt;/td&gt;
&lt;td&gt;Removes the first two objects.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;count-map-filter-and-others&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#count-map-filter-and-others&quot; aria-label=&quot;count map filter and others permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Count, map filter and Others&lt;/h2&gt;
&lt;p&gt;Scala has many other functions that manipulate lists in various ways. I won’t go over these but the code examples below should give you an idea of the possibilities.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; words &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;peg&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;al&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bud&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;kelly&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
words&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;peg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; al&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bud&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; kelly&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; words&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;count&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;word &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; word&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;size &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
res0&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; words&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filter&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;word &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; word&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;size &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
res1&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;peg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bud&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; kelly&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; words&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;map&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;word &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; word&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
res2&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; words&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;forall&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;word &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; word&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;size &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
res3&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Boolean&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; words&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exists&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;word &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; word&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;size &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
res4&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Boolean&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can also parameterise our anonymous functions so that we can sort a list based on the first letter of each word. We do that like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;words&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sortWith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;charAt&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;toLower &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;charAt&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;toLower&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can also sort by word size:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;words&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sort&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;size undefined&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;foldleft&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#foldleft&quot; aria-label=&quot;foldleft permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;foldLeft&lt;/h2&gt;
&lt;p&gt;The foldLeft method takes an initial value and a code block. It will take the initial value and for each item in the list run the code block passing back in the calculated value. Let me show you:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; list &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; sum &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; list&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sum&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; sum &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Initially, /: takes the initial value, 0 , and the first element of list , 1 ,and passes them into the code block. sum is 0 , i is 1 , and the result of 0 + 1 is 1 .&lt;/li&gt;
&lt;li&gt;Next, /: takes 1 , the result returned from the code block, and folds it back into the calculation as sum . So, sum is 1 ; i is the next element of list , or 2 ; and the result of the code block is 3 .&lt;/li&gt;
&lt;li&gt;Finally, /: takes 3, the result returned from the code block, and folds it back into the calculation as sum . So, sum is 3 ; i is the next element of list , or 3 ; and sum + i is 6 .&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We can achieve the same thing by using the foldLeft method like so:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;foldLeft&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sum&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; sum &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;self-study&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#self-study&quot; aria-label=&quot;self study permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Self-Study&lt;/h2&gt;
&lt;p&gt;I’m starting to like Scala more and more, the practical challenge for this week was really fun albeit a bit simple.
The theoretical questions for day 2 are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A discussion on how to use Scala files&lt;/li&gt;
&lt;li&gt;What makes a closure different from a code block&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once again these questions are trivial if you’ve actually paid attention while reading the book. Anyway, here are the answers:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.scala-lang.org/tutorials/scala-for-java-programmers.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://docs.scala-lang.org/tutorials/scala-for-java-programmers.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/1812401/exactly-what-is-the-difference-between-a-closure-and-a-block&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://stackoverflow.com/questions/1812401/exactly-what-is-the-difference-between-a-closure-and-a-block&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The results of the second day’s practical assignments can found on &lt;a href=&quot;https://github.com/Mastermindzh/Seven-Languages-in-Seven-Weeks/tree/master/Scala/Day%202/src/myApp&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Github&lt;/a&gt; or below:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
   Self-Study day 2, practical assignments:

   • Use foldLeft to compute the total size of a list of strings.

   • Write a Censor trait with a method that will replace the curse words
     Shoot and Darn with Pucky and Beans alternatives. Use a map to
     store the curse words and their alternatives.

   • Load the curse words and alternatives from a file.

*/&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;trait&lt;/span&gt; Censor &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; curseWords &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Map&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;shoot&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pucky&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;darn&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;beans&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/**
    * Awesome function which will build a curseWords map from a file.
    * @param input string input
    * @param path curseWords file
    * @return clean string
    */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; censorTextUsingFile&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; path&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// neat little statement which will read a file from a path, get its lines&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// for each line it will split on &quot;=&quot; and put the values in the map&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; myMap &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; io&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Source&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fromResource&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getLines&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;foldLeft&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Map&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;map&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt;
      map &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;=&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;=&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    censorText&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; myMap&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/**
    * censors input text using the builtin curseWords map or @param map
    * @param input string to be censored
    * @param map optional, map of curse words
    * @return censored string
    */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; censorText&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; map&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Map&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; curseWords&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; words &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    words&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;map&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;word &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; map&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getOrElse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;word&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;toLowerCase&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; word&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mkString&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;object&lt;/span&gt; MyApp &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; App &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; Censor&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// print combined size of a list of strings&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; list &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;one&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;two&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;three&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;foldLeft&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sum&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; sum &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; strToCensor &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Shoot !, this darn thing won&apos;t work!&quot;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// censor using builtin map&lt;/span&gt;
  println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;censorText&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;strToCensor&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// censor using curseWords.txt file from resources folder&lt;/span&gt;
  println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;censorTextUsingFile&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;strToCensor&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;curseWords.txt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Scala Day 1 - The Basics]]></title><description><![CDATA[Let's take a deep dive into a programming book and Scala!]]></description><link>https://www.rickvanlieshout.com/posts/2017/scala-day-1-the-basics/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2017/scala-day-1-the-basics/</guid><pubDate>Sun, 02 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;So day 1 has arrived, I’ve opened the book and I’ve started looking at the assignments in front of me. The book starts off by telling us how to install Scala so that is what I’ll start with today.&lt;/p&gt;
&lt;h2 id=&quot;installing-scala&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#installing-scala&quot; aria-label=&quot;installing scala permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Installing Scala&lt;/h2&gt;
&lt;p&gt;Being on Linux the first thing I did was use my package manager of choice (Pacman) to check whether there was a Scala package in my repositories. Sure enough, it found a package (20MB in size) and proceeded to download and install said package.&lt;/p&gt;
&lt;p&gt;While Pacman started collecting all the little dots, I took a quick look at the &lt;a href=&quot;https://www.scala-lang.org/download/install.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Scala download page&lt;/a&gt;. On there I am greeted with a friendly message telling me the binary for my system is ready to download. Right below the download button is a link on how to install Scala. Curiosity got to me and I decided to open the link. The installation steps briefly explain that there are 2 binaries in the compressed folder which are of importance: “scala” and “scalac”. To anyone coming from Java, these should be fairly familiar seeing as Java uses “java” and “javac” for their interpreter and compiler respectively. (note: the installation steps assume you know how to add PATH variables).&lt;/p&gt;
&lt;p&gt;The next message on this page tells me about a popular build tool called &lt;code class=&quot;language-text&quot;&gt;sbt&lt;/code&gt; so I went ahead and installed that as well.&lt;/p&gt;
&lt;p&gt;The final step on this page recommends me to install ”&lt;a href=&quot;https://scala-ide.org/?_ga=1.153666491.264179122.1490891096&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;The Scala IDE&lt;/a&gt;” or use the IntelliJ plugin. Seeing as I adore the JetBrains product line I’ve opted to choose the latter.&lt;/p&gt;
&lt;p&gt;While browsing the downloads page I noticed Pacman had beat his level. (a.k.a collected all the dots. a.k.a the install has finished) Which means it’s high time for me to continue on with the assignments.&lt;/p&gt;
&lt;h2 id=&quot;scala-types&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#scala-types&quot; aria-label=&quot;scala types permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Scala types&lt;/h2&gt;
&lt;p&gt;The next step in the book guides me through using the interpreter to execute basic bits of code. These range from a simple hello world to entering some arithmetics. In the code block below you can see both my input and the interpreter’s output.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hello, surreal world&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
hello&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; surreal world

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
res1&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
res2&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;17&lt;/span&gt;

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5.&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4.&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
res3&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;17&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Two things struck me as odd about these results. First up the word “Int” is written with a capital I. This is weird to me because in Java “int” is a base type, not a class (it uses the Integer wrapper class). Next up is the “ResX” line, does that just mean result or is there something more to find out about it? After a quick Google search I found out the “res” is an immutable variable which we can use like so:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;res0&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;

scala&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; res0 &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;
res1&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;type-inference-arrow-notation-var-vs-val-and-github&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#type-inference-arrow-notation-var-vs-val-and-github&quot; aria-label=&quot;type inference arrow notation var vs val and github permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Type inference, arrow notation, “var vs val” and GitHub&lt;/h2&gt;
&lt;p&gt;At this point the code is getting slightly more complicated and typing it all directly into the interpreter would be a fool’s effort. Therefore I’ve switched to using IntelliJ with the scala plugin and .scala files. All the files can be found on &lt;a href=&quot;https://github.com/Mastermindzh/Seven-Languages-in-Seven-Weeks/tree/master/Scala/Day%201&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After fiddling a bit with the examples I’ve found a few things I already like in Scala:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Type inference. To me, not having to specify the type of a variable is strangely satisfying.&lt;/li&gt;
&lt;li&gt;Anonymous function syntax support (a.k.a arrow notation).&lt;/li&gt;
&lt;li&gt;First class ranges&lt;/li&gt;
&lt;li&gt;1 line methods without braces&lt;/li&gt;
&lt;li&gt;companion objects (&lt;a href=&quot;https://github.com/Mastermindzh/Seven-Languages-in-Seven-Weeks/blob/master/Scala/Day%201/extending.scala&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;extending.scala&lt;/a&gt; on Github)&lt;/li&gt;
&lt;li&gt;No semicolons! (although I sometimes use them by accident)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;inheritance-is-weird&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#inheritance-is-weird&quot; aria-label=&quot;inheritance is weird permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Inheritance is weird&lt;/h2&gt;
&lt;p&gt;Inheritance is one of the many joys from the Object-Oriented programming paradigm and I’m glad to read Scala supports inheritance too. The way Scala does it, however, is rather weird in my opinion. Take a look at the following code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; Person&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; talk&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;message&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; says &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; Employee&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; number&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; Person&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; talk&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;message&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; with number &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; number &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; says: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; number&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;toString

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As you can see we have to specify the parameter list of the class we want to extend. Also, note that we don’t have to specify the type of said parameters. Another peculiarity is the “override” keyword. Apparently, it is mandatory to prevent the creation of new methods due to mis-spelling … lame.&lt;/p&gt;
&lt;h2 id=&quot;traits&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#traits&quot; aria-label=&quot;traits permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Traits&lt;/h2&gt;
&lt;p&gt;Traits, in short, resemble a Java interface combined with an implementation.&lt;/p&gt;
&lt;p&gt;We will start by defining a trait “Bad” for the Person class we’ve defined earlier:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;trait&lt;/span&gt; Bad&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; curse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Object oriented languages are cool too!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Next, we’ll override the person class with a new class and add the “Bad” trait:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; BadPerson&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; Person&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; Bad&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now if we create a new object of BadPerson we can call the “curse” method.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; badPerson &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; BadPerson&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Mr. bad&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
badPerson&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;curse&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can also add multiple traits to a class by repeating “with TRAIT” like so:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; IndecisivePerson&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; Person&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; Nice &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; Bad&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;self-study&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#self-study&quot; aria-label=&quot;self study permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Self-Study&lt;/h2&gt;
&lt;p&gt;At the end of every day, the book ends with a few assignments, some are theoretical and some are practical.&lt;/p&gt;
&lt;p&gt;Day 1’s theoretical questions are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find the Scala API&lt;/li&gt;
&lt;li&gt;Find a comparison of Java and Scala&lt;/li&gt;
&lt;li&gt;Find a discussion of “val” vs “var”&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My answers to these are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.scala-lang.org/api/current/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.scala-lang.org/api/current/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.toptal.com/scala/why-should-i-learn-scala&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.toptal.com/scala/why-should-i-learn-scala&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.scala-lang.org/old/node/5367&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.scala-lang.org/old/node/5367&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Finally, we get to move on to the practical assignment for the week. For the assignment, I have to create a “Tic-tac-toe” game for 2 players.&lt;/p&gt;
&lt;p&gt;Writing this game has been really interesting. I tried using as few variables as possible and I tried to use Scala-specific features. One of these features I have already fallen in love with: collections. Scala collections have methods similar to &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/bb397933.aspx&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;LINQ in c#&lt;/a&gt; and they are extremely useful. Examples of these collection methods can be found in the “boardHasWinner” method in the code below.&lt;/p&gt;
&lt;p&gt;The complete code for this game, including the bonus problem, can also be found at &lt;a href=&quot;https://github.com/Mastermindzh/Seven-Languages-in-Seven-Weeks/blob/master/Scala/Day%201/Self-Study/day1.scala&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scala&quot;&gt;&lt;pre class=&quot;language-scala&quot;&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;object&lt;/span&gt; TicTacToe &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; currentPlayer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&apos;X&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; playerOne &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&apos;X&apos;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; playerTwo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&apos;O&apos;&lt;/span&gt;


  &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; board &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Array&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    Array&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token char&quot;&gt;&apos;_&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&apos;_&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&apos;_&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    Array&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token char&quot;&gt;&apos;_&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&apos;_&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&apos;_&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    Array&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token char&quot;&gt;&apos;_&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&apos;_&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&apos;_&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/**
    * Flips current player to the other player.
    */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; flipPlayers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;currentPlayer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;equals&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;playerOne&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      currentPlayer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; playerTwo
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      currentPlayer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; playerOne
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/**
    * read user input and play a move
    * @param error set to true if user made a mistake and has to re-enter his position
    */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; readLine&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Boolean&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      System&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Please enter a value ON the grid which has no mark yet.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Please enter the x position you want to place your mark at&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;io&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;StdIn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;readLine&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;toInt

    println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Please enter the y position you want to place your mark at&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; scala&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;io&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;StdIn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;readLine&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;toInt

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      play&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      readLine&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/**
    * checks whether pos(x,y) is a valid position
    * if it&apos;s valid it will put currentPlayer on that position
    * if it isn&apos;t it will ask the user for new input using the readLine method
    * @param x coordinate
    * @param y coordinate
    */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; play&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;board&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;equals&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token char&quot;&gt;&apos;_&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      board&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; currentPlayer
      flipPlayers
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
     readLine&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/**
    * Checks whether the board is full
    * @return true if board is full, else false
    */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; boardIsFull &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Boolean&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    board&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;foreach &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; row &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// if any row contains an underscore we&apos;re obv not full yet so we can return false;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;row contains &lt;span class=&quot;token char&quot;&gt;&apos;_&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/**
    * main game loop
    */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; run &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;boardIsFull &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;boardHasWinner&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      printBoard
      readLine&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;boardHasWinner&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        flipPlayers &lt;span class=&quot;token comment&quot;&gt;// reverse last player flip&lt;/span&gt;
        println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Congrats &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; currentPlayer &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; you have won this game of Tic-Tac-Toe&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;boardHasWinner&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Sorry, it&apos;s a draw!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// print the board once more so the players can see the final score&lt;/span&gt;
    printBoard
    &lt;span class=&quot;token comment&quot;&gt;// exit execution&lt;/span&gt;
    System&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/**
    * Checks whether the board has a winner
    * @return true if board has a winner else false.
    */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; boardHasWinner &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Boolean&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;//check horizontals&lt;/span&gt;
    board&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;foreach &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;row &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&apos;_&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; row&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;forall&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;equals&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// check diagonals&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; topLeftBottomRight &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Array&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;board&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; board&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; board&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; bottomLeftTopRight &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Array&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;board&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; board&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; board&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;topLeftBottomRight&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&apos;_&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; topLeftBottomRight&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;forall&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;equals&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;topLeftBottomRight&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;bottomLeftTopRight&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&apos;_&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; bottomLeftTopRight&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;forall&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;equals&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;bottomLeftTopRight&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// if no winner has been found, return false.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/**
    * Prints a visual representation of the board and who&apos;s turn it is
    */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; printBoard &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    board&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;foreach &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; row &lt;span class=&quot;token keyword&quot;&gt;=&gt;&lt;/span&gt; println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; row&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; | &quot;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; row&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; | &quot;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; row&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    println&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;currentPlayer &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; is playing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// let&apos;s play!&lt;/span&gt;
TicTacToe&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Scala Day 0 - What is Scala?]]></title><description><![CDATA[My final assignment for a school course is to learn a new language from a book (uh-oh). I picked Scala and here's why]]></description><link>https://www.rickvanlieshout.com/posts/2017/scala-day-0-what-is-scala/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2017/scala-day-0-what-is-scala/</guid><pubDate>Thu, 30 Mar 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 700px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 29.166666666666668%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABmUlEQVR42j2QPWhaURSAHx1CQHSIr5s4Kfiz6KJTBh1asoQuLq2dWnF1aBWEbFUQxEkHEdEGxGLQgC0iOggSlNIWJNS6PdSsdvAHfGDr1/cupAcOnHu4fOecT1Lv71Fvb/l7dQUf0ugxurujWCyyWCzE+3g88hiP9X6/J5fLoSjK/76e0g+3m5Ek0dfy15u3XDebyGdnhEIhut2u+LxcLpnP5+x2O6bTKZvNhvV6jdlsptfrsd1umc1mHA4HpK+vwlSeynzSgNtIlHylwhOtzmQyAlYulzEYDCQSCdrtNi6XC6fTyWQywWq1CmAymUSWZSKRCNLP83PGp6d81iCjl2EBad7cYDKZiMVi+P1+4vG46KfTaYLBIEajkWq1it1up1arEY1G8Xg8YpA00k77eHLCF33D8GuuNZ8vLi+xWCxks1mxmQ4oFAoEAgG8Xq84tVQq4dZ0pVIpbDYbPp8Ph8OBpFxc8Pv5M/68ew/fvqM8PFDI54U/XbKqqtTrdTqdjvDYaDTo9/vC62AwYLVaMRwOabVajMdj/gGbxUaposxvkgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/6f2e506975a01e528d84eb4e6be4fe84/8ac56/scala.webp 240w,
/static/6f2e506975a01e528d84eb4e6be4fe84/d3be9/scala.webp 480w,
/static/6f2e506975a01e528d84eb4e6be4fe84/426ac/scala.webp 700w&quot;
              sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/6f2e506975a01e528d84eb4e6be4fe84/8ff5a/scala.png 240w,
/static/6f2e506975a01e528d84eb4e6be4fe84/e85cb/scala.png 480w,
/static/6f2e506975a01e528d84eb4e6be4fe84/8c557/scala.png 700w&quot;
            sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/6f2e506975a01e528d84eb4e6be4fe84/8c557/scala.png&quot;
            alt=&quot;&amp;quot;Logo of the scala programming language&amp;quot;&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;One of the final assignments for a school course called “APP” (Algorithms Programming language &amp;#x26; Paradigms) was/is to learn a new programming language using the book ”&lt;a href=&quot;https://pragprog.com/search/?q=seven-languages-in-seven-weeks&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Seven languages in Seven weeks&lt;/a&gt;“.&lt;/p&gt;
&lt;p&gt;The idea of this book is that you can get comfortable with a programming language in just a week. As you can probably guess from the title the book covers 7 languages in total and I will be covering at least 1 (Scala).&lt;/p&gt;
&lt;h2 id=&quot;what-is-scala&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-scala&quot; aria-label=&quot;what is scala permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is Scala&lt;/h2&gt;
&lt;p&gt;Scala is a hybrid language that tries to bridge the gap between object-oriented languages like Java and functional languages like Haskell.&lt;/p&gt;
&lt;h2 id=&quot;why-did-i-pick-scala-for-the-assignment&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-did-i-pick-scala-for-the-assignment&quot; aria-label=&quot;why did i pick scala for the assignment permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why did I pick Scala for the assignment?&lt;/h2&gt;
&lt;p&gt;I have never really liked functional languages (except Javascript) much. It’s a hard paradigm for me to wrap my head around in most languages and it gets tiring quickly. I thought having an assignment (for which I will be graded) to focus on might help me stay on the right path.&lt;/p&gt;
&lt;p&gt;So… if you wanted to go functional why not go Haskell you ask? Well, purely functional programming is something which just doesn’t “speak” to me, combining it with an OO approach might just be the thing that makes the gears click. At the very least it should provide a gradual learning curve to apply functional programming ideas to my code.&lt;/p&gt;
&lt;p&gt;Besides my personal reasons, there are some objective reasons why Scala is “better” than Haskell:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scala is much more popular than Haskell, as such chances of encountering it “in the wild” are severely increased.&lt;/li&gt;
&lt;li&gt;Scala painlessly integrates with pre-existing java libraries.&lt;/li&gt;
&lt;li&gt;Scala uses the Java Virtual Machine (JVM), this has numerous benefits.&lt;/li&gt;
&lt;li&gt;Like Java, Scala is statically typed and the syntax somewhat resembles that of Java too.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well that’s it for today folks, check back in for the next blog within a few days!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[My extended leave, status updates and other stuff]]></title><description><![CDATA[My blogs aren't flowing like they used to :/. Is it dead?]]></description><link>https://www.rickvanlieshout.com/posts/2016/extended-leave-status-updates-and-other-stuff/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2016/extended-leave-status-updates-and-other-stuff/</guid><pubDate>Fri, 02 Sep 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;So….. last blog post was in December of last year. Does that mean the blog is dead? Well I’m happy to report that is NOT what it means! In this blog post I’ll address why I’ve been on an extended leave and I have some exciting news to boot!&lt;/p&gt;
&lt;h2 id=&quot;good-news-always-comes-first&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#good-news-always-comes-first&quot; aria-label=&quot;good news always comes first permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Good news always comes first!&lt;/h2&gt;
&lt;p&gt;Before I start on my rant about being away for so long I’d better tell you all some exciting news. And boy do I have quite a bit of it!&lt;/p&gt;
&lt;p&gt;First of all, if you hadn’t noticed yet, the personal website has gotten a facelift! I have added a new “Software” page, this page will contain software I made without a contract and open source projects I’ve worked on. Furthermore, I have updated the CV with some new job information and a couple of snazzy logos. The Portfolio page got trimmed down a bit (moved some stuff to Software) and the contact page has gotten a nice new look with an actual form instead of just social buttons. Lastly, I added an “Other sites” drop-down menu. This menu will house links to various other websites of which I am the owner / co-owner. As some of those keen-eyed people among you will have noticed I also upgraded my “Disclaimer” page and added a new “RSS feed” to the footer of the site.&lt;/p&gt;
&lt;p&gt;All in all, quite a few changes which will allow me to further separate Mi-soft.nl from my personal website. (update to Mi-soft.nl expected somewhere later this year hehe)&lt;/p&gt;
&lt;h2 id=&quot;more-good-news&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#more-good-news&quot; aria-label=&quot;more good news permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;More good news!?&lt;/h2&gt;
&lt;p&gt;Oh yes! I have recently started working on Three, yes Three, new projects. I will probably blog about all of these projects but in case I don’t here’s a little overview:&lt;/p&gt;
&lt;p&gt;First up is a new Python (Flask) REST API which makes getting Linux OS information a breeze! I started this project because I wanted to recreate my old hardware info system (written in Java) and generally improve it overall. I started out working on this by myself but soon joined up with my old friend Janco (more on him later). We haven’t done all too much about it but in its current state it can already serve most, if not all, CPU and Memory information. Though the best feature of this new API is arguably its name. I named it after the person I have cherished for over six years now, &lt;a href=&quot;https://github.com/SammySolutions&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Sammy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also finally bit the bullet regarding “Linfinity”. For a while now I’ve been wanting to create a “software install script generator” for Linux which I can use to install Linux software easily on a multitude of systems. Linfinity will be a web tool which will be able to generate software install scripts for various different distributions (aiming for at least: Arch, Ubuntu and Raspbian).&lt;/p&gt;
&lt;p&gt;Lastly, I have some “maker” news. A friend and I have decided to try our hand at creating a Raspberry Pi workplace for the masses. We found an absolutely perfect display to use in combination with the Raspberry pi and have devised a way to mount it and the Rasberry Pi in a single chassis. Cables will be mostly routed within the unit and it all can be powered by a single standard 2.1mm adapter! More news about this soon!&lt;/p&gt;
&lt;h2 id=&quot;moving-away-from-digitalocean&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#moving-away-from-digitalocean&quot; aria-label=&quot;moving away from digitalocean permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Moving away from Digitalocean&lt;/h2&gt;
&lt;p&gt;As of today I no longer have any Digitalocean droplets. Not because they offer a bad service but because they are too expensive for what I was using them for. The only real purpose my droplet still had was handling go8.nl and it’s traffic. I have since moved go8.nl over to Sohosted purely because it is a lot cheaper :).&lt;/p&gt;
&lt;h2 id=&quot;the-rekindled-friendship&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-rekindled-friendship&quot; aria-label=&quot;the rekindled friendship permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The rekindled friendship?&lt;/h2&gt;
&lt;p&gt;As some of you might know Janco and I completely split up about a year and a half ago after a rather lengthy fight between us. In this year and a half apart we both calmed down a bit and after a good talk we’ve decided to pick things up again. So far everything is going well and we are working on keeping it that way. Even though programming together will certainly add to both of our stress levels , and probably lead to a couple of smaller fights, we have decided to team up to create &lt;a href=&quot;https://github.com/SammySolutions&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Sammy&lt;/a&gt;, my new REST API for extracting Linux OS information.&lt;/p&gt;
&lt;p&gt;One of my other good friends (Jelle) also happened to come by some extra free time these past months and we’ve been using that time to explore the magical world of Tamriel (ESO online) and kick some butt (Awesomenauts) together.&lt;/p&gt;
&lt;p&gt;So all these things combined have been taking up most of my free time and motivation. Which leaves none for writing blogs unfortunately. I will try to improve upon this though.&lt;/p&gt;
&lt;p&gt;Well that’s it for me folks, Have a great day and may happiness surround you :)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TekTree part 4 - programming]]></title><description><![CDATA[I finally get to the juicy code of my home-made christmas tree shambles!]]></description><link>https://www.rickvanlieshout.com/posts/2015/tektree-part-4-programming/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2015/tektree-part-4-programming/</guid><pubDate>Thu, 24 Dec 2015 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the last installment of the series I show you how to program the arduino to work with the TekTree we built. I would advise each and every one of you to download my sketch and try it but after that start experimenting with your own designs!&lt;/p&gt;
&lt;h2 id=&quot;testing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#testing&quot; aria-label=&quot;testing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Testing&lt;/h2&gt;
&lt;p&gt;Before we start writing complicated code we first need to design a very simple test sketch for the leds. The script I used can be found below or at &lt;a href=&quot;https://github.com/Mastermindzh/TekTree&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Github&lt;/a&gt; under the following directory: Testing -&gt; LedTest&lt;/p&gt;
&lt;p&gt;The code is quite simple. It sets all led’s as output and runs through them. back and forth&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ino&quot;&gt;&lt;pre class=&quot;language-ino&quot;&gt;&lt;code class=&quot;language-ino&quot;&gt; &lt;span class=&quot;token comment&quot;&gt;/*
   Rick van Lieshout
   24-12-2015
   LICENSE: MIT
 */&lt;/span&gt;

 const &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; DELAYTIME &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 const &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; NUMBEROFPINS &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 const &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; pinArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;NUMBEROFPINS&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

 &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token comment&quot;&gt;//initiate pins&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; thisPin &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; thisPin &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; NUMBEROFPINS&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; thisPin&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
     &lt;span class=&quot;token function&quot;&gt;pinMode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pinArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;thisPin&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;OUTPUT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

 &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;loop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token comment&quot;&gt;// loop from the lowest pin to the highest:&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; thisPin &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; thisPin &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; NUMBEROFPINS&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; thisPin&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// turn the led on:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;digitalWrite&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pinArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;thisPin&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;HIGH&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// wait for a bit&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;delay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;DELAYTIME&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// turn the led off:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;digitalWrite&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pinArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;thisPin&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;LOW&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
   &lt;span class=&quot;token comment&quot;&gt;// loop from the highest pin to the lowest:&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; thisPin &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; NUMBEROFPINS &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; thisPin &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; thisPin&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// turn the led on:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;digitalWrite&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pinArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;thisPin&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;HIGH&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// wait for a bit&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;delay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;DELAYTIME&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// turn the led off:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;digitalWrite&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pinArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;thisPin&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;LOW&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Assuming all went well you should now see the led’s come on 1 by 1 and create a little wave effect (first pattern down!)&lt;/p&gt;
&lt;p&gt;Now that we know it all works let’s clean up the code and add some pattern handling.&lt;/p&gt;
&lt;h2 id=&quot;the-finished-code--result&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-finished-code--result&quot; aria-label=&quot;the finished code  result permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The finished code / result&lt;/h2&gt;
&lt;p&gt;The complete code can once again be found on github or directly below the video.
That’s it for now. &lt;strong&gt;Merry christmas and a happy new year folks!&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 41.964285714285715%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/VlQoVNe77Ys&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;h2 id=&quot;the-code-that-makes-it-work&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-code-that-makes-it-work&quot; aria-label=&quot;the code that makes it work permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The code that makes it work&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ino&quot;&gt;&lt;pre class=&quot;language-ino&quot;&gt;&lt;code class=&quot;language-ino&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/*
  Rick van Lieshout
  24-12-2015
  LICENSE: MIT
*/&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/** Constant value&apos;s, these have to be changed manually  **/&lt;/span&gt;
const &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; MAXSEQUENCES&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;     &lt;span class=&quot;token comment&quot;&gt;// number of steps in the largest sequence. Could make it 999 but that would affect performance&lt;/span&gt;
const &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; NUMBEROFPINS &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;// number of leds&lt;/span&gt;
const &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; NUMBEROFPATTERNS &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// number of patterns specified&lt;/span&gt;
const &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; DELAYPOT &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;         &lt;span class=&quot;token comment&quot;&gt;// number of pin that pot is connected to&lt;/span&gt;
const &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; BUTTONPIN &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;       &lt;span class=&quot;token comment&quot;&gt;// number of pin that button is connected to&lt;/span&gt;
const &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; pinArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;NUMBEROFPINS&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// pins where leds are connected&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/** Regular variables, program can alter these **/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; previousbuttonstate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// used to detect whether button is pressed&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; buttonstate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;          &lt;span class=&quot;token comment&quot;&gt;// used to detect whether button is pressed&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; pattern &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;              &lt;span class=&quot;token comment&quot;&gt;// pattern to start with&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/** massive array which holds the patterns **/&lt;/span&gt;
const &lt;span class=&quot;token keyword&quot;&gt;byte&lt;/span&gt; LEDsequence &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;NUMBEROFPATTERNS&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;MAXSEQUENCES&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;NUMBEROFPINS&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/** Setup only gets run once **/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//set all pins as input/output&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;initializePins&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/** Loop is constantly running **/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;loop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// read button state&lt;/span&gt;
  buttonstate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;digitalRead&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BUTTONPIN&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// if button state changed&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;buttonstate &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; previousbuttonstate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    previousbuttonstate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; buttonstate&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
     &lt;span class=&quot;token comment&quot;&gt;// check value and add to pattern&lt;/span&gt;
     &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;buttonstate &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;HIGH&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pattern &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; NUMBEROFPATTERNS&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        pattern &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        pattern&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Loop through all the arrays and toggle pins on or off.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; sequence&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;sequence&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSequences&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pattern&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;sequence&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; pin&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;pin&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;NUMBEROFPINS&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;pin&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;digitalWrite&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pinArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;pin&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; LEDsequence&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;pattern&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;sequence&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;pin&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// delay between sequences, should use millis if you want instant response on the button&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;delay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDelay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;DELAYPOT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/** Count the number of sequences in a specific pattern **/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getSequences&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; pattern&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;byte&lt;/span&gt; amount &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;byte&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;MAXSEQUENCES&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; total &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; pin&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; pin&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;NUMBEROFPINS&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; pin&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      total&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;LEDsequence&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;pattern&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;pin&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      amount&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; amount&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/** get value of pot **/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getDelay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; potnr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;analogRead&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;potnr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/** Set all pins as either output or input **/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;initializePins&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;pinMode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BUTTONPIN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;INPUT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; pin&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;pin&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;NUMBEROFPINS&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;pin&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;pinMode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pinArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;pin&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;OUTPUT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;     &lt;span class=&quot;token comment&quot;&gt;// we make all the declarations at once&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[TekTree part 3 - Wiring]]></title><description><![CDATA[Read about me being tangled with wires and generally just making a mess of things]]></description><link>https://www.rickvanlieshout.com/posts/2015/tektree-part-3-wiring/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2015/tektree-part-3-wiring/</guid><pubDate>Thu, 24 Dec 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the 3rd part of my TekTree project I’ll show you guys how to wire everything. This time I even used separate colours for the power, ground and signal wires. So no more complaining! ^_^ All in all I think the result looks absolutely wicked. Even without the Arduino case which has yet to come in the mail. (and probably won’t fit)&lt;/p&gt;
&lt;h2 id=&quot;wiring-part-1---schematics&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#wiring-part-1---schematics&quot; aria-label=&quot;wiring part 1   schematics permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Wiring part 1 - schematics&lt;/h2&gt;
&lt;p&gt;Before I started to jam wires in every nook and cranny I could find I had to come up with a plan. Most of that plan has been put into a “Fritzing” sketch which can be found below and on &lt;a href=&quot;https://github.com/Mastermindzh/TekTree&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Github&lt;/a&gt;. The only thing I couldn’t figure out how to model on fritzing is the actual Christmas tree and the power cord for the Arduino.&lt;/p&gt;
&lt;p&gt;The Arduino will get power from a regular adaptor. The only modification I made to the adapter was putting a button on one of the wires. The only reason I did that is because I’m too lazy to unplug the TekTree when I want to turn it off :)&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 700px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 140.83333333333334%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAcABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIDBAX/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/2gAMAwEAAhADEAAAAcLxvMC5mg0G0bTjA//EAB0QAAIBBAMAAAAAAAAAAAAAAAACEgEDECERMTL/2gAIAQEAAQUCkdDW+atltCPJ9EqsW/Z//8QAFhEAAwAAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AXT/xAAWEQEBAQAAAAAAAAAAAAAAAAAQMUH/2gAIAQIBAT8Bph//xAAaEAABBQEAAAAAAAAAAAAAAAAAARARITCB/9oACAEBAAY/Ai8Fk43/xAAdEAACAwACAwAAAAAAAAAAAAAAAREhMUGBEGFx/9oACAEBAAE/IXBZ0KUCJhuTXGUWU3wSCaij2jtjYoo3+vH/2gAMAwEAAgADAAAAEOj8fv/EABgRAAMBAQAAAAAAAAAAAAAAAAABERAh/9oACAEDAQE/EFE4QvVj/8QAGBEAAwEBAAAAAAAAAAAAAAAAAAExESH/2gAIAQIBAT8QhtnRUYf/xAAgEAEAAgICAQUAAAAAAAAAAAABABEhMUFRYXGBocHw/9oACAEBAAE/ELPDOwVfq7YaKKeepcbx3HT7EFHANqlcPmNFN7V3GFaLXtGjkXwDDQUAFTAPxUdz/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/1d6b20287f5ddcecabc216c5b2e4ff9c/8ac56/wiring1.webp 240w,
/static/1d6b20287f5ddcecabc216c5b2e4ff9c/d3be9/wiring1.webp 480w,
/static/1d6b20287f5ddcecabc216c5b2e4ff9c/426ac/wiring1.webp 700w&quot;
              sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/1d6b20287f5ddcecabc216c5b2e4ff9c/09b79/wiring1.jpg 240w,
/static/1d6b20287f5ddcecabc216c5b2e4ff9c/7cc5e/wiring1.jpg 480w,
/static/1d6b20287f5ddcecabc216c5b2e4ff9c/29d31/wiring1.jpg 700w&quot;
            sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/1d6b20287f5ddcecabc216c5b2e4ff9c/29d31/wiring1.jpg&quot;
            alt=&quot;Wiring of the back of the Tektree. You can see a lot of jumper wires sticking out and connecting to LEDs&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;why-so-many-wires&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-so-many-wires&quot; aria-label=&quot;why so many wires permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why so many wires?&lt;/h2&gt;
&lt;p&gt;I want the project to be “manageable” for everyone. To do this I kept the wiring as simple as possible. Every LED has 2 prongs, 1 goes to ground 1 goes to the Arduino. Simple. Same goes for the potentiometers, 3 legs, 1 power 1 ground 1 signal. The only leds I did bundle together (in terms of wiring) is the star. I did this to create a single star instead of multiple led’s.&lt;/p&gt;
&lt;h2 id=&quot;well-you-couldve-made-it-way-prettier-and&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#well-you-couldve-made-it-way-prettier-and&quot; aria-label=&quot;well you couldve made it way prettier and permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Well you could’ve made it way prettier… and&lt;/h2&gt;
&lt;p&gt;Well yes, as all of us know I’m perfectly capable of designing a &lt;a href=&quot;/images/blogs/han4pi/front.png&quot;&gt;refined build&lt;/a&gt;. I didn’t want to go with a pcb this time however because that would make the barrier to entry way higher on this project. And that is something I definitely &lt;strong&gt;don’t&lt;/strong&gt; want.&lt;/p&gt;
&lt;p&gt;I also didn’t “group” all my ground wires together. (led -&gt; led -&gt; led -&gt; board) This would’ve made the project a lot neater but it wouldn’t be anywhere near as service friendly. (which was kinda the idea…)&lt;/p&gt;
&lt;p&gt;Well then, I feel like I prepared you guys enough to show the (complicated looking, but very simple) wiring. Check it out below!&lt;/p&gt;
&lt;h2 id=&quot;wiring-part-2---actual-wiring&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#wiring-part-2---actual-wiring&quot; aria-label=&quot;wiring part 2   actual wiring permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Wiring part 2 - Actual wiring&lt;/h2&gt;
&lt;p&gt;Below you’ll find the pictures I took while I was wiring the TekTree.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 700px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 163.33333333333334%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAhABQDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAMEBQEC/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQD/2gAMAwEAAhADEAAAAWZdMZeiYR/NVY4xQNO8IlAn/8QAHxAAAgIBBAMAAAAAAAAAAAAAAQIAAxEFEjEyEyEi/9oACAEBAAEFAtQ6r8TMtv8ANGPvMSt8BSY3IsDqF2y5lLjtbxP/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AV//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AV//xAAeEAABAwQDAAAAAAAAAAAAAAAAEDFRAQIRIRIgIv/aAAgBAQAGPwK1cQvJqGhjy8Gyen//xAAdEAADAAICAwAAAAAAAAAAAAAAAREhMRBRQWFx/9oACAEBAAE/Id/20NO+KEUPK0oHA/8AZz5GeNcKTpwzPywPWJ9mFLBSmg08f//aAAwDAQACAAMAAAAQaN9w98//xAAYEQEAAwEAAAAAAAAAAAAAAAABABARIf/aAAgBAwEBPxAKHk2Ff//EABgRAQEAAwAAAAAAAAAAAAAAAAEQABEh/9oACAECAQE/EFidzV//xAAfEAEAAgICAgMAAAAAAAAAAAABABEhMUFxEFFhkaH/2gAIAQEAAT8QNi4+4R6Gy77lcZvuDIin7SiONywl6lcAJt0+CYVFZFqUBjhHdxmowZAjWoD4HpXcupVEXbnw/wAXj//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/c20f85f3a53f006bb81d3987d6e8324b/8ac56/wiring2.webp 240w,
/static/c20f85f3a53f006bb81d3987d6e8324b/d3be9/wiring2.webp 480w,
/static/c20f85f3a53f006bb81d3987d6e8324b/426ac/wiring2.webp 700w&quot;
              sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/c20f85f3a53f006bb81d3987d6e8324b/09b79/wiring2.jpg 240w,
/static/c20f85f3a53f006bb81d3987d6e8324b/7cc5e/wiring2.jpg 480w,
/static/c20f85f3a53f006bb81d3987d6e8324b/29d31/wiring2.jpg 700w&quot;
            sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/c20f85f3a53f006bb81d3987d6e8324b/29d31/wiring2.jpg&quot;
            alt=&quot;Wiring of the back of the Tektree. You can see a lot of jumper wires sticking out and connecting to LEDs&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TekTree part 2 - Lasercutting]]></title><description><![CDATA[Dangerous things involving lasers and christmassy figures. Fun!]]></description><link>https://www.rickvanlieshout.com/posts/2015/tektree-part-2-lasercutting/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2015/tektree-part-2-lasercutting/</guid><pubDate>Sat, 19 Dec 2015 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last friday I actually got to cut the parts for my TekTree! So excited! This is by far the biggest “piece” I have ever laser cut but luckily everything went well. This in part is thanks to my brilliant friend &lt;a href=&quot;https://www.ronnabuurs.nl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Ron&lt;/a&gt; who helped me create the sketches for the laser cutter. Thanks again &lt;a href=&quot;https://www.ronnabuurs.nl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Ron&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Top tip!&lt;/strong&gt; You don’t have to laser cut the designs. Just print the designs with a regular printer and stick it on some wood. Then just use something like a bandsaw to cut the pieces!&lt;/p&gt;
&lt;h2 id=&quot;laser-cutting-video&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#laser-cutting-video&quot; aria-label=&quot;laser cutting video permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Laser cutting video&lt;/h2&gt;
&lt;p&gt;I’ve gotten so much positive feedback on my last laser cutting video that I decided to make another one. This one is a little different though. It’s a compilation of a few different cuts.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 41.964285714285715%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/92aTol52q8o?wmode=transparant&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;h2 id=&quot;tektree-assembly&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tektree-assembly&quot; aria-label=&quot;tektree assembly permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TekTree assembly&lt;/h2&gt;
&lt;p&gt;Below you’ll find a series of pictures I took while assembling the TekTree.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQBAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABzrlGBEgj/8QAGBABAQEBAQAAAAAAAAAAAAAAAQIAEiL/2gAIAQEAAQUCkHcS6hKl9XST1W//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAgEBPwEn/8QAGBAAAwEBAAAAAAAAAAAAAAAAABExARD/2gAIAQEABj8CZBc1FP/EABoQAAMBAAMAAAAAAAAAAAAAAAABEUEhUWH/2gAIAQEAAT8haNodRfBybB3EYzRltn//2gAMAwEAAgADAAAAEOQv/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFREBAQAAAAAAAAAAAAAAAAAAEDH/2gAIAQIBAT8Qg//EABsQAQADAQADAAAAAAAAAAAAAAEAESExQWFx/9oACAEBAAE/EBgAY+CBkMVX0Tc1VXXSDocdSp7IoEWWq/Z//9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/cf7102f1cdc8bd7fca9b5d45f9d1dcbd/8ac56/plate.webp 240w,
/static/cf7102f1cdc8bd7fca9b5d45f9d1dcbd/d3be9/plate.webp 480w,
/static/cf7102f1cdc8bd7fca9b5d45f9d1dcbd/e46b2/plate.webp 960w,
/static/cf7102f1cdc8bd7fca9b5d45f9d1dcbd/f992d/plate.webp 1440w,
/static/cf7102f1cdc8bd7fca9b5d45f9d1dcbd/882b9/plate.webp 1920w,
/static/cf7102f1cdc8bd7fca9b5d45f9d1dcbd/58c0b/plate.webp 2688w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/cf7102f1cdc8bd7fca9b5d45f9d1dcbd/09b79/plate.jpg 240w,
/static/cf7102f1cdc8bd7fca9b5d45f9d1dcbd/7cc5e/plate.jpg 480w,
/static/cf7102f1cdc8bd7fca9b5d45f9d1dcbd/6a068/plate.jpg 960w,
/static/cf7102f1cdc8bd7fca9b5d45f9d1dcbd/644c5/plate.jpg 1440w,
/static/cf7102f1cdc8bd7fca9b5d45f9d1dcbd/0f98f/plate.jpg 1920w,
/static/cf7102f1cdc8bd7fca9b5d45f9d1dcbd/03c3e/plate.jpg 2688w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/cf7102f1cdc8bd7fca9b5d45f9d1dcbd/6a068/plate.jpg&quot;
            alt=&quot;plate&quot;
            title=&quot;the baseplate&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;the baseplate&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACA//EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAEOzKEV0o//xAAZEAEBAAMBAAAAAAAAAAAAAAACAQADITH/2gAIAQEAAQUC9sndkRR7Dm1qP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABgQAAIDAAAAAAAAAAAAAAAAAAEQABFB/9oACAEBAAY/AlroGf/EABoQAQACAwEAAAAAAAAAAAAAAAEAESExUZH/2gAIAQEAAT8hKye9iNliktGzMdFzQi+gT//aAAwDAQACAAMAAAAQvy//xAAVEQEBAAAAAAAAAAAAAAAAAAAAAf/aAAgBAwEBPxCK/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGxABAAMAAwEAAAAAAAAAAAAAAQARITFBUXH/2gAIAQEAAT8Qd1gc2NjckvBOvsBLGluIlvd5CFXkdGAUUeT/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/d279a02ec7c55c139306aebcf0c6dc56/8ac56/bottom.webp 240w,
/static/d279a02ec7c55c139306aebcf0c6dc56/d3be9/bottom.webp 480w,
/static/d279a02ec7c55c139306aebcf0c6dc56/e46b2/bottom.webp 960w,
/static/d279a02ec7c55c139306aebcf0c6dc56/f992d/bottom.webp 1440w,
/static/d279a02ec7c55c139306aebcf0c6dc56/882b9/bottom.webp 1920w,
/static/d279a02ec7c55c139306aebcf0c6dc56/58c0b/bottom.webp 2688w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/d279a02ec7c55c139306aebcf0c6dc56/09b79/bottom.jpg 240w,
/static/d279a02ec7c55c139306aebcf0c6dc56/7cc5e/bottom.jpg 480w,
/static/d279a02ec7c55c139306aebcf0c6dc56/6a068/bottom.jpg 960w,
/static/d279a02ec7c55c139306aebcf0c6dc56/644c5/bottom.jpg 1440w,
/static/d279a02ec7c55c139306aebcf0c6dc56/0f98f/bottom.jpg 1920w,
/static/d279a02ec7c55c139306aebcf0c6dc56/03c3e/bottom.jpg 2688w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/d279a02ec7c55c139306aebcf0c6dc56/6a068/bottom.jpg&quot;
            alt=&quot;bottom&quot;
            title=&quot;bottom of the assembly&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;bottom of the assembly&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABAAF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAclA0Bao/8QAGRABAQADAQAAAAAAAAAAAAAAAQIAERIh/9oACAEBAAEFAvN6lKlEwyl6/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFhAAAwAAAAAAAAAAAAAAAAAAAAEg/9oACAEBAAY/ApZ//8QAGxABAAICAwAAAAAAAAAAAAAAAQAxESFhcZH/2gAIAQEAAT8hOnmbgfGJTbFlYcVLA3P/2gAMAwEAAgADAAAAEPcv/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQMBAT8Qh//EABcRAQADAAAAAAAAAAAAAAAAAAEQESH/2gAIAQIBAT8QHKj/xAAYEAEBAQEBAAAAAAAAAAAAAAABEQAhMf/aAAgBAQABPxBQGC9jKAlSXHAEeJWmapvbiPEyqew93//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/01e3e9ea0a8cbfff0c90d8a0e77a6ba4/8ac56/bottom2.webp 240w,
/static/01e3e9ea0a8cbfff0c90d8a0e77a6ba4/d3be9/bottom2.webp 480w,
/static/01e3e9ea0a8cbfff0c90d8a0e77a6ba4/e46b2/bottom2.webp 960w,
/static/01e3e9ea0a8cbfff0c90d8a0e77a6ba4/f992d/bottom2.webp 1440w,
/static/01e3e9ea0a8cbfff0c90d8a0e77a6ba4/882b9/bottom2.webp 1920w,
/static/01e3e9ea0a8cbfff0c90d8a0e77a6ba4/58c0b/bottom2.webp 2688w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/01e3e9ea0a8cbfff0c90d8a0e77a6ba4/09b79/bottom2.jpg 240w,
/static/01e3e9ea0a8cbfff0c90d8a0e77a6ba4/7cc5e/bottom2.jpg 480w,
/static/01e3e9ea0a8cbfff0c90d8a0e77a6ba4/6a068/bottom2.jpg 960w,
/static/01e3e9ea0a8cbfff0c90d8a0e77a6ba4/644c5/bottom2.jpg 1440w,
/static/01e3e9ea0a8cbfff0c90d8a0e77a6ba4/0f98f/bottom2.jpg 1920w,
/static/01e3e9ea0a8cbfff0c90d8a0e77a6ba4/03c3e/bottom2.jpg 2688w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/01e3e9ea0a8cbfff0c90d8a0e77a6ba4/6a068/bottom2.jpg&quot;
            alt=&quot;bottom2&quot;
            title=&quot;bottom with box closed&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;bottom with box closed&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 176.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAjABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQCAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB8KrlcQskpsk6S8GxFgoD/8QAHRAAAgEEAwAAAAAAAAAAAAAAAQIAAxESIRMgIv/aAAgBAQABBQIRksJRHqHRQETHT5BlfGc6w1x0/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwFf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwFf/8QAGRAAAQUAAAAAAAAAAAAAAAAAACAwQVFh/9oACAEBAAY/AmLMJT//xAAcEAADAAIDAQAAAAAAAAAAAAAAAREhQRAxYVH/2gAIAQEAAT8hatIkta4pXwaqg9UXI8DbwJNH6MnbZIzLQafTN8//2gAMAwEAAgADAAAAEBAa/XPP/8QAFxEAAwEAAAAAAAAAAAAAAAAAABARAf/aAAgBAwEBPxCLSP8A/8QAGREAAgMBAAAAAAAAAAAAAAAAARAAESFh/9oACAECAQE/EEDkvj//xAAfEAEAAgICAgMAAAAAAAAAAAABABEhMUFREKFhcZH/2gAIAQEAAT8QY0LWpYDo438wm3aXiWq5I/UsdBZ6r1F2G3dXHFPsCZ9QFkO02SlRw0239yzfiEdDiceP/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/5e9fdf00043361168e5d581713dd5925/8ac56/tree.webp 240w,
/static/5e9fdf00043361168e5d581713dd5925/d3be9/tree.webp 480w,
/static/5e9fdf00043361168e5d581713dd5925/e46b2/tree.webp 960w,
/static/5e9fdf00043361168e5d581713dd5925/f992d/tree.webp 1440w,
/static/5e9fdf00043361168e5d581713dd5925/7afe4/tree.webp 1520w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/5e9fdf00043361168e5d581713dd5925/09b79/tree.jpg 240w,
/static/5e9fdf00043361168e5d581713dd5925/7cc5e/tree.jpg 480w,
/static/5e9fdf00043361168e5d581713dd5925/6a068/tree.jpg 960w,
/static/5e9fdf00043361168e5d581713dd5925/644c5/tree.jpg 1440w,
/static/5e9fdf00043361168e5d581713dd5925/6ed34/tree.jpg 1520w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/5e9fdf00043361168e5d581713dd5925/6a068/tree.jpg&quot;
            alt=&quot;tree&quot;
            title=&quot;the tree inserted into the base&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;the tree inserted into the base&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 176.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAjABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAIDBAX/xAAVAQEBAAAAAAAAAAAAAAAAAAABAP/aAAwDAQACEAMQAAAB5tmiQ8dsRZDVJMzUSi0qYr//xAAeEAACAQMFAAAAAAAAAAAAAAABAgASITIDEBETQf/aAAgBAQABBQKkpFZgXXh/KlJ1aC94qX6RBteDE4z/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AV//xAAWEQADAAAAAAAAAAAAAAAAAAAQESD/2gAIAQIBAT8BCj//xAAbEAABBAMAAAAAAAAAAAAAAAABABARMSAygf/aAAgBAQAGPwJQUQ+xbipprH//xAAeEAEAAgICAwEAAAAAAAAAAAABABEhQTFhEFFxkf/aAAgBAQABPyE7Uo5dxsx+T16gACLLRbuoBS3DG570isabjRk0+zHhuOxc5/nj/9oADAMBAAIAAwAAABCnHP8Ah+//xAAZEQADAAMAAAAAAAAAAAAAAAAAAREgITH/2gAIAQMBAT8QemkQt7h//8QAGBEBAAMBAAAAAAAAAAAAAAAAAQARIDH/2gAIAQIBAT8QGxYMKcx//8QAGxABAQEBAQEBAQAAAAAAAAAAAREAITFhQYH/2gAIAQEAAT8QerS+p5gKwpAzIqPrGXtRaMaslZ+cwMSOjoa3zym4Vxi+iJlLD96X+GAFfrDzoTsB904CPoZmKqDutK7/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/8561e33d235554bd4fbae322406ac426/8ac56/back2.webp 240w,
/static/8561e33d235554bd4fbae322406ac426/d3be9/back2.webp 480w,
/static/8561e33d235554bd4fbae322406ac426/e46b2/back2.webp 960w,
/static/8561e33d235554bd4fbae322406ac426/f992d/back2.webp 1440w,
/static/8561e33d235554bd4fbae322406ac426/7afe4/back2.webp 1520w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/8561e33d235554bd4fbae322406ac426/09b79/back2.jpg 240w,
/static/8561e33d235554bd4fbae322406ac426/7cc5e/back2.jpg 480w,
/static/8561e33d235554bd4fbae322406ac426/6a068/back2.jpg 960w,
/static/8561e33d235554bd4fbae322406ac426/644c5/back2.jpg 1440w,
/static/8561e33d235554bd4fbae322406ac426/6ed34/back2.jpg 1520w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/8561e33d235554bd4fbae322406ac426/6a068/back2.jpg&quot;
            alt=&quot;back2&quot;
            title=&quot;the arduino and breadboard will just be hanging in the back&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;the arduino and breadboard will just be hanging in the back&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TekTree part 1 - TekTree - a christmassy surprise project]]></title><description><![CDATA[A new maker project based on a big piece of lumber that my parents erected 🤔]]></description><link>https://www.rickvanlieshout.com/posts/2015/tektree-part-1-a-christmas-surprise/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2015/tektree-part-1-a-christmas-surprise/</guid><pubDate>Sat, 19 Dec 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’m very excited to announce a new maker project to you guys ! It will be simple, and thus reproducible, yet fun and quite possibly even useful. (oh, and a tad crazy)&lt;/p&gt;
&lt;h2 id=&quot;so-what-is-it&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#so-what-is-it&quot; aria-label=&quot;so what is it permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;So? What is it?&lt;/h2&gt;
&lt;p&gt;Well… basically I’m going to assemble and program a little christmas tree thing.&lt;/p&gt;
&lt;p&gt;I got the idea after my parents put up their christmas tree. My mom opted for a more “modern” (so I’ve been told) kind of tree. This “modern” tree is basically a home made christmastree-y looking thing bolted together with a few screws. (picture below) At first I didn’t like the idea of a more modern, less authentic, christmas tree but once it was actually up it didn’t look half bad. There were some things missing though. It just didn’t make sense to me to create something new yet be limited by old stuff. For example: my parents put a string of lights &lt;strong&gt;around&lt;/strong&gt; the wooden boards, why not integrate them? Or why not add a dimmer? Or make it follow some flashy patterns? As you might expect by now I am basically going to recreate, with a bit more finesse, my parent’s christmas tree.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 540px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 177.91666666666669%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAkABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAQBAwUC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/9oADAMBAAIQAxAAAAHkdKejLoYJ7rm2GpUyr5ypA5//xAAeEAEAAgICAwEAAAAAAAAAAAABAAIDEhMiEBEhM//aAAgBAQABBQJ7N66+OFx5n8xLTF3WqY+WFdJtrEZZln57Z//EABYRAQEBAAAAAAAAAAAAAAAAABABEf/aAAgBAwEBPwFyP//EABURAQEAAAAAAAAAAAAAAAAAABAh/9oACAECAQE/AWv/xAAgEAACAgAGAwAAAAAAAAAAAAAAAQIREBIgITFRQXGR/9oACAEBAAY/AlRSwjGVdlmxKXLH9ODL47Q6bl70/wD/xAAbEAADAQEBAQEAAAAAAAAAAAAAAREhMUFRYf/aAAgBAQABPyHre4LTSfpBWgm/YPKePcElqFtuXTN+KDGGjqnW4hU6SabBF8Yz6OTtCd6z/9oADAMBAAIAAwAAABA41b8L/wD/xAAYEQADAQEAAAAAAAAAAAAAAAAAAREQIf/aAAgBAwEBPxCcKi4PP//EABkRAAMAAwAAAAAAAAAAAAAAAAABERAhMf/aAAgBAgEBPxC7IxIoXMf/xAAgEAEAAgICAQUAAAAAAAAAAAABABEhMUFRYXGBkcHh/9oACAEBAAE/EMcIqttXbAgipWF+dSkbNm0Yg7PUPmFeipYZxe/ZlQslZKjY1ANLbdt90Rncah8Pb4iX9ka4imgdY41BQh4ZJsx+SouDqWdtRcshcJV3dz//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/4c49586bce3891f6aba0cac28250795e/8ac56/old.webp 240w,
/static/4c49586bce3891f6aba0cac28250795e/d3be9/old.webp 480w,
/static/4c49586bce3891f6aba0cac28250795e/9e625/old.webp 540w&quot;
              sizes=&quot;(max-width: 540px) 100vw, 540px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/4c49586bce3891f6aba0cac28250795e/09b79/old.jpg 240w,
/static/4c49586bce3891f6aba0cac28250795e/7cc5e/old.jpg 480w,
/static/4c49586bce3891f6aba0cac28250795e/09d21/old.jpg 540w&quot;
            sizes=&quot;(max-width: 540px) 100vw, 540px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/4c49586bce3891f6aba0cac28250795e/09d21/old.jpg&quot;
            alt=&quot;a picture of my parents&amp;#39; new christmas tree&quot;
            title=&quot;a picture of my parents&amp;#39; new christmas tree&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;a picture of my parents&amp;#39; new christmas tree&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;open-source&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#open-source&quot; aria-label=&quot;open source permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Open source?&lt;/h2&gt;
&lt;p&gt;Of course! All code will be open source! All other stuff (drawings etc.) will also be opened up to the public. Everything can be found on &lt;a href=&quot;https://github.com/Mastermindzh/TekTree&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Github&lt;/a&gt; once again.&lt;/p&gt;
&lt;h2 id=&quot;step-1---design&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#step-1---design&quot; aria-label=&quot;step 1   design permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Step 1 - Design&lt;/h2&gt;
&lt;p&gt;I’ve thought long and hard about what kind of “controller” I wanted to use. And of course I immediately wanted to use a Raspberry pi. But I asked myself, why a pi? Why not use something simpler (like an arduino) to control the lights and switches. After some serious brainstorming I decided to go with an arduino in the end. I figured the Raspberry pi zero would be too cumbersome to work with for a simple christmas tree. Besides, I have a lot more uses for a pi zero than I have for an arduino, and I got more arduino’s laying around than pi zero’s at the moment.&lt;/p&gt;
&lt;h2 id=&quot;digital-drawing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#digital-drawing&quot; aria-label=&quot;digital drawing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Digital drawing&lt;/h2&gt;
&lt;p&gt;After deciding to use an arduino I had another big decision to make. Should I follow my parents’ example? Or go a different route? In the end I decided my way was better (kids…) and so I decided to laser cut my wooden designs. One of the other big changes I made is to the base. Whereas my parents opted for something rugged I’m going for a slightly more “finished” look. This means that my base is nice and round with a few fun shapes on it and I even speculated about making the circle sit flush with the ground.(which would mean creating bendable wood! A challenge in and of itself.)&lt;/p&gt;
&lt;p&gt;After that came my struggle with the drawing software. I tried creating a drawing in Coreldraw Pro… that was… a painful experience to say the least. Then I tried drawing with a program called InkScape, while better it still didn’t yield any results. Finally I decided to give up and ask for help from a friend.&lt;/p&gt;
&lt;p&gt;Luckily my friend &lt;a href=&quot;https://www.ronnabuurs.nl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Ron Nabuurs&lt;/a&gt; is brilliant when it comes to designing a drawing which can be lasercut. So after explaining my idea to &lt;a href=&quot;https://www.ronnabuurs.nl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Ron&lt;/a&gt; he decided to help me out. A picture of what we ended up with can be found below. The source file we used can be found on git.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.91666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAIBBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAe5TSQf/xAAUEAEAAAAAAAAAAAAAAAAAAAAg/9oACAEBAAEFAl//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAUEAEAAAAAAAAAAAAAAAAAAAAg/9oACAEBAAY/Al//xAAXEAADAQAAAAAAAAAAAAAAAAAAARAx/9oACAEBAAE/IVUPJ//aAAwDAQACAAMAAAAQpM//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAbEAADAAIDAAAAAAAAAAAAAAAAATEhQVFxgf/aAAgBAQABPxDll9seU54TQtLCh//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/78fb24d8c443b8c694eae9976dd27ef5/8ac56/new.webp 240w,
/static/78fb24d8c443b8c694eae9976dd27ef5/d3be9/new.webp 480w,
/static/78fb24d8c443b8c694eae9976dd27ef5/e46b2/new.webp 960w,
/static/78fb24d8c443b8c694eae9976dd27ef5/d7218/new.webp 1067w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/78fb24d8c443b8c694eae9976dd27ef5/09b79/new.jpg 240w,
/static/78fb24d8c443b8c694eae9976dd27ef5/7cc5e/new.jpg 480w,
/static/78fb24d8c443b8c694eae9976dd27ef5/6a068/new.jpg 960w,
/static/78fb24d8c443b8c694eae9976dd27ef5/914ed/new.jpg 1067w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/78fb24d8c443b8c694eae9976dd27ef5/6a068/new.jpg&quot;
            alt=&quot;Designs for the laser cutter, from left to right: a circular base plate with snow characters. A foldable box cutout and a tree shape&quot;
            title=&quot;Designs for the laser cutter&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Designs for the laser cutter&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;so-what-now-&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#so-what-now-&quot; aria-label=&quot;so what now  permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;So what now ?&lt;/h2&gt;
&lt;p&gt;Well… now I have to actually laser cut the pieces and assemble the tree. If we haven’t made any mistakes (or I conveniently forget to mention them to you guys) I should be able to put out another blog this weekend showing you guys both the laser cutting and a test build of the TekTree.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Making things]]></title><description><![CDATA[The creation process of a Raspberry PI based "game console" and its controllers]]></description><link>https://www.rickvanlieshout.com/posts/2015/making-things/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2015/making-things/</guid><pubDate>Sat, 17 Oct 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Even though this week has been extremely busy I wanted to bring you guys a little blog because the things I’ve been doing are truly wicked.&lt;/p&gt;
&lt;h2 id=&quot;special-assignment&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#special-assignment&quot; aria-label=&quot;special assignment permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Special assignment&lt;/h2&gt;
&lt;p&gt;Let’s start with the boring, non maker, stuff. Around 1 pm I received a frantic phone call and a couple of messages from different people about “something”. When I finally got around to dealing with them I discovered something truly awesome.&lt;/p&gt;
&lt;p&gt;As some of you know, next semester I will be working on a (school issued) project. This usually involves a group of 4-5 students working on a single big task for about 8 weeks. This time however it will be slightly different, me and 4 other students have been asked to work on a different project than all the other students. Turns out we have been recommended by our teachers and this company, of which we do not know the name yet, has decided to give it a go.&lt;/p&gt;
&lt;p&gt;We do not yet know what this special assignment will entail but one thing we know for sure. WE ARE EXCITED ABOUT IT !&lt;/p&gt;
&lt;h2 id=&quot;maker-thingies&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#maker-thingies&quot; aria-label=&quot;maker thingies permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Maker thingies&lt;/h2&gt;
&lt;p&gt;Even though I love software development, deep down I am also still a maker. And a maker likes to “make” things (go figure…), so when I got asked to do a project involving a Raspberry Pi I couldn’t refuse. Even though I had no idea what exactly the project was going to entail I enlisted anyways.&lt;/p&gt;
&lt;p&gt;Soon after I had my first meeting with the team and the supervisor, and before long the goal of the project became clear. We were responsible for designing a workshop involving the Raspberry Pi for kids between the age of 12 and 18 years(middle school basically). One of the things we have to do is compare the Raspberry Pi to several other educational boards. This is especially important because schools don’t tend to get anywhere near sufficient resources to even teach programming / IT related stuff, let alone spend their money on fun stuff like a Raspberry pi.&lt;/p&gt;
&lt;p&gt;So we came up with “pong”. We are going to create simple controllers (based on potentiometers) and some kind of Raspberry Pi hat to which we can connect them. Besides pong we also speculated about creating our own Raspberry Pi image. I quickly pointed out however that maintaining an image shouldn’t be high on our priority lists and that we might have to think about a different way to solve this problem. What we eventually decided upon was an “Install” script which can be run by either the teacher or some kind of maintainer which will install all dependencies and some example sketches.&lt;/p&gt;
&lt;h2 id=&quot;the-code&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-code&quot; aria-label=&quot;the code permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The code&lt;/h2&gt;
&lt;p&gt;Throughout the entire project we will be using a &lt;a href=&quot;https://github.com/Mastermindzh/han4pi&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;github repo&lt;/a&gt; to sync changes. One of the benefits of a github repo, apart from the actual git stuff, is that we automatically share all our code / designs. This means that anyone who is interested can either reproduce or follow along with us.&lt;/p&gt;
&lt;h2 id=&quot;enough-talking-show-us-something&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#enough-talking-show-us-something&quot; aria-label=&quot;enough talking show us something permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Enough talking, show us something&lt;/h2&gt;
&lt;p&gt;Well alright then, we’ve got a couple of things “ready” to show others. The first of which are the design schematics of our controllers and our “hubs”.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 953px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 88.75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAIAAADUsmlHAAAACXBIWXMAAA7DAAAOwwHHb6hkAAADaklEQVR42m1TTWwbRRTeIpG21wYOSBwSDqFwQKII8SNxqHoCcaigHCuhUkrpgeYEqlRERImUqpBCBQgspBYnaXCpItMmpS1WII6S7Hr9E2ezdp34p7uOkyaN7V3vZr0zb3aXtzY0SHT07Zs38943b/a9Nxwwh1JGSQOo9gDMh86I3pKawwg4rm0ZtllvmnXSNMFxKGMc8zynWS/noqVMSs2l1Gyqkk2XFmN5iS9IfF6KLc9P59I8ZZ6uzBi5cCM7Zq0mkeWTq7WaUpifm/1LkorFkrq0oqaUO/fqDc2gdZPqlmNRIsejmxqhRLfN+8zWGFjMdfEu3DsDB556a/dzx554+UjXS+89+ezJxw70vhAZv7qxnJ+6eT2RjCWnJn779ftZMZWW59OybG5ZdtNqWiZQwj1/at/ewb2dh/bsPNGx83DHjsPci5/vi2fjpFa/dWVI4IXfL18auhK4dnNCmOXFRKqqJMvx0Wrmmnc/zr3+yRv7f9jf+Vrnrrd3dbzbseP4I6/2v5JaXthUVyZGhqXk3NUbl3v7PgyFf86XFhckyaivMUOFhkqNNe7pT3u497nuM91dR7t6Purp7u/qH/1CVu9YG5vB774+evzgcHBg+sbI2OiFEx8fuhgOArjUdanjgwsJwZNjvaFwaHDo/ODIlxdun/txMlBYLXqeN3L9F+5R7tvhgLFujk/d4nZzp8/34b5NbGBAATjXdT3Xc1x/RokgDhAG6JSr5E8H+hbVLOortdXPfjozkxFQJwD/1Bk1G7BNGAXmS8aY42LnoBnrga6oEPA3UUeByzZ88oNFG02bGOYW1tCqlrTKgrUug7kOwGoVubIsVssLgL2IpzusRcYgLWBkPFtR1Oj0tP9j9+K2EmGVSUcvMABpanR+Mqgmw2BugOPhcei/HRnvj5xI5M+zZ89Vymv5vFIqrRQK5UKxvGXUjWLEuvsHUSJgrgFenj0scnQuGgxdigsxURBi/Jwo8GJM0DTNxRdibQKCNoG5bX/uvwnAvGfyd6MJOZ1IxFsDJ1T1hoE26mfRfXjCCPMjj/O3vxkL8DE+kUiIooh8/HS94WBXYIUY8/F/sk0pko+cOrbnmcdnUsKSvJSRsplFH4ZpYtnov7Rtcru2iDZ54OJXb35wcKNRRaNt26Q1KGx3wTaA/Q0G/4Tyr4Uf4wAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/cd8e5cf59be453837876732a5e608ae2/8ac56/fritzing_example.webp 240w,
/static/cd8e5cf59be453837876732a5e608ae2/d3be9/fritzing_example.webp 480w,
/static/cd8e5cf59be453837876732a5e608ae2/5bf28/fritzing_example.webp 953w&quot;
              sizes=&quot;(max-width: 953px) 100vw, 953px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/cd8e5cf59be453837876732a5e608ae2/8ff5a/fritzing_example.png 240w,
/static/cd8e5cf59be453837876732a5e608ae2/e85cb/fritzing_example.png 480w,
/static/cd8e5cf59be453837876732a5e608ae2/38124/fritzing_example.png 953w&quot;
            sizes=&quot;(max-width: 953px) 100vw, 953px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/cd8e5cf59be453837876732a5e608ae2/38124/fritzing_example.png&quot;
            alt=&quot;example of wiring diagram&quot;
            title=&quot;fritzing wiring diagram of the controller&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;fritzing wiring diagram of the controller&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;We quickly decided upon changing the hub design to a more elegant “hat” (hat being a board you can attach to the Raspberry Pi, not the fedora kind). A render of one such hats can be found below.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 454px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 87.91666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE/klEQVR42mWUy28bVRSH/U/AhhWLqrRN7PgRP+PEjhPbzatVQyCtQKhqqqokTV3HSRPHdj3jeb8847E9cfomYc+CDSzoAiSkbrqGBTalRQjSpE5pGjuee7gu7FgczZ17z/nOmXN+dywLy55iLhf8kiTHtilicpumzmxzzLktkftwSxI/3hKEmW0RmyR+tCXy/xk+Y+lzb31JHEORE9tdxtWUV7NcvXby0bXFEz/kUu7O9SunXqYWbM2bCefeasK+t7LYu7OadL3ILnv+yiy5d7DPzs0brp2VRSc+s+8uz9uaOGY3nXSiz+ff/24hYf/Rsr7W81Nm9aRJZtxtIutuM6SvRZPeVlEebz24N99imFCLZwZbIhfGFmoVCsE2QfjbPBVoUXlvm8Qx+Yyznb557Ci77vjZkss46jztA4ENmgLrh6IUAoYNQK12Hp48+RYe3PsEFCUEshxGmjoKqhoDXhgCgR8AHvvLfAhwQiQwfiDy3oYls26tU3kr0KTTZApODPYCw3hhQx+DrQefQVkNQ1mLIIYPmIo4gEQxADzvA5bxoDzhAIZ0AHnLhsjsScjn+hsWruCvS4wHZ/GZEq5Mk4ehVBqDSmkEqqVhuG2cBqMSR7w8ZJbUENLVIQz0I4HzIpJ0AlfAwJwVkTkMvOVuWM4n+upLOTfwlNNUhCCuKAq6Pg61yhjarMRNDEVaMXxULA6b+NmpaGFU1gZBkQKIZz2Ip13AFvpRAQPJvKdhsc++U7+02g8CZTd5xgVF/EmiPAC6EDnU6ZGXFSH2yhDjLw0pvr8hxJobSuyNURxul8RgRxF9IPF+UIQwYkgbkAQG+j99r34l7QaRduKhuDEQD0bBlZbHOkZ51LxTi8LdWgwMIwo87ievxYDOjD4XiOC+Kvlwf0+Dro6jIh7U/4GMG1TJD5oSRLoYPahK0WZVju1XZVyhHGtmiHBzbi14sJQaesbmg/ua7IdSMYr9Y0iTI0BTgYbFdeHd+txaP/CFPpOjXUjk8ICEANLEQVOXwu2SEuko8kinoo52SvJwJ0cHO2srA095Mtgsih4ovYVFsQJCQJH+huXikrO+lvfhykJmURpEqjKCZMEPd2rjsLE5ie7enkTVSsQ0jNPo4f1pdH9zDAwtiiQ+gPRSHA9nEK+DJpXv+XcohZyzLmLZcIXIIU9GDkpSrL1pTGEdnm1V1bOvNstnDr64NwP3N2c6m/r031V16nWtOmGW9SncovgbOh8+ENnQEUf1A0FgYWfTtl9Y/LJ+w7qfvOz4I5N0/mmUx0Fmhw6JlL9OrgSe1cpTrY3y2BG16nueTw40BGrgdTdpLuV4kZyz/55O9O13GRQx0MBXz1rnKCcQ2VNHhYzVpG7ZOpoSRUV8K2TWg8XuxlqMm5XSKFJ4jykyXlPivKauxRFD2MxuTD7dc8R2BU74fu3+HOrz831fLy4euyswvbCc+uDxSvrcwtKyV+YZBxQI22+Z/MT6cnp0mSJszyXOAdeXbOxabnYplTz+mGd6YDFx/OH8vPWrTLrvqeVaovf7ucs9j7LpU4ci0wdEztqmyJHdAuFrqpIHRM7V4djRPZoK7Umcy9TwHpF1NVk6tkvketsCjsmme99cvHTim0TS/thyJelcoelYURDGBU6YoBVliquWZ2Vdn5YUdZrRtBnWMC7IXeuuVbyna9NStTord305YYqWhEmhy7iUtK/8A53hFenqRmy7AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/e0efd5bc6406cba9cd9970d6383122b5/8ac56/front-thumb.webp 240w,
/static/e0efd5bc6406cba9cd9970d6383122b5/44d9f/front-thumb.webp 454w&quot;
              sizes=&quot;(max-width: 454px) 100vw, 454px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/e0efd5bc6406cba9cd9970d6383122b5/8ff5a/front-thumb.png 240w,
/static/e0efd5bc6406cba9cd9970d6383122b5/b3c1d/front-thumb.png 454w&quot;
            sizes=&quot;(max-width: 454px) 100vw, 454px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/e0efd5bc6406cba9cd9970d6383122b5/b3c1d/front-thumb.png&quot;
            alt=&quot;rendering of the raspberry pi hat&quot;
            title=&quot;render of the raspberry pi hat&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;render of the raspberry pi hat&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;We also started working on the controllers. The final design will be compromised of a few “boxes” between which telephone wires run to connect them together. My fantastic soldering / glueing job on the inner workings of a controller and the laser cutted wooden box can be found below.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGQAAAQUAAAAAAAAAAAAAAAAAAAECAwQF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAazs5YgAr//EABsQAAEEAwAAAAAAAAAAAAAAAAIAAQMEEBET/9oACAEBAAEFAqwRlGQhy0gdPj//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAaEAEAAQUAAAAAAAAAAAAAAAABAgAREyAh/9oACAEBAAY/Aryj2lxg6//EABkQAQEBAAMAAAAAAAAAAAAAAAERADFBcf/aAAgBAQABPyEEFDPcNIYwuK7M0lZdwc7/2gAMAwEAAgADAAAAEIgP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGhABAQEBAAMAAAAAAAAAAAAAAREAMUFhcf/aAAgBAQABPxBvKkvMvIDbfTprD64MiFQfOa23W//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/2191fe7f391bc519fe78cf7ff82ddf35/8ac56/back.webp 240w,
/static/2191fe7f391bc519fe78cf7ff82ddf35/d3be9/back.webp 480w,
/static/2191fe7f391bc519fe78cf7ff82ddf35/e46b2/back.webp 960w,
/static/2191fe7f391bc519fe78cf7ff82ddf35/f992d/back.webp 1440w,
/static/2191fe7f391bc519fe78cf7ff82ddf35/882b9/back.webp 1920w,
/static/2191fe7f391bc519fe78cf7ff82ddf35/5a003/back.webp 2560w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/2191fe7f391bc519fe78cf7ff82ddf35/09b79/back.jpg 240w,
/static/2191fe7f391bc519fe78cf7ff82ddf35/7cc5e/back.jpg 480w,
/static/2191fe7f391bc519fe78cf7ff82ddf35/6a068/back.jpg 960w,
/static/2191fe7f391bc519fe78cf7ff82ddf35/644c5/back.jpg 1440w,
/static/2191fe7f391bc519fe78cf7ff82ddf35/0f98f/back.jpg 1920w,
/static/2191fe7f391bc519fe78cf7ff82ddf35/8ec0a/back.jpg 2560w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/2191fe7f391bc519fe78cf7ff82ddf35/6a068/back.jpg&quot;
            alt=&quot;back&quot;
            title=&quot;Back of the controller&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Back of the controller&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAIDBAX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAv/aAAwDAQACEAMQAAABkRKUVrih/8QAGRABAAMBAQAAAAAAAAAAAAAAAQADIQIy/9oACAEBAAEFAnAdl3mpXuf/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAXEAADAQAAAAAAAAAAAAAAAAABECAh/9oACAEBAAY/Ao0r/8QAGhABAQEBAAMAAAAAAAAAAAAAAQARITFBgf/aAAgBAQABPyHBZzWxPfds0KOQgR+z5v/aAAwDAQACAAMAAAAQPD//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPxCH/8QAHBABAAICAwEAAAAAAAAAAAAAAQARITEQQXGB/9oACAEBAAE/EAR4GNDDTaqG/kpHZIyIwuEF0rri/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/aa5261c5c905fb62a403513a96ab3cb8/8ac56/bottom.webp 240w,
/static/aa5261c5c905fb62a403513a96ab3cb8/d3be9/bottom.webp 480w,
/static/aa5261c5c905fb62a403513a96ab3cb8/e46b2/bottom.webp 960w,
/static/aa5261c5c905fb62a403513a96ab3cb8/f992d/bottom.webp 1440w,
/static/aa5261c5c905fb62a403513a96ab3cb8/882b9/bottom.webp 1920w,
/static/aa5261c5c905fb62a403513a96ab3cb8/5a003/bottom.webp 2560w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/aa5261c5c905fb62a403513a96ab3cb8/09b79/bottom.jpg 240w,
/static/aa5261c5c905fb62a403513a96ab3cb8/7cc5e/bottom.jpg 480w,
/static/aa5261c5c905fb62a403513a96ab3cb8/6a068/bottom.jpg 960w,
/static/aa5261c5c905fb62a403513a96ab3cb8/644c5/bottom.jpg 1440w,
/static/aa5261c5c905fb62a403513a96ab3cb8/0f98f/bottom.jpg 1920w,
/static/aa5261c5c905fb62a403513a96ab3cb8/8ec0a/bottom.jpg 2560w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/aa5261c5c905fb62a403513a96ab3cb8/6a068/bottom.jpg&quot;
            alt=&quot;bottom&quot;
            title=&quot;bottom of the controller&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;bottom of the controller&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 48.75000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIDAQT/xAAVAQEBAAAAAAAAAAAAAAAAAAABAP/aAAwDAQACEAMQAAABg3O8xNA//8QAHBAAAQMFAAAAAAAAAAAAAAAAAQACMgMREiJC/9oACAEBAAEFAtQnWwDQR3Vi2P8A/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQMBAT8Bqv/EABYRAQEBAAAAAAAAAAAAAAAAAAARAf/aAAgBAgEBPwGJj//EABgQAAIDAAAAAAAAAAAAAAAAAAABEBEx/9oACAEBAAY/AkMypR//xAAbEAADAQADAQAAAAAAAAAAAAAAARExIUFhof/aAAgBAQABPyGtR68grUVULyvBvLpmp8B//9oADAMBAAIAAwAAABCQP//EABcRAQEBAQAAAAAAAAAAAAAAAAEAESH/2gAIAQMBAT8QE8tX/8QAFhEBAQEAAAAAAAAAAAAAAAAAARAh/9oACAECAQE/EAbL/8QAHRABAAICAgMAAAAAAAAAAAAAAQARIUExUWGBkf/aAAgBAQABPxBxK949MeMsUfEPtjsyqeVFXqfeTCb/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/1fe778ffd5b30095a97ad2c662817a85/8ac56/controller_pot.webp 240w,
/static/1fe778ffd5b30095a97ad2c662817a85/d3be9/controller_pot.webp 480w,
/static/1fe778ffd5b30095a97ad2c662817a85/e46b2/controller_pot.webp 960w,
/static/1fe778ffd5b30095a97ad2c662817a85/f992d/controller_pot.webp 1440w,
/static/1fe778ffd5b30095a97ad2c662817a85/2911a/controller_pot.webp 1864w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/1fe778ffd5b30095a97ad2c662817a85/09b79/controller_pot.jpg 240w,
/static/1fe778ffd5b30095a97ad2c662817a85/7cc5e/controller_pot.jpg 480w,
/static/1fe778ffd5b30095a97ad2c662817a85/6a068/controller_pot.jpg 960w,
/static/1fe778ffd5b30095a97ad2c662817a85/644c5/controller_pot.jpg 1440w,
/static/1fe778ffd5b30095a97ad2c662817a85/69ede/controller_pot.jpg 1864w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/1fe778ffd5b30095a97ad2c662817a85/6a068/controller_pot.jpg&quot;
            alt=&quot;controller_pot&quot;
            title=&quot;potentiometer used inside the controller&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;potentiometer used inside the controller&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 454px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 87.91666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE/klEQVR42mWUy28bVRSH/U/AhhWLqrRN7PgRP+PEjhPbzatVQyCtQKhqqqokTV3HSRPHdj3jeb8847E9cfomYc+CDSzoAiSkbrqGBTalRQjSpE5pGjuee7gu7FgczZ17z/nOmXN+dywLy55iLhf8kiTHtilicpumzmxzzLktkftwSxI/3hKEmW0RmyR+tCXy/xk+Y+lzb31JHEORE9tdxtWUV7NcvXby0bXFEz/kUu7O9SunXqYWbM2bCefeasK+t7LYu7OadL3ILnv+yiy5d7DPzs0brp2VRSc+s+8uz9uaOGY3nXSiz+ff/24hYf/Rsr7W81Nm9aRJZtxtIutuM6SvRZPeVlEebz24N99imFCLZwZbIhfGFmoVCsE2QfjbPBVoUXlvm8Qx+Yyznb557Ci77vjZkss46jztA4ENmgLrh6IUAoYNQK12Hp48+RYe3PsEFCUEshxGmjoKqhoDXhgCgR8AHvvLfAhwQiQwfiDy3oYls26tU3kr0KTTZApODPYCw3hhQx+DrQefQVkNQ1mLIIYPmIo4gEQxADzvA5bxoDzhAIZ0AHnLhsjsScjn+hsWruCvS4wHZ/GZEq5Mk4ehVBqDSmkEqqVhuG2cBqMSR7w8ZJbUENLVIQz0I4HzIpJ0AlfAwJwVkTkMvOVuWM4n+upLOTfwlNNUhCCuKAq6Pg61yhjarMRNDEVaMXxULA6b+NmpaGFU1gZBkQKIZz2Ip13AFvpRAQPJvKdhsc++U7+02g8CZTd5xgVF/EmiPAC6EDnU6ZGXFSH2yhDjLw0pvr8hxJobSuyNURxul8RgRxF9IPF+UIQwYkgbkAQG+j99r34l7QaRduKhuDEQD0bBlZbHOkZ51LxTi8LdWgwMIwo87ievxYDOjD4XiOC+Kvlwf0+Dro6jIh7U/4GMG1TJD5oSRLoYPahK0WZVju1XZVyhHGtmiHBzbi14sJQaesbmg/ua7IdSMYr9Y0iTI0BTgYbFdeHd+txaP/CFPpOjXUjk8ICEANLEQVOXwu2SEuko8kinoo52SvJwJ0cHO2srA095Mtgsih4ovYVFsQJCQJH+huXikrO+lvfhykJmURpEqjKCZMEPd2rjsLE5ie7enkTVSsQ0jNPo4f1pdH9zDAwtiiQ+gPRSHA9nEK+DJpXv+XcohZyzLmLZcIXIIU9GDkpSrL1pTGEdnm1V1bOvNstnDr64NwP3N2c6m/r031V16nWtOmGW9SncovgbOh8+ENnQEUf1A0FgYWfTtl9Y/LJ+w7qfvOz4I5N0/mmUx0Fmhw6JlL9OrgSe1cpTrY3y2BG16nueTw40BGrgdTdpLuV4kZyz/55O9O13GRQx0MBXz1rnKCcQ2VNHhYzVpG7ZOpoSRUV8K2TWg8XuxlqMm5XSKFJ4jykyXlPivKauxRFD2MxuTD7dc8R2BU74fu3+HOrz831fLy4euyswvbCc+uDxSvrcwtKyV+YZBxQI22+Z/MT6cnp0mSJszyXOAdeXbOxabnYplTz+mGd6YDFx/OH8vPWrTLrvqeVaovf7ucs9j7LpU4ci0wdEztqmyJHdAuFrqpIHRM7V4djRPZoK7Umcy9TwHpF1NVk6tkvketsCjsmme99cvHTim0TS/thyJelcoelYURDGBU6YoBVliquWZ2Vdn5YUdZrRtBnWMC7IXeuuVbyna9NStTord305YYqWhEmhy7iUtK/8A53hFenqRmy7AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/e0efd5bc6406cba9cd9970d6383122b5/8ac56/front-thumb.webp 240w,
/static/e0efd5bc6406cba9cd9970d6383122b5/44d9f/front-thumb.webp 454w&quot;
              sizes=&quot;(max-width: 454px) 100vw, 454px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/e0efd5bc6406cba9cd9970d6383122b5/8ff5a/front-thumb.png 240w,
/static/e0efd5bc6406cba9cd9970d6383122b5/b3c1d/front-thumb.png 454w&quot;
            sizes=&quot;(max-width: 454px) 100vw, 454px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/e0efd5bc6406cba9cd9970d6383122b5/b3c1d/front-thumb.png&quot;
            alt=&quot;front&quot;
            title=&quot;The front of the controller with the logo&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;The front of the controller with the logo&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAIB/9oADAMBAAIQAxAAAAGF2nK3SQF//8QAGRAAAwEBAQAAAAAAAAAAAAAAAAECESES/9oACAEBAAEFAojnuhYR1p6af//EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAEDAQE/AQn/xAAXEQADAQAAAAAAAAAAAAAAAAABAhBB/9oACAECAQE/AWOT/8QAGxAAAgEFAAAAAAAAAAAAAAAAAAEQAiFBYnH/2gAIAQEABj8CTqNXF8IXY//EABsQAQEBAAIDAAAAAAAAAAAAAAERACExUWGB/9oACAEBAAE/IRofMWBIkfeUQcRu3KZkXrK87//aAAwDAQACAAMAAAAQKP8A/8QAFhEBAQEAAAAAAAAAAAAAAAAAARAh/9oACAEDAQE/ECdZ/8QAFhEAAwAAAAAAAAAAAAAAAAAAEBEh/9oACAECAQE/EEQP/8QAGxABAQEAAwEBAAAAAAAAAAAAAREAIUFRMWH/2gAIAQEAAT8QRXQEcAXt96wJS0GxfMM8AIYzEIHjMwdifP3TUOA7/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/0ab669746e8f1fa7a78b8a8e8772e617/8ac56/inside.webp 240w,
/static/0ab669746e8f1fa7a78b8a8e8772e617/d3be9/inside.webp 480w,
/static/0ab669746e8f1fa7a78b8a8e8772e617/e46b2/inside.webp 960w,
/static/0ab669746e8f1fa7a78b8a8e8772e617/f992d/inside.webp 1440w,
/static/0ab669746e8f1fa7a78b8a8e8772e617/882b9/inside.webp 1920w,
/static/0ab669746e8f1fa7a78b8a8e8772e617/5a003/inside.webp 2560w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/0ab669746e8f1fa7a78b8a8e8772e617/09b79/inside.jpg 240w,
/static/0ab669746e8f1fa7a78b8a8e8772e617/7cc5e/inside.jpg 480w,
/static/0ab669746e8f1fa7a78b8a8e8772e617/6a068/inside.jpg 960w,
/static/0ab669746e8f1fa7a78b8a8e8772e617/644c5/inside.jpg 1440w,
/static/0ab669746e8f1fa7a78b8a8e8772e617/0f98f/inside.jpg 1920w,
/static/0ab669746e8f1fa7a78b8a8e8772e617/8ec0a/inside.jpg 2560w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/0ab669746e8f1fa7a78b8a8e8772e617/6a068/inside.jpg&quot;
            alt=&quot;inside&quot;
            title=&quot;the inside of an assembled controller&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;the inside of an assembled controller&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQBAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAABAP/aAAwDAQACEAMQAAABScxrCXJE/8QAGRABAAIDAAAAAAAAAAAAAAAAAQACBBAT/9oACAEBAAEFAsQol+QSkdf/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAZEAEAAgMAAAAAAAAAAAAAAAABAAISICL/2gAIAQEABj8CtkCx5rr/AP/EABgQAQEBAQEAAAAAAAAAAAAAAAEAURBh/9oACAEBAAE/IcBUN5YgN6t//9oADAMBAAIAAwAAABATH//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABsQAQADAQEBAQAAAAAAAAAAAAEAETEhUUFx/9oACAEBAAE/EDATWDn2BKmmaLVcr1uKLSPk4VNmH8mp/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f148c4ab9de7695d1c119ea0a0cbe4c5/8ac56/left_side.webp 240w,
/static/f148c4ab9de7695d1c119ea0a0cbe4c5/d3be9/left_side.webp 480w,
/static/f148c4ab9de7695d1c119ea0a0cbe4c5/e46b2/left_side.webp 960w,
/static/f148c4ab9de7695d1c119ea0a0cbe4c5/f992d/left_side.webp 1440w,
/static/f148c4ab9de7695d1c119ea0a0cbe4c5/882b9/left_side.webp 1920w,
/static/f148c4ab9de7695d1c119ea0a0cbe4c5/5a003/left_side.webp 2560w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f148c4ab9de7695d1c119ea0a0cbe4c5/09b79/left_side.jpg 240w,
/static/f148c4ab9de7695d1c119ea0a0cbe4c5/7cc5e/left_side.jpg 480w,
/static/f148c4ab9de7695d1c119ea0a0cbe4c5/6a068/left_side.jpg 960w,
/static/f148c4ab9de7695d1c119ea0a0cbe4c5/644c5/left_side.jpg 1440w,
/static/f148c4ab9de7695d1c119ea0a0cbe4c5/0f98f/left_side.jpg 1920w,
/static/f148c4ab9de7695d1c119ea0a0cbe4c5/8ec0a/left_side.jpg 2560w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f148c4ab9de7695d1c119ea0a0cbe4c5/6a068/left_side.jpg&quot;
            alt=&quot;left_side&quot;
            title=&quot;The left side of the controller&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;The left side of the controller&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAQFAf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGVQlMQmaJ//8QAGRABAAMBAQAAAAAAAAAAAAAAAgADBDER/9oACAEBAAEFAs9ZsbzVk+QdXJ//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAaEAABBQEAAAAAAAAAAAAAAAABAAIRICEx/9oACAEBAAY/Aocjp5X/xAAbEAEAAgIDAAAAAAAAAAAAAAABABEQITFBUf/aAAgBAQABPyFgiAXqKewtcExoUaYns8e4/9oADAMBAAIAAwAAABBo/wD/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPxBX/8QAGhABAAIDAQAAAAAAAAAAAAAAAQARITFBgf/aAAgBAQABPxBX4QZKw42ILVkGsB9iIg6NMWxYwpUQvU//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/8efee1fbfd07a737e0d030d4adeff023/8ac56/right_side.webp 240w,
/static/8efee1fbfd07a737e0d030d4adeff023/d3be9/right_side.webp 480w,
/static/8efee1fbfd07a737e0d030d4adeff023/e46b2/right_side.webp 960w,
/static/8efee1fbfd07a737e0d030d4adeff023/f992d/right_side.webp 1440w,
/static/8efee1fbfd07a737e0d030d4adeff023/882b9/right_side.webp 1920w,
/static/8efee1fbfd07a737e0d030d4adeff023/5a003/right_side.webp 2560w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/8efee1fbfd07a737e0d030d4adeff023/09b79/right_side.jpg 240w,
/static/8efee1fbfd07a737e0d030d4adeff023/7cc5e/right_side.jpg 480w,
/static/8efee1fbfd07a737e0d030d4adeff023/6a068/right_side.jpg 960w,
/static/8efee1fbfd07a737e0d030d4adeff023/644c5/right_side.jpg 1440w,
/static/8efee1fbfd07a737e0d030d4adeff023/0f98f/right_side.jpg 1920w,
/static/8efee1fbfd07a737e0d030d4adeff023/8ec0a/right_side.jpg 2560w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/8efee1fbfd07a737e0d030d4adeff023/6a068/right_side.jpg&quot;
            alt=&quot;right_side&quot;
            title=&quot;The right side of the controller&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;The right side of the controller&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUCBP/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGbQm6jhFf/xAAaEAACAgMAAAAAAAAAAAAAAAABAgADBBEj/9oACAEBAAEFAsVdvYnOKSivdYRP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGxAAAQQDAAAAAAAAAAAAAAAAAAECECERMnH/2gAIAQEABj8CXg6oy2jaP//EABkQAQEAAwEAAAAAAAAAAAAAAAERABAhQf/aAAgBAQABPyErCzBPJY+aBLS9yAVG+a//2gAMAwEAAgADAAAAELcP/8QAFREBAQAAAAAAAAAAAAAAAAAAEDH/2gAIAQMBAT8Qh//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAECAQE/EKf/xAAbEAEAAwEAAwAAAAAAAAAAAAABABEhMUGBkf/aAAgBAQABPxBDAeQs1hDVioLHsVoMI2z3FLyBKafI9n//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/29b6f481c52c6f0e478f50b5db9f5ad0/8ac56/top.webp 240w,
/static/29b6f481c52c6f0e478f50b5db9f5ad0/d3be9/top.webp 480w,
/static/29b6f481c52c6f0e478f50b5db9f5ad0/e46b2/top.webp 960w,
/static/29b6f481c52c6f0e478f50b5db9f5ad0/f992d/top.webp 1440w,
/static/29b6f481c52c6f0e478f50b5db9f5ad0/882b9/top.webp 1920w,
/static/29b6f481c52c6f0e478f50b5db9f5ad0/5a003/top.webp 2560w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/29b6f481c52c6f0e478f50b5db9f5ad0/09b79/top.jpg 240w,
/static/29b6f481c52c6f0e478f50b5db9f5ad0/7cc5e/top.jpg 480w,
/static/29b6f481c52c6f0e478f50b5db9f5ad0/6a068/top.jpg 960w,
/static/29b6f481c52c6f0e478f50b5db9f5ad0/644c5/top.jpg 1440w,
/static/29b6f481c52c6f0e478f50b5db9f5ad0/0f98f/top.jpg 1920w,
/static/29b6f481c52c6f0e478f50b5db9f5ad0/8ec0a/top.jpg 2560w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/29b6f481c52c6f0e478f50b5db9f5ad0/6a068/top.jpg&quot;
            alt=&quot;top&quot;
            title=&quot;The top of the controller&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;The top of the controller&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-laser-cutting-process&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-laser-cutting-process&quot; aria-label=&quot;the laser cutting process permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The laser cutting process&lt;/h2&gt;
&lt;p&gt;For those interested in the laser cutting process I have also prepared a video:&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;div class=&quot;video-container&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/OO6UDl8CU4s?wmode=transparent&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt;&lt;/div&gt; &lt;/div&gt;
&lt;h2 id=&quot;the-end&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-end&quot; aria-label=&quot;the end permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The end&lt;/h2&gt;
&lt;p&gt;Well that’s all for today folks, I’ll keep you updated!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[I got a new thing !!!! ~ Raspberry pi 7" official touchscreen]]></title><description><![CDATA[A look at the new official raspberry pi touchscreen]]></description><link>https://www.rickvanlieshout.com/posts/2015/raspberry-pi-screen/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2015/raspberry-pi-screen/</guid><pubDate>Fri, 25 Sep 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hey guys, as some of you know I was really, and I mean &lt;strong&gt;really&lt;/strong&gt;, excited when they announced the official raspberry pi screen. Now why is that might you ask? Everything the raspberry pi people have released so far has been really solid. The boards, the sd cards, the wifi-dongle, all of them work absolutely fantastic! So as soon as I saw that the official screen was available for pre-order in the UK I ordered myself one and started waiting.&lt;/p&gt;
&lt;h2 id=&quot;whats-in-the-box&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-in-the-box&quot; aria-label=&quot;whats in the box permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What’s in the box?&lt;/h2&gt;
&lt;p&gt;First up is the box itself:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 700px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAgX/xAAVAQEBAAAAAAAAAAAAAAAAAAACAf/aAAwDAQACEAMQAAABS3k5LoLgT//EABkQAAMBAQEAAAAAAAAAAAAAAAECAxIAIf/aAAgBAQABBQKSjKop54ENo60eh7L/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAwEBPwGI/8QAFREBAQAAAAAAAAAAAAAAAAAAABL/2gAIAQIBAT8BW//EABoQAAICAwAAAAAAAAAAAAAAAAABESEDEjH/2gAIAQEABj8CnUh40VY7OsR//8QAGxABAAICAwAAAAAAAAAAAAAAAQARIVExYfH/2gAIAQEAAT8hes+rIo0D1FQERpLc7nrRKXLP/9oADAMBAAIAAwAAABDQH//EABYRAQEBAAAAAAAAAAAAAAAAAAEAEf/aAAgBAwEBPxAGWW//xAAXEQEBAQEAAAAAAAAAAAAAAAABABEx/9oACAECAQE/EDkocv/EAB4QAQACAQQDAAAAAAAAAAAAAAEAESExUWFxkaHB/9oACAEBAAE/EGEK4FisBHRLPF9s1c5HbiEMZfAgjf8ARFJchb2z/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/c82e0f022811b8fe014c15d1c9114fd9/8ac56/box.webp 240w,
/static/c82e0f022811b8fe014c15d1c9114fd9/d3be9/box.webp 480w,
/static/c82e0f022811b8fe014c15d1c9114fd9/426ac/box.webp 700w&quot;
              sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/c82e0f022811b8fe014c15d1c9114fd9/09b79/box.jpg 240w,
/static/c82e0f022811b8fe014c15d1c9114fd9/7cc5e/box.jpg 480w,
/static/c82e0f022811b8fe014c15d1c9114fd9/29d31/box.jpg 700w&quot;
            sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/c82e0f022811b8fe014c15d1c9114fd9/29d31/box.jpg&quot;
            alt=&quot;picture of the official Raspberry Pi 7&amp;quot; touchscreen display&quot;
            title=&quot;picture of the official Raspberry Pi 7&amp;quot; touchscreen display&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;picture of the official Raspberry Pi 7&amp;quot; touchscreen display&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The box resembles the original packaging from a standalone raspberry pi which is a nice little touch. The picture on the box does not however resemble the pi screen at all which I personally kinda like but it could possibly be seen as false advertisement.&lt;/p&gt;
&lt;p&gt;As soon as I opened the box I found a little booklet which contained some health and safety regulations. I have not taken a picture of the booklet because… well it’s a booklet…&lt;/p&gt;
&lt;p&gt;Lifting the first bit of red foam reveals yet another piece of red foam in which several electronic bits are embedded. I did take a picture this time:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 700px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAIBAwT/xAAWAQEBAQAAAAAAAAAAAAAAAAAEAgP/2gAMAwEAAhADEAAAAc6wuSlLij//xAAaEAACAgMAAAAAAAAAAAAAAAAAAgEREiEy/9oACAEBAAEFAqwTY9W/REH/xAAXEQEBAQEAAAAAAAAAAAAAAAABACEx/9oACAEDAQE/AQwnt//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABgQAAMBAQAAAAAAAAAAAAAAAAABIQIg/9oACAEBAAY/AllFLx//xAAaEAADAAMBAAAAAAAAAAAAAAAAAREhMUGB/9oACAEBAAE/IVRHqiq0N31rhn4REKayj//aAAwDAQACAAMAAAAQ+C//xAAWEQEBAQAAAAAAAAAAAAAAAAAAIQH/2gAIAQMBAT8QsM0//8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERIf/aAAgBAgEBPxBvSn//xAAeEAEAAwABBQEAAAAAAAAAAAABABEhcTFBUWGRwf/aAAgBAQABPxAMqJ+1ZkIlZ4uDsKhsde35ACu0R8IIUhXEy400cT//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/6db821e4a629c612aa554c0299e9e06a/8ac56/pcb.webp 240w,
/static/6db821e4a629c612aa554c0299e9e06a/d3be9/pcb.webp 480w,
/static/6db821e4a629c612aa554c0299e9e06a/426ac/pcb.webp 700w&quot;
              sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/6db821e4a629c612aa554c0299e9e06a/09b79/pcb.jpg 240w,
/static/6db821e4a629c612aa554c0299e9e06a/7cc5e/pcb.jpg 480w,
/static/6db821e4a629c612aa554c0299e9e06a/29d31/pcb.jpg 700w&quot;
            sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/6db821e4a629c612aa554c0299e9e06a/29d31/pcb.jpg&quot;
            alt=&quot;a picture of the box the screen is in. It has red foam with the components packed neatly inside&quot;
            title=&quot;neatly packed pcb and accessories&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;neatly packed pcb and accessories&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;From top left to bottom right we’ve got:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;4 silver stand-offs&lt;/li&gt;
&lt;li&gt;The logic board for both touch and display&lt;/li&gt;
&lt;li&gt;Flat ribbon cable to connect the logic board to the pi&lt;/li&gt;
&lt;li&gt;4 cables to (optionally) connect the pi to the logic board. (more on this later)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After carefully extracting all the components I yanked out the red foam and found what I was really looking for. The official pi screen nicely protected in bubble wrap (the &lt;strong&gt;only&lt;/strong&gt; way a display should be packaged).&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 700px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAQL/xAAWAQEBAQAAAAAAAAAAAAAAAAADAAL/2gAMAwEAAhADEAAAAcmpTheBpH//xAAaEAACAwEBAAAAAAAAAAAAAAAAAQIDERMy/9oACAEBAAEFArHzHKRPNs9NCP/EABYRAQEBAAAAAAAAAAAAAAAAABEBEP/aAAgBAwEBPwEhn//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/Aar/xAAbEAABBAMAAAAAAAAAAAAAAAACAAERICExQf/aAAgBAQAGPwIQHjLamHzT/8QAGBABAQEBAQAAAAAAAAAAAAAAAQAhEVH/2gAIAQEAAT8hQIQhBqu/bB3C3vyBJvL/2gAMAwEAAgADAAAAEDMP/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAR/9oACAEDAQE/EDIsl//EABYRAQEBAAAAAAAAAAAAAAAAABEAAf/aAAgBAgEBPxBMMv/EABoQAQEBAQADAAAAAAAAAAAAAAERACExQeH/2gAIAQEAAT8QIyMU964XOxdBUQqw/ebyeuNCJcCRYcN//9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/eb3983a91b288d677800ea1e5f90a869/8ac56/screen.webp 240w,
/static/eb3983a91b288d677800ea1e5f90a869/d3be9/screen.webp 480w,
/static/eb3983a91b288d677800ea1e5f90a869/426ac/screen.webp 700w&quot;
              sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/eb3983a91b288d677800ea1e5f90a869/09b79/screen.jpg 240w,
/static/eb3983a91b288d677800ea1e5f90a869/7cc5e/screen.jpg 480w,
/static/eb3983a91b288d677800ea1e5f90a869/29d31/screen.jpg 700w&quot;
            sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/eb3983a91b288d677800ea1e5f90a869/29d31/screen.jpg&quot;
            alt=&quot;[picture of the screen in bubble wrap]&quot;
            title=&quot;finally! A screen.&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;finally! A screen.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;After emptying the box I laid out all the pieces and checked whether my set was complete. (it was) In the picture below you’ll see all the contents of the original raspberry pi 7” touchscreen laying next to a raspberry pi B v2. Looking good so far !&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 700px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAwX/xAAWAQEBAQAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAY3znHvimdf/xAAbEAADAAIDAAAAAAAAAAAAAAABAgMABBIhM//aAAgBAQABBQJ58SUdVn3PYYihds1/D//EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAEDAQE/AWf/xAAWEQADAAAAAAAAAAAAAAAAAAABEDH/2gAIAQIBAT8BEX//xAAaEAADAQADAAAAAAAAAAAAAAAAAQIhEjJh/9oACAEBAAY/ApnGU+ZL8MZ2ekH/xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhMVGh/9oACAEBAAE/IUCUV1PZrRRwvJTsWIEEMIVa9Gz4J//aAAwDAQACAAMAAAAQ/wA//8QAFhEBAQEAAAAAAAAAAAAAAAAAAAFR/9oACAEDAQE/ENJX/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAh/9oACAECAQE/ENiTb//EABwQAQEAAgIDAAAAAAAAAAAAAAERACExcUFh8P/aAAgBAQABPxBYgDoVEvWDIi64j1vWW+KhebMHyWg+a4bw6Ct95uz9rn//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f36ce227fe5cbcf595e2d6964240e4cb/8ac56/layedout.webp 240w,
/static/f36ce227fe5cbcf595e2d6964240e4cb/d3be9/layedout.webp 480w,
/static/f36ce227fe5cbcf595e2d6964240e4cb/426ac/layedout.webp 700w&quot;
              sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f36ce227fe5cbcf595e2d6964240e4cb/09b79/layedout.jpg 240w,
/static/f36ce227fe5cbcf595e2d6964240e4cb/7cc5e/layedout.jpg 480w,
/static/f36ce227fe5cbcf595e2d6964240e4cb/29d31/layedout.jpg 700w&quot;
            sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f36ce227fe5cbcf595e2d6964240e4cb/29d31/layedout.jpg&quot;
            alt=&quot;a picture of all the components layed out on a mat&quot;
            title=&quot;all components inside the box&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;all components inside the box&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Assembly was easy and straightforward. The only thing I struggled with was the stand-offs. The stand-offs connect the board directly to the metal back of the screen, something which would fry an ordinary pc motherboard. Instead of monkeying around (like usual) I decided to seek guidance and googled a bit. Being one of the early adopters comes at a price though. There was hardly any information on the screen, let alone assembly instructions. I’m sure that by the time I upload this post there is plenty of information about this particular subject but in case you are interested. Yes. You &lt;strong&gt;do&lt;/strong&gt; screw the pi directly into the back of the screen with the included standoff screws.&lt;/p&gt;
&lt;h2 id=&quot;my-case&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#my-case&quot; aria-label=&quot;my case permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;My case&lt;/h2&gt;
&lt;p&gt;I bought my pi at Pimoroni and I ordered the case/stand there as well. The exact case I ordered is &lt;a href=&quot;https://shop.pimoroni.com/products/raspberry-pi-7-touchscreen-display-frame&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;here&lt;/a&gt;. The case is a laser cut layer based case. This means the individual parts of the case are actually flimsy but all bolted together it forms a nice solid block. After applying the case to my screen it looked like this:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 700px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMFAQL/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABnOdLl04KP//EABoQAAICAwAAAAAAAAAAAAAAAAECAxEABDL/2gAIAQEAAQUCdVDTRrEDV73bEkjP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFhEBAQEAAAAAAAAAAAAAAAAAARAR/9oACAECAQE/AR0n/8QAGRAAAgMBAAAAAAAAAAAAAAAAASEAAhBB/9oACAEBAAY/AjxxWJysZz//xAAbEAADAAIDAAAAAAAAAAAAAAAAAREhUTFBcf/aAAgBAQABPyFDR6NCtYbkMiCqncapmA/WcD//2gAMAwEAAgADAAAAEDzP/8QAFxEBAAMAAAAAAAAAAAAAAAAAARARIf/aAAgBAwEBPxBK2P/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAECAQE/EJB//8QAHRABAQABBAMAAAAAAAAAAAAAAREAECExgUFRsf/aAAgBAQABPxBViAXyV46zeFxSE2vjAKYWT1myfaEEn3Kpvmo6H//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/6b4baaef353b5510efe3dd76d924a156/8ac56/backcase.webp 240w,
/static/6b4baaef353b5510efe3dd76d924a156/d3be9/backcase.webp 480w,
/static/6b4baaef353b5510efe3dd76d924a156/426ac/backcase.webp 700w&quot;
              sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/6b4baaef353b5510efe3dd76d924a156/09b79/backcase.jpg 240w,
/static/6b4baaef353b5510efe3dd76d924a156/7cc5e/backcase.jpg 480w,
/static/6b4baaef353b5510efe3dd76d924a156/29d31/backcase.jpg 700w&quot;
            sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/6b4baaef353b5510efe3dd76d924a156/29d31/backcase.jpg&quot;
            alt=&quot;&amp;quot;picture of the previously described case&amp;quot;&quot;
            title=&quot;fully assembled and ready to hold the screen!&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;fully assembled and ready to hold the screen!&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;As you can see there is plenty of room for the logic board and the flat cable is dangling freely. One fun thing to note are those plastic screws (which over tighten and break easily, hence why they included a spare screw).&lt;/p&gt;
&lt;h2 id=&quot;attaching-the-pi&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#attaching-the-pi&quot; aria-label=&quot;attaching the pi permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Attaching the pi&lt;/h2&gt;
&lt;p&gt;The pi itself is connected to the logic board by screwing it onto the stand-offs. Quick tip: connect both ribbon cables before you connect the pi! After attaching the pi I ended up with the following result:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 700px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQD/2gAMAwEAAhADEAAAAea1WQQNif/EABwQAAIBBQEAAAAAAAAAAAAAAAECEQADEhMiMf/aAAgBAQABBQKyQG2oxde0E1iJPv8A/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAHRAAAQQCAwAAAAAAAAAAAAAAAQACERIQMSFBcf/aAAgBAQAGPwIWaCIUOJqdwjTlvRTfFrH/xAAZEAEBAAMBAAAAAAAAAAAAAAABABEhQVH/2gAIAQEAAT8hREu4zgSuI2Ox2LAmp4kTK//aAAwDAQACAAMAAAAQtO//xAAWEQEBAQAAAAAAAAAAAAAAAAABEBH/2gAIAQMBAT8QTZ//xAAWEQADAAAAAAAAAAAAAAAAAAABEDH/2gAIAQIBAT8QNX//xAAaEAEBAQEBAQEAAAAAAAAAAAABEQAhUWGR/9oACAEBAAE/EKmnCgyn7Y5PyoumXydmOURgIj10Z0ICfXcPpjEEDf/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/b4305ffd0917bf985e14c55c78b5c289/8ac56/backpi.webp 240w,
/static/b4305ffd0917bf985e14c55c78b5c289/d3be9/backpi.webp 480w,
/static/b4305ffd0917bf985e14c55c78b5c289/426ac/backpi.webp 700w&quot;
              sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/b4305ffd0917bf985e14c55c78b5c289/09b79/backpi.jpg 240w,
/static/b4305ffd0917bf985e14c55c78b5c289/7cc5e/backpi.jpg 480w,
/static/b4305ffd0917bf985e14c55c78b5c289/29d31/backpi.jpg 700w&quot;
            sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/b4305ffd0917bf985e14c55c78b5c289/29d31/backpi.jpg&quot;
            alt=&quot;&amp;quot;A picture of the pi bolted to the screen assembly&amp;quot;&quot;
            title=&quot;don&amp;#39;t mind the wires!&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;don&amp;#39;t mind the wires!&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The red and black cables provide power (and ground) to the pi from the logic board. This means that you can power the entire thing (pi + screen) with a single micro USB cable. Neat for those that don’t have a spare micro USB cable. You could also connect the pi with an ordinary micro USB cable to the logic board since it has a USB port. Connecting the pi separately might be required to use some high power GPIO peripherals.&lt;/p&gt;
&lt;h2 id=&quot;booting-it-up&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#booting-it-up&quot; aria-label=&quot;booting it up permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Booting it up&lt;/h2&gt;
&lt;p&gt;The moment had arrived, I plugged the pi into a battery pack (creating a makeshift tablet-like device) and waited. First boot wasn’t all that promising… Touch didn’t work and I had an annoying little square in the top right. This was however not my first rodeo with a pi and I quickly worked out that the little square indicates insufficient input power. I did a quick update and after rebooting touch worked wonders! The only thing my makeshift tablet test was missing was some sort of input method for the keyboard. For this I used a program called “matchbox”, which was available in the default repository. After playing around with touch for a bit I switched to a solid 2 amp power supply and the little, coloured square disappeared, as suspected.&lt;/p&gt;
&lt;h2 id=&quot;thats-nice-and-all-but-we-want-a-video&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#thats-nice-and-all-but-we-want-a-video&quot; aria-label=&quot;thats nice and all but we want a video permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;That’s nice and all… But we want a video&lt;/h2&gt;
&lt;p&gt;Of course I prepared a little video, wouldn’t be a showcase if I hadn’t now would it. So here goes:&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 41.964285714285715%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;div class=&quot;video-container&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/tSR9aql7HCY?wmode=transparent&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt;&lt;/div&gt; &lt;/div&gt;
&lt;h2 id=&quot;in-closing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#in-closing&quot; aria-label=&quot;in closing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;In closing&lt;/h2&gt;
&lt;p&gt;So, conclusion time. I really like the pi screen, I have been using it for a while now (hence the delayed release of this blog.) and it hasn’t failed me yet. The screen is solid and bright enough for my use case and the touch works wonders. The price point is a little high (88 euro’s) but I suspect the price to go down quite a bit when it becomes available in stores in the Netherlands. That’s it for today’s blog and I’ll see you all later !&lt;/p&gt;</content:encoded></item><item><title><![CDATA[What I've been doing]]></title><description><![CDATA[A brief update of what I've been up to lately ]]></description><link>https://www.rickvanlieshout.com/posts/2015/what-ive-been-doing/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2015/what-ive-been-doing/</guid><pubDate>Fri, 11 Sep 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;my-goals&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#my-goals&quot; aria-label=&quot;my goals permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;My goals&lt;/h2&gt;
&lt;p&gt;Last blog we talked about a couple of goals I set for myself. As usual, not all of these have been completed. But instead of focusing on the ones I didn’t complete I’ll focus on the ones I did.&lt;/p&gt;
&lt;h3 id=&quot;finish-separating-my-websites&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#finish-separating-my-websites&quot; aria-label=&quot;finish separating my websites permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Finish separating my websites&lt;/h3&gt;
&lt;p&gt;I’m almost done with this goal. The content has been separated but the new portfolio isn’t up yet. I hope to be uploading the new portfolio at the same time as this blog but I can’t be sure of that. I can start uploading the portfolio as soon as I have finished updating a couple of “projects” under the school category. After that the portfolio will be filled with recent work and fully functional. (and quite possibly even pretty).&lt;/p&gt;
&lt;h3 id=&quot;clean-all-my-servers-both-soft-and-hardware&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#clean-all-my-servers-both-soft-and-hardware&quot; aria-label=&quot;clean all my servers both soft and hardware permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Clean all my servers (both soft and hardware)&lt;/h3&gt;
&lt;p&gt;I went above and beyond on this one. I even cleaned my regular pc (soft + hard) and my laptop (soft only). Cleaning my regular (dev) pc wasn’t by choice however. A lightning strike wiped out some electrical stuff and one of the things that got fried was my motherboard. While replacing my motherboard I decided to clean the entire pc since it was open already. After installing a new motherboard I had thought I would have to reinstall Windows. This however was not the case! Windows 8 and Windows 10 both successfully booted after changing my motherboard! This is the first time I have seen any Windows version do that and I was happy to see they’ve improved. I still decided to wipe the system however and replace the ssd Windows was on. A couple of days later I also wiped the linux sdd and replaced that with my old Windows ssd (which was purchased later and thus much faster).&lt;/p&gt;
&lt;p&gt;As far as servers go… I have cleaned them too ! Not only have I cleaned all my servers I have also cleaned up both my Dropbox and my Google Drive folders.&lt;/p&gt;
&lt;h3 id=&quot;finish-my-portfolio&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#finish-my-portfolio&quot; aria-label=&quot;finish my portfolio permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Finish my portfolio&lt;/h3&gt;
&lt;p&gt;I kinda made this goal… kinda. Hear me out on this one ! When I wrote my last blog post I had an idea in mind for the portfolio. There was already a sorting mechanism in place and things didn’t look half bad either. However… I decided to change things around and use a different sorting mechanism (mixitup) and also revamped the look of the portfolio. /images/videos are now the first thing you’ll get to see and they will be as wide as the page itself. (some videos , like app showcases, will have black borders though). Directly beneath the media content is the customer and designer information and below that you’ll find a short detailed summary for each aspect of the project. So I decided to chalk this one up as a success because I’ve done more work than I had originally anticipated :).&lt;/p&gt;
&lt;h3 id=&quot;the-other-goals&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-other-goals&quot; aria-label=&quot;the other goals permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The other goals&lt;/h3&gt;
&lt;p&gt;Only a few of the goals I had set I haven’t reached. I have given up on losing weight and because of the extra portfolio work I didn’t really start LSR either. 5 new tutorials is a detable goal. I haven’t exactly written 5 tutorials but I have done some work on mi-soft.nl (and still wrote 2 tutorials). And 1 blogpost… well I’m trying !&lt;/p&gt;
&lt;h2 id=&quot;losing-some-of-my-stuff&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#losing-some-of-my-stuff&quot; aria-label=&quot;losing some of my stuff permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Losing some of my stuff&lt;/h2&gt;
&lt;p&gt;As I mentioned before I have lost some of my hardware to a lightning strike. I didn’t just lose my motherboard however. I also lost my microphone (blue snowball), my keyboard (razer blackwidow), my xbox controller receiver, 8gb’s of ram and some random usb peripherals. Some of the stuff was insured and thus I have gotten some money for it. However I did not simply want to replace the lost stuff, I wanted to upgrade too.&lt;/p&gt;
&lt;p&gt;I upgraded my keyboard to a ducky shine with black cherry mx switches. I have to say I’m still getting used to the linear-ness of the switches but so far so good. The big upgrade however is my recording setup. I went from having a single blue snowball to a blue yeti with shock mount, pop filter and boom arm. Initial tests prove to be very promising and there is a definite upgrade in sound quality. Aside from sounding a bit better it looks A LOT better. It almost look’s pro! Here, have a look:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 176.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAjABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUGBAH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABozdBnio7RLl8nsaFnldtEsniX//EAB4QAQABBAIDAAAAAAAAAAAAAAECAAMREgQQEzJE/9oACAEBAAEFAr0pb5w7Xuvrp5A22b5Dl2gCjNLrVj2AxpGT/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwFf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwFf/8QAHRAAAgICAwEAAAAAAAAAAAAAAAEQIQIREiIxgv/aAAgBAQAGPwJaEkysY+4rLsct36LeU2odDbR//8QAHxABAAMAAgIDAQAAAAAAAAAAAQARIUFREDFhccHw/9oACAEBAAE/IQGEAd7hsMsg10V8544H83wrWMVDM+zhzDJFrWpZ6Flj3LFa/cJqLel11Num/wAn/9oADAMBAAIAAwAAABCU4fAAD//EABcRAAMBAAAAAAAAAAAAAAAAAAABEBH/2gAIAQMBAT8QU2MR/8QAGBEAAwEBAAAAAAAAAAAAAAAAAAEQETH/2gAIAQIBAT8QmRcGf//EAB4QAQEAAgICAwAAAAAAAAAAAAERACExcRBRQZGx/9oACAEBAAE/EEKkaUoj+4TJybsvXGN0QwRgwqIgeBpCOCNEuDXRBjXTvA+snyGbyndm9Zokj1vBW7lqIfWca3THBdsxkcwBamo9Z//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/0f82e6cd598caf83333d9ae9cb92b593/8ac56/mic1.webp 240w,
/static/0f82e6cd598caf83333d9ae9cb92b593/d3be9/mic1.webp 480w,
/static/0f82e6cd598caf83333d9ae9cb92b593/e46b2/mic1.webp 960w,
/static/0f82e6cd598caf83333d9ae9cb92b593/f992d/mic1.webp 1440w,
/static/0f82e6cd598caf83333d9ae9cb92b593/7afe4/mic1.webp 1520w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/0f82e6cd598caf83333d9ae9cb92b593/09b79/mic1.jpg 240w,
/static/0f82e6cd598caf83333d9ae9cb92b593/7cc5e/mic1.jpg 480w,
/static/0f82e6cd598caf83333d9ae9cb92b593/6a068/mic1.jpg 960w,
/static/0f82e6cd598caf83333d9ae9cb92b593/644c5/mic1.jpg 1440w,
/static/0f82e6cd598caf83333d9ae9cb92b593/6ed34/mic1.jpg 1520w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/0f82e6cd598caf83333d9ae9cb92b593/6a068/mic1.jpg&quot;
            alt=&quot;picture of the new blue yeti on a mic arm&quot;
            title=&quot;Looking spiffy!&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Looking spiffy!&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAG7JRRSck//xAAdEAACAgEFAAAAAAAAAAAAAAAAAwECBBESEyEx/9oACAEBAAEFAr5S9l26nMYkRI7pnp//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAbEAABBQEBAAAAAAAAAAAAAAARAAEQIUECEv/aAAgBAQAGPwLlyTjL0BF4qj//xAAaEAEBAQADAQAAAAAAAAAAAAABEQAhMUFh/9oACAEBAAE/IZRWHUH1cDivZlVF8Zy6c5BKnu//2gAMAwEAAgADAAAAEJD/AP/EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPxCNf//EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/EGf/xAAdEAEAAwEAAgMAAAAAAAAAAAABABEhQTFRYXGB/9oACAEBAAE/ED6ADW0i0/sOpgrg5369QDaPhuQYb1bmxG18tVlq3AMWpwqf/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/72affc8003be86041d17b083be9c7226/8ac56/mic2.webp 240w,
/static/72affc8003be86041d17b083be9c7226/d3be9/mic2.webp 480w,
/static/72affc8003be86041d17b083be9c7226/e46b2/mic2.webp 960w,
/static/72affc8003be86041d17b083be9c7226/f992d/mic2.webp 1440w,
/static/72affc8003be86041d17b083be9c7226/882b9/mic2.webp 1920w,
/static/72affc8003be86041d17b083be9c7226/58c0b/mic2.webp 2688w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/72affc8003be86041d17b083be9c7226/09b79/mic2.jpg 240w,
/static/72affc8003be86041d17b083be9c7226/7cc5e/mic2.jpg 480w,
/static/72affc8003be86041d17b083be9c7226/6a068/mic2.jpg 960w,
/static/72affc8003be86041d17b083be9c7226/644c5/mic2.jpg 1440w,
/static/72affc8003be86041d17b083be9c7226/0f98f/mic2.jpg 1920w,
/static/72affc8003be86041d17b083be9c7226/03c3e/mic2.jpg 2688w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/72affc8003be86041d17b083be9c7226/6a068/mic2.jpg&quot;
            alt=&quot;picture of the new blue yeti on a mic arm&quot;
            title=&quot;Don&amp;#39;t mind the mess, it&amp;#39;s the mic we&amp;#39;re looking at&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Don&amp;#39;t mind the mess, it&amp;#39;s the mic we&amp;#39;re looking at&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;youtube-channel-split--new-intros-and-outros&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#youtube-channel-split--new-intros-and-outros&quot; aria-label=&quot;youtube channel split  new intros and outros permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Youtube channel split + new intros and outros&lt;/h2&gt;
&lt;p&gt;Mi-Soft.nl and Rick van Lieshout are now 2 separate Youtube channels. Mi-Soft.nl will only be used to host tutorials. Nothing else. My personal channel (Rick van Lieshout) will host all other things.&lt;/p&gt;
&lt;p&gt;I have designed a new outro for all of the Mi-Soft.nl video’s. I made the outro with “Camtasia studio” and “Gimp”. The outro can be found here:&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;div class=&quot;video-container&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/mysCUZzfeC4?wmode=transparent&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt;&lt;/div&gt; &lt;/div&gt;
&lt;p&gt;I also bought some intro’s from Flixpress. Both of these can be found here:&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;div class=&quot;video-container&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/AZZ86IPX9QQ?wmode=transparent&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt;&lt;/div&gt; &lt;/div&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;div class=&quot;video-container&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/WT5EC6UKoHQ?wmode=transparent&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt;&lt;/div&gt; &lt;/div&gt;</content:encoded></item><item><title><![CDATA[New look, new comments, new everything!]]></title><description><![CDATA[In this blog post I describe my plans for the upcoming vacation.]]></description><link>https://www.rickvanlieshout.com/posts/2015/new-look-new-comments-new-everything/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2015/new-look-new-comments-new-everything/</guid><pubDate>Tue, 16 Jun 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;separating-the-personal-stuff&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#separating-the-personal-stuff&quot; aria-label=&quot;separating the personal stuff permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Separating the personal stuff&lt;/h2&gt;
&lt;p&gt;First off, it’s been a while… I know. ☺&lt;/p&gt;
&lt;p&gt;I’m trying to separate &lt;a href=&quot;https://mi-soft.nl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;mi-soft.nl&lt;/a&gt; and myself, yet keep them together somehow. I have removed almost all personal content from &lt;a href=&quot;https://mi-soft.nl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;mi-soft.nl&lt;/a&gt; and am currently busy moving it to this “personal website”. The end goal is to have them completely separate apart from the “software” tab. Software that I want to reveal to the public (more so than some scripts I use myself) will still be uploaded to &lt;a href=&quot;https://mi-soft.nl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;mi-soft.nl&lt;/a&gt; and more personal projects (like &lt;a href=&quot;https://github.com/Mastermindzh/Scripts/blob/master/java/CSVtoDatabase.java&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;CSVtoDatabase&lt;/a&gt;) on my &lt;a href=&quot;https://github.com/Mastermindzh/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In order to “keep the sites together” I have given this site the exact same look as &lt;a href=&quot;https://mi-soft.nl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;mi-soft.nl&lt;/a&gt; except for the colours. I have also made a little system that allows users to switch the website’s language. Everything apart from the blog will be Multilingual. Doing all these upgrades however also means upgrading Disqus, which meant losing all my comments. While sad, I feel like it had to be done.&lt;/p&gt;
&lt;h2 id=&quot;replacing-the-about-me-page-on-mi-softnl&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#replacing-the-about-me-page-on-mi-softnl&quot; aria-label=&quot;replacing the about me page on mi softnl permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Replacing the “about me” page on &lt;a href=&quot;https://mi-soft.nl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;mi-soft.nl&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I will be replacing the about me page on &lt;a href=&quot;https://mi-soft.nl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;mi-soft.nl&lt;/a&gt; with a “Linux software review” (LSR for short) section. LSR will consist of short video’s (in Dutch) promoting Linux software.&lt;/p&gt;
&lt;h2 id=&quot;another-maker-project&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#another-maker-project&quot; aria-label=&quot;another maker project permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Another maker project&lt;/h2&gt;
&lt;p&gt;I am currently gathering materials and setting up the software for another cool maker project. It is going to include both the arduino and the raspberry pi. But that is pretty much all the information I want to disclose right now.&lt;/p&gt;
&lt;h2 id=&quot;school&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#school&quot; aria-label=&quot;school permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;School&lt;/h2&gt;
&lt;p&gt;I have only 2 days of school left this year, (and maybe a ceremony) which means an increase in productivity (hopefully). There are a couple of things I want to do before school starts again:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lose 20+ pounds&lt;/li&gt;
&lt;li&gt;Finish separating my websites&lt;/li&gt;
&lt;li&gt;Clean all my servers (both soft and hardware)&lt;/li&gt;
&lt;li&gt;Finish my portfolio (in both Dutch and English)&lt;/li&gt;
&lt;li&gt;Get started with LSR&lt;/li&gt;
&lt;li&gt;Write at least 5 new tutorials on &lt;a href=&quot;https://mi-soft.nl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;mi-soft.nl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Write at least 2 new blogs. (not counting this one)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let’s hope I can get all my planned projects done and then some.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A status update]]></title><link>https://www.rickvanlieshout.com/posts/2014/a-status-update/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2014/a-status-update/</guid><pubDate>Sun, 16 Nov 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;school&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#school&quot; aria-label=&quot;school permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;School&lt;/h2&gt;
&lt;p&gt;In my last blog post I mentioned that I was busy with schoolwork (and all related matters like friends &amp;#x26; gaming). That all changed yesterday, I decided not to game as much anymore and focus on something exciting again. I have no idea what kind of exciting thing I’m going to focus myself on, but most likely it will be either Arduino or Raspberry PI (cluster / solo).&lt;/p&gt;
&lt;p&gt;Some more great news! We were able to collect 15 points (out of 60 in a year) during this first semester. And I got them all. The most difficult test for me was of course the Dutch language test. Which I barely passed. One of the other “harder” tests was a subject called “UML”, and as some of you might know… I hate, most of, UML.&lt;/p&gt;
&lt;p&gt;A new semester has started this week and we’ve already had a taste of what is to come. Sadly what is to come isn’t all that Linux friendly. They have opted to use MsSQL instead of the (much better) MySQL(MariaDB) / PostgeSQL. This means that I, and another classmate, have to install virtualbox with Windows on our laptops. Shouldn’t be a big problem should it? Well no it shouldn’t. But me trying to be smart resulted in me downloading a “stripped down / light” version of Windows. (as if there is such a thing ! ha!) After setting up Windows, and installing office (since we’ll be using Access (another YUK!) I tried installing MsSQL. Turns out however that one of the stripped features was powershell, and for some inexplicable reason MsSQL will &lt;strong&gt;not&lt;/strong&gt; install without powershell. To make matters worse Microsoft decided that they wouldn’t offer an install package through the website anymore since powershell is built-in in the newer versions of Windows. So I had to resort to giving up almost 30GB of hard drive space just to install MsSQL… (and I will probably end up using MySQL anyways)&lt;/p&gt;
&lt;h2 id=&quot;numix-icon-theme-square&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#numix-icon-theme-square&quot; aria-label=&quot;numix icon theme square permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Numix-icon-theme-square&lt;/h2&gt;
&lt;p&gt;Last night a friend of mine tried installing the Numix square theme, something that usually doesn’t require my help. Last night however my friend did need some help because the theme just would &lt;strong&gt;NOT&lt;/strong&gt; install correctly. (kept throwing a GPG key error) So after trying to install an older package (which I did not know he removed from his system) I finally decided to google the matter. Turns out the “Square” theme’s actually cost money (who knew?). Turns out that Antergos Linux has some sort of a license to use them but general Linux does not.&lt;/p&gt;
&lt;p&gt;That is why the team behind Numix has requested the package to be removed from the aur. And their request was granted. (as it should have been). Last night however we didn’t have the tools handy to be able to make a purchase of the Icon theme, so I sent him my version and he installed that instead. I will however buy a license from them today, since I use the icon theme on pretty much all my machines.&lt;/p&gt;
&lt;h2 id=&quot;arduino-sneak-peak&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#arduino-sneak-peak&quot; aria-label=&quot;arduino sneak peak permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Arduino sneak peak&lt;/h2&gt;
&lt;p&gt;I acquired some new toys for the arduino, two of them being the “Adafruit mini 8x8 LED matrix”. To use them I had to install 2 libraries, and with those came “Example sketches”. One of those example sketches was a “Robotic eye”, naturally with me having 2 new toys I decided to create a little “face” (just eyes) with the prebuilt sketches. Anyways I thought that looked cool so I made a photo which you can view below:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 700px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 53.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAADB0lEQVR42i2Se0yURxTF5/v2g0XWGECDQlGqiawo0WhUwKiRasS0TfzDJ9X4iC9ILJZulw0PITx2l2XpQki3CIivmBgexmiDaU18BB9NCFVRS0VrW5Oif9AmhWDZBdlfr9RJTubOmXvPmbkzylZi5XBpIjObDVYUxPDVuflkdVrIemJQ1jmXvdei2Xc9EsfF2Rw9NRtLgULlK2a26hjlOqpCY365Isemk2+Xvc9rP2C/PZoPHZGYjyuO+JM42B7L9p9M5P06iyVXpxDXanCoM5Y9l6LZ2BZOVIuG0aZh/UGR0m0wo9HElC8VK3NE0OlK50BpLBE7FdoxSarT2XwpjG1dYVgeKfSHCtNdxdb7Ojn3DPbf0Ym9ZsLSPZXEvhkk/GJmU6/i0y5F2tlJwfUcr04j6QsLKk8EmsRdnKf16ziGsukInKc12Mya1yks+FmxUExWDaTSM36DZ+M9fDtcy6yeKD6+osg7p6Hcngzc9auxn7CyrMHA3C4u4ugdrQCCTIRGIRTkz1Af6YMrSX4dxQBPJvnAxN+SM8Z3gXYstwyW+qW2yrOWyrpUSpoXYWuPY911xZzfoviD51IUYDz0hmBomHfD88ZF3GAEw6Hn/DMxwN2x7/n97WOGQq9Y8DCB+JMi6PNm4q2XU7akU9axEFvXNDa/jKQv1D0pcnhkB85/HZNx5UgR6qWiYdRLgL9YPGTl/FiTXP82ETfNzKkXQZdrHZU1q6nwr6DobDKFnfFs65EXe5XC04kHOMeKOf3Wz9VgBxH94ah70udejZzBAzSM+Kgb9mC9n4RqFN4uPfRWbaKqZr1cexWuljScbYs5dCUG02XFvAdzyXqxhU+eZTL9xxiU9Fc/rRF+Juz/+LL8wwsy+3Q0m4a2S07oL8/EV7YWV9kyan2pfO1fSkFjPAk1kuyTr/Su0d9IUZWsSyUuFhQKXygCRRq6Q/iDwm0RbBBU53+EuzADZ8kaqt0ZlHvSsLsXsdubyLxiM6Y8Hf2YIFfDJAjLFbFsKdwj+Eyw9b3QckGy4j928unpbCQcggAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/cc9b5a429c60db1d515b5dd5f2d77b8b/8ac56/face.webp 240w,
/static/cc9b5a429c60db1d515b5dd5f2d77b8b/d3be9/face.webp 480w,
/static/cc9b5a429c60db1d515b5dd5f2d77b8b/426ac/face.webp 700w&quot;
              sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/cc9b5a429c60db1d515b5dd5f2d77b8b/8ff5a/face.png 240w,
/static/cc9b5a429c60db1d515b5dd5f2d77b8b/e85cb/face.png 480w,
/static/cc9b5a429c60db1d515b5dd5f2d77b8b/8c557/face.png 700w&quot;
            sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/cc9b5a429c60db1d515b5dd5f2d77b8b/8c557/face.png&quot;
            alt=&quot;&amp;quot;two led matrices with green lights illustrating eyes&amp;quot;&quot;
            title=&quot;Google eyes... but matrix style&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Google eyes... but matrix style&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Me, my blog, and projects.]]></title><description><![CDATA[A little update blog]]></description><link>https://www.rickvanlieshout.com/posts/2014/me-my-blog-and-projects/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2014/me-my-blog-and-projects/</guid><pubDate>Tue, 21 Oct 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;the-blog&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-blog&quot; aria-label=&quot;the blog permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The blog&lt;/h2&gt;
&lt;p&gt;So, I’ve already gone past my weekly schedule. Which tends to happen every time… I’m not giving up on the blog though ! I’ve just been far too busy. Busy with what you ask? well… college.
Now surely the first period shouldn’t be that hard for someone who can code reasonably well already You’d be right in thinking that, but.. that’s not the only part of college, college also means new friends. New friends mean gaming. So yeah I’ve been gaming a bunch. Sorry.&lt;/p&gt;
&lt;h2 id=&quot;projects&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#projects&quot; aria-label=&quot;projects permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Projects&lt;/h2&gt;
&lt;p&gt;For now I’m putting off some of the projects I had originally planned. I simply can’t find the time to write detailed blog posts on them and I don’t want to disappoint you guys with half-baked posts.&lt;/p&gt;
&lt;p&gt;I did start a new “project”, meaning I ordered 2 of the most beautiful computers on the planet. Yes, I bought 2 iMac G4’s . Even though I don’t like Mac os, or the designs Apple is currently pushing out, I do really like these older Mac’s. I’ve ordered 2 of them from the internet, the seller is currently looking for a box to send them both in since they are pretty big and heavy. I can only wait and hope they will arrive in good condition.&lt;/p&gt;
&lt;p&gt;So I hope you guys appreciate this little update and can forgive my absence. Have a nice day!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Shellshock and why you shouldn't get your panties in a bunch.]]></title><description><![CDATA[In today's blog I share my opinion on shellshock and why I think you shouldn't get your panties in a bunch! hah!]]></description><link>https://www.rickvanlieshout.com/posts/2014/shellshock-why-you-shouldnt-get-your-panties-in-a-bunch/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2014/shellshock-why-you-shouldnt-get-your-panties-in-a-bunch/</guid><pubDate>Sat, 27 Sep 2014 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;On September 24 2014, A Bash vulnerability, known as “Shellshock” was disclosed. This “bug” allows an attacker to run code on your machine, which is bad, very bad.&lt;/p&gt;
&lt;figure class=&quot;float-right&quot; style=&quot;width: 420px&quot;&gt;
 &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 400px; &quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 37.5%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAACN0lEQVR42i2O3UuTYRiH3/+g/6KDPiAoAvtwto+c2zs3TbfXTbc1N3VuurIoDSsyl0YgIZtOV1M3UydKglEWnRQUkQfSQUmgRY0UU1Sig1h7d/WqPXDzPPd13c+PWxjqH+RhrJfUo1GS6SnS6UmmkkmG4gMMxGKMJQaJ9MUYHuhjRGH98QRpxU8kU8yOp5T3CDOjI7yYTpFMJBBarVoksw6j5hRul4uWOj8X7NUE3OdpqXUTbnZhMNtotNu401xLmeSkulLCaSqjwyXhd9QQsJTTE7LgqRQR5lqNXLOqOXn8CB69Bq9oxqt88CpD9pIiOmsLsZWqsOlVNFk1HC5QodUWU2USaVYCtPpSrBod7UETRlGHMBEw45eMOCwl1J0t4ooCb0si0UYzPrtIm0+vbKbjek0RoXorKiXsxBkNdZUK9xiVYANh5Y7edHDLX44Q8VcQbtCQailmNFDKZb2aq6cPMN5UQFA8xrmCg1w07Ke9/BBVBjVOZzVBj4VYqIIejw6XKDLcITF+TyTVakC43+bjaaSBJ11eZnpv8HH+DVF3Ia+mIqTbTUzGo8Q6mqg/uo8H3Z1kMl+JX3LuuuleH+/fzrP84RlzXWqmw40Is8NdvH46xmpmmaXFT0CWuWSI9bUVfq5myCvk19YGiXCQ71+W2DkLLx/zfKybze2t3f7P7y1m7zpYXHiHsL2xxvbm+q7I5/NK5djc+EHub26PybLCZOS8/N/vlbxnkXe8nGPl22ey2Sz/AAp7qTh4uw88AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source srcset=&quot;/static/29e039b889dffca39de413a95490187d/8ac56/hackzors.webp 240w,
/static/29e039b889dffca39de413a95490187d/7f61c/hackzors.webp 400w&quot; sizes=&quot;(max-width: 400px) 100vw, 400px&quot; type=&quot;image/webp&quot;&gt;
          &lt;source srcset=&quot;/static/29e039b889dffca39de413a95490187d/8ff5a/hackzors.png 240w,
/static/29e039b889dffca39de413a95490187d/e17e5/hackzors.png 400w&quot; sizes=&quot;(max-width: 400px) 100vw, 400px&quot; type=&quot;image/png&quot;&gt;
          &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/29e039b889dffca39de413a95490187d/e17e5/hackzors.png&quot; alt=&quot;terminal with shellshock exploit&quot; title=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
&lt;/figure&gt;
&lt;p&gt;Now then, what exactly is “Shellshock”. Shellshock is a “bug” (or vulnerability) that can be used to remotely run code on someone’s machine by altering an environment variable. The real danger however lies in programs that can alter these variables without requiring root. Thus enabling anyone with access to your computer to run commands.
Imagine someone attacking you twice, the first time they’ll create a user and the second time they’ll set a password for the user. After that they can just log in to your system and destroy the entire thing, or worse still, monitor your every move.
Some examples of the services which can alter environment variables without root privileges are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenSSH (which 90% of all Linux distros use)*&lt;/li&gt;
&lt;li&gt;DHCP clients&lt;/li&gt;
&lt;li&gt;Apache servers with CGI scripts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;when-are-you-vulnerable&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#when-are-you-vulnerable&quot; aria-label=&quot;when are you vulnerable permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;When are you vulnerable?&lt;/h2&gt;
&lt;p&gt;This seems to be a point many news sites forget about. When exactly are you vulnerable and how worried should you be. The thing is, in order for you to be vulnerable you’d have to have one of two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A server which is open to the world (web,vps, etc.)&lt;/li&gt;
&lt;li&gt;An intruder in your network.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most people won’t have either one of those things. And to be fair, if you can’t trust the people on your own network you’ve got far bigger problems than “Shellshock”. Unless of course you’re using a whole lot of “free-wifi” services, in which case you really don’t know who is on the network.&lt;/p&gt;
&lt;p&gt;I’d imagine the number of people having a “server” , or simply a computer which is accessible from outside your home network is way higher. So if you are one of those people, please patch your bash to avoid any trouble. ( I too like to have an easy way to log into my server from anywhere (work / family / vacation) and thus I would be vulnerable.)&lt;/p&gt;
&lt;h2 id=&quot;how-to-test-whether-youre-vulnerable&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-to-test-whether-youre-vulnerable&quot; aria-label=&quot;how to test whether youre vulnerable permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to test whether you’re vulnerable&lt;/h2&gt;
&lt;p&gt;Testing whether you’re vulnerable is quite easy. You can just use this “attack” on yourself with an “echo” command (which won’t cause any harm). If it works, you’re vulnerable. If it doesn’t you’re not.
Here’s how to construct a test command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;env&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;() { :;}; echo vulnerable&apos;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;echo hello&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you’re &lt;strong&gt;not&lt;/strong&gt; vulnerable you’ll get:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;bash: warning: x: ignoring &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; definition attempt bash: error importing &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; definition &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; `x&apos; hello&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You might also simply get “hello”.
If you &lt;strong&gt;are&lt;/strong&gt; vulnerable however you’ll get:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;vulnerable hello&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;how-to-patch-your-system&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-to-patch-your-system&quot; aria-label=&quot;how to patch your system permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to patch your system&lt;/h2&gt;
&lt;p&gt;By now most distributions have updated their repo to include the patched version of bash. If that is the case you can simply do a regular update:&lt;/p&gt;
&lt;h3 id=&quot;ubuntu--re-spins&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ubuntu--re-spins&quot; aria-label=&quot;ubuntu  re spins permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ubuntu / re-spins&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; update &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; upgrade&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;arch--re-spins&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#arch--re-spins&quot; aria-label=&quot;arch  re spins permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Arch / re-spins&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; pacman &lt;span class=&quot;token parameter variable&quot;&gt;-Syu&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If however you’re using a mac you’ll have to do it by hand. Since Apple hasn’t yet released an update nor commented on the matter. Instructions for a mac can be found &lt;a href=&quot;https://mac-how-to.wonderhowto.com/how-to/every-mac-is-vulnerable-shellshock-bash-exploit-heres-patch-os-x-0157606/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;in-summary&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#in-summary&quot; aria-label=&quot;in summary permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;In summary&lt;/h2&gt;
&lt;p&gt;So should you worry? Yes and no. If your computer (/server) is exposed to an outside network you should absolutely worry. If it’s not however you are relatively safe. Still, patching is a simple and fast process, so just patch it and get on with your life !&lt;/p&gt;
&lt;h2 id=&quot;documentation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#documentation&quot; aria-label=&quot;documentation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Documentation&lt;/h2&gt;
&lt;p&gt;For those of you who like to research this “Shellshock” vulnerability some more, here are 2 entries in the NVD: &lt;a href=&quot;https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;CVE-2014-6271&lt;/a&gt; &amp;#x26; &lt;a href=&quot;https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-7169&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;CVE-2014-7169&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you want to see Shellshock in action I recommend watching the following video from Quidsup:&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 41.964285714285715%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;//www.youtube.com/embed/UllSNdgGLbo&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;</content:encoded></item><item><title><![CDATA[The pi cluster, home automation & kickstarter monitoring]]></title><description><![CDATA[Today's blog is about home automation.]]></description><link>https://www.rickvanlieshout.com/posts/2014/using-the-cluster-for-home-automation/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2014/using-the-cluster-for-home-automation/</guid><pubDate>Sat, 27 Sep 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Some of you might be wondering “why doesn’t he write more blogs about the cluster?” and I wouldn’t blame you. I have a pretty good reason for not blogging about the pi cluster (even though I promised sample code). That reason is “home automation”. As some of you might know I’m big into home automation, and have done quite a bit already. But it’s always fun to try something different!&lt;/p&gt;
&lt;p&gt;I usually use single or double relay boards which you can control with an arduino or a Raspberry pi. This time however I ordered an 8 relay board instead of a double relay board. I got the board from China at a store called “Sainsmart”, here’s the link to the exact board I got: &lt;a href=&quot;https://www.sainsmart.com/products/8-channel-5v-relay-module&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.sainsmart.com/products/8-channel-5v-relay-module&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So what does that have to do with the cluster you ask? Well, I used to have a Raspberry pi to experiment with… But I used that in the cluster to save some money. (here I was, thinking to be smart!) So I had to “disassemble”(taking the top off) the cluster to connect the relay board. In the next blog-post I’ll have a couple of pictures showing off the relay board and the pi cluster.&lt;/p&gt;
&lt;h2 id=&quot;i-donated-a-pi&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#i-donated-a-pi&quot; aria-label=&quot;i donated a pi permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;I donated a pi&lt;/h2&gt;
&lt;p&gt;While talking on IRC with a friend&lt;a href=&quot;https://baldnerd.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;(Robbie Ferguson)&lt;/a&gt; of mine I discovered that he had never used a Raspberry pi before. And to make matters worse he told me he had lost interest in them now. When I asked why he never got one he told me the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When they were new I couldn’t get one here in Canada, and now it’s been so long that I’ve lost interest.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;While discussing the fact he jokingly told me, if you’ll send me one I’ll try it out. A small problem arose though, me sending a pi to Canada would cost way more than actually buying one over there. So we decided that I’d just send him the money and he would order his own. I can’t wait to see what he does with it.
If you guys are interested in seeing what he does with it too you can check out &lt;a href=&quot;https://category5.tv/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Category5.tv&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What Robbie doesn’t know is that I wanted to do something for the show / him anyways. I was originally planning on just donating $20, but giving him the joy that comes from owning a Raspberry pi seemed like a way better plan! Besides, he’s been working really really hard on the new Studio D so he deserves some fun!&lt;/p&gt;
&lt;h2 id=&quot;kickstarter-monitoring&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#kickstarter-monitoring&quot; aria-label=&quot;kickstarter monitoring permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kickstarter monitoring&lt;/h2&gt;
&lt;p&gt;I have once more decided to back a certain Kickstarter campaign and find myself checking the website &lt;strong&gt;a lot&lt;/strong&gt;. I plan to change this by creating a little script (don’t know which language yet) that will check it for me and report back. More info about this project to come.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Raspberry pi cluster step 5: Expanding the cluster]]></title><description><![CDATA[Today's blog post will be about expanding the cluster with more nodes.]]></description><link>https://www.rickvanlieshout.com/posts/2014/pi-cluster-5-expanding-the-cluster/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2014/pi-cluster-5-expanding-the-cluster/</guid><pubDate>Fri, 19 Sep 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In today’s post we’ll have a look at expanding the cluster with more nodes! We will have a look at how to clone them and how we can set up a universal login using ssh keys.&lt;/p&gt;
&lt;p&gt;Windows users can use the “read” option of the previously installed &lt;code class=&quot;language-text&quot;&gt;win32imager&lt;/code&gt; to create an img.&lt;/p&gt;
&lt;h2 id=&quot;linux&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#linux&quot; aria-label=&quot;linux permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Linux&lt;/h2&gt;
&lt;p&gt;Insert the tested and configured SD card and use lsblk to find out on which /dev/ the SD card resides. Now use dd to make an img of your Raspberry pi master node (note! this can be used as a backup too) with the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;dd&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/path/to/sd/card &lt;span class=&quot;token assign-left variable&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/home/&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;whoami&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;/raspy.img&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After running that command you will have an image of the configured Raspberry pi in your home folder. You will now have to write this image to all SD cards.&lt;/p&gt;
&lt;p&gt;After writing all the images to the SD cards you have to change the hostname on all “copies”. To do this put the SD card into one of the pi’s, let it boot , and log in. Then give it the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; raspi-config&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Next, you’ll have to change the ip on each of the nodes by changing the “address” line after executing the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /etc/network/interfaces&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After setting up all 4 pi’s and plugging it all in you should see all 4 led’s light up on the pi’s. If this is not the case you might’ve forgotten to change either the ip address or the hostname. (which will lead to a conflict resulting in one of them not having internet access). Mine now looks like this (note the dramatic night picture taken at 10 past 12 am):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./media/pidark.jpg&quot; alt=&quot;picture of 4 Raspberry pi&amp;#x27;s stacked on a network switch serving as a cluster&quot; title=&quot;It&amp;#x27;s not quite RGB but it&amp;#x27;s beautiful!&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;logging-in-to-the-nodes-with-ssh-keys&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#logging-in-to-the-nodes-with-ssh-keys&quot; aria-label=&quot;logging in to the nodes with ssh keys permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Logging in to the nodes with ssh keys&lt;/h2&gt;
&lt;p&gt;To make working with the cluster &lt;strong&gt;a lot&lt;/strong&gt; easier we will use ssh keys to login in place of the old password. We are going to generate the master node’s key first, to do this enter the following command.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh-keygen &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; rsa  &lt;span class=&quot;token parameter variable&quot;&gt;-C&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pi@raspberrypi0&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You’ll be asked where you want to save the key, the default directory is usually fine. After that you will be asked to enter a passphrase. (the passphrase is optional but also recommended in a production environment) After generating the key a “randomart” image will appear. After generating the key you want to execute the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; ~/.ssh/id_rsa.pub &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; pi@192.168.1.8 &lt;span class=&quot;token string&quot;&gt;&quot;mkdir .ssh;cat &gt;&gt; .ssh/authorized_keys&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Keep in mind you might have to change the ip address in the previous command. After executing this command for the 2nd node, repeat for the third,fourth,fifth, etc., etc. nodes.&lt;/p&gt;
&lt;p&gt;After we have copied the key to all nodes we have to edit the previously created machine file (on master) to include all the ip addresses of the other pi’s. To do this type in the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; mpi_scripts/machinefile&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Simply add all the other pi’s ip addresses to the file (each on a new line).&lt;/p&gt;
&lt;h2 id=&quot;testing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#testing&quot; aria-label=&quot;testing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Testing&lt;/h2&gt;
&lt;p&gt;Now that we’ve added the pi’s ip’s to the machinefile we can use them from our master node. To test this we can run the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;mpiexec &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; mpi_scripts/machinefile &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hostname&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This should give you 4 hostnames. If it does you’ve set it all up correctly! We can even try and run some C code with them by running the next command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;mpiexec &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; mpi_scripts/machinefile &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; ~/mpich_build/examples/cpi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 790px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 35%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAABSUlEQVR42lVS7XKDIBD0dWr8SqICKqJgNRppkmnf/1G6vSNNZ/pjZwGPvb3FKE8LZL/Ic+IsI84JGeI4hmoUOq3RNA3KskSSHJCmKXHyD0VRoK7r78h5BffRwHkJPbUYBof1sqLve7RtCyEklGpIsEVDXFV1EA57gqJGWndUoyCFQHT1K9w8wk4GZjAYzIB997hePew4Uvc0dGewc3aXpklYv86Px2Pg0+mE6DJvcOMMN7xjcu9w1uJ+u+Px+AzrVzFHwRckO5GSnFZ/sRwI8VscaqLlNmD2Bv5rxrxNcCS6bRtMbwJ4bE0Z6k6HGHjNZz194zEpt9CAWdQ08rI7zLvF6h2mhQTtFByu64ZlWSg3FbJjdF0HYwx6EmWWUuF8Pgcxds8PF7E7xvawmC42ZMfFXFSWVbjAxQx+DHbB4JE5jucf8cxWCIEf18nqOzkBSJkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/02853e90855e717da6e9711bd3989752/8ac56/piresults.webp 240w,
/static/02853e90855e717da6e9711bd3989752/d3be9/piresults.webp 480w,
/static/02853e90855e717da6e9711bd3989752/02aff/piresults.webp 790w&quot;
              sizes=&quot;(max-width: 790px) 100vw, 790px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/02853e90855e717da6e9711bd3989752/8ff5a/piresults.png 240w,
/static/02853e90855e717da6e9711bd3989752/e85cb/piresults.png 480w,
/static/02853e90855e717da6e9711bd3989752/2e237/piresults.png 790w&quot;
            sizes=&quot;(max-width: 790px) 100vw, 790px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/02853e90855e717da6e9711bd3989752/2e237/piresults.png&quot;
            alt=&quot;a picture showing that a clustered pi is actually slower at calculating pi...&quot;
            title=&quot;Is that correct? O.o&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Is that correct? O.o&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;If you have a look at the screenshot above you’ll see that the cluster as a whole (4 pi’s) actually take longer to calulcate pi than a single node would. This is to be expected with something that runs this quickly. The cluster has to communicate with each of the pi’s, which results in a tiny little bit of network overhead. In the case of calculating pi this network overhead turns out to be greater than the time it takes to calculate pi to 15 digits.&lt;/p&gt;
&lt;p&gt;Now that we have a complete (working) cluster we are all set to start using it! But first, here’s a video of me power cycling the cluster:&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 75%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;//www.youtube.com/embed/lm1oeS1uzY8&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;</content:encoded></item><item><title><![CDATA[Raspberry pi cluster Step 4: Setting up the master node]]></title><description><![CDATA[We're going to set up the master node. The master node will be the one that gives work orders to the slaves.]]></description><link>https://www.rickvanlieshout.com/posts/2014/pi-cluster-4-setting-up-the-master-node/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2014/pi-cluster-4-setting-up-the-master-node/</guid><pubDate>Wed, 17 Sep 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After installing raspbian to the sd card it’s time to plug in that SD card and fire up the Raspberry pi. If everything went well you should end up with a screen similar to mine:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 800px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 27.083333333333332%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAFABQDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABtLID/8QAFRABAQAAAAAAAAAAAAAAAAAAABH/2gAIAQEAAQUCiI//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAUEAEAAAAAAAAAAAAAAAAAAAAQ/9oACAEBAAY/An//xAAWEAEBAQAAAAAAAAAAAAAAAAAAEQH/2gAIAQEAAT8hwhD/2gAMAwEAAgADAAAAEPQf/8QAFhEAAwAAAAAAAAAAAAAAAAAAAAER/9oACAEDAQE/EKys/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGRAAAwADAAAAAAAAAAAAAAAAAAERITFB/9oACAEBAAE/EFQl1mTR/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/5e846d36574c5ae6373582c3f6feb881/8ac56/pi1-prev.webp 240w,
/static/5e846d36574c5ae6373582c3f6feb881/d3be9/pi1-prev.webp 480w,
/static/5e846d36574c5ae6373582c3f6feb881/d00b9/pi1-prev.webp 800w&quot;
              sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/5e846d36574c5ae6373582c3f6feb881/09b79/pi1-prev.jpg 240w,
/static/5e846d36574c5ae6373582c3f6feb881/7cc5e/pi1-prev.jpg 480w,
/static/5e846d36574c5ae6373582c3f6feb881/4b190/pi1-prev.jpg 800w&quot;
            sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/5e846d36574c5ae6373582c3f6feb881/4b190/pi1-prev.jpg&quot;
            alt=&quot;ncurses based interface that starts after boot that allows you to configure several Raspberry pi settings&quot;
            title=&quot;raspi-config boot screen&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;raspi-config boot screen&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The first thing you should do is select the “Expand Filesystem” option, this will make sure the OS can access the entire SD card. After doing that you might want to change the user password (user = pi). The last thing you want to do is hidden in the “Advanced options”, after going there you should see:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 800px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 31.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAGABQDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAL/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABoWAf/8QAFhABAQEAAAAAAAAAAAAAAAAAEQAQ/9oACAEBAAEFAiM//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFBABAAAAAAAAAAAAAAAAAAAAEP/aAAgBAQAGPwJ//8QAFxAAAwEAAAAAAAAAAAAAAAAAAAFxEf/aAAgBAQABPyGmWzD/2gAMAwEAAgADAAAAEAAf/8QAFhEAAwAAAAAAAAAAAAAAAAAAARAR/9oACAEDAQE/EKV//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGhAAAgIDAAAAAAAAAAAAAAAAAAERgTFR4f/aAAgBAQABPxCPQgsssSrds//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f6681791daa8eaef222a882d7b1cee65/8ac56/pi2-prev.webp 240w,
/static/f6681791daa8eaef222a882d7b1cee65/d3be9/pi2-prev.webp 480w,
/static/f6681791daa8eaef222a882d7b1cee65/d00b9/pi2-prev.webp 800w&quot;
              sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f6681791daa8eaef222a882d7b1cee65/09b79/pi2-prev.jpg 240w,
/static/f6681791daa8eaef222a882d7b1cee65/7cc5e/pi2-prev.jpg 480w,
/static/f6681791daa8eaef222a882d7b1cee65/4b190/pi2-prev.jpg 800w&quot;
            sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f6681791daa8eaef222a882d7b1cee65/4b190/pi2-prev.jpg&quot;
            alt=&quot;ncurses based interface with the menu options of the &amp;#39;expand filesystem&amp;#39; option&quot;
            title=&quot;expand filesystem menu options&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;expand filesystem menu options&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In here, select the “A2 Hostname” option and rename it to something better. (I appended a 0, indicating this would be the master pi)&lt;/p&gt;
&lt;p&gt;After doing all this hit finish, reboot the pi, and log back into the shell. (default user = pi pass= raspberry) The first thing we are going to do is update the pi, in case any updates have come out since the image was uploaded to raspbian.net. We can update the pi by running the following commands:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; update &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; upgrade&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After updating the pi we need to give the pi a static ip address (so we can find it later). We can do this by following a couple of steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;sudo nano /etc/network/interfaces&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;replace &lt;code class=&quot;language-text&quot;&gt;iface eth0 inet dhcp&lt;/code&gt; with &lt;code class=&quot;language-text&quot;&gt;iface eth0 inet static&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Directly underneath add the following lines: (remember to change info if required)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;address &lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.1.11
netmask &lt;span class=&quot;token number&quot;&gt;255.255&lt;/span&gt;.255.0
network &lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.1.1
broadcast &lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.1.255
gateway &lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.1.1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hit ctrl + x to close nano and hit y to save the changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;reboot the pi&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After that we have to install some required software, we can do so with the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; gfortran&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After installing some of the required software we still have to install “mpich3”, do so by running the following commands:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; /home/pi/mpich3
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; mpich3
&lt;span class=&quot;token function&quot;&gt;wget&lt;/span&gt; https://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz
&lt;span class=&quot;token function&quot;&gt;tar&lt;/span&gt; xzf mpich-3.0.4.tar.gz
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; /home/rpimpi/mpich3-install
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; /home/pi/mpich_build
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; /home/pi/mpich_build
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; /home/pi/mpich3/mpich-3.0.4/configure &lt;span class=&quot;token parameter variable&quot;&gt;-prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/home/rpimpi/mpich3-install
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After installing mpich3 we need to edit a file. Execute the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /home/pi/.profile&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Scroll down all the way and add the following text:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PATH&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token environment constant&quot;&gt;$PATH&lt;/span&gt;:/home/rpimpi/mpich3-install/bin&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After adding that line hit ctrl + x and save your work. Then either restart the shell or reboot the pi.&lt;/p&gt;
&lt;p&gt;After you have rebooted the pi you have to create a so-called “machine file”, we will store this file in the folder “mpi_scripts” in our home directory. To do this execute the following commands:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; ~/mpi_scripts
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ~/mpi_scripts
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;/sbin/ifconfig eth0 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;inet addr&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; -F: &lt;span class=&quot;token string&quot;&gt;&apos;{print $2}&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;{print $1}&apos;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; machinefile&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The last command creates the machinefile and populates it with the ip of this (master) node automatically. With all of this setup we can do our first real test with the mpi commands, so try out the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;mpiexec &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; machinefile &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hostname&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The -f is the filename parameter (so you would type the machinefile path behind that).
The -n is the number of nodes we want to use (we are working from 1 now). And finally “hostname” is the command.&lt;/p&gt;
&lt;p&gt;if all went well you should now see the hostname of the raspberry pi (for me: raspberrypi0). After this we are done setting up the master (for now) and can begin copying the SD card. To shutdown the pi you can execute the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shutdown&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-h&lt;/span&gt; now&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Raspberry pi cluster Step 3: Installing the OS]]></title><description><![CDATA[Installing the raspberry pi OS (Raspbian) and prepping for a cluster]]></description><link>https://www.rickvanlieshout.com/posts/2014/pi-cluster-3-installing-the-os/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2014/pi-cluster-3-installing-the-os/</guid><pubDate>Sun, 14 Sep 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Installing an OS for a Raspberry pi is quite different from installing an OS on any other computer. We will have to write an “image” to the SD card rather than actually “installing” anything. Don’t worry if you’re confused just now, even I don’t know what I’m rambling on about at times!&lt;/p&gt;
&lt;h3 id=&quot;linux&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#linux&quot; aria-label=&quot;linux permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Linux&lt;/h3&gt;
&lt;p&gt;First off, if you want to use Windows, skip this bit by clicking &lt;a href=&quot;#windows&quot;&gt;here.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;First we will have to download the .img from the Raspbian website, we can do so by clicking &lt;a href=&quot;https://downloads.raspberrypi.org/raspbian_latest&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;here&lt;/a&gt;. After downloading the image we can use a kernel application known as “dd” to write the file to our SD card. We will first need to find out which /dev/ the SD card is currently using. To do this we can use the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;lsblk&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will show us a list of all the connected volumes. You should be able to determine which of the entries is your SD card by looking at the size of each entry. If you are not able to determine which one you need based on the size of the entry however, you can try removing the sd card and re-running the command. The entry that disappears is the SD card.&lt;/p&gt;
&lt;p&gt;As you can see below, /dev/sde is my SD card&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;NAME   MAJ:MIN RM   SIZE
sda      &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;:0    &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;119&lt;/span&gt;.2G
├─sda1   &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;:1    &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;   243M
├─sda2   &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;:2    &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;   &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;.5G
└─sda3   &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;:3    &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;111&lt;/span&gt;.6G
sdb      &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;:16   &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;111&lt;/span&gt;.8G
└─sdb1   &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;:17   &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;111&lt;/span&gt;.8G
sdc      &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;:32   &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;111&lt;/span&gt;.8G
├─sdc1   &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;:33   &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;   350M
└─sdc2   &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;:34   &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;111&lt;/span&gt;.5G
sde      &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;:64   &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;.5G
└─sde1   &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;:65   &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;.5G&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now that we know both the input path (the downloaded iso’s location) and the output path (the /dev/sd* device) we can assemble our dd command as follows:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;dd&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/path/to/iso &lt;span class=&quot;token assign-left variable&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/path/to/sd/card&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When you execute the dd command the terminal will appear “busy” for the duration of the write. You can either wait patiently until it’s done or check up on its status by entering the command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;kill&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-USR1&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;pidof &lt;span class=&quot;token function&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;windows&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#windows&quot; aria-label=&quot;windows permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Windows&lt;/h3&gt;
&lt;p&gt;If you ended up here you have chosen to use the much inferior Windows to get Linux on your Raspberry pi’s. Don’t worry though, you can still install the, much superior, Linux images to your SD cards.&lt;/p&gt;
&lt;p&gt;The very first thing we have to do is download the Raspbian image, which we can do by clicking &lt;a href=&quot;https://downloads.raspberrypi.org/raspbian_latest&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;here&lt;/a&gt;. After downloading the image we will have to download some software to write the image to the SD card. The tool we are going to use is called win32DiskImager, and can be downloaded free of charge &lt;a href=&quot;https://downloads.sourceforge.net/project/win32diskimager/Archive/Win32DiskImager-0.9.5-install.exe?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fwin32diskimager%2F&amp;#x26;ts=1410459796&amp;#x26;use_mirror=cznic&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;right here.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After the tool has been downloaded (and installed) we have to start it by double clicking on the .exe file, which will leave us staring at the following tool:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 421px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 50.416666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAIDBAX/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB0Wdiq5ID/8QAGhAAAwADAQAAAAAAAAAAAAAAAAEDAhETMf/aAAgBAQABBQJRlrhIcsBeDP/EABcRAAMBAAAAAAAAAAAAAAAAAAABERL/2gAIAQMBAT8B0ys//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGBAAAwEBAAAAAAAAAAAAAAAAAAEyEDH/2gAIAQEABj8ChEI4Lf/EABoQAQACAwEAAAAAAAAAAAAAAAEAMRARQaH/2gAIAQEAAT8hYVo7gR0Z5ibl5//aAAwDAQACAAMAAAAQpz//xAAXEQADAQAAAAAAAAAAAAAAAAAAAREx/9oACAEDAQE/EHXWKWn/xAAXEQADAQAAAAAAAAAAAAAAAAAAARFR/9oACAECAQE/EIsIj//EABoQAQACAwEAAAAAAAAAAAAAAAEAESExUfH/2gAIAQEAAT8QYTUK25MuAxxioHK0ETu8pbrG1y6n/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/9ed986189da7748cca546dcd902c3c3c/8ac56/windows.webp 240w,
/static/9ed986189da7748cca546dcd902c3c3c/ced8d/windows.webp 421w&quot;
              sizes=&quot;(max-width: 421px) 100vw, 421px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/9ed986189da7748cca546dcd902c3c3c/09b79/windows.jpg 240w,
/static/9ed986189da7748cca546dcd902c3c3c/5c51b/windows.jpg 421w&quot;
            sizes=&quot;(max-width: 421px) 100vw, 421px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/9ed986189da7748cca546dcd902c3c3c/5c51b/windows.jpg&quot;
            alt=&quot;Picture of win32diskimager with numbers on the input fields&quot;
            title=&quot;win32diskimage&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;win32diskimage&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Using the image above as a reference:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;This is where you have to specify the image location (you can hit the blue box to select a location)&lt;/li&gt;
&lt;li&gt;Here you will have to specify which device you want to write to.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After keying in the right values you can hit “write” and wait for the “install” to finish.&lt;/p&gt;
&lt;h2 id=&quot;first-boot&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#first-boot&quot; aria-label=&quot;first boot permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;First boot&lt;/h2&gt;
&lt;p&gt;Once you boot up the pi you will get a settings screen, you can go through it if you wish. (change password and so on) If you want to start the GUI you can type:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;startx&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Raspberry pi cluster Step 2: Assembling the hardware]]></title><description><![CDATA[Assembling all the parts and creating a cute little cluster]]></description><link>https://www.rickvanlieshout.com/posts/2014/pi-cluster-2-the-build/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2014/pi-cluster-2-the-build/</guid><pubDate>Wed, 10 Sep 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;So today I finally received the required parts to finish up my Raspberry pi cluster and I was &lt;strong&gt;extremely&lt;/strong&gt; excited! To share this excitement with you lot here’s a picture of all the parts I’ll be using:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 58.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABYBAQEBAAAAAAAAAAAAAAAAAAEAAv/aAAwDAQACEAMQAAABjodrMosB/8QAGhAAAgMBAQAAAAAAAAAAAAAAAQIAAxMQEf/aAAgBAQABBQLzSwJWJgszUKiLz//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAgEBPwG4r//EABoQAAICAwAAAAAAAAAAAAAAAAABITEQERL/2gAIAQEABj8CfWkiILZRWP/EABwQAQABBQEBAAAAAAAAAAAAAAEAESExUWFBcf/aAAgBAQABPyHwYN5lcFdpvOT8YOU7mVlAAtP/2gAMAwEAAgADAAAAECvP/8QAFhEBAQEAAAAAAAAAAAAAAAAAARAh/9oACAEDAQE/EE2f/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERIVH/2gAIAQIBAT8QVjJ6f//EAB4QAQEAAgEFAQAAAAAAAAAAAAERACFxMUFRYZGh/9oACAEBAAE/EFrQyuyO0udXNKyg+8Z4PWFD8wZDeyrV5xYs7S1yAABn/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/2bf5dd7700de3ebbfe70032657eef4fb/8ac56/pi_overview_full.webp 240w,
/static/2bf5dd7700de3ebbfe70032657eef4fb/d3be9/pi_overview_full.webp 480w,
/static/2bf5dd7700de3ebbfe70032657eef4fb/e46b2/pi_overview_full.webp 960w,
/static/2bf5dd7700de3ebbfe70032657eef4fb/7f403/pi_overview_full.webp 1400w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/2bf5dd7700de3ebbfe70032657eef4fb/09b79/pi_overview_full.jpg 240w,
/static/2bf5dd7700de3ebbfe70032657eef4fb/7cc5e/pi_overview_full.jpg 480w,
/static/2bf5dd7700de3ebbfe70032657eef4fb/6a068/pi_overview_full.jpg 960w,
/static/2bf5dd7700de3ebbfe70032657eef4fb/d165a/pi_overview_full.jpg 1400w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/2bf5dd7700de3ebbfe70032657eef4fb/6a068/pi_overview_full.jpg&quot;
            alt=&quot;picture of all the parts spread on the mat&quot;
            title=&quot;all the bits!&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;all the bits!&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I began by building the Raspberry pi “tower”, sadly I forgot to take a picture with the DSLR so I only have this one cell image to show you guys:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 800px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 70.83333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAOABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIDBP/EABUBAQEAAAAAAAAAAAAAAAAAAAIB/9oADAMBAAIQAxAAAAFougtzUFf/xAAcEAABBAMBAAAAAAAAAAAAAAACAAEDEQQSIRP/2gAIAQEAAQUCM++6ArY49k2P2MaH/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQMBAT8Bh//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/Aar/xAAcEAACAAcAAAAAAAAAAAAAAAAAEAERITEyQYH/2gAIAQEABj8Cp2ZaBitL/8QAHBAAAgICAwAAAAAAAAAAAAAAAREAITFBYXGR/9oACAEBAAE/Ia5ENIoah3w17o7jevIoC6cSmzc//9oADAMBAAIAAwAAABC8z//EABYRAQEBAAAAAAAAAAAAAAAAAAEQEf/aAAgBAwEBPxBWz//EABcRAAMBAAAAAAAAAAAAAAAAAAABESH/2gAIAQIBAT8QmKj0f//EAB0QAQEAAgIDAQAAAAAAAAAAAAERACExYUFRcaH/2gAIAQEAAT8QMEXE7EU0mIJEWQXxjlHQsDwPrvIjTF5rLewuER/M2aUn51n/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/c9a050583cb69bea9ebd1152e5edd958/8ac56/sneakpeek2.webp 240w,
/static/c9a050583cb69bea9ebd1152e5edd958/d3be9/sneakpeek2.webp 480w,
/static/c9a050583cb69bea9ebd1152e5edd958/d00b9/sneakpeek2.webp 800w&quot;
              sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/c9a050583cb69bea9ebd1152e5edd958/09b79/sneakpeek2.jpg 240w,
/static/c9a050583cb69bea9ebd1152e5edd958/7cc5e/sneakpeek2.jpg 480w,
/static/c9a050583cb69bea9ebd1152e5edd958/4b190/sneakpeek2.jpg 800w&quot;
            sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/c9a050583cb69bea9ebd1152e5edd958/4b190/sneakpeek2.jpg&quot;
            alt=&quot;2 raspberry pis stacked in their cases&quot;
            title=&quot;rising up!&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;rising up!&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;On the picture above you can clearly see how the “tower” is being assembled.
I’m basically using the stand-offs that come included to mount the pi to the bottom plates and then instead of attaching a top plate I attach a bottom plate again. I did have to customize the plates a bit to prevent the pi’s from overheating (because there now is pretty much no room between a pi and the top plate).&lt;/p&gt;
&lt;p&gt;After mounting all 4, the “tower” now looks like this: (oh, I also added SD cards)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.5%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQCA//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHguxE60f/EABoQAQACAwEAAAAAAAAAAAAAAAECEQADEzL/2gAIAQEAAQUCC4RMiWIc4hWrx//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/Aar/xAAaEAACAgMAAAAAAAAAAAAAAAABEAARITFR/9oACAEBAAY/Ar4XqHC//8QAGRAAAwEBAQAAAAAAAAAAAAAAAAEhEVEx/9oACAEBAAE/Ia6vSlWp0vT3gkySK8NDjwVZh//aAAwDAQACAAMAAAAQ6y//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8QxI//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8QLiv/xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhMUHB/9oACAEBAAE/ELkNAjyq+xEVnOMzYjvVjYDFIsAX2CAD7qErBa8J/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/0b7174006510fea870f5a1dcb753fc44/8ac56/pi_sides_prev.webp 240w,
/static/0b7174006510fea870f5a1dcb753fc44/d3be9/pi_sides_prev.webp 480w,
/static/0b7174006510fea870f5a1dcb753fc44/e46b2/pi_sides_prev.webp 960w,
/static/0b7174006510fea870f5a1dcb753fc44/a5d4d/pi_sides_prev.webp 1000w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/0b7174006510fea870f5a1dcb753fc44/09b79/pi_sides_prev.jpg 240w,
/static/0b7174006510fea870f5a1dcb753fc44/7cc5e/pi_sides_prev.jpg 480w,
/static/0b7174006510fea870f5a1dcb753fc44/6a068/pi_sides_prev.jpg 960w,
/static/0b7174006510fea870f5a1dcb753fc44/a2510/pi_sides_prev.jpg 1000w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/0b7174006510fea870f5a1dcb753fc44/6a068/pi_sides_prev.jpg&quot;
            alt=&quot;a picture of the front, back and side of the tower of pis&quot;
            title=&quot;Assembled tower of pis&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Assembled tower of pis&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Then I attempted to glue the tower to my switch… Some complications came up though. First I glued my knife to my finger and then my finger to another finger. Once I had successfully managed to glue the tower onto the switch I needed something to apply pressure to let the glue dry. Since I didn’t have anything heavy handy I had to improvise. And so I did, in true nerd style:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 400px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 133.33333333333331%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEA//EABcBAAMBAAAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAY2TZGpoNT03NlcxYVP/xAAbEAACAgMBAAAAAAAAAAAAAAABAgADEBETEv/aAAgBAQABBQL2NixcChdrQjQVgDia5Sjb5mDP/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAEQERL/2gAIAQMBAT8BijKP/8QAGBEAAgMAAAAAAAAAAAAAAAAAABEBEBL/2gAIAQIBAT8BdM3J/8QAIBAAAgEBCQAAAAAAAAAAAAAAAAECERASICEiMTJBkf/aAAgBAQAGPwLe3OZRNs5v00pyJXo0TOsH/8QAHxABAAIBAwUAAAAAAAAAAAAAAQARMRAhcUFRgZGh/9oACAEBAAE/IcL4gGlqCpdPqbF0bxGlUZ2lAQ8o1FBzCoxO85vJoJbP/9oADAMBAAIAAwAAABB/OwD/xAAYEQACAwAAAAAAAAAAAAAAAAAAERAxYf/aAAgBAwEBPxBRZmR//8QAFxEBAQEBAAAAAAAAAAAAAAAAEQAxYf/aAAgBAgEBPxAbMwul/8QAHRABAAMBAAIDAAAAAAAAAAAAAQARITFBYXGRof/aAAgBAQABPxCjEvPI+4xTTzVn5CYrS9ZBWF0FMd9XkvoHqgQ5UuCFHxcfw8R1lYARYu4qBmFDok12YT1AjFn/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/8c142da5294ddf47fef0737928fcd1bd/8ac56/improvising.webp 240w,
/static/8c142da5294ddf47fef0737928fcd1bd/7f61c/improvising.webp 400w&quot;
              sizes=&quot;(max-width: 400px) 100vw, 400px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/8c142da5294ddf47fef0737928fcd1bd/09b79/improvising.jpg 240w,
/static/8c142da5294ddf47fef0737928fcd1bd/066f9/improvising.jpg 400w&quot;
            sizes=&quot;(max-width: 400px) 100vw, 400px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/8c142da5294ddf47fef0737928fcd1bd/066f9/improvising.jpg&quot;
            alt=&quot;a mini laptop on top of the cluster to keep some pressure on it&quot;
            title=&quot;balancing a weight.... a netbook&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;balancing a weight.... a netbook&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Yes, those are 2 packs of cards (which weren’t heavy enough) and an old netbook.
I went to have dinner while I let the glue dry and when I returned everything was all glued firmly into place.&lt;/p&gt;
&lt;p&gt;After adding the cables and the usb switch I am left with my beautiful raspberry pi cluster:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 65.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABAAC/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQD/2gAMAwEAAhADEAAAAT6MqKVD/8QAGhAAAgMBAQAAAAAAAAAAAAAAAQIDERIhAP/aAAgBAQABBQIPwHux5jTyCpFhXP8A/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFhEBAQEAAAAAAAAAAAAAAAAAABES/9oACAECAQE/Aa0//8QAGhAAAgIDAAAAAAAAAAAAAAAAAAERIRAxQf/aAAgBAQAGPwLSzCghdLs//8QAGxAAAwADAQEAAAAAAAAAAAAAAAERMUFxIWH/2gAIAQEAAT8h9k6OmnBOuEWkIl8IkVyLJk2z/9oADAMBAAIAAwAAABAsD//EABcRAAMBAAAAAAAAAAAAAAAAAAABESH/2gAIAQMBAT8Qaewh/8QAFhEBAQEAAAAAAAAAAAAAAAAAAREA/9oACAECAQE/EA0unf/EABwQAQEAAgIDAAAAAAAAAAAAAAERACExcUFRsf/aAAgBAQABPxBJNGxq9cGGtTArbm5KDELDGfy0Cn3NPM7d5rvCw+eMr1n/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/a0a120486c9d600c05ae7a084bb84355/8ac56/pi_front_back_prev.webp 240w,
/static/a0a120486c9d600c05ae7a084bb84355/d3be9/pi_front_back_prev.webp 480w,
/static/a0a120486c9d600c05ae7a084bb84355/e46b2/pi_front_back_prev.webp 960w,
/static/a0a120486c9d600c05ae7a084bb84355/a5d4d/pi_front_back_prev.webp 1000w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/a0a120486c9d600c05ae7a084bb84355/09b79/pi_front_back_prev.jpg 240w,
/static/a0a120486c9d600c05ae7a084bb84355/7cc5e/pi_front_back_prev.jpg 480w,
/static/a0a120486c9d600c05ae7a084bb84355/6a068/pi_front_back_prev.jpg 960w,
/static/a0a120486c9d600c05ae7a084bb84355/a2510/pi_front_back_prev.jpg 1000w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/a0a120486c9d600c05ae7a084bb84355/6a068/pi_front_back_prev.jpg&quot;
            alt=&quot;front and back of the cluster, all cabled up&quot;
            title=&quot;looking great!&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;looking great!&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In my next blog post, I will cover how to install raspbian on a raspberry pi in general and how I plan on cloning the install across all pi’s&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Raspberry pi cluster Step 1: Shopping]]></title><description><![CDATA[Ordering the parts for a nice little pi cluster]]></description><link>https://www.rickvanlieshout.com/posts/2014/pi-cluster-1-shopping/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2014/pi-cluster-1-shopping/</guid><pubDate>Fri, 05 Sep 2014 23:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;so-a-raspberry-pi-cluster-what-is-it-and-what-does-it-do&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#so-a-raspberry-pi-cluster-what-is-it-and-what-does-it-do&quot; aria-label=&quot;so a raspberry pi cluster what is it and what does it do permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;So, A raspberry pi cluster. What is it and what does it do?&lt;/h2&gt;
&lt;p&gt;Well, a raspberry pi is a small $35 dollar Linux computer with an SD card as a hard drive and an USB cable as it’s power source. While they are only $35, they perform really well!&lt;/p&gt;
&lt;p&gt;A cluster is basically a group of computers that work together to run a very intensive program. Say for example you needed to calculate 1000 things with a single raspberry pi and every calculation takes 1 second. That would be 1000 seconds! Now if you add a second raspberry pi and you have them share the load they will be twice as fast! Imagine running 4 of them, that would cut it down to 250 seconds! Well that’s exactly what I plan on doing&lt;/p&gt;
&lt;h2 id=&quot;what-software-are-you-going-to-use&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-software-are-you-going-to-use&quot; aria-label=&quot;what software are you going to use permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What software are you going to use?&lt;/h2&gt;
&lt;p&gt;I am going to use &lt;a href=&quot;https://www.raspbian.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;raspbian&lt;/a&gt; for the OS and I will be using python (and &lt;a href=&quot;https://mpi4py.scipy.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;mpi4py&lt;/a&gt;) to program the cluster.&lt;/p&gt;
&lt;h2 id=&quot;what-did-you-need-and-how-much-did-it-cost&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-did-you-need-and-how-much-did-it-cost&quot; aria-label=&quot;what did you need and how much did it cost permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What did you need and how much did it cost&lt;/h2&gt;
&lt;p&gt;Below you will find a list of items you would need if you were to build a 4 pi cluster from scratch. Prices are in Euro’s because that’s what I pay with (I know, crazy right?)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 raspberry pis ( €131.80 )&lt;/li&gt;
&lt;li&gt;4 ethernet cables ( €3.40 )&lt;/li&gt;
&lt;li&gt;4 USB power cables ( €7.20 )&lt;/li&gt;
&lt;li&gt;4 sd cards ( €12.72 )&lt;/li&gt;
&lt;li&gt;4 raspberry pi cases ( €11.72 )&lt;/li&gt;
&lt;li&gt;An Ethernet hub ( €10.95 )&lt;/li&gt;
&lt;li&gt;An USB hub ( €2.64 )&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This all adds up to ( €180.43 which is $233.76 according to &lt;a href=&quot;https://www.google.nl/search?site=&amp;#x26;source=hp&amp;#x26;q=180.43+euro+to+dollar&amp;#x26;oq=180.43+euro+to+dollar&amp;#x26;gs_l=hp.3..33i21l2.879.5191.0.5287.28.24.3.1.1.0.157.1273.22j1.23.0....0...1c.1.53.hp..9.19.917.0.jex09uDmbow&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;google&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;I ordered &lt;strong&gt;some&lt;/strong&gt; of the stuff from a shop in china called ”&lt;a href=&quot;https://banggood.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;banggood&lt;/a&gt;”. Since they deliver all around the world I will add the links to those items below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The raspberry pi cases can be found &lt;a href=&quot;https://www.banggood.com/Transparent-Box-Case-Shell-For-Raspberry-Pi-512MB-Version-p-923015.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The 8gb SD cards can be found &lt;a href=&quot;https://www.banggood.com/8GB-SD-HC-SDHC-Flash-Secure-Digital-Memory-Card-Camera-p-938458.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The USB hub can be found &lt;a href=&quot;https://www.banggood.com/Wholesale-Laptop-PC-New-Black-4-Port-Tap-USB-2_0-High-Speed-Hub-ON-Or-OFF-Sharing-Switch-p-45306.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The USB power cables can be found &lt;a href=&quot;https://www.banggood.com/Retractable-Micro-USB-Data-Sync-Charger-Cable-For-Cellphones-p-90245.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[My brand new blog]]></title><description><![CDATA[Starting a new blog... again... without wordpress but in English ;)]]></description><link>https://www.rickvanlieshout.com/posts/2014/my-brand-new-blog/</link><guid isPermaLink="false">https://www.rickvanlieshout.com/posts/2014/my-brand-new-blog/</guid><pubDate>Fri, 05 Sep 2014 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hey all and welcome to my new blog!
A couple of questions pop-up right away I’m sure. So let’s get those out of the way right now!&lt;/p&gt;
&lt;h2 id=&quot;english-is-this-a-joke&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#english-is-this-a-joke&quot; aria-label=&quot;english is this a joke permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;English?!? Is this a joke?&lt;/h2&gt;
&lt;p&gt;Nope, I have decided to blog in English for a couple of reasons.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It will be easier for me to write articles.&lt;/li&gt;
&lt;li&gt;I get to share my posts with a couple of non-Dutch friends.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;why-did-you-start-over-again&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-did-you-start-over-again&quot; aria-label=&quot;why did you start over again permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why did you start over &lt;strong&gt;again&lt;/strong&gt;?&lt;/h2&gt;
&lt;p&gt;Yeah, I know… This is like the fourth time I start over isn’t it? Well let me give you some reasons for switching:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Control. I now have full control over how the page looks and performs.&lt;/li&gt;
&lt;li&gt;No more Wordpress!!! Many of you will know I have a love/hate relationship with Wordpress. But in the end, the hate won over the love. I am just fed up with the entire system and its problems.&lt;/li&gt;
&lt;li&gt;Because I wanted to convert to English. And why not convert platform at the same time?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;so-what-can-we-expect&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#so-what-can-we-expect&quot; aria-label=&quot;so what can we expect permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;So what can we expect?&lt;/h2&gt;
&lt;p&gt;I’ll be doing a lot more technical blogs. (up next: raspberry pi cluster) I also plan on doing some code examples and general rambling. So pretty much the same as any other blog.&lt;/p&gt;</content:encoded></item></channel></rss>