https://www.suffix.be/feeds/blog.xmlSuffix2024-03-14T23:20:49+01:00Simonhttps://www.suffix.be/blog/ski-valle-aosta/Chasing Powder in Valle d’Aosta2024-03-14T11:00:00+01:002024-03-14T12:00:00+01:00Exploring Crévacol, La Thuile and Pila in Italy.
<figure>
<picture>
<source type="image/webp" srcset="../../assets/aosta-snowcar.webp">
<img src="../../assets/aosta-snowcar.jpg" width="300" height="300" alt="Parked card snowed under" />
</picture>
</figure>
<p>We just returned from a 3-day ski adventure in Italy’s stunning Valle d’Aosta. The weather forecast predicted a <a href="https://stylealtitude.com/retour-est-genoa-low.html" title="or Genoa Low, a heavy snowfall phenomenon">Retour d’Est</a> hitting the region, making it perfect timing for fresh powder runs.</p>
<h2>Crévacol: A Nostalgic Glimpse</h2>
<p>Our journey began at <a href="https://www.crevacol.it/" title="Crévacol ski resort">Crévacol</a>, a mini resort just across the border with Switzerland. With only two chairlifts, it offered a charmingly old-school vibe – pure 90s ski nostalgia! Unfortunately, heavy winds restricted access to just the base lift. After a couple of hours carving through pristine powder, we retreated for a warming cappuccino for only €1.50 - a steal that perfectly complemented the resort’s retro feel. While the top lift closure left us wanting more, Crévacol will definitely be a stop on our next trip over the San Bernardo pass. (Lift ticket: €24 due to limited opening).</p>
<h2>Cogne: Winterwonderland</h2>
<p>Next, we set off for Cogne, a scenic village about an hour’s drive from Crévacol. The snowy conditions, however, demanded snow chains, and by the time we reached the village, the lifts had closed early. Though disappointed about missing out on the slopes, the breathtaking scenery surrounding Cogne made the adventurous drive worthwhile.</p>
<figure>
<picture>
<img src="../../assets/aosta-cogne.jpg" width="300" height="225" alt="Snowy road to Cogne">
</picture>
<figcaption>En route to Cogne, Italy</figcaption>
</figure>
<h2>La Thuile: a Bucket List Check</h2>
<p>Day two brought us to <a href="https://www.lathuile.it/en/index.html" title="La Thuile ski resort">La Thuile</a>, a 30-minute drive from our base in Aosta. Initially aiming for Monterosa, where only half the lifts were operational, we opted for La Thuile – a lucky gamble! La Thuile, along with La Rosière on the French side, forms a resort with over 80 slopes. We primarily stuck to the sunny Italian slopes, but the international border crossing was definitely a bucket list check!</p>
<p>While La Thuile’s bowl-shaped layout offered extensive terrain, the red slopes felt more like blues, and the blacks were more akin to reds – ideal for beginners but too flat for seasoned skiers. However, the off-piste potential is noteworthy, allowing playful jumps anywhere off the groomed runs. Despite the mellow terrain, we clocked a surprising 60km by day’s end, with the Belvedere (№ 25) and Muret (№ 5) – beautifully nestled amidst the trees – being our favorites. Overall, La Thuile offered a pleasant day with sunshine, great snow, but perhaps not a top contender for a return trip. (Lift ticket: €55 + €2, parking: €7.50).</p>
<h2>Pila: Perfectly Groomed Paradise</h2>
<p>Our final day, shorter due to an early departure, was reserved for <a href="https://pila.it/en/ski-area/" title="Pila ski resort">Pila</a>. Known for weekend crowds, we strategically saved it for a less busy weekday. The gondola whisked us directly from Aosta’s center to Pila, where we enjoyed first tracks on perfectly groomed slopes! Similar to La Thuile, Pila sits in a bowl, but the slopes offered a much steeper challenge. The scenery was stunning, with sections weaving through forests and others soaring above the tree line. From the summit of Col Couis, we could see Cogne on the opposite side. While the central area got crowded even on a Tuesday (potentially a nightmare during peak season), the outer areas remained blissfully empty. Here, we carved our way down wide red runs winding through the forests – a perfect day for honing carving skills. The three red slopes (№ 1, 2 & 3) on Chamolé were a must-do, while the black Resselin (№ 11), though steep, felt a tad short. For true speed thrills, the Creuisa (№ 8) under the Couis 1 took the top speed record for the trip! (Lift ticket: €49.5 saving the €2 cost reusing the pass from La Thuile).</p>
<figure>
<picture>
<img src="../../assets/aosta-pila.jpg" width="250" height="333" alt="Skier on a freshly groomed slope in Pila">
</picture>
<figcaption>First track in Pila, Italy</figcaption>
</figure>
<p>Overall, our Valle d’Aosta adventure was a resounding success. We explored three new resorts, reveled in exceptional snow conditions, and soaked up the region’s charm. Valle d’Aosta – a must-visit for any skier seeking pristine powder, diverse terrain, and unforgettable Italian flair!</p>
Simonhttps://www.suffix.be/blog/masters-of-doom/Masters of Doom2024-02-18T15:00:00+01:002024-02-18T17:00:00+01:00The two Johns that defined my teenage gaming years.
<div typeof="Book" resource="#doom">
<link property="bookFormat" href="https://schema.org/EBook" />
<figure>
<picture>
<source type="image/webp" srcset="../../assets/masters-of-doom.webp" />
<img src="../../assets/masters-of-doom.jpg" property="thumbnailUrl image" alt="Masters of Doom by David Kushner book cover" />
</picture>
<figcaption>
Copyright <a href="http://www.davidkushner.com/book/masters-of-doom/" property="mainEntityOfPage">David Kushner</a>
</figcaption>
</figure>
<div property="review" typeof="Review">
<div property="reviewBody">
<p>Growing up in the 90s, <a href="https://en.wikipedia.org/wiki/Id_Software" title="id Software @ Wikipedia">id Software</a> was synonymous with groundbreaking games – and parental concern (how did I get away with playing <a href="https://en.wikipedia.org/wiki/Doom_(1993_video_game)" title="DOOM (1993 vdieo game) @ Wikipedia">DOOM</a>?!). <span property="author" resource="#kushner" about="#doom"><span property="name" typeof="Person" about="#kushner">David Kushner</span></span>’s “<span property="name" about="#doom">Masters of Doom</span>” (<abbr title="International Standard Book Number">ISBN</abbr> <span property="isbn" about="#doom">9780749924898</span>) dives into the origin story of this iconic studio, focusing on its founding duo: John Carmack, the programming prodigy, and John Romero, the rockstar designer. While I devoured the id Software classics like Commander Keen, Wolfenstein 3D, DOOM and Quake, this book revealed the depth of their influence on my gaming teenage years. While I knew about Carmack, shamefully, “Masters of Doom” filled the void with Romero’s story.</p>
<p>The book’s pacing, however, could be brisker. While details about their junk food and deathmatches offer some context, a deeper exploration of their innovations would have been welcome. What made sidescolling so grounbraking on <abbr title="Personal Computer">PC</abbr> when it was already done on consoles? Why was Carmack the first to make it work? Romero’s level design was top notch, but what made it so?</p>
<p>My teenage self remembers begging for a new graphics card to keep up with the latest games. This book captures my frustration, highlighting how far hardware has come since those days. Each generation seemed to usher in must-have innovations: the leap to super <abbr title="Video Graphics Array">VGA</abbr>, the introduction of 3D graphics, the power of dynamic lighting. Perhaps it’s just nostalgia clouding my judgment, but back then, these advancements felt truly epochal. Now, looking back through the lens of the book, I can appreciate the impact these early pioneers had.</p>
<p>However, the portrayal of the Johns felt a bit caricature-ish. Carmack as the anti-social programmer and Romero as the swearing rockstar – but were they really that one-dimensional? Makes you wonder how accurate the story really is. The book shines in highlighting how the magic in the collaboration between the two Johns likely played a significant role in their success than their (undeniable) individual talents alone.</p>
<p>One cool detail: I knew Carmack was related to <a href="https://en.wikipedia.org/wiki/Armadillo_Aerospace" title="Armadillo Aerospace @ Wikipedia">Armadillo Aerospace</a>, but this book explained how it started with him dabbling in rockets as a hobby. No wonder it pops up in gaming circles.</p>
<blockquote>
<p>Though games were barely acknowledged as a legitimate form of expression, let alone a legitimate art form, Tom was convinced that they were almost sublime forms of communication, just as films or novels.</p>
<footer>—David Kushner, about Tom Hall</footer>
</blockquote>
<p>This quote resonated deeply. Back then, games still had to prove their worth. As I write this, watching the television adaptation of <a href="https://www.imdb.com/title/tt3581920/" title="The Last of Us TV series @ IMDB">The Last of Us</a>, it’s clear how things have changed. Today, we see an increasing number of television series based on video games, a remarkable shift from the days when games desperately sought legitimacy.</p>
<p>Overall, I enjoyed learning about this pivotal era in gaming and the people who fueled it. Thanks to them, my teenage years were filled with pixelated fun! Though the book feels a bit <span property="reviewRating" typeof="Rating"><meta property="bestRating" content="5"><meta property="ratingValue" content="3">overrated</span> in tech circles.</p>
</div>
</div>
</div>
Simonhttps://www.suffix.be/blog/control-game/Control2024-02-17T11:00:00+01:002024-02-17T12:00:00+01:00A stunning, brilliant videogame trip.
<div typeof="VideoGame" resource="#control">
<figure>
<picture>
<source type="image/webp" srcset="../../assets/control.webp" />
<img src="../../assets/control.jpg" property="thumbnailUrl screenshot image" alt="Screenshot from the game" />
</picture>
</figure>
<div property="review" typeof="Review">
<div property="reviewBody">
<p>Blindly diving into this <abbr title="Personal Computer" property="gamePlatform" about="#control">PC</abbr> videogame shooter released in <time datetime="2019">2019</time>. <a href="https://www.remedygames.com/games/control" title="Control product page @ Remedy Games">Control</a> languished on my wishlist, nearly forgotten, until I snagged it for €9.99 on a Steam sale.</p>
<p>The <time datetime="PT1H">first hour</time>, impressed so far. The opening level throws you into a desolate government building, instantly setting the game’s eerie atmosphere. Though clueless about your own purpose, a strange sense of belonging washes over you, pulling you deeper into the unknown. The brutalist architecture and <time datetime="1960">60s</time> vibes are stunning, but the weak, scarce enemies made me wonder if it’s more of a walking simulator than a shooter.</p>
<p>A <time datetime="PT2H">few hours</time> in, the difficulty ramped up. It’s a shooter, alright. My trusty Service Weapon, the only gun you get, is probably the most awesome gun in any game. But here’s my first critique: interaction with the world feels limited. No picking up enemy weapons? Can’t use those med kits in the medical cabinets you rip out with satisfying violence? Immersion takes a hit.</p>
<p>The lighting, though? Breathtaking. Back in <time datetime="2019">2019</time>, it was among the first to utilize real-time ray tracing, and it shows. Imagine an eerie dark room bathed in the green glow of an old <abbr title="Cathode-Ray Tube">CRT</abbr> monitor - stunning, but unfortunately fixed and indestructible. Asset reuse doesn’t help either. While the grandiose room designs compensated, identical offices with the same chairs and desks led to occasional moments of “have I been here before?”</p>
<p>Around the <time datetime="PT5H">five-hour mark</time>, I assumed gameplay had plateaued. Repetitive grind, here I come? But wait… superpowers! This twist adds a thrilling new dimension to the game.</p>
<p>Some <time datetime="PT5H">five hours</time> in, the story truly clicked. While I won’t spoil anything, the game blurs the lines between good and evil, keeping me constantly questioning the true motives of everyone involved. The <span property="author" typeof="Organization" resource="#remedy"><a property="url" href="https://www.remedygames.com/" title="Remedy Entertainment homepage" about="#remedy"><span property="name" about="#remedy">Remedy Entertainment</span></a></span> touch (creators of <a href="https://en.wikipedia.org/wiki/Alan_Wake" title="Action-adventure video game aplauded for its story">Alan Wake</a>) is evident in the captivating narrative, where time-constrained side missions organically fit into the main story arc, even if their timing is often inconvenient (right in the middle of a mid-boss fight, seriously?).</p>
<p>Over <time datetime="PT10H">10 hours</time> in. First time I notice this game throws away the minimap! Instead, you rely on a map for general direction, hints scattered around the level design, and your own memory to navigate. Sure, I sometimes got lost, but that became part of the fun.</p>
<p>Enemy variety was decent, with the usual mix of heavy-hitters, agile foes, and flying nuisances. Backtracking annoyance came from enemies respawning in cleared areas, which made sense story-wise but felt tedious, especially without intermediate saves (the game auto-saves only at specific points).</p>
<p>Puzzles! Not brain-busters, but enough to make you pause and appreciate the world-building. They are mostly pattern-matching variations, but the diversity keeps them engaging. The collectibles (letters and audio tapes) are optional and don’t impact gameplay, but they enrich the story for lore-hungry players.</p>
<p>At around the <time datetime=PT15H">15-hour</time> mark, I reached the <a href="https://breezewiki.com/control/wiki/Ashtray_Maze" title="Ashtray Maze level description @ breeze wiki">Ashtray Maze</a>. As I finished the level, I thought to myself, “This is awesome!”. Coincidentally, at the same moment, the protagonist echoed my sentiment, exclaiming, “That was awesome!” Undoubtedly, this level stands out as the game’s highlight.</p>
<p>After roughly <time datetime="PT18H">18 hours</time> of enthralling gameplay, the main story reached its conclusion, though not quite the ending I expected. The story takes a rather downbeat turn at the close.</p>
<p><span property="name" about="#control">Control</span> has stolen a place in my favorite shooters’ hall of fame. <span property="reviewRating" typeof="Rating"><meta property="bestRating" content="5"><meta property="ratingValue" content="4">It’s a grandiose, stunning, and ultimately brilliant trip that shouldn’t be missed!</span></p>
</div>
</div>
</div>
Simonhttps://www.suffix.be/blog/fosdem-2024/FOSDEM2024-02-07T15:00:00+01:002024-02-17T17:00:00+01:00My takeaways from FOSDEM 2024.
<div typeof="Event" resource="#fosdem">
<p><a href="https://fosdem.org/2024/" title="The free event for software developers in Brussels, Belgium" property="url name" about="#fosdem">FOSDEM</a> is a name that resonates with open-source enthusiasts worldwide. This massive conference, boasting over 8,000 attendees and 800+ talks, is a true staple in the <span property="about" about="#fosdem">open-source</span> world. So, per tradition, it was held at the <abbr title="Université libre de Bruxelles" property="location" about="#fosdem">ULB</abbr> in Brussels, a convenient bike ride away. I had no reason to miss out.</p>
<p>FOSDEM is free, jam-packed with informative talks, and this year, the dedicated <a href="https://fosdem.org/2024/schedule/track/ruby/" title="Ruby devroom schedule @ FOSDEM">Ruby devroom</a> made its return. Top it off with catching up with old friends and my wife attending for the first time it was a no-brainer.</p>
<p>But even the best experiences have room for improvement.</p>
<ul>
<li>Full rooms. FOSDEM’s rooms, with only a few auditoria, reach capacity swiftly, leading to closed doors—a frequent occurrence. Venturing between talks becomes a gamble, potentially leaving you shut out of the next one. Settling in a room with the highest density of your interests seems the optimal strategy, albeit at the cost of missing other appealing talks. This space crunch is a familiar FOSDEM hurdle, and solutions aren’t easy. A venue with larger rooms would do the trick, but securing free infrastructure for 8,000+ attendees sounds like a challenge.</li>
<li>No mandatory COVID-19 measures. Some people chose to skip the conference due to safety concerns in packed rooms, and let’s be honest, mask usage wasn’t as widespread as it could have been. It’s difficult not to draw a connection back to the first issue. Would a mandatory mask policy have addressed these concerns? It’s hard to say. All presentations are live-streamed, which may help a little, but I do understand the real solution will require more effort.</li>
<li>Representation Matters: In 2024, the tech world still leans heavily male, and the hacker community is no exception. While the organizers made an effort to include diverse keynote speakers, the devrooms and attendees largely reflected a different reality. My wife, on the other hand, noted the diverse attendance compared to the trade shows she often frequents, a hopeful sign!</li>
</ul>
<p>Honorable mention to <a href="https://fosdem.sojourner.rocks/">Sojourner</a>, once again proving itself as the ideal <abbr title="Progressive Web App">PWA</abbr> for planning my FOSDEM schedule. Throughout the conference, it served as my go-to tool for navigating the event and checking room availability, saving time and ensuring I didn’t miss any desired presentations.</p>
<h2>Talks Attended</h2>
<ol>
<li property="subEvent" typeof="Event" about="#fosdem" resource="#sandjiv">
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2293-the-best-case-scenario/" property="url" about="#sandjiv"><span property="name" about="#sandjiv">The best `case` scenario</span></a> by <span property="actor" about="#sandjiv">Sandjiv</span></p>
<p>My first talk of the conference and a strong one to open with. Although Sandjiv mentioned feeling nervous, his delivery was flawless. The presentation was engaging, and I picked up some valuable new techniques. I’m definitely going to investigate pattern matching in Ruby further, and his suggestion to start with the simpler cases first seems wise.</p>
</li>
<li property="subEvent" typeof="Event" about="#fosdem" resource="#kevin">
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2273-a-front-end-journey-back-to-rails/" property="url" about="#kevin"><span property="name" about="#kevin">A front-end journey back to Rails</span></a> by <span property="actor" about="#kevin">Kevin Vanzandberghe</span></p>
<p>I share Kevin’s love for Ruby on Rails, but I often shy away from “modern” <abbr title="User Interface">UI</abbr> choices as they involve switching from Ruby to JavaScript, which disrupts my workflow. Kevin presented some elegant alternatives using <a href="https://www.honeybadger.io/blog/rails-viewcomponent/" title="Building reusable UI components in Rails with ViewComponent">components</a>, interactivity, suspense, inline forms, confirmation dialogs, and live updates. He covered the material a bit quickly for my preference, so I’ll explore these techniques further on my own. Luckily Kevin prepared a nice <a href="https://github.com/kvzb/hotwire-resources">list of resources</a>.</p>
</li>
<li property="subEvent" typeof="Event" about="#fosdem" resource="#timothy">
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3661-timestamping-with-opentimestamps/" property="url" about="#timothy"><span property="name" about="#timothy">Timestamping with opentimestamps</span></a> by <span property="actor" about="#timothy">Timothy M. Redaelli</span></p>
<p>While <a href="https://opentimestamps.org/" title="A timestamping proof standard">OpenTimestamps</a> has piqued my interest for several years, I have yet to find an opportunity to integrate it into my dayjob. Though Timothy’s presentation didn’t offer much new information since I’ve dabbled with OpenTimestamps before, it served as a welcome reminder.</p>
</li>
<li property="subEvent" typeof="Event" about="#fosdem" resource="#helio">
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-1729-the-world-of-passkeys/" property="url" about="#helio"><span property="name" about="#helio">The wold of Passkeys</span></a> by <span property="actor" about="#helio">Helio Cola</span></p>
<p>I keep hearing that passkeys are the future and will replace passwords, but I still don’t quite understand them. Are passkeys only considered passkeys if they’re synced? How can I sync them without trusting a 3th party with my private keys? What about Yubikeys, are they passkeys? If passkey authentication fails and the relaying party falls back on passwords, doesn’t that mean passwords will still be around? So many questions that Helio’s talk, unfortunately, didn’t cover. The Ruby gem he mentioned offers a chance to explore, though.</p>
</li>
<li property="subEvent" typeof="Event" about="#fosdem" resource="#ivo">
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2473-backtracie-and-the-quest-for-prettier-ruby-backtraces/" property="url" about="#ivo"><span property="name" about="#ivo">Backtracie and the quest for prettier Ruby backtraces</span></a> by <span property="actor" about="#ivo">Ivo Anjo</span></p>
<p>While Ivo’s talk delved into Ruby’s internals beyond my understanding, his enthusiastic and engaging presentation was infectious. I gleaned some insights into Ruby’s inner workings and was impressed by his inventive approach to unravel Ruby’s internals.</p>
</li>
<li property="subEvent" typeof="Event" about="#fosdem" resource="#florian">
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2723-power-profiling-my-entire-house-with-the-firefox-profiler/" property="url" about="#florian"><span property="name" about="#florian">Power profiling my entire house with the Firefox Profiler</span></a> by <span property="actor" about="#florian">Florian Quèze</span></p>
<p>Florian’s presentation captured the true FOSDEM magic. His project, hacking together power monitoring during late-night sessions with a sleeping newborn, resonated with me. Only to uncover that his router is a greater energy hog than his chest freezer. His creative use of the Firefox profiler was a nice touch.</p>
</li>
<li property="subEvent" typeof="Event" about="#fosdem" resource="#remy">
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-1669-beyond-passwords-secure-authentication-with-passkeys/" property="url" about="#remy"><span property="name" about="#remy">Beyond passwords: secure authentication with passkeys</span></a> by <span property="actor" about="#remy">Remy Bertot</span></p>
<p>Compared to Helio’s talk (reviewed earlier), Remy’s presentation on passkeys resonated more with me. He balanced enthusiasm for their potential benefits with a realistic analysis of the challenges passkeys face. Both talks delved into the semantics of “passkeys as true <abbr title="Two Factor Authentiation">2FA</abbr>,” which felt more relevant for compliance than anything else. Personally, I couldn’t care less. If you’re seeking a balanced introduction to passkeys, watch Remy’s talk! One only wishes passkeys were supported in Firefox on Linux…</p>
</li>
<li property="subEvent" typeof="Event" about="#fosdem" resource="#robin">
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2292--clients-aerc-an-email-client-for-the-discerning-hacker/" property="url" about="#robin"><span property="name" about="#robin">[Clients] aerc, an email client for the discerning hacker</span></a> by <span property="actor" about="#robin">Robin Jarry</span></p>
<p>I’ve always contemplated switching to a terminal-based email client, but attempts with <a href="/blog/mutt/" title="The mutt e-mail client">mutt</a> haven’t quite clicked. While <a href="https://aerc-mail.org/" title="Aerc: a pretty good email client">aerc</a> initially piqued my interest, it eventually slipped my mind. Robin’s presentation rekindled my curiosity. I learned that Drew DeVault passed the torch, and Robin is now actively developing aerc. Perhaps I will give aerc a better look this time?</p>
</li>
<li property="subEvent" typeof="Event" about="#fosdem" resource="#manoel">
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-1721-dapnet-bringing-pagers-back-to-the-21st-century/" property="url" about="#manoel"><span property="name" about="#manoel">DAPNET: Bringing pagers back to the 21st Century</span></a> by <span property="actor" about="#manoel">Manoel Casquilho</span></p>
<p>Not only am I old enough to remember pagers from my first job, but I’m old enough to qualify as an <abbr title="Old Man">OM</abbr>! I had no idea pagers were still commercially available today. I learned about <a href="http://www.hampager.de" title="A distributed amateur pager network">DAPNET</a>, an active amateur pager network, and it blew my mind! Adding a node and using a pager today sounds like a ton of fun. Kudos to Manoel for sharing your knowledge and sparking my curiosity!</p>
<li property="subEvent" typeof="Event" about="#fosdem" resource="#iker">
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2169-passwordless-authentication-in-the-gui/" property="url" about="#iker"><span property="name" about="#iker">Passwordless authentication in the GUI</span></a> by <span property="actor" about="#iker">Iker Pedrosa</span></p>
<p>Iker’s presentation explored alternative authentication mechanisms for the GNOME login screen. While the concept was certainly intriguing, my expectation was focused on passkey integration for website logins rather than GNOME itself, my bad.</p>
</li>
<li property="subEvent" typeof="Event" about="#fosdem" resource="#hansjorg">
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2478--structuredemail-structured-vacation-notices-and-structured-email-for-roundcube/" property="url" about="#hansjorg"><span property="name" about="#hansjorg">[StructuredEmail] Structured Vaction Notices and Structured Email for Roundcube</span></a> by <span property="actor" about="#hansjorg">Hans-Jörg Happel</span></p>
<p>While the topic overlapped with the following presentation, both Hans-Jörg’s talk on <a href="https://structured.email/" title="Standardizing structured email (SML)">structured emails</a> and the subsequent one could have benefited from being combined into a longer session. Previously aware of <abbr title="K Desktop Environment">KDE</abbr>’s efforts in semantic email extraction, I learned the possibility of embedding JSON-LD snippets within emails. This simple approach allows adding metadata to transactional emails, enabling better understanding by e-mail clients. For instance, Hans-Jörg imagined how inserting a snippet with your “out-of-office” period could inform recipients and avoid scheduling conflicts. I’ll certainly implementing structured formats in our transactional emails.</p>
</li>
<li property="subEvent" typeof="Event" about="#fosdem" resource="#volker">
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2053--structuredemail-when-is-my-flight-semantic-data-extraction-in-kmail-and-nextcloud-mail/" property="url" about="#volker"><span property="name" about="#volker">[StructuedEmail] When is my flight? - Semantic data extraction in KMail and Nextcloud Mail</span></a> by <span property="actor" about="#volker">Volker Krause</span></p>
<p>Following Hans-Jörg’s presentation on structured emails, Volker delved into the specific challenges faced by <a href="https://apps.kde.org/itinerary/" title="A digital travel assistant">KDE Itinerary</a> when parsing non-structured emails, such as those containing <abbr title="Portable Document Format">PDF</abbr> attachments.</p>
</li>
</ol>
<h2>Looking Ahead</h2>
<p>FOSDEM remains a magical experience for open-source enthusiasts, and 2024 was no different. To all volunteers: you are the backbone of the event, a huge thank you for all your hard work! See you all in 2025!</p>
</div>
Simonhttps://www.suffix.be/blog/high-system-load-raspberry-pi/High system load on a RPi without SD card2023-12-12T09:00:00+01:002023-12-12T09:00:00+01:00Raspberry Pi 3 locking up polling for a missing SD card.
<p>Back in April, I repurposed an old Raspberry Pi 3 (model B+) as a <a href="../adguard-home-raspberry-ubuntu-core/" title="Self updating ad blocking with AdGuard Home">network-wide ad blocker</a>. Using <a href="https://ubuntu.com/core" title="Self updating Linux OS">Ubuntu Core</a> and <a href="https://adguard.com/en/adguard-home/overview.html" title="Network-wide ad blocking">AdGuard Home</a> for a complete hands-off <abbr title="Domain Name Server">DNS</abbr>: the main <abbr title="Operating System">OS</abbr>, all the software, and the block lists automatically update. Earlier this week, after 9 months of trouble-free operation, the DNS started acting wonky. It was fixed with a quick reboot, but the DNS went down again yesterday. Time for a more serious investigation.</p>
<p>The slow <abbr title="Secure SHell">SSH</abbr> connection already hinted at what was wrong. The Raspberry reported an average system load of over 6. Checking the running processes with <kbd>top</kbd> showed a <em><a href="https://www.kernel.org/doc/html/latest/core-api/workqueue.html?highlight=kworker" title="Linux workqueues">kworker</a></em> process locking up around 8% of the <abbr title="Central Processing Unit">CPU</abbr>. That was kind of excessive. Some internet searches later, I had found the culprit. My ancient Raspberry Pi has endured several falls to the floor. One of these broke the <abbr title="Secure Digital">SD</abbr> card slot, so it now runs from a <abbr title="Universal Serial Bus">USB</abbr> stick without an SD card. It <a href="https://jamesachambers.com/raspberry-pi-reclaim-1-cpu-usage-when-ssd-msd-booting/" title="Reclaim ~1% CPU Usage when SSD/USB Booting">turns out</a> the Pi is constantly polling for an SD card. It constantly searches for an SD card it will never find.</p>
<p>The solution? Tell the RPi to ignore the SD card slot. Just stick it in <kbd>/boot/config.txt</kbd> or, for Ubuntu Core, in <kbd>/run/mnt/ubuntu-seed/config.txt</kbd>.</p>
<p>For the Raspberry Pi 3, adding the following dtparam setting at the end of the config.txt and restarting the Pi fixed the issue.</p>
<code>
<pre># only check for an SD card at boot
dtparam=sd_poll_once</pre>
</code>
<p>If you have a newer Raspberry Pi, you may need to use one of these dtoverlay parameters (untested).</p>
<code>
<pre># never check for an SD card
dtoverlay=sdtweak,enable=off
# only check for an SD card at boot
dtoverlay=sdtweak,poll_once=on</pre>
</code>
<p>I checked the running processes using <kbd>top</kbd> after the reboot and, guess what, no more <em>kworker</em> hogging the CPU.</p>
Simonhttps://www.suffix.be/blog/invincible-lem/The Invincible2023-11-20T11:00:00+01:002023-11-20T11:00:00+01:00A journey into Stanisław Lem’s space adventure.
<div typeof="Book" resource="#invincible">
<link property="bookFormat" href="https://schema.org/EBook" />
<figure>
<picture>
<source type="image/webp" srcset="../../assets/the-invincible.webp" />
<img src="../../assets/the-invincible.jpg" property="thumbnailUrl image" alt="The Invincible by Stanisław Lem book cover" />
</picture>
</figure>
<div property="review" typeof="Review">
<div property="reviewBody">
<p>I learned of the novel and its author, <span property="author" typeof="Person" resource="#lem" about="#invincible"><span property="name" about="#lem">Stanisław Lem</span></span>, from the <time>2023</time> <a href="https://store.steampowered.com/app/731040/The_Invincible/" title="The Invincible on Steam">computer game</a> with the same name by Starward Industries. The <time>1960</time>s retro-futuristic art style of the game piqued my interest. <a href="https://en.wikipedia.org/wiki/Fallout_(series)" title="Fallout series @ Wikipedia">Fallout</a> promptly came to mind. To avoid spoiling the story, I quit playing and read the book first.</p>
<p>The novel follows the crew of the spaceship Invincible as they investigate the fate of a sister ship that has disappeared on the remote planet Regis III, a desert world with a barren surface. To comprehend the spaceship and crew’s fate, more knowledge about the planet and its ecosystem is necessary. Astronautic Pilot Ghijahn, known as Rohan, narrates the story. Rohan grapples with the challenges of navigating the hostile and mysterious environment of this world, while also wrestling philosophical questions about reality, artificial intelligence, and the limits of human understanding.</p>
<p>What makes the story work is the hard <span property="genre" about="#invincible">science fiction</span> combined with philosophical themes. While Lem takes care to explain the scientific concepts that underpin the narrative, he pays equal attention to the deeper philosophical thoughts.</p>
<p>Written in <time>1964</time>, some of the crew’s tech now feels dated. They use drones but print the photos in their map room, for example. Not how we imagine an intergalactic spaceship today. The book has the <time>1960</time>s vibe, despite lacking the retro-futuristic graphics from the game. This doesn’t detract from the story. On the contrary, it makes you wonder how future generations will look back on our space travel ideas.</p>
<p>I later found out that the story is often seen as a criticism of Communist society and its oppressive nature. However, I didn’t interpret it that way. To me, it’s a fun exploration story in deep space with some thought-provoking reflections.</p>
<p><span property="name" about="#invincible">The Invincible</span> (<abbr title="International Standard Book Number">ISBN</abbr> <span property="isbn" about="#invincible">9780816491230</span>) <span property="reviewRating" typeof="Rating"><meta property="bestRating" content="5"><meta property="ratingValue" content="5">instantly established a place in <a href="../../reading" title="My reading list">my most favorite science fiction stories</a></span>!</p>
<p>Let's play the computer game now, I guess?</p>
</div>
</div>
</div>
Simonhttps://www.suffix.be/blog/koreader-kindle/Spicing my Kindle with KOReader2023-09-02T00:00:00+02:002023-09-02T20:00:00+02:00In search of a more privacy-friendly e-reader.
<figure>
<picture>
<source type="image/webp" srcset="../../assets/koreader-logo.webp">
<img src="../../assets/koreader-logo.png" width="250" height="79" alt="KOReader logo" />
</picture>
</figure>
<p>I own a <a href="https://wiki.mobileread.com/wiki/Amazon_Kindle_4" title="Amazon Kindle 4 @ MobileRead">Kindle 4</a>. Over 10 years old and scratched, but still works admirably. I like it. However, it’s no secret that Amazon <a href="https://www.theguardian.com/technology/2020/feb/03/amazon-kindle-data-reading-tracking-privacy" title="Article from the Guardian on what Amazon tracks">tracks</a> our reading habits. That, I don’t like.</p>
<p>I rooted my Kindle and installed <a href="https://koreader.rocks/" title="Custom software for e-reading devices">KOReader</a> because I didn’t want to feel like someone was watching me. KOReader is “a document viewer for E Ink devices.” An application to read books on e-readers, like a Kindle or Kobo. KOReader is free and open-source software with extra features like night mode, <a href="https://calibre-ebook.com/" title="E-book management software">Calibre</a> integration, fonts, statistics, and <a href="https://github.com/koreader/koreader/wiki/Features-list" title="KOReader feature list">more</a>. Its best feature: no tracking!</p>
<h2>Installation</h2>
<p>Installing KOReader is a breeze, but it needs a jailbroken Kindle. Jailbreaking is easy: copy some files on your Kindle over <abbr title="Universal Serial Bus">USB</abbr> and restart the device. The issue is there are too many files for each Kindle version, and that info is buried in the <a href="https://www.mobileread.com/forums">MobileRead forums</a>. Once jailbroken, you’ll need a launcher, and only then can you install the KOReader software.</p>
<p>I expected KOReader to replace the official Kindle software. At least on my old Kindle 4 <abbr title="Non Touch">NT</abbr> 2012, that’s not the case. The Kindle starts as normal, after which you open a launcher (which looks like a book in your reading list), from where you start KOReader. Once running, there is almost no need to return to the Kindle software.</p>
<h2>Experience</h2>
<p>KOReader mostly works as advertised. While maybe not as polished as the official Kindle software, KOReader packs a punch. Don’t like the font? Orientation? Sorting? Language? Screensaver? <abbr title="Secure Shell">SSH</abbr>? Its many features mean there are more menu items to dig through. Like Amazon, KOReader tracks the time and counts the pages you read. Unlike Amazon, it keeps these stats offline and makes them available to you, the reader, not some big multinational. You can even set the screensaver to a nice weekly summary of your reading progress.</p>
<p>KOReader focuses on touch devices, sensible I guess, but my Kindle 4 doesn’t have touch. The hardware buttons work, but need some getting used to. Finding the bottom menu, for example, needed to change the font size, took me a <a href="https://github.com/koreader/koreader/issues/10707" title="How to find the bottom menu on a Kindle 4 @ Github">while</a>. You can open it with the main square button while reading a book.</p>
<p>Then there is the Wi-Fi, activated from the menu, but there is no way to select a Wi-Fi network to connect to. I <a href="https://github.com/koreader/koreader/discussions/7686#discussioncomment-4033468" title="Wi-Fi toggle discussion on Github">learned</a> KOReader doesn’t implement its own Wi-Fi driver, so connecting to a Wi-Fi network needs to be done via the official Kindle software. Although a minor issue, my main concern is that KOReader doesn’t replace Kindle software, which still has internet access. I suppose this means the Kindle is still happily phoning home? It might collect less, since the actual reading is hidden from the official software, but it can still track the books on the device and the time it was active, can’t it?</p>
<p>I work around this by not connecting the device to a Wi-Fi network, but this obviously limits the usefulness of KOReader. You upload books to the Kindle via a cloud service or Calibre, but that only works when Wi-Fi is active. Uploading via USB currently doesn’t work on the KOReader Kindle version. For now, my only option is to exit the application, upload the book via USB, and restart KOReader.</p>
<h2>Conclusion</h2>
<p>KOReader makes my old Kindle feel fresh again, like an old dog learning new tricks. The main goal of installing something different, however, was to liberate the device from Amazon’s tracking. Given that KOReader runs as an application on top of the official Kindle software, I am not sure I attained that goal. My reluctance to enable Wi-Fi, for the same reason, combined with the lack of USB support, limits its usefulness. While KOReader definitely is an e-reader power tool, I am still unsure it offers the one feature I am looking for: privacy.</p>
Simonhttps://www.suffix.be/blog/lego-house-billund/Visiting the LEGO House in Billund2023-08-21T21:00:00+02:002023-08-21T21:00:00+02:00If ever there was a “children’s” museum, then this is it.
<figure>
<picture>
<source type="image/webp" srcset="../../assets/legohouse.webp">
<img src="../../assets/legohouse.jpg" width="400" height="400" alt="Photo of the LEGO House logo on a wall" />
</picture>
</figure>
<p>Everyone knows <a href="https://www.legoland.dk/en/" title="Official LEGOLAND Billund website">LEGOLAND Billund</a>, the must-see theme park for every LEGO fan and Denmark’s most visited tourist attraction outside of Copenhagen. However, did you know there is a LEGO museum in Billund as well? Inaugurated in 2017 the <a href="https://legohouse.com" title="Official LEGO House websit">LEGO House</a> resembles 21 interlocking bricks found in the centre of Billund, a 1.5 km walk from LEGOLAND. And spoiler, it's the dream museum for kids and adults alike!</p>
<p>We knew we had to at least see the LEGO House when visiting LEGOLAND earlier this month but were contemplating the additional 299 DKK (~€40) entrance fee. I am glad we did!</p>
<h2>Welcome</h2>
<p>The LEGO House website describes the visit as the “ultimate LEGO experience” where “anything is possible.” Great, but what does that mean?</p>
<p>After scanning your ticket, each visitor receives an <abbr title="Near Field Communication">NFC</abbr> wristband. This bracelet is central to your visit: it provides unlimited access for the day, so you can leave and enter the LEGO House as you please, but you also scan it at the various activities in the house. After your visit, you can download your pictures and videos from the day.</p>
<p>Enter via the winding stairs. In the centre, the <a href="https://legohouse.com/en-gb/press-releases/tree-of-creativity/" title="Tree of Creativity @ LEGO House">Tree of Creativity</a>, one of the world’s largest LEGO constructions: 15 meters tall and over 6 million bricks!</p>
<p>Arriving at the top <strike>brick</strike> floor there are 3 enormous dinos: one in DUPLO, one in SYSTEM and a third in Technic. On the sides: display cases with builds of <abbr title="Adult Fan Of LEGO">AFOL</abbr>s. The creativity in these masterpieces is incredible!</p>
<h2>Experience Zones</h2>
<p>The house has four “<a href="https://legohouse.com/en-gb/explore/experiences/" title="The Experience Zones @ LEGO House">experience zones</a>” with a variety of bricks to play with. That sounded tedious, and I thought we would be out quickly. Sure, brick building is fun but 4 times fun? I was seriously wrong. We stayed the entire day and had tons of fun. Why? Guided play!
<p>I was amazed at how well this worked. The earlier visitors’ builds on the shelves give you inspiration (staff members constantly collect the ugly ones and leave the nice ones, so you feel everyone is a master builder). The builds are small and easy enough to keep everyone interested, and since the whole family is building, we were constantly showing and helping each other.</p>
<p>This was key: we were playing together!</p>
<h3>Red Zone</h3>
<figure>
<picture>
<source type="image/webp" srcset="../../assets/legohouse-bee.webp">
<img src="../../assets/legohouse-bee.jpg" width="250" height="250" alt="Small model of a bee made out of LEGO bricks">
</picture>
<figcaption>Bzzzz bzzzz</figcaption>
</figure>
<p>The red zone has a lot of bricks and a huge colourful brick waterfall. Take bricks and construct something, simple. When finished, scan your wristband at one of the photo kiosks and take a picture. Leave your build on the shelf if you wish. There is a breakout area with multiple tables with smaller yellow and black parts where you assemble a bee (or many bees, we went a little overboard here).</p>
<h3>Yellow Zone</h3>
<figure>
<picture>
<source type="image/webp" srcset="../../assets/legohouse-flower.webp">
<img src="../../assets/legohouse-flower.jpg" width="250" height="250" alt="Model of a flower out of LEGO pieces">
</picture>
<figcaption>Tazzzty flowerzzzz</figcaption>
</figure>
<p>The yellow zone has you create a small 2D monster on a baseplate. Slide it into one of the machines, scan the wristband, and watch your dancing monster come to life. Next, you build a flower (it is remarkably easy to make a decent flower if LEGO selects the pieces you can use). Don’t forget to take a picture of the flower before moving on to the next section where you construct a fish (this one was hard). Scan the build and your fish swims to life in the virtual aquarium.</p>
<h3>Green Zone</h3>
<figure>
<picture>
<source type="image/webp" srcset="../../assets/legohouse-diorama.webp">
<img src="../../assets/legohouse-diorama.jpg" width="250" height="250" alt="Huge LEGO diorama of a bridge over a stream">
</picture>
<figcaption>Count the LEGO pieces</figcaption>
</figure>
<p>The green zone: 3 stunning dioramas and many small miniature stories to discover. Absolutely amazing! Like LEGOLAND’s <a href="https://www.legoland.dk/en/explore/the-park/attractions/miniland/" title="LEGOLAND’s miniature world with over 20 million bricks">Miniland</a>, but at minifig scale. Oh, wait for the room to go dark and admire the dioramas light up! Off in the corner, you can make a stop-motion movie in the Story Lab. The children build the minifig characters for the movie while the parents wait. Your movie station has a prebuilt backdrop, and you bring the set to life with different camera angles. Add music and, since they scan the bracelets, the credits are personalized automatically. This zone also has a section where you can build your own minifigure. Pose the minifig, choose a magazine cover and - snap - your own famous minifig.</p>
<h3>Blue Zone</h3>
<figure>
<picture>
<source type="image/webp" srcset="../../assets/legohouse-treehouse.webp">
<img src="../../assets/legohouse-treehouse.jpg" width="250" height="250" alt="Micro scale LEGO model of a tree house">
</picture>
<figcaption>SimCity in LEGO</figcaption>
</figure>
<p>The blue zone. Control a LEGO robot to drill holes, plant, and water seeds. Build a car and race it against each other or attempt to make it leap through a circle (our multi wheeled, solar powered contraption crashed multiple times). Play SimCity by building a few micro-scale buildings and placing them in the city with the other visitors’ buildings.</p>
<h2>Museum</h2>
<p>Oh, right, almost forgot, there is an actual museum too. Down in the basement you can find the origin story of LEGO from Ole Kirk Christiansen's wooden <a href="https://legohouse.com/en-gb/press-releases/exclusive-product-series/" title="The LEGO duck">duck</a> to the <a href="https://www.toysnbricks.com/lego-03110202-cop26-better-world-sustainability-building-instructions-2021/">custom LEGO sets</a> handed out during <abbr title="2021 United Nations Climate Change Conference">COP26</abbr>. Then there are iconic sets from each decade. I knew this would be a journey down memory lane. After boring my kids to death with “this was my favourite 1980s set, oh, wait this one was even better, see that one, we had that one, oh, look there” they quickly left me alone. A personal highlight, not so for my children. You know, everything was better in the eighties, especially <a href="https://breezewiki.esmailelbob.xyz/thelegomovie/wiki/Benny" title="Benny, the 1980s spaceman from the LEGO Movie">spaceships</a>!</p>
<h2>Brick Moulder</h2>
<p>On your way out, there is a functioning LEGO brick moulding machine. The machine moulds red 2×6 bricks, packaged in plastic bags. Scan your wristband and get a unique combination to arrange your 6 bricks. These bricks you can take home. There are bags with DUPLO blocks for the smaller ones, but these are not moulded on site.</p>
<figure>
<picture>
<source type="image/webp" srcset="../../assets/legohouse-bags.webp">
<img src="../../assets/legohouse-bags.jpg" width="250" height="250" alt="Plastic bags with LEGO and DUPLO bricks">
</picture>
<figcaption>Bags with 2×6 LEGO and DUPLO bricks</figcaption>
</figure>
<h2>Tickets</h2>
<p>If you plan to visit LEGOLAND, and you should, you can save 34% of your ticket if you buy it online. There is a LEGOLAND combi ticket that allows access to LEGOLAND and the LEGO House, but the price is the same as the online LEGOLAND + separate LEGO House tickets. You can find discounted LEGO House tickets for 269 DKK (~€36) on the LEGO House website if you plan to go on a quiet day or visit in the afternoon.</p>
<h2>Parking</h2>
<p>There is a paid parking close to LEGO House, but the ‘<a href="https://www.openstreetmap.org/way/529515052" title="Location of the fjernparkering @ OpenStreetMap">fjernparkering</a>’ (remote parking) is free and a 1 km walk from the LEGO House. Tip: park here when you visit LEGOLAND and save yourself the 60 DKK (~€8) LEGOLAND parking fee. The LEGO House fjernparkering is a 1.5 km walk from the LEGOLAND entrance.</p>
<h2>Food</h2>
<p>The LEGO House has its own restaurant, the <a href="https://legohouse.com/en-gb/explore/eateries/" title="Eateries @ LEGO House">MINI CHEF</a>, and café, the BRICKACCINO. The latter is your standard coffee and sandwich self-service place, but the MINI CHEF lets you build your own dish of LEGO bricks (each of the 4 bricks stands for an ingredient). Scan your order and pick it up by Robert and Roberta, the serving robots. Don’t forget to book a table for the MINI CHEF, however. Both eateries are on the ground floor and do not require an entrance fee to visit. As many museums in Denmark (to my pleasant surprise) there is a pick-nick area as well, bring your own lunch and save the Krones for the LEGO store.</p>
<h2>LEGO Store</h2>
<p>The house wouldn’t be complete without its own <a href="https://legohouse.com/en-gb/explore/lego-store/" title="The LEGO Store in the Home of the Brick">store</a>. No need for an entrance ticket. The store has a Minifigure Factory (design the body of a minifig, which is printed on a blank minifig body piece) and Mosaic Maker (turn your photo into a LEGO mosaic). Noteworthy are the wall decorations in the store, which are beautiful dioramas of Danish scenes, better than most builds in LEGOLAND <abbr title="In My Humble Opinion">IMHO</abbr>. Visit the store early, it gets busy near closing. Don’t worry they will keep your bags for the day.</p>
<p>Finally: store exclusives! This is where they got me. The store has a several <a href="https://legohouse.com/en-gb/explore/exclusive-products/" title="The excluse LEGO sets @ LEGO House">exclusive</a> LEGO sets. The best known one being the model of the LEGO House itself: “<a href="https://rebrickable.com/sets/21037-1/lego-house/#parts" title="LEGO set 21037 @ Rebrickable">LEGO House Architecture (21037)</a>”. I hadn’t bought any sets for my adult self yet, but I, eh, gave in.</p>
<p>Take a small detour back to the parking at the end of the day via the <a href="https://www.openstreetmap.org/way/589932789#map=17/55.73279/9.12131" title="Location of the parc on OpenStreetMap">Symbolik park</a> and daydream about working at LEGO’s main campus.</p>
<p><a href="https://en.wikipedia.org/wiki/Everything_Is_Awesome" title="Theme song of the 2014 LEGO MOVIE">Everything Was AWESOME!!!</a></p>
Simonhttps://www.suffix.be/blog/nix-runtime-environment-variables/Nix Runtime Environment Variables2023-04-30T22:00:00+02:002023-05-01T00:00:00+02:00Assigning environment variables at runtime in nix configurations.
<p>How do you include environment variables in your nix configurations when the application runs? Let’s take the <a href="https://devcenter.heroku.com/articles/heroku-cli" title="Application to create and manage Heroku apps directly from the terminal">Heroku <abbr title="Command Line Interface">CLI</abbr></a> client as an example.</p>
<p>The Heroku CLI normally updates itself. An important feature, but not so on nix. Nix wants to be <a href="https://nixos.org/" title="Nix’ homepage">reproducible and declarative</a>. A version change needs to be explicit. Fortunately, Heroku has a method to prevent automatic updates through an environment variable. Add <kbd>HEROKU_DISABLE_AUTOUPDATE=1</kbd> before running the Heroku CLI and all is good. Nice, but how do we add this to our nix configuration? We don’t want to specify the variable manually each time we run the client.</p>
<h2>makeWrapper</h2>
<p>Nix has a solution: wrapper scripts. Add the “makeWrapper” function to your build inputs, and use the “wrapProgram” function to replace the binary with a script that adds the variable before calling the real application.</p>
<figure class="highlight"><pre><code class="language-nix" data-lang="nix"><span class="nv">nativeBuildInputs</span> <span class="o">=</span> <span class="p">[</span> <span class="nv">pkgs</span><span class="o">.</span><span class="nv">makeWrapper</span> <span class="p">];</span>
<span class="nv">postInstall</span> <span class="o">=</span> <span class="s2">''</span><span class="err">
</span><span class="s2"> wrapProgram $out/bin/heroku --set HEROKU_DISABLE_AUTOUPDATE 1</span><span class="err">
</span><span class="s2">''</span><span class="p">;</span></code></pre></figure>
<p>For non-flake declarations, you will also have to include the “makeWrapper” function on the <a href="https://github.com/NixOS/nixpkgs/blob/b00a5321bb61a745357ee2f8107e91369cc392db/pkgs/development/tools/heroku/default.nix#LL1C1-L1C48">first line</a>.</p>
<p>On building the package and inspecting the overall result, you will recognize the Heroku script is exporting the variable as foreseen before invoking the wrapped version.</p>
<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nv">$ </span><span class="nb">cat </span>result/bin/heroku
<span class="c">#! /nix/store/xxx-bash-5.1-p16/bin/bash -e</span>
<span class="nb">export </span><span class="nv">HEROKU_DISABLE_AUTOUPDATE</span><span class="o">=</span><span class="s1">'1'</span>
<span class="nb">exec</span> <span class="nt">-a</span> <span class="s2">"</span><span class="nv">$0</span><span class="s2">"</span> <span class="s2">"/nix/store/xxx-heroku-7.66.4/bin/.heroku-wrapped"</span> <span class="s2">"</span><span class="nv">$@</span><span class="s2">"</span></code></pre></figure>
Simonhttps://www.suffix.be/blog/adguard-home-raspberry-ubuntu-core/Self updating ad blocking with AdGuard Home2023-04-10T16:00:00+02:002023-04-10T18:00:00+02:00Fully automated network-wide DNS ad blocking for free.
<figure>
<picture>
<source type="image/webp" srcset="../../assets/adguard.webp" />
<img src="../../assets/adguard.png" property="thumbnailUrl" alt="AdGuard Home dashboard screenshot" />
</picture>
</figure>
<p>We all use ad blockers in our browsers, but what about the other devices on our network, such as smartphones and televisions?</p>
<p>That is where a <a href="https://pi-hole.net/" title="A popular network-wide ad blocker">Pi-hole</a> or <a href="https://adguard.com/en/adguard-home/overview.html" title="My favorite network-wide ad blocker">AdGuard Home</a> comes in, as a replacement for the network’s <abbr title="Domain Name Server">DNS</abbr>. When an app, website, or device requests an advertisement, the DNS examines the request against a known list of advertisers and trackers and, if it matches, pretends the ad or tracker does not exist. It is not waterproof but performs admirably.</p>
<p>I don’t want to babysit a DNS on my network, so I run a Raspberry Pi with <a href="https://ubuntu.com/core" title="Self updating Linux distribution">Ubuntu Core</a> and AdGuard Home as a <a href="https://ubuntu.com/core/services/guide/snaps-intro" title="What is a snap?">snap</a>. Ubuntu Core is designed for embedded <abbr title="Internet of Things">IoT</abbr> devices and depends on snap packages, but it’s the automatic updates that are valuable to us. Because snaps update automatically, as the core <abbr title="Operating System">OS</abbr> does, and AdGuard automatically updates its block lists, we have a hands-off network-wide ad and tracking blocker!</p>
<h2>Ubuntu Core</h2>
<p>First, you will need an <abbr title="Secure Digital">SD</abbr> card with Ubuntu Core installed. The <a href="https://www.raspberrypi.com/software/" title="Raspberry Pi Imager download page">Raspberry Pi Imager</a> makes this a piece of cake. Select “Other general-purpose OS” → “Ubuntu” → “Ubuntu Core” in the Raspberry Pi Imager. Specify the SD card as the storage device and write the image to it.</p>
<p>While the image is being written on the card, create an <a href="https://login.ubuntu.com/" title="Free account for Ubuntu related services">Ubuntu One</a> account with an <abbr title="Secure Shell">SSH</abbr> key; you will need it when the Raspberry boots.</p>
<p>Insert the written SD card into the Raspberry Pi and follow the on-screen instructions.. Although you can connect the Pi to your Wi-Fi network, an Ethernet cable will provide a faster and more reliable connection. Not a luxury, since it will take charge of all DNS requests.</p>
<h2>AdGuard Home</h2>
<p>After configuring Ubuntu Core, SSH into the Raspberry and install the AdGuard Home snap. During installation, AdGuard will take issue with the Ubuntu DNSStubListener, so deactivate it while in command line mode.</p>
<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nb">sudo </span>snap <span class="nb">install </span>adguard-home
<span class="nb">sudo mkdir</span> <span class="nt">-p</span> /etc/systemd/resolved.conf.d
<span class="nb">sudo </span>vi /etc/systemd/resolved.conf.d/adguardhome.conf</code></pre></figure>
<p>If the adguardhome.conf file and directories do not already exist, create them.</p>
<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="o">[</span>Resolve]
<span class="nv">DNS</span><span class="o">=</span>127.0.0.1
<span class="nv">DNSStubListener</span><span class="o">=</span>no</code></pre></figure>
<figcaption class="highlight">↑ Add this to the adguardhome.conf resolved configuration</figcaption>
<p>Restart systemd-resolved, the service that provides network name resolution.</p>
<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nb">sudo </span>systemctl reload-or-restart systemd-resolved</code></pre></figure>
<p>On your computer’s browser, navigate to “http://ip_of_your_pi:3000” and complete the AdGuard configuration steps.</p>
<h2>Router</h2>
<p>Your router will have a <abbr title="Domain Name Server">DNS</abbr> <abbr title="Internet Protocol">IP</abbr> setting. On UniFi networks, go to “Settings” → “Networks” → edit the selected network → “DHCP” → “DHCP Service Management” → “DHCP DNS Server”. Replace that address with the IP address of the Raspberry. You can usually find the IP address in your router’s settings and on the Raspberry’s screen. The Raspberry is now responsible to translate domain names in IP addresses. When the browser asks for an ad or tacker it simply responds with “does not exist”. Simple but effective.</p>
<p>Once configured, browse around as usual and watch the AdGuard dashboard come to life.</p>
<p>Adding <a href="https://ublockorigin.com/" title="uBlock Origin, the best content filter">ad blocking</a> capabilities to your browser makes it even better; the more layers of protection, the better, like an <a href="https://www.quotes.net/mquote/85881" title="Quote from Shrek">onion</a>.</p>
<h2>mDNS (optional)</h2>
<p>You still need to use the Raspberry’s IP address to access the AdGuard dashboard. Not too bad, but we can do better: <abbr title="Multicast DNS">mDNS</abbr> (also known as zeroconf, Bonjour or Avahi). Simply add the <a href="https://snapcraft.io/avahi">avahi</a> snap to the Raspberry Pi and set the hostname to something that makes sense.</p>
<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nb">sudo </span>hostnamectl set-hostname <span class="s1">'adguard'</span>
<span class="nb">sudo </span>snap <span class="nb">install </span>avahi</code></pre></figure>
<p>You can now access the AdGuard web dashboard via http://adguard.local/ from your <abbr title="Local Area Network">LAN</abbr>.
Simon