<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>DoneBySimon</title><description>Things done, by Simon.</description><link>https://donebysimon.be/</link><item><title>Kortrijk 14-18</title><link>https://donebysimon.be/2013/11/01/kortrijk-14-18/</link><guid isPermaLink="true">https://donebysimon.be/2013/11/01/kortrijk-14-18/</guid><description>Kortrijk in the first world war, day by day, 100 years ago.</description><pubDate>Fri, 01 Nov 2013 05:23:41 GMT</pubDate><content:encoded>&lt;p&gt;I had the idea to revive the first world war in Kortrijk via Twitter. This way, a tweet would pop up in your timeline and would make you think about it for a minute.&lt;/p&gt;
&lt;p&gt;It turned out that &lt;a href=&quot;https://www.google.be/books/edition/Kortrijk_14_18/Bn4dAQAAMAAJ?hl=nl&amp;amp;gbpv=0&amp;amp;bsq=kortrijk%2014%2018&quot;&gt;Egied van Hoonacker wrote a book about the day-by-day events in Kortrijk&lt;/a&gt; during that period of time. This was a goldmine to say the least. I used the book as a source for the tweets.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/Kortrijk1418/&quot;&gt;https://twitter.com/Kortrijk1418/&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Het station en stationsplein worden door bommen beschadigd, alle ruiten op het plein zijn kapot. 2 soldaten en een burger overlijden. &lt;a href=&quot;https://t.co/gRri6vyl5f&quot;&gt;pic.twitter.com/gRri6vyl5f&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— Kortrijk 14-18 (@Kortrijk1418) &lt;a href=&quot;https://twitter.com/Kortrijk1418/status/924176431608889344?ref_src=twsrc%5Etfw&quot;&gt;October 28, 2017&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>BudaBeachBot</title><link>https://donebysimon.be/2017/05/01/budabeachbot/</link><guid isPermaLink="true">https://donebysimon.be/2017/05/01/budabeachbot/</guid><description>When a boat passes by, a picture is taken and tweeted.</description><pubDate>Mon, 01 May 2017 05:18:43 GMT</pubDate><content:encoded>&lt;p&gt;At the Buda Beach in Kortrijk, there is a webcam looking at the Leie. I made a bot that tweets a picture of every boat that passes by.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/budabeachbot&quot;&gt;https://twitter.com/budabeachbot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/budabeachbot/status/1101166241908178944&quot;&gt;https://twitter.com/budabeachbot/status/1101166241908178944&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Materials used&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A bunch of hacky scripts, really...&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Een Tesla voor Simon</title><link>https://donebysimon.be/2017/09/19/een-tesla-voor-simon/</link><guid isPermaLink="true">https://donebysimon.be/2017/09/19/een-tesla-voor-simon/</guid><description>Mine me monero for a Tesla</description><pubDate>Tue, 19 Sep 2017 05:34:35 GMT</pubDate><content:encoded>&lt;p&gt;When browsing to &lt;a href=&quot;https://eenteslavoorsimon.be/&quot;&gt;eenteslavoorsimon.be&lt;/a&gt;, the visitor helps mining Monero cryptocurrency for me. This way I could become immeasurable rich. The only concern I would have is to pick the color of the Tesla.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20170921124423/https://eenteslavoorsimon.be/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Media attention&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.demorgen.be/economie/simon-wil-graag-een-tesla-en-u-kunt-hem-daarbij-helpen-b123f36e/&quot;&gt;De Morgen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kw.knack.be/west-vlaanderen/nieuws/onderwijs-en-jeugd/docent-howest-wil-tesla-verdienen-met-jouw-computer/article-normal-279253.html&quot;&gt;Krant van West-Vlaanderen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Update&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Coinhive (de dienst achter &lt;a href=&quot;https://t.co/AFeBrQJXSB&quot;&gt;https://t.co/AFeBrQJXSB&lt;/a&gt;) is gestopt. We kloppen of op 197 226 752 hashes (&lt;a href=&quot;https://twitter.com/hashtag/merci?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#merci&lt;/a&gt;) goed voor 0,02561 XMR. Met een transaction fee van 0,005 XMR heeft dit 0,02060 XMR opgebracht. 1 XMR is op dit moment €44.12&lt;br /&gt;
Still, totally worth it 🤑&lt;/p&gt;
&lt;p&gt;— Simon Vanherweghe (@donebysimon) &lt;a href=&quot;https://twitter.com/donebysimon/status/1106099705237393408?ref_src=twsrc%5Etfw&quot;&gt;March 14, 2019&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>Everywhere I go, it&apos;s disco</title><link>https://donebysimon.be/2018/01/27/everywhere-i-go-its-disco/</link><guid isPermaLink="true">https://donebysimon.be/2018/01/27/everywhere-i-go-its-disco/</guid><description>When the theme for a party is &apos;disco&apos;</description><pubDate>Sat, 27 Jan 2018 05:54:24 GMT</pubDate><content:encoded>&lt;p&gt;One could dress up like a real disco star, or one could just wear a disco ball on their back. I chose the latter. This way I could provide the stars...&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.instagram.com/p/BecZ-DjhC58&quot;&gt;https://www.instagram.com/p/BecZ-DjhC58&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Materials used&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;wood&lt;/li&gt;
&lt;li&gt;disco ball&lt;/li&gt;
&lt;li&gt;flashlight&lt;/li&gt;
&lt;li&gt;shoulder straps&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>TabCyclist</title><link>https://donebysimon.be/2019/02/20/tabcyclist/</link><guid isPermaLink="true">https://donebysimon.be/2019/02/20/tabcyclist/</guid><description>Cycle through your open tabs</description><pubDate>Wed, 20 Feb 2019 05:50:16 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=donebysimon.tabcyclist&quot;&gt;Extension for VS Code&lt;/a&gt; that lets you cycle through your open tabs like a slideshow.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded></item><item><title>Buda Kitchen Bot</title><link>https://donebysimon.be/2019/06/18/buda-kitchen-bot/</link><guid isPermaLink="true">https://donebysimon.be/2019/06/18/buda-kitchen-bot/</guid><description>Ask your Google assistant for the menu</description><pubDate>Tue, 18 Jun 2019 19:47:28 GMT</pubDate><content:encoded>&lt;p&gt;A &lt;a href=&quot;https://assistant.google.com/services/a/uid/0000004f817c7aef?hl=nl&quot;&gt;Google Assistant action&lt;/a&gt; you can ask what&apos;s on the menu today at &lt;a href=&quot;http://budakitchen.be&quot;&gt;Buda Kitchen Kortrijk.&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Vloryan</title><link>https://donebysimon.be/2021/12/26/vloryan/</link><guid isPermaLink="true">https://donebysimon.be/2021/12/26/vloryan/</guid><description>A disguised IKEA hack</description><pubDate>Sun, 26 Dec 2021 19:40:06 GMT</pubDate><content:encoded>&lt;p&gt;There is a quite famous IKEA hack out there called a &lt;a href=&quot;https://www.exploringlife.be/ikea-hack-learning-tower/&quot;&gt;learning tower&lt;/a&gt;. It consists out of two IKEA items, an &lt;a href=&quot;https://www.ikea.com/be/en/p/oddvar-stool-pine-20249330/&quot;&gt;ODDVAR stool&lt;/a&gt; and a &lt;a href=&quot;https://www.ikea.com/be/en/p/bekvaem-step-stool-aspen-10225589/&quot;&gt;BEKVAM stepstool&lt;/a&gt; that you attach to each other.&lt;/p&gt;
&lt;p&gt;When this item appeared on a gift list, we had a couple of options. We could buy both and just hand over the boxes, we could give it already assembled, or we could present it like an IKEA product as if we took it off the shelf. Off course, I went for the last option. I even painted some parts, so they would match the already existing furniture in the house it would end up.&lt;/p&gt;
&lt;h2&gt;The manual&lt;/h2&gt;
&lt;p&gt;With a mix of Illustrator, InDesign and Sketchup I created &lt;a href=&quot;@images/posts/2022/12/vloryanmanual.pdf&quot;&gt;a manual completely in the IKEA style.&lt;/a&gt; I&apos;ve updated the screws needed and made sure the renderings reflected the actual product.&lt;/p&gt;
&lt;h2&gt;The box&lt;/h2&gt;
&lt;p&gt;It was a bit of a puzzle to pack all the items as tight as possible. Luckily, we had some cardboard boxes lying around that were the perfect size. I&apos;ve added some extra cardboard to the sides to make sure the parts wouldn&apos;t move around. Since I almost surgically opened the plastic bags with the screws, I was able to fill them with the correct amount of screws and seal them again with my vacuum sealer from in the kitchen.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;The result&lt;/h2&gt;
&lt;p&gt;It couldn&apos;t be better, since the first reaction I heard was &quot;I didn&apos;t know they sell them like that&quot;&lt;/p&gt;
&lt;p&gt;Mission succeeded!&lt;/p&gt;
</content:encoded></item><item><title>Waldschattenspiel</title><link>https://donebysimon.be/2021/12/27/waldschattenspiel/</link><guid isPermaLink="true">https://donebysimon.be/2021/12/27/waldschattenspiel/</guid><description>A board game in the dark</description><pubDate>Mon, 27 Dec 2021 20:15:25 GMT</pubDate><content:encoded>&lt;p&gt;It was when we were visiting &lt;a href=&quot;https://www.manufactum.de/&quot;&gt;Manufactum&lt;/a&gt; that I discovered &lt;a href=&quot;https://de.wikipedia.org/wiki/Waldschattenspiel&quot;&gt;Waldschattenspiel&lt;/a&gt;. It is a game you play in the dark with a little candle. The goal is to hide your pawns in the shadows of the trees.&lt;/p&gt;
&lt;p&gt;For a gift, I decided to make a version of this game myself. I had some old veneer lying around, this seemed like the perfect opportunity to see what was possible with that material and a laser cutter. After some tests, I was able to create a mosaic for the playing field. The main difficulty here was that the veneer was warped. I tried some different techniques to flatten it out, but in the end I had to settle with a little bit of deformation in the circles that were cut.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Instead of making a board and a case, I made a case with the board on the back, you&apos;ve probably seen this before with chess boards. I&apos;ve lined the inside with felt to give it a nice finish. There are even magnets to keep the board close, but this didn&apos;t work out as well as I hoped.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The gift was received with a lot of enthusiasm, but it turned out I forgot to mention something in the game rules...&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded></item><item><title>Social Banking App</title><link>https://donebysimon.be/2022/04/02/social-banking-app/</link><guid isPermaLink="true">https://donebysimon.be/2022/04/02/social-banking-app/</guid><description>A fake banking app to reward participants for completing challenges.</description><pubDate>Sat, 02 Apr 2022 14:58:06 GMT</pubDate><content:encoded>&lt;p&gt;For a bachelor party where the groom happens to be a banker, we&apos;ve decided it would be nice to get things started a couple of weeks before the event. This way, all the participants got a chance to get to know each other in advance. So we came up with the idea of a banking app with some extra features. By fulfilling all kinds of challenges with the groom (without his knowledge) participants could earn virtual money.&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;An overview of a user his bank account&lt;/li&gt;
&lt;li&gt;Transfer money to other users (hey, it was a banking app after all)&lt;/li&gt;
&lt;li&gt;An overview of all the investments to make (the challenges)&lt;/li&gt;
&lt;li&gt;News section&lt;/li&gt;
&lt;li&gt;Live chat&lt;/li&gt;
&lt;li&gt;FAQ section&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Tech stack used&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/&quot;&gt;Next.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fauna.com/&quot;&gt;FaunaDB&lt;/a&gt; for the database&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pubnub.com/&quot;&gt;Pubnub&lt;/a&gt; for the chat&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mantine.dev/&quot;&gt;Mantine&lt;/a&gt; for the UI&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Portrait plotter</title><link>https://donebysimon.be/2022/05/02/portrait-plotter/</link><guid isPermaLink="true">https://donebysimon.be/2022/05/02/portrait-plotter/</guid><description>A plotter that draws a picture of you</description><pubDate>Mon, 02 May 2022 21:01:00 GMT</pubDate><content:encoded>&lt;p&gt;It all started with a note in our mailbox during corona: &quot;Present yourself, your hobbies, via the front window of your house&quot;.&lt;/p&gt;
&lt;p&gt;I wanted to present something interactive, and I had a pen plotter available, so I decided to make a little site where neighbors could upload a picture and get a plotter drawing of it.&lt;/p&gt;
&lt;p&gt;It had some attention, people tried it and were happily surprised with the result.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Next iteration&lt;/h2&gt;
&lt;p&gt;When we saw the call for makers for the &lt;a href=&quot;https://www.makerfairegent.be/&quot;&gt;Maker Faire&lt;/a&gt; at the office, I talked about this project and suggested we could use our &lt;a href=&quot;https://axidraw.com/&quot;&gt;AxiDraw&lt;/a&gt; to create something similar.&lt;/p&gt;
&lt;p&gt;We decided to ditch the app and let people queue to let their picture get taken. You can &lt;a href=&quot;https://github.com/devinekask/postcard-portrait-plotter&quot;&gt;take a look at the code&lt;/a&gt; yourself, but this is how it works:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There is an Arduino micro hooked up to two buttons. The Arduino can act like a keyboard, so when you press a button, it will send a keystroke to the computer.&lt;/li&gt;
&lt;li&gt;The whole thing runs in Node.js using &lt;a href=&quot;https://github.com/google/zx&quot;&gt;zx&lt;/a&gt;, it is like bash scripting, but then in node. I like it.&lt;/li&gt;
&lt;li&gt;When the command to take a picture is received, the native photo booth app is opened and a picture is taken. By running AppleScript from the Node.js script... An approach &lt;a href=&quot;aboutme.be&quot;&gt;Wouter&lt;/a&gt; came up with, nice one!&lt;/li&gt;
&lt;li&gt;When the command to plot a new picture from the queue, the picture goes through a couple of steps:
&lt;ul&gt;
&lt;li&gt;The picture is cropped to a postcard-ratio, taking the position of one or more faces into account. &lt;a href=&quot;https://github.com/jwagner/smartcrop-sharp&quot;&gt;Smartcrop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A Python script then transforms the cropped picture into a line drawing (SVG) &lt;a href=&quot;https://github.com/LingDong-/linedraw&quot;&gt;Linedraw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The SVG gets simplified and optimized for plotting with &lt;a href=&quot;https://vpype.readthedocs.io/en/latest/&quot;&gt;vpype&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Finally, the optimized SVG is then plotted with the &lt;a href=&quot;https://axidraw.com/&quot;&gt;AxiDraw&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Results&lt;/h2&gt;
&lt;p&gt;During the &lt;a href=&quot;https://www.makerfairegent.be/&quot;&gt;Maker Faire&lt;/a&gt;, we had a lot of visitors who were intrigued by the plotter and wanted to let their picture get drawn. We ran into a queue of multiple hours, so we had to refuse people at some point. The algorithm that translates a picture into a line drawing can bring surprising results now and then, but overall, people were happy with the result.&lt;/p&gt;
</content:encoded></item><item><title>Sleep trainer</title><link>https://donebysimon.be/2022/09/01/sleeptrainer/</link><guid isPermaLink="true">https://donebysimon.be/2022/09/01/sleeptrainer/</guid><description>A custom-made sleep trainer made out of Lego</description><pubDate>Thu, 01 Sep 2022 06:12:25 GMT</pubDate><content:encoded>&lt;p&gt;Kids and sleep, it takes some time to get these two in harmony, to say the least. There are things called a &apos;sleep trainer&apos; that let your child know when it&apos;s okay to get out of bed. Some of these are clocks which will open their eyes when it&apos;s time to get up. Others have lights in them. They come in all kinds of shapes and sizes. We&apos;ve tried a couple of them, but we (and they...) were never really happy with them. The light is too bright, another light starts to shine a half hour before it&apos;s time to get up, or they simply figured out how to open the eyes by themselves...&lt;/p&gt;
&lt;p&gt;At one point we were playing with old Lego bricks (they were left behind when we bought our house) making a tower. Since we had some transparent bricks, the tower evolved into a lighthouse. So the idea came up to add a light to it and turn it into a sleep trainer.&lt;/p&gt;
&lt;h2&gt;Materials used&lt;/h2&gt;
&lt;p&gt;I&apos;ve used an ESP32 for this. It&apos;s a small board, something like an Arduino, but it comes with Wi-Fi out of the box. Normally, it&apos;s a bit more of a low-level approach since I&apos;m running &lt;a href=&quot;https://www.home-assistant.io/&quot;&gt;Home Assistant&lt;/a&gt; here, I decided to use &lt;a href=&quot;https://esphome.io/&quot;&gt;ESPHome.&lt;/a&gt; This framework allows you to configure the ESP32 in a yaml file, and it will generate the code for you.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;All I&apos;ve needed was an RGB LED and some resistors, so this was a good starting project.&lt;/p&gt;
&lt;p&gt;It was &lt;a href=&quot;aboutme.be&quot;&gt;Wouter&lt;/a&gt; who mentioned a &lt;a href=&quot;https://www.adafruit.com/product/571&quot;&gt;&apos;perma-proto&apos;&lt;/a&gt; board to me. It&apos;s a step in between a breadboard and a prototype board. These things are great to use. They don&apos;t require that much soldering.&lt;/p&gt;
&lt;h2&gt;Automation&lt;/h2&gt;
&lt;p&gt;The integration with Home Assistant is pretty straight forward. I have an &apos;sleep trainer&apos; entity which I can use within an automation. I have one running for the weekdays and one for the weekends (where they can sleep in a bit longer...)&lt;/p&gt;
&lt;p&gt;Via the Home Assistant app, I can turn the light on or off and even change the color.&lt;/p&gt;
&lt;h2&gt;Result&lt;/h2&gt;
&lt;p&gt;Do they stay in bed longer? Sometimes they do, sometimes they don&apos;t, but they can explain the concept very well ;-)&lt;/p&gt;
</content:encoded></item><item><title>Shifts planning</title><link>https://donebysimon.be/2023/04/27/shifts-planning/</link><guid isPermaLink="true">https://donebysimon.be/2023/04/27/shifts-planning/</guid><description>An update to the shift filling process</description><pubDate>Thu, 27 Apr 2023 18:48:14 GMT</pubDate><content:encoded>&lt;p&gt;As a volunteer for a &lt;a href=&quot;https://textival.be&quot;&gt;local festival&lt;/a&gt;, I was looked in my direction for an overhaul of the shifts planning process. In the preceding years, people saw a public spreadsheet and mailed their preferred shifts to the organizers. The organizers then had to manually add the shifts to the spreadsheet. This was a lot of work, and vulnerable to errors.&lt;/p&gt;
&lt;p&gt;The goal was to make it easier for the volunteers to sign up for shifts, and to make it easier for the organizers to manage the shifts.&lt;/p&gt;
&lt;p&gt;The first thing that came to mind was the use of so called no-code tools. These are tools that allow you to create applications without writing code. After gaining some more information with my colleagues, I decided to use &lt;a href=&quot;https://airtable.com&quot;&gt;Airtable&lt;/a&gt;. I&apos;ve signed up for Airtable since it was more or less a layer on top of Google Sheets, but now it has grown into a full-fledged database application.&lt;/p&gt;
&lt;h2&gt;The process&lt;/h2&gt;
&lt;p&gt;What I feared came true, I soon hit the limits of Airtable. The main thing I wanted, was the user to be able to filter the shifts based on the type or moment. This was simply impossible, Airtable provided simply straight forward forms inputs.&lt;/p&gt;
&lt;p&gt;The way Airtable lets you connect multiple spreadsheets was still a big plus, and I decided to use it as a backend. I created a front-end with React and MUI for the interface.&lt;/p&gt;
&lt;h2&gt;Update&lt;/h2&gt;
&lt;p&gt;After some tests, it came clear I overlooked an important advantage of the public spreadsheet: people saw with which other volunteers they could do a shift. This is a critical thing to convince people, so I made an update to the application.&lt;/p&gt;
&lt;p&gt;I listed all the names of the people who already signed up for the shift, and I made it clear where we still needed some folks.&lt;/p&gt;
&lt;p&gt;The whole project involved some other screens to gain some more information about the volunteers, but in the end the process went smooth.&lt;/p&gt;
</content:encoded></item><item><title>Textivalkrant</title><link>https://donebysimon.be/2023/05/03/textivalkrant/</link><guid isPermaLink="true">https://donebysimon.be/2023/05/03/textivalkrant/</guid><description>A mobile program guide with a funny twist</description><pubDate>Wed, 03 May 2023 19:58:30 GMT</pubDate><content:encoded>&lt;p&gt;For a &lt;a href=&quot;https://textival.be&quot;&gt;local festival&lt;/a&gt; I was asked to make some kind of digital program guide. There was a focus on reducing the amount of print, so a dedicated mobile site for the schedule and other useful information was a logical approach.&lt;/p&gt;
&lt;p&gt;To keep the sponsors happy, they also had to be given some exposure there. The problem was: how to display more than 20 sponsors on a mobile site? No one would sit back and swipe to a carousel of sponsors.&lt;/p&gt;
&lt;h2&gt;Butt crack&lt;/h2&gt;
&lt;p&gt;The theme of the festival was &apos;construction&apos; and low hanging pants was already been mentioned a couple of times. So I came up with the idea of hacking the mobile page refresh. Instead of refreshing the page, one would pull down a construction workers pants and a new sponsor would pop up.&lt;/p&gt;
&lt;p&gt;The pull down hack was implemented quite easily. Off course there were some differences between Android and iOS, but they were easily resolved.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Probability&lt;/h2&gt;
&lt;p&gt;To decide which sponsor would pop up, I wrote a serverless function that returns a specific sponsor, the higher they sponsored, the bigger the chance they will be returned.&lt;/p&gt;
&lt;p&gt;I based the algorithm on this genius piece of code. I don&apos;t entirely grasp how it works, but it does…&lt;/p&gt;
&lt;p&gt;&amp;lt;script src=&quot;https://gist.github.com/alesmenzel/6164543b3d018df7bcaf6c5f9e6a841e.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;h2&gt;Sponsor logos&lt;/h2&gt;
&lt;p&gt;Everyone that had to publish something with lots of sponsors on it gets it: all those logos with different colors, orientations, and dimensions are terrible to work with. I wanted them all to be at the bottom of the screen, like a banner. But that meant that I had to get them within the same dimension, pick a background color, center the logo and so on. And when it would turn out that they needed some more padding, I would have to do it all over again. I don&apos;t think there was any extra motivation necessary to script this job.&lt;/p&gt;
&lt;p&gt;&amp;lt;script src=&quot;https://gist.github.com/SimonVanherweghe/a7d64572b0f27a665ab941df7c60e3ab.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;h2&gt;The result&lt;/h2&gt;
&lt;p&gt;You can have a look at &lt;a href=&quot;https://textivalkrant.vercel.app&quot;&gt;textivalkrant.vercel.app&lt;/a&gt; but be aware it was meant to be viewed on a mobile device. People scanned QR codes that were on the tables.&lt;/p&gt;
&lt;h2&gt;Credits&lt;/h2&gt;
&lt;p&gt;I can&apos;t finish this post without giving credits to &lt;a href=&quot;https://www.instagram.com/pieter.depoortere/&quot;&gt;Pieter Depoortere&lt;/a&gt; and &lt;a href=&quot;https://www.agatasmok.be/&quot;&gt;Agata Smok&lt;/a&gt; for the graphics and style guidance. Go check them out.&lt;/p&gt;
</content:encoded></item><item><title>New year&apos;s cards</title><link>https://donebysimon.be/2024/01/12/new-years-cards/</link><guid isPermaLink="true">https://donebysimon.be/2024/01/12/new-years-cards/</guid><description>Personalized New Year&apos;s crosswords cards made with the plotter.</description><pubDate>Fri, 12 Jan 2024 21:00:30 GMT</pubDate><content:encoded>&lt;p&gt;For our new year&apos;s cards, I wanted to make use of my pen plotter. I&apos;ve had that goal since a couple of years, but I never really found a good concept. This year I came up with the idea of a crossword about all those little enjoyable things in life. We would like to wish you a lot of those moments.&lt;/p&gt;
&lt;p&gt;With the concept clear, Lotte and I began to collect a list of those moments. We quickly found around 15 of them, so I went on and started to focus on the crossword algorithm and the drawing of it.&lt;/p&gt;
&lt;p&gt;To make use of the plotter, I need vector files. Preferably SVG because they are easily to transform to gcode, the language that a CNC, the plotter can understand.
I think I technically could have made use of p5 to generate those SVG&apos;s, but I wanted to gain some more experience with &lt;a href=&quot;https://vpype.readthedocs.io/en/latest/index.html&quot;&gt;Vpype&lt;/a&gt;, &apos;the Swiss Army knife for creating, modifying and/or optimizing plotter-ready vector graphics.&apos; It can create some basic geometry (enough for crosswords) but also has the nice feature it can create Hershey text. You have to be aware a plotter can only draw lines, contours, but no fills (unless you start hatching) but characters of a regular font are shapes, so they require fills. Hershey fonts are made out of simple line strokes, perfect for plotting. I quickly was able to create a grid, adding little numbers inside them and created filled (hatched) squares if necessary. Good proof of concept, time to focus on the algorithm.&lt;/p&gt;
&lt;h2&gt;A crossword algorithm&lt;/h2&gt;
&lt;p&gt;I couldn&apos;t imagine I was the first one who would like to make a crossword in JavaScript, the language I&apos;m most familiar with. I had some extra requirements that I should be able to implement afterwards. The one that popped out was written in JS, but clearly of &lt;a href=&quot;https://github.com/fabnun/conwords-generator&quot;&gt;a Spanish-speaking developer&lt;/a&gt;. With the help of some AI, it was quite easily translated tot English, so I could start adopting it to my needs.&lt;/p&gt;
&lt;p&gt;The first requirement was that it must contain certain words, I wanted to include the names of the addressed. In a rather cheesy way, we would like to wish they found the happiness inside them...&lt;/p&gt;
&lt;p&gt;So I fiddled around, tried to grasp the inner algorithm of that library and made some words mandatory. I had some results, but then, when I decreased the grid from 50x50 to something like 20x10 (to fit on a 1/3 A4 page) things got bad: there were very large black areas, filled only half of the area or the words were all mangled up. It came clear to me that I would need a massive amount of words to make this work. I only had around 25 of them at that time (we later made it to 45)&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The grid was all messed up by trying to obligate some words&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So I abandoned the idea of a so called &apos;American style&apos; crossword, the one with black squares now and then. I decided to go for a &apos;criss-cross&apos; variant. This isn&apos;t just a matter of ignoring those black squares. All the words have to be connected somehow with eachother, no islands. This wasn&apos;t possible with the Spanish algorithm I was using, so I went on and looked for another one.&lt;/p&gt;
&lt;p&gt;It looked like an &lt;a href=&quot;https://github.com/satchamo/Crossword-Generator&quot;&gt;13 years old script&lt;/a&gt; could do the job. Some quick test confirmed that there were no islands occuring. It generated quite quickly, so I decided to just keep on generating new versions until all of my requirements were met instead of coding all my requirements in the algorithm...
The first one was the occurrence of the addressed
Another one is that the whole area should be filled (read: left/right/top/bottom col/row shouldn&apos;t be empty)
But then I still had some crosswords with quite empty areas. So I asked GitHub Copilot how I could calculate the surface of empty areas. This is an example of how one could learn with the help of AI. The so called &lt;a href=&quot;https://en.wikipedia.org/wiki/Depth-first_search&quot;&gt;depth-first search algorithm&lt;/a&gt; did the job. Hello recursion.&lt;/p&gt;
&lt;p&gt;Finally, I had them. I could create crosswords that were unique to every addressed and met all my requirements. I saved them as JSON files, representing every character in the grid and their according clues.&lt;/p&gt;
&lt;h2&gt;Drawing&lt;/h2&gt;
&lt;p&gt;Back to the generation of the drawing. I like to make use of zx. It is like writing bash scripts, but then in Node.js, JavaScript. I can create statements to execute python scripts (&lt;a href=&quot;https://vpype.readthedocs.io/en/latest/index.html&quot;&gt;Vpype&lt;/a&gt; is Python) which create the SVG&apos;s. Although it can be tricky to escape strings and passing long statements, it&apos;s really convenient to orchestrate almost anything from a node script.&lt;/p&gt;
&lt;p&gt;Hail to Vpype, what a great flexible tool to generate and optimize vector images. The way I created the crossword grid -by drawing squares where a character needs to be written-, results in overlapping lines. After splitting all the squares into individual lines, one can merge lines who have overlapping start/end points. Together with some shortest path optimizing this resulted into weird zigzag patterns instead of straight lines (which I expected). I still don&apos;t know if this would be possible with Vpype. The drawing time was acceptable, so I didn&apos;t look further into it. There was an issue first with some squares who didn&apos;t align perfectly. After tightening the belt on my plotter, this was luckily solved.&lt;/p&gt;
&lt;p&gt;For the queues on the backside of the card, I had to run some tests to find out the optimal font size. We adjusted some paraphrasing off the clues, so everything was readable, but fitted neatly on one line. Vpype has an option to wrap text on a new line, but there is no way to find out if it has done it. So this could be a problem for the start position of the next clue.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;I wanted to share the solution in some way, so a website was the most logical step for me. I provided a solution SVG, created a unique code based on the addressed (which I also use for the file naming)
The URL had to be something short, easy and linked to the project. Terms like &apos;word&apos; and &apos;luck&apos; were some keywords I searched for, but I eventually settled with &lt;code&gt;oploss.in/g&lt;/code&gt; (Dutch for &lt;code&gt;solut.io/n&lt;/code&gt;, which was already taken)
The generation of the site was a breeze with Astro, but the domain name kept on failing to resolve. As it turned out, it was listed as &apos;serverHold&apos;. As for today, this isn&apos;t resolved... This really is a bummer, I postponed the sending of the cards for a couple of weeks because of this. Eventually I decided to just to hand them out, or it would be too late.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Conveyor&lt;/h2&gt;
&lt;p&gt;I made a conveyor belt script that plots the grid, the clues in sequence. Between every step it waits for a key press, so I can switch papers.&lt;/p&gt;
&lt;p&gt;Since I was already plotting, I decided to also write the addresses on the envelopes with the plotter and include them in the conveyor. Those came out really well.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;The code&lt;/h2&gt;
&lt;p&gt;If you&apos;re interested, the whole thing is open source. You can find it on &lt;a href=&quot;https://github.com/SimonVanherweghe/crossword-cards&quot;&gt;GitHub&lt;/a&gt;, have fun with it, and a happy New Year!&lt;/p&gt;
</content:encoded></item><item><title>A-maze-ing new year</title><link>https://donebysimon.be/2025/01/06/a-maze-ing-new-years-cards/</link><guid isPermaLink="true">https://donebysimon.be/2025/01/06/a-maze-ing-new-years-cards/</guid><description>A new year, a new card. This year I&apos;ve made everyone a unique maze to solve, with a hidden message included.</description><pubDate>Mon, 06 Jan 2025 19:49:57 GMT</pubDate><content:encoded>&lt;p&gt;Like &lt;a href=&quot;/2024/01/12/new-years-cards/&quot;&gt;last year&lt;/a&gt;, I wanted to create a unique New Year’s card for my friends and family. This time, I designed a maze where the path spelled out “2025”, adding a fun twist to the traditional maze puzzle.&lt;/p&gt;
&lt;h2&gt;Maze Algorithms&lt;/h2&gt;
&lt;p&gt;I found several insightful articles about &lt;a href=&quot;https://cloudfour.com/thinks/generating-random-mazes-with-javascript/&quot;&gt;maze generation&lt;/a&gt; and &lt;a href=&quot;https://bost.ocks.org/mike/algorithms/#maze-generation&quot;&gt;maze algorithms in general&lt;/a&gt;, including &lt;a href=&quot;https://professor-l.github.io/mazes/&quot;&gt;Professor L’s detailed explanations&lt;/a&gt; and &lt;a href=&quot;https://www.jamisbuck.org/mazes/&quot;&gt;Jamis Buck’s resources&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For this project, I chose Wilson’s algorithm. Based on &lt;a href=&quot;https://en.wikipedia.org/wiki/Loop-erased_random_walk&quot;&gt;loop-erased random walks&lt;/a&gt;, it seemed ideal for implementing a fixed path that spelled out “2025&quot;. The algorithm creates a random walk, erases any loops when the path intersects itself, and continues until the maze is complete. &lt;a href=&quot;https://professor-l.github.io/mazes&quot;&gt;Professor L’s explanation&lt;/a&gt; provides an excellent deep dive into the mechanics of Wilson’s algorithm.&lt;/p&gt;
&lt;p&gt;As a test, I created a version with a pre-defined path already embedded in the maze. The starting point was the maze’s entrance, and the random walker was given a target: the beginning of the pre-defined path. The walker kept moving randomly until it reached the target, at which point the path was drawn. The same process was repeated for the exit and the end of the path. Additional paths were then created from random starting points, following the original algorithm—random walking, erasing loops, and connecting to the existing paths. This ensured the maze was filled with intricate routes while preserving the visibility of the original path.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Type Creation&lt;/h2&gt;
&lt;p&gt;What initially seemed simple —drawing “2025” in a maze— turned out to be more challenging than expected. The path had to be a single continuous stroke with no intersections or interruptions. After sketching some ideas on paper, I realized that creating outlines for the digits would provide more flexibility for a continuous path and make the design stand out.&lt;/p&gt;
&lt;p&gt;I developed a custom tool for this. It featured a grid where I could toggle cells on or off, and ultimately export the data for use in the maze algorithm. At first, I experimented with drawing basic shapes for the digits and connecting them into a single line.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I settled on a version where the start and end points were on opposite sides of the path, which made more sense visually and functionally.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I created three different sizes for the characters to balance their scale: large enough to fill the maze and allow space for dead ends, but small enough to fit on the card.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Generating SVGs with D3 and Node.js&lt;/h2&gt;
&lt;p&gt;Once the “2025” path was finalized, I needed to convert it into an SVG for plotting. This is where &lt;a href=&quot;https://d3js.org/&quot;&gt;D3.js&lt;/a&gt;, a powerful visualization library, came into play. Maybe not the perfect tool for the job, but I was keen to have more experience with it. Although D3 is typically used in the browser, I needed to run in a Node.js environment to automate the process.&lt;/p&gt;
&lt;p&gt;D3 requires a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction&quot;&gt;DOM&lt;/a&gt; to manipulate SVGs, but Node.js doesn’t have a built-in DOM parser. Initially, I used &lt;a href=&quot;https://github.com/jsdom/jsdom&quot;&gt;JSDOM&lt;/a&gt;, but it was painfully slow, taking minutes to generate a single SVG. After some research, I switched to a faster solution: combining &lt;a href=&quot;https://github.com/WebReflection/linkedom&quot;&gt;linkedom&lt;/a&gt; with &lt;a href=&quot;https://github.com/neg4n/d3-no-dom&quot;&gt;d3-no-dom&lt;/a&gt;, which reduced the generation time to just a few seconds.&lt;/p&gt;
&lt;h2&gt;Finishing Touches&lt;/h2&gt;
&lt;p&gt;To complete the card, I adjusted the walls, changing them from thick blocks to single lines. I used &lt;a href=&quot;https://vpype.readthedocs.io/en/stable/index.html&quot;&gt;Vpype&lt;/a&gt; to eliminate overlapping lines, connect nearby endpoints, translate the design into G-code for the plotter, and optimize the plotting sequence.&lt;/p&gt;
&lt;p&gt;The back of the card featured our New Year’s wishes and our names. I reused last year’s script to plot all the addresses on the envelopes.&lt;/p&gt;
&lt;p&gt;Happy New Year!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded></item><item><title>A Bright Year</title><link>https://donebysimon.be/2026/01/11/a-bright-year/</link><guid isPermaLink="true">https://donebysimon.be/2026/01/11/a-bright-year/</guid><description>New Year’s cards that glow in the dark, created with a plotter and scratch paper.</description><pubDate>Sun, 11 Jan 2026 10:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This year’s New Year’s cards turned into quite the experiment. I pulled out my plotter again, but instead of the usual pen on paper, I went for scratch cards — the kind with a black coating that hides a surprise underneath.&lt;/p&gt;
&lt;p&gt;Before diving into the mechanical setup, I worked on the design phase. In the center of each card I wanted a bold 2026, surrounded by fireworks. I had an AI model generate a couple of different firework types to explore complexity and shapes until I found a few that worked well for plotting.&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;a few AI‑generated fireworks designs with different styles&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Then came the numbers. To give the “2026” some texture, I also relied on an AI model to generate a custom hatching library — a whole collection of line‑based fills that could be plotted.&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;A couple of shapes to check if the hatching library works as expected&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Once the design was ready, the real hardware tinkering began. Scratch paper posed its own challenges: the small wooden stylus that came in the kit didn’t even make a dent when mounted in the plotter. I improvised, experimenting with a drill bit, a large screw, and even added weights to get better contact pressure.&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;a close‑up of the plotter with the improvised scratching tool mounted.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The first version of the plot took a painstaking 30 minutes to complete. By simplifying the fireworks and cleaning up overlapping lines, I eventually cut that down to around 15 minutes per card — still long, but much more reasonable.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;In the end, the results weren’t perfect. Some lines didn’t scratch cleanly, and a few designs came out patchy or misaligned. I suspect it had something to do with the scratch paper coating or the direction of the screw in the plotter.&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;A pile of tests and failures&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;But despite the imperfections, I sincerely hope that someone at home switched off the lights and had a delightful surprise in the dark. If not, maybe the hint at the back of the card will light a spark with someone:&lt;/p&gt;
&lt;p&gt;“Een stralend jaar toegewenst” — wishing you a bright year.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded></item><item><title>Sjaaltafel</title><link>https://donebysimon.be/2026/02/20/sjaaltafel/</link><guid isPermaLink="true">https://donebysimon.be/2026/02/20/sjaaltafel/</guid><description>A warm scarf that doubles as multiplication table exercises.</description><pubDate>Fri, 20 Feb 2026 20:02:00 GMT</pubDate><content:encoded>&lt;p&gt;I have a soft spot for machines that bring something out of the digital world, right in the physical world. I like how they translate from a pixel-perfect, double-precision world, to our imperfect physical world. But let us call them happy accidents, opportunities. One is able to create almost everything digital and the fact that you can multiply this by all kinds of material, just broadens our possibilities.&lt;/p&gt;
&lt;p&gt;It must have been via &lt;a href=&quot;https://makezine.com/article/craft/how-to_hacking_the_brother_kh/&quot;&gt;Make:&lt;/a&gt; back in the days that I first got to know that one could hack a knitting machine. I watched &lt;a href=&quot;https://www.youtube.com/watch?v=vKpdFIlbqSY&quot;&gt;the video&lt;/a&gt; a couple of times and I always kept remembering it at the back of my head. Printing with yarn? Yes please!&lt;/p&gt;
&lt;p&gt;I was always on the lookout for one of those on a flea market. Meanwhile, the &lt;a href=&quot;https://www.ayab-knitting.com/&quot;&gt;AYAB (All Yarns Are Beautiful)&lt;/a&gt; project was born. They raised the hacking part to another level by providing the components to create an Arduino Hat. You simply need to swap the inner computer of the knitting machine with those new Arduino brains and connect it to your computer. Doing so, your computer can control the position of the needles, based on a provided bitmap. You can knit forever.&lt;/p&gt;
&lt;p&gt;So a couple of years ago, I finally found a decent second hand offer and took the bait. And it was... difficult. I had no knitting experience. Even without the hack, those things aren&apos;t plug and play. But with the manual and the AYAB documentation, I was able to create some tests.&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The mandatory &apos;Hello World&apos;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I never really made anything worth mentioning with it. Part of it because of the backside of the knitted piece: that is full of loose yarn, the so called floats. It seemed inevitable with my type of setup.&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The floats on the back&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;And then it hits me&lt;/h2&gt;
&lt;p&gt;At the moment, it&apos;s all multiplication tables (&apos;maaltafels&apos; in Dutch) here at home. And suddenly, I was riding my bike, the wordplay &apos;sjaaltafel&apos; came to me. (&apos;sjaal&apos; -&amp;gt; scarf, &apos;tafel&apos; -&amp;gt; table) It stuck to me and I thought it would be fun to practice multiplication tables through a scarf. First you would have to roll the entire thing up, by unrolling you would see a multiplication, by further unrolling you would see the result, and so on and on.&lt;/p&gt;
&lt;h2&gt;With a little help&lt;/h2&gt;
&lt;p&gt;I want to pause for a moment on how I created the design, or &lt;em&gt;created something that can create the design&lt;/em&gt;. I discussed the idea —typing while walking— with Gemini on my mobile phone. I wanted a tool that would let me change parameters like sizes, padding, table selection etc. I asked if it would be possible to do something about the floating on the back. There was no straight solution for this, but the best alternative was to make the scarf double as wide, fold it in the middle and sew the 2 loose sides together. This way the floats are tucked away inside the scarf. It even showed me some pictures on how to manually sew it together. Fine for me. I still asked to add some random dots on it, simply to make the floats a bit more manageable.&lt;/p&gt;
&lt;p&gt;Then, I asked it to create technical instructions on how to create a tool that let me generate those designs, so I could pass it to another coding model. I handed that over to Copilot that was running in the cloud on a fresh repository. Once I got home, the whole thing was up and running. Was it perfect? No, but surely good enough.&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;This way I was able to quickly make adjustments to the design&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;The final touches, a lot of them&lt;/h2&gt;
&lt;p&gt;And here we have it. A finished sjaaltafel. It took me quite some time to manually sew everything by hand, but with some skilled advice from my relatives, I made it. It&apos;s not perfect, but I&apos;m happy with the result, up to the next one!&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
</content:encoded></item></channel></rss>