<?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>Fri, 06 Mar 2026 13:36:24 GMT</lastBuildDate><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>