<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Raymon Zutekouw</title>
    <description>Personal blog</description>
    <language>en-us</language>
    <link>https://raymon.dev</link>
    <atom:link href="https://raymon.dev/posts/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Automation fascination</title>
      <link>https://raymon.dev/posts/2021/10/automation-fascination.html</link>
      <guid>https://raymon.dev/posts/2021/10/automation-fascination.html</guid>
      <pubDate>Fri, 24 Oct 2021 09:00:00 GMT</pubDate>
      <description><![CDATA[
        <p> So to do it in style, here is again a post about the website itself. Post writing on this website has gone full-circle; From a custom file format to nice minimal org-files. Now even the identifiers for the posts are redundant, year and month buckets the posts enough to prevent name collisions. </p>  <p> If you want to look at the hack-job that made it possible, it is right here: <a href="https://github.com/Raymonzut/Personal-Website/commit/4cebaf550bc1316cba5d0971240029ee6d536a2a">Folder by year/month commit</a> </p> 
]]></description>
    </item>

    <item>
      <title>Having fun with creating silly music</title>
      <link>https://raymon.dev/posts/2025/4/having-fun-with-creating-silly-music.html</link>
      <guid>https://raymon.dev/posts/2025/4/having-fun-with-creating-silly-music.html</guid>
      <pubDate>Mon, 07 Apr 2025 17:00:00 +0200</pubDate>
      <description><![CDATA[
        <p> There is just something that does not click in my brain when it comes to music, or so I thought. When I say this to other people, the usual advice is that &ldquo;you just have to practise more&rdquo;. That is probably true, but I never got around being good enough with an instrument to get creative with it. It was the hurdle that took the enjoyment out of music for me, because I wanted to make songs, not fight with the instrument. </p>  <p> But then came a day where I tried making music digitally, and that changed the whole situation around. It is a lot of fun to just mess around with music in that way, and I started to understand why there are so many people who like music production. And there is this awesome genre of music that I discovered, called <a href="https://en.wikipedia.org/wiki/Chiptune">chiptune music</a>, which also feels very fitting as video game music. </p>  <p> Previously I made it in a little program called Bosca Ceoil, the name of the program is literally music box in Irish. There still is an active fork of the program called <a href="https://yurisizov.itch.io/boscaceoil-blue">Bosca Ceoil: The Blue Album</a>, which also works in the webbrowser. With it you can quickly create this kind of music, within minutes you can make a small tune like this: </p>  <audio controls src="/assets/audio/dual_saw_madness.wav"></audio>  <p> With only a single instrument, you can already add a lot of variety, but it is way more fun to add more instruments. It is amazing what some people can make with just a few simple sounds, they can make the entire audio for a video game with it or mixtapes that last hours. You can probably do a way better job than me, so I would encourage to give it a try and have fun. </p>  <p> For now it is more a personal experiment to make music, but who knows what I will do with the music in the future. </p> 
]]></description>
    </item>

    <item>
      <title>Code modularity is replaceability</title>
      <link>https://raymon.dev/posts/2023/3/code-modularity-is-replaceability.html</link>
      <guid>https://raymon.dev/posts/2023/3/code-modularity-is-replaceability.html</guid>
      <pubDate>Sat, 25 Mar 2023 22:41:00 +0100</pubDate>
      <description><![CDATA[
        <p> What is the benefit of putting code into multiple files? What is the benefit to the reader of the code? What does it constrain your design on? </p>  <p> When you have a module in your code, you could export everything and import everything where you use it. You can have a rough equivalent #include&rsquo;s, and end up with a source file that is just split up over multiple files. That is, if you import by following a collapsible structure, a DAG to be specific, without tangling it into cycles. </p>  <p> Although this is useful, it is a small benefit compared to code with sectioning if you do not hide implementation details. Modules that reach outwards to grab stuff are not necessarily a threat to replaceability. They can be part of code up in a hierarchy, and here is the key; that can only give it&rsquo;s benefit if you mostly abide by it. The further you stray from it, less of its properties are true. </p>  <p> Concrete example: a hierarchy for a single page application. In this example your application has pages, pages have components, components use data and utilities to act on it. A page describes what is shown, and picks the parts to compose it. </p>  <p> This hierarchy has the property that allows re-use the more you use it. But beware, this is a fine balance between verbosity and re-usability. The intuition that is worth having here is that code has a good-enough placement in the program at any given point. As discussed in <a href="https://raymon.dev/posts/2023/2/when-duplication-helps.html">the post about duplication</a>, duplication and abstraction go hand in hand; you can move between the two if you follow a design. </p>  <p> You do not know what is best for the system in advance, as you don&rsquo;t know the requirements that come it. But you can design it as such that changing the system allows you to still reason with it, and not relearn it like it is a completely new system. Code modularity is both about saving you as a developer effort, and saving your teammates the effort to relearn specifics. If you design your code with library design in mind, you are already taking modularity into account. </p>  <p> And if you write code that the linter complains about, take it as a hint to also consider your overall design. And if you write code that you name very similar across modules, unroll the imports manually and see what your code ends up being. Put your existing code together experimentally, if you try to figure out the fault of the design. Make it painfully obvious when the same concepts have separately evolved implementations. It is inevitable that you write this kind of code, you are human afterall, right? </p> 
]]></description>
    </item>

    <item>
      <title>Programmer onboarding</title>
      <link>https://raymon.dev/posts/2022/7/programmer-onboarding.html</link>
      <guid>https://raymon.dev/posts/2022/7/programmer-onboarding.html</guid>
      <pubDate>Tue, 19 Jul 2022 19:27:00 +0200</pubDate>
      <description><![CDATA[
         <div id="outline-container-orgb706a5b" class="outline-2"> <h2 id="orgb706a5b">The usual</h2> <div class="outline-text-2" id="text-orgb706a5b"> <p> Most developers know the typical onboarding story. It goes something like this: </p>  <ul class="org-ul"> <li>Get introduced to your new team</li> <li>Get introduced to their workflow</li> <li>Get introduced to their current work</li> <li>Get a breakdown of what you could be working on</li> </ul>  <p> While this is already great, there is something that completes a programming onboarding. And that is your first contribution on your first day. </p>  <p> For some this contribution is force pushing an empty repository onto remote, and causing a policy change. But for most, it is tiny like fixing a typo. Because even though it tiny, it is still a change that has to go through all the systems the other members use daily. </p> </div> </div>  <div id="outline-container-org141fcdb" class="outline-2"> <h2 id="org141fcdb">Own experience</h2> <div class="outline-text-2" id="text-org141fcdb"> <p> Recently, I went through an onboarding that went just like this. During the onboarding presentation, presentors might touch on an annoyance that is still in the codebase. It is often something so small they refuse to go through the hassle of fixing it. But guess who would benefit from it; you, you fixing that. </p>  <p> So that is exactly what I did during that onboarding, as it: </p>  <ul class="org-ul"> <li>required making a commit</li> <li>that was on a published branched according to their naming scheme</li> <li>that was following templates, coherent with the addressed issues</li> <li>that followed their task-schedule for the coming weeks</li> </ul>  <p> Still small things to learn, but already more than what first meets the eye. this all comes up along the way, whilst being prompted with a dozen login prompts with seemingly the sole purpose to make you remember your credentials once and for all. </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>Why is your site not static</title>
      <link>https://raymon.dev/posts/2020/7/why-is-your-site-not-static.html</link>
      <guid>https://raymon.dev/posts/2020/7/why-is-your-site-not-static.html</guid>
      <pubDate>Fri, 10 Jul 2020 13:20:00 GMT</pubDate>
      <description><![CDATA[
        <p> First of all, let&rsquo;s talk about the post page. When I was designing it, there were a few choices. </p>  <p> I could make all the posts as HTML and serve them statically. The only parts that change from post to post are the content, date and title. This would work fine, but it has one flaw: the network traffic has a lot of boilerplate HTML. Why bother the server with that? </p>  <p> The API that comes with this website already serves the data that changes for each post. The job of the post page is to show it in the format you are used to. Besides that, you can always read the posts via the <a href="https://raymon.dev/api/posts/rss.xml">RSS feed</a> (link deprecated, see top of post). </p>  <p> Although it saves a bit of data, it does make the website overengineered. A good friend pointed out that the pages can use caching, if you use a static site. As a bonus, more of the JavaScript can be removed, which is another victory for the website. So the website will move towards being more static, as that suits the small scale better. </p> 
]]></description>
    </item>

    <item>
      <title>Building the Wiki</title>
      <link>https://raymon.dev/posts/2022/9/building-the-wiki.html</link>
      <guid>https://raymon.dev/posts/2022/9/building-the-wiki.html</guid>
      <pubDate>Tue, 26 Sep 2022 21:43:00 +0200</pubDate>
      <description><![CDATA[
        <p> When choosing where to store my notes, having one clear place to store is most important to me. That is why I didn&rsquo;t have much preference for the medium at first, as long it was only one. </p>  <p> This post is part two of the journey to build a life-long information system. </p>  <p> &#x2014; </p>  <p> The <a href="https://raymon.dev/posts/2022/9/building-the-bullet-journal-collection.html">previous post in this series</a> ended with questioning where the book notes should live. </p>   <p> It lead to creating a personal wiki; <a href="https://vimwiki.github.io">vimwiki</a>. The export-to-html feature was nice to view the notes on other devices. The tools allowed to mass-edit digital notes, with the classical folder-per-notebook slowly breaking down and relating more notes as it was so easy. </p>  <p> The other major feature was it supporting multiple file-types; also Markdown which made it fully compatible with markdown-tools like <a href="https://obsidian.md/">Obsidian</a>. And that is where the volume of notes really took of, as the digital tooling encouraged a growth mindset so you have more to link notes to. The wiki part in vimwiki was the most misleading, as my initial thought was to create a structure resembling <a href="https://www.wikipedia.org/">WikiPedia</a>. That created a linked mess, a growth mindset set on volume instead of set on quality; contribution mindset. </p>  <p> Consider this task; make the block of hash-symbols rectangular, no holes if you draw a rectangle around it: </p> <div class="org-src-container"> <pre class="src src-python"><span style="color: #928374;"># </span><span style="color: #928374;">#   #</span> <span style="color: #928374;">#######</span> <span style="color: #928374;">#######</span> </pre> </div> <p> It is a common theme to have solutions be an addition instead of a removal, most would fill the top row instead of removing the top 3. Ow, and if you said that it didn&rsquo;t specify you could remove symbols, did you even consider it? </p>  <p> The unconscious doing because it looks neat is also is the enemy for people that work with Obsidian, because they like the look of their huge graph: </p>   <div id="org5e041db" class="figure"> <p><img src="https://nicolevanderhoeven.com/assets/graph_view-20210518.png" alt="graph_view-20210518.png" width="800px" /> </p> <p><span class="figure-number">Figure 1: </span>Large graph of notes</p> </div>  <p> That is the hidden cost of digital note-taking if left unaware; copying is so easy on a computer, that you barely have to process the information. Common remedies are writing everything in your own words, separating a place to reference quotes and literature and quitting digital all together; which will be discussed in the next part. </p> 
]]></description>
    </item>

    <item>
      <title>MBLF</title>
      <link>https://raymon.dev/posts/2022/1/mblf.html</link>
      <guid>https://raymon.dev/posts/2022/1/mblf.html</guid>
      <pubDate>Sat, 15 Jan 2022 10:30:00 GMT</pubDate>
      <description><![CDATA[
         <div id="org130ae43" class="figure"> <p><img src="../../../assets/images/mblf.png" alt="mblf.png" /> </p> <p><span class="figure-number">Figure 1: </span>The original cover for the first spec/docs of MBLF</p> </div>   <div id="outline-container-orga9f31ea" class="outline-2"> <h2 id="orga9f31ea">Into the land of Fucks</h2> <div class="outline-text-2" id="text-orga9f31ea"> <p> Brainfuck has always been an interesting language, because it shows how little is needed to make the computer compute. But as it implies by the name, it is a pain to write larger programs with. </p>  <p> So most programmers would only toy around with the language a bit and move on. <a href="https://circl-lastname.github.io/">A good friend of mine</a> delved deeper into the Brainfuck world, and wanted to make it <a href="https://circl-lastname.github.io/mblf/">more like an assembly language; MBLF.</a> </p>  <p> The first version was mostly a proof of concept. It was made at a time when we both toyed around with <a href="https://raymon.dev/posts/2021/8/making-compilers.html">making compilers</a>. </p>  <p> Since then, I have rewritten that original version with a proper Pest grammar in Rust; It is available on <a href="https://crates.io/crates/mblf">crates.io.</a> </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>When duplication helps</title>
      <link>https://raymon.dev/posts/2023/2/when-duplication-helps.html</link>
      <guid>https://raymon.dev/posts/2023/2/when-duplication-helps.html</guid>
      <pubDate>Wed, 22 Feb 2023 22:21:00 +0100</pubDate>
      <description><![CDATA[
        <p> Duplication, do you address it yourself or is the compiler addressing it? At every point you see duplication, I consider it a choice you have to make. &ldquo;Well, duplication is bad, I should abstract it&rdquo; is the common answer here. But duplication can also be an answer, and here is why. </p>  <p> From the point of the compiler, it shouldn&rsquo;t affect the behavior of the code. It should be purely for organizing code. That is if you take optimizations and concurrency with a grain of salt. It should be a benefit to the reader, which are the other programmers that will read this code later. This includes your future self, so you better make sure the code is readable. </p>  <p> But, how will this work when the program needs to change? Because the programmer will attempt to change the code to fit new requirements. And if the abstraction doesn&rsquo;t fit anymore, the idea behind the abstraction got outdated. </p>  <p> To get rid of the now wrong abstraction, you first identify how the abstraction works and their concrete counterparts. Implicit rules of the language become explicit, like inheritance turns into explicit delegation; by duplicate calling structure and further by duplicate code. </p>  <p> And then you have it unrolled, right in front of your eyes, to the most modifiable state you need, all the way down to assembly if you wish. And then you freely make the needed change, a specific change to the code that takes in the new requirement. The skill is to know what to write, so the code as a whole can be re-abstracted, and it won&rsquo;t be the old code with the new requirement as a blob. Code is never in a perfect state, but to leave it as the latter is neglecting the code. </p>  <p> How would this re-abstracting work? An oversimplified example would be taking a for-each loop, with the requirement that you only take the even indices. Assuming imperative programming, by this plan you would unroll into a for loop with a counter. Then you make the change by changing the advancement part. That puts the new requirement idea in and the old one out. </p>  <p> But that syntax has too much variability for this idea, so the code is under-abstracted for this idea. I find it ugly to set the counter to zero and the loop condition to remain within bounds; too much focus on the how and prone to typing errors. So you re-abstract. It might sound silly to do this for a for loop, remember that this is an oversimplified example. As having the for-each loop is clearer, even if you know it won&rsquo;t fit new requirements. I argue it is better to keep the code as simple it can be for your current requirements. You can bring benefit to the future reader by keeping it simple, and not use that code further once new requirements come in. Otherwise the tendency for future-proofing is too strong. It fits with developing incrementally; each version of your project got the refactoring it needed and is usable. </p>  <p> Real requirements can go against your whole architecture. The programmer will start to panic and realize the design is crumbling down when changing the code to the requirement. It is a divide and conquer against the code, which at every step you break open the needed parts to fit the requirement. Abstracting is solidifying the ideas, while keeping duplication is accepting you don&rsquo;t want to maintain the current underlying idea to that extend. Keeping duplication to a degree is delaying the second step of this plan to the future, a future where this idea is perhaps not relevant anymore. Where importance has dropped, and it isn&rsquo;t the center of your design anymore. </p>  <p> The center of your design serves as the opposite, the parts you don&rsquo;t want to change. You accept the high risk for the high reward it gives, for the months that will follow and don&rsquo;t have to work with too open code. </p>  <p> In summary: </p>  <ol class="org-ol"> <li>Code has a lifetime, bound to whenever the idea behind it changes.</li> <li>Duplication is bliss while discovering change.</li> </ol> 
]]></description>
    </item>

    <item>
      <title>Reversed Digital Notes</title>
      <link>https://raymon.dev/posts/2022/11/reversed-digital-notes.html</link>
      <guid>https://raymon.dev/posts/2022/11/reversed-digital-notes.html</guid>
      <pubDate>Thu, 17 Nov 2022 22:50:00 +0100</pubDate>
      <description><![CDATA[
        <p> Now that I have an Antinet, there is a new place to keep notes. Making them takes a bit more time, which is a natural filter to make them concise and to the point. </p>  <p> I wanted to re-use the notes I already had, and I came up with an interesting migrating strategy. The default would be to discard the old note, except for the lines that are still relevant and make sense to tell myself right now, to remind myself of later. That turned out to not be much, as a bunch was already internalized for the years I had it, no more need to keep it around; it had fulfilled its purpose. </p>  <p> The notes left were still interlinked. This sparked yet another idea: what if the purpose of the digital notes it so converge to no-connection notes? That the connections that are present represent draft connections, before I migrate it into the analog notes? Then the digital notes are truly capture notes, minimal, and made with a clear purpose. </p>  <p> So that is the way I will be doing it for the time being, letting go of everything that has used up its value. </p> 
]]></description>
    </item>

    <item>
      <title>Perfect Programming Languages</title>
      <link>https://raymon.dev/posts/2022/11/perfect-programming-languages.html</link>
      <guid>https://raymon.dev/posts/2022/11/perfect-programming-languages.html</guid>
      <pubDate>Wed, 16 Nov 2022 21:20:00 +0100</pubDate>
      <description><![CDATA[
        <ul class="org-ul"> <li>(Lisps)</li> <li>Rust</li> <li>Scala</li> </ul> 
]]></description>
    </item>

    <item>
      <title>What practice means to me</title>
      <link>https://raymon.dev/posts/2022/8/what-practice-means-to-me.html</link>
      <guid>https://raymon.dev/posts/2022/8/what-practice-means-to-me.html</guid>
      <pubDate>Sat, 06 Aug 2022 14:19:00 +0200</pubDate>
      <description><![CDATA[
        <p> Currently my life was never impossibly hard; it is only hard because I chose to make it hard. The area where this shows the most is in exercising, working out. I could be a couch potato every day, programming is not physically challenging in any way. So I like to mix it up a few times a week. </p>  <p> It can feel like an obsession if you keep yourself to strict rules to do something daily. That also blinds you for what you are pursuing; progress. It is not that you practice so you can say you tried every day. You practice so you can achieve a goal and have fun along the way, who cares how much effort it took. </p>  <p> Sometimes it is easy to forget this if you only look at metrics, for programming this can be the amount of commits or the days with coding activity. To make progress also means changing what you think you are capable of because you can do more after making progress. </p>  <p> Because let&rsquo;s be honest: If you had other areas in your life where you did hard stuff because you wanted to, you can do more than just &ldquo;ow lemme do 2 more pushups, phew done it, almost sweated&rdquo; That would just hold you back by pretending you are a complete beginner constantly; use the skills you have to enhance the advice. The best heuristic for physical exercise I have found thus-far is the 40% rule. What you are physically capable of is like a battery that gives warnings when it is being depleted. The 40%-depletion warning is when you get the thought &ldquo;i am so done, i can&rsquo;t do any more of these&rdquo;. You surely know how to extrapolate this, but just in case: if that thought pops up at 20 pushups, your target for that set is 50. It is just a warning, a thought, a notification, letting you know where you are at. Because in nature, you would not survive by draining yourself to 0 for simple task; you would be too easy of a target for predators. </p>  <p> &ldquo;But what if I go to far?&rdquo; Well, have you, and if so: did you not recover? Injuries aside, which risk can greatly be reduced, finding the upper limit is a good way to set a baseline. Exercise is a fine balance, discover both sides to know the meaning of the signs your body gives you. How this upper and lower limit discovery can help, here is what good isolation of the two can do: </p>  <p> Let&rsquo;s say you want stand on your hands. Analyze for a second what exerting too little and too much means: </p>  <ul class="org-ul"> <li>exert too little power means you fall back to your feet.</li> <li>exert too much power means you fall over.</li> </ul>  <p> The first case is what will probably happen. A good exercise before starting the training is forcing yourself to the last case: just go full power and fall over, learn to fall as best as you can. Now that you have fallen once, and you have seen that it wasn&rsquo;t bad at all (assuming you fell on a soft-surface ;D). </p>  <p> This simplifies it, mentally prepares you, so you can now start the training. It is also part of setting up your learning environment, be it mentally. From there the training can begin. </p>  <p> Same with stamina: </p> <ul class="org-ul"> <li>go to little and feel little discomfort.</li> <li>go too much and feel lightheaded.</li> </ul> <p> From there the training can begin. </p>  <p> &#x2014; </p>  <p> We gaan door / We persist </p>  <p> We gaan door / We persist </p>  <p> Ook al weet ik niet waarom   / Even if I don&rsquo;t know why </p>  <p> Ook al weet ik niet waarvoor / Even if I don&rsquo;t know what for </p>  <p> Maar we gaan door / Yet we persist </p>  <p> We gaan door / We persist </p>  <p> We gaan door / We persist </p>  <p> &#x2014; <a href="https://en.wikipedia.org/wiki/Youp_van_%27t_Hek">Youp van&rsquo;t Hek</a> </p> 
]]></description>
    </item>

    <item>
      <title>And thou shall shred again</title>
      <link>https://raymon.dev/posts/2025/7/and-thou-shall-shred-again.html</link>
      <guid>https://raymon.dev/posts/2025/7/and-thou-shall-shred-again.html</guid>
      <pubDate>Tue, 01 Jul 2025 17:00:00 +0200</pubDate>
      <description><![CDATA[
        <p> The journey of this article starts with the simple task of shredding paper. And this time it was not just a few sheets. You know how it goes, you try to find the limit of how many papers you can do at the same time. </p>  <p> The paper shredder in question has three modes: automatic, off and reverse. So there is no just on mode, it is assumed that the shredder may only start when a paper is pushed in so that it automatically starts and stops. There is a latch in the machine that gets pushed to close the starting circuit. </p>  <p> The thing with this latch is that it is annoying, sometimes gets stuck or gets paper stuck on top of it. And that tiny bit of paper on top of the latch makes it harder to detect the paper. Because there is no always on option, you cannot let the paper go through, reversing also does not clear it. </p>  <p> So one day enough was enough, it was time to improve this piece of hardware. The electronics inside were accessible, as they should be. There was quite a bit of paper pieces that made their way inside the chassis. After cleaning that out, I removed the latch and was left with the two wires. </p>  <p> Connecting those wires directly two solved all problems. Now the shredder just runs until you switch it to off, and there is no latch to get stuck on. How hard would it have been to just provide an always on option as well, or is that too much to ask? </p> 
]]></description>
    </item>

    <item>
      <title>Storage of the code repos</title>
      <link>https://raymon.dev/posts/2025/7/storage-of-the-code-repos.html</link>
      <guid>https://raymon.dev/posts/2025/7/storage-of-the-code-repos.html</guid>
      <pubDate>Sat, 27 Jul 2025 17:00:00 +0200</pubDate>
      <description><![CDATA[
        <p> What is a good place to store a code repository? That has been a question that has been on my mind lately. Ever since GitHub was bought by Microsoft, I explored other forges like GitLab. </p>  <p> One way to solve the storage question is to not be the maintainer yourself. It sounds snarky, but for public projects it makes sense to attempt merging with the upstream. The chance of a fork getting populair is quite low if you ask me, unless it is really good. </p>  <p> For private projects is is a different story, but because they are private it is sufficient to just backup the repositories somewhere. For internal projects, there has always been a GitLab instance I could make use of. For public projects, most of the projects were just applications and not libraries. </p>  <p> After a while, I questioned if I should also publish and become a maintainer for a project. I felt comfortable enough with being a maintainer, after being one for several internal projects. At the same time there was a strong sense of perfectionism; not wanting to polute the internet with stuff that has no use. </p> <div id="outline-container-orgd7adf4e" class="outline-2"> <h2 id="orgd7adf4e">MBLF compiler</h2> <div class="outline-text-2" id="text-orgd7adf4e"> <p> The code for the MBLF compiler was <a href="https://crates.io/crates/mblf">published to cargo in 2022</a>. It was originally stored on GitHub under a seperate organization. Recently I looked at the crate statistics, and was surprised it had over a thousand downloads. So it was a project that I wanted to keep available, and decided to migrate the repository to <a href="https://codeberg.org/">Codeberg</a>. </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>Tool for wikipedia infoboxes</title>
      <link>https://raymon.dev/posts/2025/8/tool-for-wikipedia-infoboxes.html</link>
      <guid>https://raymon.dev/posts/2025/8/tool-for-wikipedia-infoboxes.html</guid>
      <pubDate>Mon, 04 Aug 2025 17:00:00 +0200</pubDate>
      <description><![CDATA[
        <p> <i>The following article is about an analysis tool I built for editing wikipedia.</i> <i>The published software <a href="https://crates.io/crates/wikipedia-infobox-analyzer">can be found here</a>, v0.1.0 is published under a permissive license.</i> <i>The following text is the README of the project, detailing the intended use and motivation for the tool.</i> </p>  <p> <i>Your requests for usablity have been heard, v0.2.0 of the software has been released.</i> <i>All properties that the template use now show their name in a third column.</i> <i>This data is only fetched once, and cached locally on your device to minimize requests.</i> <i>The examples in this blog post have been updated to the new output.</i> </p> <div id="outline-container-org539a423" class="outline-2"> <h2 id="org539a423">Wikipedia Infobox Analyzer</h2> <div class="outline-text-2" id="text-org539a423"> <p> On wikipedia there are different kinds of infoboxes. Each modern infobox retrieves data from wikidata. But due to legacy, many of the infoboxes still use manual values. </p>  <p> This analysis tool allows seeing the wikidata behind articles through the lens of the infoboxes. It will detect if expected fields are missing in the wikidata, in which case the values are often manually set inside the article. </p>  <p> As articles in other languages are created, someone might also extend the wikidata entry. That means that fields that were previously set manually, could now be updated to use wikidata. So this tool can be used to analyze the used infobox template, to see which values are now present or are still missing in wikidata. It offers an easier side-by-side comparison than going through all wikidata properties manually, as it looks only at the properties used by the infobox. </p>  <p> Infoboxes are interesting, and there could be plenty more to check. But the aim of this tool is to be simple, to be used alongside the editor of wikipedia. Analysis on an entire wikidata item is out of scope for this tool. Read the warnings on wikipedia and wikidata for that kind of analysis. </p> </div> <div id="outline-container-org46b050c" class="outline-3"> <h3 id="org46b050c">Usage</h3> <div class="outline-text-3" id="text-org46b050c"> <p> Here is a simple example on how this analyzer can be used for the wikipedia article about &ldquo;Earth&rdquo;: </p> <div class="org-src-container"> <pre class="src src-sh">wikipedia-infobox-analyzer   --title Earth   --lang en   --template &lt;infobox_template_file&gt; </pre> </div>  <p> By default, the tool assumes that you are looking for tools on the English wikipedia, but you can provide the language code of other wikipedia&rsquo;s like `fr`, `de`, `es` and `eo`. Make sure the passed title matches the article title, and the tool should be able to find the wikidata entry. The next section will go over what these infobox templates files are, where you can find them on wikipedia, and how you can customize them locally for your wikidata analysis. </p> </div> </div> <div id="outline-container-org273c060" class="outline-3"> <h3 id="org273c060">Interpretation of output</h3> <div class="outline-text-3" id="text-org273c060"> <p> The left column of the table first lists all the properties that the infobox requires. The right column will display the same property name if it is present in wikidata. If it is not present, the right column will be blank. Remaining properties in wikidata that are not required by the infobox are trailed in the right column. </p>  <div class="org-src-container"> <pre class="src src-markdown">&#9474; Infobox requires &#9474; Wikidata Earth (Q2) &#9474; Property name &#9474; &#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508; &#9474; P18              &#9474; P18                 &#9474; image         &#9474; &#9474; P170             &#9474; P170                &#9474; creator       &#9474; &#9474; P571             &#9474; P571                &#9474; inception     &#9474; &#9474;                  &#9474; P31                 &#9474;               &#9474; &#9474;                  &#9474; P138                &#9474;               &#9474; &#9474;                  &#9474; P361                &#9474;               &#9474; &#9474;                  &#9474; ....                &#9474;               &#9474; </pre> </div>  <p> This (shortened) example is complete, but if we were to try a different infobox template on the earth entry you can see that it is not a good fit. To demonstrate, we can apply the software template to the earth entry: </p>  <div class="org-src-container"> <pre class="src src-markdown">&#9474; Infobox requires &#9474; Wikidata Earth (Q2) &#9474; Property name &#9474; &#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508; &#9474; P18              &#9474; P18                 &#9474; image         &#9474; &#9474; P154             &#9474;                     &#9474;               &#9474; &#9474; P170             &#9474; P170                &#9474; creator       &#9474; &#9474; P178             &#9474;                     &#9474;               &#9474; &#9474; P275             &#9474;                     &#9474;               &#9474; &#9474; P277             &#9474;                     &#9474;               &#9474; &#9474; P306             &#9474;                     &#9474;               &#9474; &#9474; P348             &#9474;                     &#9474;               &#9474; &#9474; P400             &#9474;                     &#9474;               &#9474; &#9474; P548             &#9474;                     &#9474;               &#9474; &#9474; P571             &#9474; P571                &#9474; inception     &#9474; &#9474; P577             &#9474;                     &#9474;               &#9474; &#9474; P856             &#9474;                     &#9474;               &#9474; &#9474; P1324            &#9474;                     &#9474;               &#9474; &#9474; P2096            &#9474;                     &#9474;               &#9474; &#9474;                  &#9474; P10                 &#9474;               &#9474; &#9474;                  &#9474; P31                 &#9474;               &#9474; &#9474;                  &#9474; P138                &#9474;               &#9474; &#9474;                  &#9474; ....                &#9474;               &#9474; </pre> </div> </div> </div> <div id="outline-container-org0a9d028" class="outline-3"> <h3 id="org0a9d028">Templates</h3> <div class="outline-text-3" id="text-org0a9d028"> <p> The wikipedia sites vary a lot when it comes to templates across the different languages. The goal of this tool is to be universal, but these templates have not been standardized as far as I am aware. </p>  <p> To mitigate this, templates can be customized and expected to be downloaded for your language from wikipedia. For instance, go to the infobox template for planets on the English wikipedia (<a href="https://en.wikipedia.org/wiki/Template:Infobox_planet">https://en.wikipedia.org/wiki/Template:Infobox_planet</a>) and download the source to a file. Then you can add the following line to that file locally: </p>  <div class="org-src-container"> <pre class="src src-text">{{... Wikidata|P18|P31|P361|P571}} </pre> </div>  <p> The program ignores what you put at the `&#x2026;`. It permits templates that include a listing of wikidata entries for their templates. As an example, this is the case on the following software template on the Dutch wikipedia (the first word means &ldquo;uses&rdquo;, it can be found here: <a href="https://nl.wikipedia.org/wiki/Sjabloon:Infobox_software">https://nl.wikipedia.org/wiki/Sjabloon:Infobox_software</a>): </p>  <div class="org-src-container"> <pre class="src src-text">{{Gebruikt Wikidata|P18|P154|P170|P178|P275|P277|P306|P348|P400|P548|P571|P577|P856|P1324|P2096}} </pre> </div>  <p> Ideally, these used properties would be discovered by use, but I have not found a way to do that universally. Besides, you only have to do this once, and this way you can also customize the properties to look for. </p>  <p> It is often the case that there are similar properties on a template, where to goal is that just one is filled in. To go back to the software example, let&rsquo;s take the Dutch wikipedia article for GitLab as an example. </p>  <div class="org-src-container"> <pre class="src src-markdown">&#9474; Infobox requires &#9474; Wikidata GitLab (Q16639197) &#9474; Property names              &#9474; &#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508; &#9474; P18              &#9474; P18                         &#9474; image                       &#9474; &#9474; P154             &#9474; P154                        &#9474; logo image                  &#9474; &#9474; P170             &#9474;                             &#9474; creator                     &#9474; &#9474; P178             &#9474; P178                        &#9474; developer                   &#9474; &#9474; P275             &#9474; P275                        &#9474; copyright license           &#9474; &#9474; P277             &#9474; P277                        &#9474; programmed in               &#9474; &#9474; P306             &#9474; P306                        &#9474; operating system            &#9474; &#9474; P348             &#9474; P348                        &#9474; software version identifier &#9474; &#9474; P400             &#9474;                             &#9474; platform                    &#9474; &#9474; P548             &#9474;                             &#9474; version type                &#9474; &#9474; P571             &#9474; P571                        &#9474; inception                   &#9474; &#9474; P577             &#9474;                             &#9474; publication date            &#9474; &#9474; P856             &#9474; P856                        &#9474; official website            &#9474; &#9474; P1324            &#9474; P1324                       &#9474; source code repository URL  &#9474; &#9474; P2096            &#9474;                             &#9474; media legend                &#9474; &#9474;                  &#9474; P10                         &#9474;                             &#9474; &#9474;                  &#9474; P17                         &#9474;                             &#9474; &#9474;                  &#9474; P31                         &#9474;                             &#9474; &#9474;                  &#9474; ....                        &#9474;                             &#9474; </pre> </div>  <p> Here you can see that the infobox template is sufficiently filled in. And yes, there are some fields missing in the wikidata that the template expects, but those are covered by other properties. This tool should give you the ability to quickly find the missing properties to be entered in wikidata. </p> </div> </div> </div> 
]]></description>
    </item>

    <item>
      <title>Game development</title>
      <link>https://raymon.dev/posts/2021/6/game-development.html</link>
      <guid>https://raymon.dev/posts/2021/6/game-development.html</guid>
      <pubDate>Wed, 09 Jun 2021 14:00:00 GMT</pubDate>
      <description><![CDATA[
        <p> So what is the plan for the coming summer? </p>  <p> Perhaps enjoy some self-made video-games. </p>  <p> Having no concerns about the quality of them, they make for a great playground to improve all-round gamedev skills. </p>  <p> At the end, it results in something to enjoy and share. </p>  <p> It is as simple as that, so lets get started! </p> 
]]></description>
    </item>

    <item>
      <title>Durable deployments</title>
      <link>https://raymon.dev/posts/2024/10/durable-deployments.html</link>
      <guid>https://raymon.dev/posts/2024/10/durable-deployments.html</guid>
      <pubDate>Sat, 19 Oct 2024 17:00:00 +0200</pubDate>
      <description><![CDATA[
        <p> Do you keep your software running when pushing an update? Isn&rsquo;t it just great when you can just keep it running, and push new definitions? When the initial runner you have setup does not have to stop, running years on end? Because a deployment setup can be as simple as pushing files to a webserver. Unless there is some data that needs to be migrated, that also works for code. It just has to replace the old definitions, which can be done while it is running. </p>  <p> The opposite is such a demotivating mess that makes you regret doing any large changes. Make backups and allow rollbacks, keep the development version in sync with each other. So that the tests you write also execute when they are working on their changes, not breaking yours. </p>  <p> Often you do not have the luxary of starting out a new project from scratch. Already existing projects sometimes have complex manual setups, not always for reasons that still apply. Do yourself a favor, and make it durable to work on the code. You know the codebase is in good shape if you do not fear changing it. </p> 
]]></description>
    </item>

    <item>
      <title>A lot of sitting at the office</title>
      <link>https://raymon.dev/posts/2023/9/a-lot-of-sitting-at-the-office.html</link>
      <guid>https://raymon.dev/posts/2023/9/a-lot-of-sitting-at-the-office.html</guid>
      <pubDate>Wed, 20 Sep 2023 22:40:00 +0200</pubDate>
      <description><![CDATA[
        <p> There is much to do at an office job, but do you know what does not do much at an office job? Your physical body. An office job is quite sedentary, and while there are ideas to make it more active, it remains one of the larger downsides this kind of job brings along. </p>  <p> Instead of compensating this lack of movement with an entire dedicated activity for exercising, do not forget to look into what you currently do and making that more active. Commuting is a good example, I know good examples like biking (partially) to work. Or walking around during breaks, not just walking to where you need to go but also for other means. </p> 
]]></description>
    </item>

    <item>
      <title>Papers please</title>
      <link>https://raymon.dev/posts/2026/1/papers-please.html</link>
      <guid>https://raymon.dev/posts/2026/1/papers-please.html</guid>
      <pubDate>Mon, 19 Jan 2026 09:00:00 GMT</pubDate>
      <description><![CDATA[
        <p> I took a step back from the internet, which is constantly buzzing. It felt like looking at a rope pulling contest, a lot of people stressed about the future. </p>  <p> A lot of people on one side, and a lot of people on the other side. Competing for followers, competing for jobs, competing for promotions even though neither is qualified. </p>  <p> Then there is one shady looking dude under a tree, reading a book or a newspaper. Just in their own reality, relaxing, looking around, not giving a flying f*ck about the world around them. </p>  <p> I wish to be more like that, just doing their own thing they are good at and sharing it when they made a contribution. If the dude under the tree is bothered too much, they put headphones on. </p>  <p> In software, it might be the start of a new era, a new dawn, a new way of working. That combines modern computing with the classic IT we used to know and run. </p>  <p> When I see the recent developments in IT infrastructure currently, I cannot express the excitement. About what kind of projects are now possible if you do data engineering well. </p>  <p> Perhaps more open-source software in public infrastructure, it would make sense to me. More development of semantic web technologies and IT automation inside regular infrastructure, which are topics I would want to specialize in further. </p> 
]]></description>
    </item>

    <item>
      <title>How I got started on Ruby on Rails</title>
      <link>https://raymon.dev/posts/2022/4/how-i-got-started-on-ruby-on-rails.html</link>
      <guid>https://raymon.dev/posts/2022/4/how-i-got-started-on-ruby-on-rails.html</guid>
      <pubDate>Thu, 21 Apr 2022 20:32:00 +0200</pubDate>
      <description><![CDATA[
         <div id="outline-container-org8f62aa9" class="outline-2"> <h2 id="org8f62aa9">Background</h2> <div class="outline-text-2" id="text-org8f62aa9"> <p> So at first I did not program in ruby, as python already worked well for getting a fast prototype. However, watching the talks <a href="https://sandimetz.com/">Sandi Metz </a>gave did peak my interest, so Ruby wasn&rsquo;t off the radar <span class="underline">yet</span>. </p>  <p> Ruby came back when I joined the commit-committee (the software-development team at the local study association where I study, almost 2 years ago) Let me take you on the journey, and how I shipped a feature in the first few days of starting on a Ruby on Rails project. </p> </div> </div>  <div id="outline-container-orgfabc303" class="outline-2"> <h2 id="orgfabc303"><a href="https://github.com/svsticky/constipated-koala">Constipated Koala</a></h2> <div class="outline-text-2" id="text-orgfabc303"> <p> is the administration system for activities and such for the study association <a href="https://svsticky.nl/en-US">sticky</a>. It lacked a richer interface for activity-hosts to summarize enrollments, and that is where the <a href="https://github.com/svsticky/constipated-koala/pull/808">journey really started</a>. </p> </div> <div id="outline-container-org28bce22" class="outline-3"> <h3 id="org28bce22">Summary feature</h3> <div class="outline-text-3" id="text-org28bce22"> <p> So it was the perfect feature to add as a beginner, as it wasn&rsquo;t complicated (allow the user to pick the columns to export, and add an export option). </p>  <p> So here is how it looks before and after the change (all data shown is randomly generated :D): </p>   <div id="orge60c70d" class="figure"> <p><img src="../../../assets/images/ror-before.png" alt="ror-before.png" /> </p> <p><span class="figure-number">Figure 1: </span>Activity enrollment panel before any changes</p> </div>    <div id="org7a28252" class="figure"> <p><img src="../../../assets/images/ror-after1.png" alt="ror-after1.png" /> </p> <p><span class="figure-number">Figure 2: </span>Activity enrollment panel after pressing summarize (as the new feature)</p> </div>    <div id="org57696aa" class="figure"> <p><img src="../../../assets/images/ror-after2.png" alt="ror-after2.png" /> </p> <p><span class="figure-number">Figure 3: </span>Activity enrollment panel after also &rsquo;cutting&rsquo; the last two columns away (by pressing the scissor icons on-top)</p> </div> </div> </div>    <div id="outline-container-orgda44070" class="outline-3"> <h3 id="orgda44070">The next journey&rsquo;s</h3> <div class="outline-text-3" id="text-orgda44070"> <p> By making that feature, the confidence for <a href="https://github.com/svsticky/constipated-koala/pull/871">taking</a> on <a href="https://github.com/svsticky/constipated-koala/pull/979">issues</a> grew, and code-reviewing and approving became my main interest for the project. </p> </div> </div> </div> 
]]></description>
    </item>

    <item>
      <title>The new intern that joins companies all over the world</title>
      <link>https://raymon.dev/posts/2023/8/the-new-intern-that-joins-companies-all-over-the-world.html</link>
      <guid>https://raymon.dev/posts/2023/8/the-new-intern-that-joins-companies-all-over-the-world.html</guid>
      <pubDate>Tue, 22 Aug 2023 22:28:00 +0200</pubDate>
      <description><![CDATA[
        <p> Let&rsquo;s suppose you are short staffed, and you want to change it. You could hire new staff members, but that would also slow down your current staff in the short term, even though it is good long term. What if there was some technology that gives every one of your current employees an intern? What do you mean you might question. An intern? Yes, but not a regular intern. An intern that joined millions of companies at the same time in a matter of weeks. An intern that learned by digesting the information on the internet, faster than you ever could. </p>  <p> This sounds promising, you might even give it a try, especially because it is free. To begin to understand the breadth this technology is granted, try to understand the technology by thinking of it as an intern. Try to visualize the amount of knowledge that is willingly exposed as if it is an intern belonging to the company. Because it has dialogues with the employees, and it is unclear if the employee even talks to them. It can be totally hidden, attempts to spot it are a lost feat. The right hand doesn&rsquo;t know what the left hand is doing, but meanwhile a new standard of performance is build. One that leaves the left hand no choice but to live up to its name it seems. </p> 
]]></description>
    </item>

    <item>
      <title>Keeping plants</title>
      <link>https://raymon.dev/posts/2022/6/keeping-plants.html</link>
      <guid>https://raymon.dev/posts/2022/6/keeping-plants.html</guid>
      <pubDate>Sun, 19 Jun 2022 12:34:00 +0200</pubDate>
      <description><![CDATA[
        <p> Plants surrounded me from when I was little. In the garden and even indoors, to me they were always interesting to look at and see them grow. They make for great decor, and I love taking care of them. </p>  <p> The hobby clicked when trying to make pictures of the plants, and learning about photography. </p>   <div id="org2b9a619" class="figure"> <p><img src="../../../assets/images/cayenne-pepper-2022-june.jpg" alt="cayenne-pepper-2022-june.jpg" width="300px" /> </p> <p><span class="figure-number">Figure 1: </span>Indoor Cayenne Pepper plant</p> </div>  <p> It was kinda by accident I was keeping track of growth of the plants, as friends asked about the plants and wanted to see them grow. That lead me to sharing the plants with plenty of others, as after a bit of practice more plants survive and thrive instead of wither away. There is almost something magical of seeing a gifted plant thrive at someone elses home, so I am glad to see more of it in the future. </p> 
]]></description>
    </item>

    <item>
      <title>Fellow programmer</title>
      <link>https://raymon.dev/posts/2021/1/fellow-programmer.html</link>
      <guid>https://raymon.dev/posts/2021/1/fellow-programmer.html</guid>
      <pubDate>Mon, 04 Jan 2021 18:53:00 GMT</pubDate>
      <description><![CDATA[
        <p> This post started out as a joke, but quickly grew to an opportunity to thank a fellow programmer; Maik (alias <a href="https://maik.dev">maikka39</a>) </p>  <p> It has already been several years since we first started coding together. Or better said, watched with admiration for his programming skills. </p>  <p> These developed into hacking skills I still can&rsquo;t get my head fully around, yes you are definitely the better hacker😀. </p>  <p> As we competed against each other for fun, it was actually our past selves we competed against; We both improved our own skills, and made awesome projects. So thank you :D </p> 
]]></description>
    </item>

    <item>
      <title>A new time format for the years</title>
      <link>https://raymon.dev/posts/2025/6/a-new-time-format-for-the-years.html</link>
      <guid>https://raymon.dev/posts/2025/6/a-new-time-format-for-the-years.html</guid>
      <pubDate>Fri, 27 Jun 2025 17:00:00 +0200</pubDate>
      <description><![CDATA[
        <p> Time to use yet another standard that will my break software! A while back I stumbled upon the <a href="https://en.wikipedia.org/wiki/Holocene_calendar">Holocene Calendar</a>, which was also popularized by <a href="https://kurzgesagt.org/">Kurzgezagt</a>: </p>  <blockquote> <p> The Holocene correlates with the last maximum axial tilt towards the Sun of the Earth&rsquo;s obliquity. The Holocene corresponds with the rapid proliferation, growth, and impacts of the human species worldwide, including all of its written history, technological revolutions, development of major civilizations, and overall significant transition towards urban living in the present. </p> </blockquote>  <p> It starts counting years roughly after the ice age, after the adorable character <a href="https://en.wikipedia.org/wiki/Scrat">Scrat</a> finally collects and burries the acorn. It is quite easy, just add 10,000 years to the <a href="https://en.wikipedia.org/wiki/Gregorian_calendar">current commonly used</a> year format. Quite a clever choice, because it is distinct enough to recognize without having to do any difficult conversion. Just write a one in front, and perhaps a comma to denote thousands for readability. </p>  <p> Now ofcourse it is not recommended to just change existing data to it. I see it as just a unit, a display option like Celcius and Fahrenheit. On this website, I have changed the year format on the post index page. It took a staggering one line of code and voilà, now it is fancy. </p>  <p> Existing urls will be kept, and so will the semantic datetime attribute. </p> 
]]></description>
    </item>

    <item>
      <title>Building the Antinet</title>
      <link>https://raymon.dev/posts/2022/9/building-the-antinet.html</link>
      <guid>https://raymon.dev/posts/2022/9/building-the-antinet.html</guid>
      <pubDate>Tue, 27 Sep 2022 22:00:00 +0200</pubDate>
      <description><![CDATA[
        <p> When choosing where to store my notes, having one clear place to store is most important to me. That is why I didn&rsquo;t have much preference for the medium at first, as long it was only one. </p>  <p> This post is part three of the journey to build a life-long information system. </p>  <p> &#x2014; </p>  <p> The <a href="https://raymon.dev/posts/2022/9/building-the-wiki.html">previous post in this series</a> ended with the remedy to quit digital again and keep all important notes analog like they initially were. </p>  <p> This analog system would be a tool to process the books I have read with more depth, by forcing you to spend time and rewrite the information so that it becomes knowledge. This is where the Antinet comes in. </p>  <p> The Antinet, the analog numeric-alpha tree-structure with indexes network for information, is a classy version of that and more. </p>  <p> There is an <a href="https://zettelkasten.de/posts/introduction-antinet-zettelkasten/">introduction to antinet zettelkasten</a> for the core principles and historical background, as well as a <a href="https://www.antinet.org/getting-started/">starting guide</a> for when you are ready to take the dive, so take a look into that for all details. </p>  <p> After researching it, I committed to migrating all my book-notes to it. So I grabbed an old shoe-box and cut it to fit A6-cards neatly, and made all the cards required to start out; index with spacer, initial main cards with spacer and bibliography spacers. I used a bookstand inside the shoebox to keep the notes standing upwards, which is easily moved when there are more notes. </p>   <div id="orgf8bda55" class="figure"> <p><img src="../../../assets/images/antinet_spacers_installed.jpg" alt="antinet_spacers_installed.jpg" width="500px" /> </p> <p><span class="figure-number">Figure 1: </span>Index at the front, then Antinet-main-cards, then Bibliography.</p> </div>    <div id="orgd0eb811" class="figure"> <p><img src="../../../assets/images/antinet_spacers_alpha.jpg" alt="antinet_spacers_alpha.jpg" width="300px" /> </p> <p><span class="figure-number">Figure 2: </span>The index cards were also made of the A6-paper, by putting them upwards and cutting to the old length with tab.</p> </div> 
]]></description>
    </item>

    <item>
      <title>Extending Emacs</title>
      <link>https://raymon.dev/posts/2022/4/extending-emacs.html</link>
      <guid>https://raymon.dev/posts/2022/4/extending-emacs.html</guid>
      <pubDate>Sat, 23 Apr 2022 21:09:00 +0200</pubDate>
      <description><![CDATA[
        <p> Coming from Notepad++ as my main editor, not having to rely on fancy editors was a given. </p>  <p> Maybe this deserves it&rsquo; own story, but what is important for now is that Doom Emacs is my main editor. It is perfect as it is so full of features, and convinced me fully on the beauty of lisp. Ow, and don&rsquo;t get started on how great org-mode is, it is being used as this article is written :) </p>  <div id="outline-container-org4401f1f" class="outline-2"> <h2 id="org4401f1f">Writing a bit of Emacs Lisp</h2> <div class="outline-text-2" id="text-org4401f1f"> <p> As I was <a href="https://github.com/Raymonzut/dotfiles/commit/7bae2a7397423687ddc47a65bd8fb015dc7257b3">standardizing</a> my <a href="https://github.com/Raymonzut/dotfiles/tree/master/.doom.d">Doom Emacs dotfiles</a> today, the choice of terminal was a tough one initially. </p> <ul class="org-ul"> <li>eshell            ; the elisp shell that works everywhere</li> <li>shell             ; simple shell REPL for Emacs</li> <li>term              ; basic terminal emulator for Emacs</li> <li>vterm             ; the best terminal emulation in Emacs</li> </ul>  <p> Of these four, eshell did not respond to the `SPC o t` keybind, and directly calling it takes up your current buffer. </p>  <p> So this inspired an idea: let just make it work just like the rest. </p> </div> <div id="outline-container-orgdc40989" class="outline-3"> <h3 id="orgdc40989">Improving the default eshell experience</h3> <div class="outline-text-3" id="text-orgdc40989"> <p> To solve it taking your current buffer, we can split before calling `eshell` </p>  <div class="org-src-container"> <pre class="src src-elisp">  <span style="color: #fe8019;">(</span><span style="color: #b8bb26;">+evil/window-split-and-follow</span><span style="color: #fe8019;">)</span>   <span style="color: #fe8019;">(</span><span style="color: #b8bb26;">eshell</span><span style="color: #fe8019;">)</span> </pre> </div>  <p> As it will be a command, lets wrap it: </p>  <div class="org-src-container"> <pre class="src src-elisp"><span style="color: #fe8019;">(</span><span style="color: #fb4934;">defun</span> <span style="color: #b8bb26;">split-and-term</span> <span style="color: #cc241d;">(</span><span style="color: #cc241d;">)</span>   <span style="color: #dfd2b8;">"Make eshell a proper terminal."</span>   <span style="color: #cc241d;">(</span><span style="color: #fb4934;">interactive</span><span style="color: #cc241d;">)</span>   <span style="color: #cc241d;">(</span><span style="color: #b8bb26;">+evil/window-split-and-follow</span><span style="color: #cc241d;">)</span>   <span style="color: #cc241d;">(</span><span style="color: #b8bb26;">eshell</span><span style="color: #cc241d;">)</span><span style="color: #fe8019;">)</span> </pre> </div>  <p> And now map it to the right keybind: </p>   <div class="org-src-container"> <pre class="src src-elisp"><span style="color: #fe8019;">(</span><span style="color: #fb4934;">map!</span> <span style="color: #fe8019;">:leader</span>       <span style="color: #fe8019;">:desc</span> <span style="color: #b8bb26;">"Open eshell as a terminal"</span>       <span style="color: #b8bb26;">"o t"</span> <span style="color: #ebdbb2;">'</span><span style="color: #689d6a;">split-and-term</span><span style="color: #fe8019;">)</span> </pre> </div>  <p> Hacking it in can be as easy as that, and wow it is fun to do. </p> </div> </div> </div>  <div id="outline-container-org32bf2f7" class="outline-2"> <h2 id="org32bf2f7">Result</h2> <div class="outline-text-2" id="text-org32bf2f7"> <p> This simple addition makes the powerful as available as the rest of the terminals If you are not familiar with eshell, it is a shell that allows you to also write elisp, which together looks like this: </p>   <div id="org3946631" class="figure"> <p><img src="../../../assets/images/extending-emacs-completion.png" alt="extending-emacs-completion.png" /> </p> <p><span class="figure-number">Figure 1: </span>Auto-completion on file navigation inside the elisp shell</p> </div>   <div id="org9466781" class="figure"> <p><img src="../../../assets/images/extending-emacs-demo.png" alt="extending-emacs-demo.png" /> </p> <p><span class="figure-number">Figure 2: </span>Demonstration of calling shell commands and elisp expressions inside the elisp shell</p> </div> </div> </div> 
]]></description>
    </item>

    <item>
      <title>If only the datastructure was different</title>
      <link>https://raymon.dev/posts/2021/5/if-only-the-datastructure-was-different.html</link>
      <guid>https://raymon.dev/posts/2021/5/if-only-the-datastructure-was-different.html</guid>
      <pubDate>Mon, 02 May 2021 14:05:00 GMT</pubDate>
      <description><![CDATA[
        <p> Algorithms and datastructures for computer science have come a long way. Optimizing code boils down to removing assumptive dependencies of your problem; formulating the problem as specifically as possible to allow the fastest algorithm. </p>  <p> This idea of problem formulation directly translates into programming itself: be as clear in intent of the code as you can be, it just so happens the notation is executable by the computer. </p>  <p> So why not leverage compilers even more? What if the basic operations you would do on datastructures, push, pop, peek, insertion-first, -last, remove-first, -last etc. would stay the contract? What if ICollection, IList,.. would be implemented by a compiler chosen implementation, matching the usage of the basic operations optimally? This could even be semi-automated, some kind of interactive process with the programmer, always allowing the programmer to override the compiler&rsquo;s suggestion. </p>  <p> This process would go something like this: the programmer is as declarative as possible in intent. Then the compiler can internalize the collection lenghts and intersect the used operations against the available datastructures. From there it is a game of picking the best by utilizing the time complexity tables. </p> 
]]></description>
    </item>

    <item>
      <title>Post Apocalypse Coding</title>
      <link>https://raymon.dev/posts/2022/9/post-apocalypse-coding.html</link>
      <guid>https://raymon.dev/posts/2022/9/post-apocalypse-coding.html</guid>
      <pubDate>Thu, 22 Sep 2022 16:56:00 +0200</pubDate>
      <description><![CDATA[
        <p> With my git-server being fancier, it now also supports <a href="https://docs.gitea.io/en-us/packages/overview/">packages</a>. (The <a href="https://git.raymon.dev/MBLF-Project/-/packages">MBLF-packages</a> are available for download) </p>  <p> The package system also supports a ton of specific repository-types, which re-sparked an idea; Post Apocalypse Coding </p>  <p> The challenge is to pretend there are no third-party libraries for the programming language your are currently working in. To help yourself build projects reasonably, you will also form primitive versions of common libraries and re-establish the classical ecosystems slowly. </p>  <p> This title co-incidentally already had a lot of related ideas, one of the <a href="https://zserge.com/posts/post-apocalyptic-programming/">closest was about building low-level tooling up to an interpreter</a>. That would be hard mode, and would be a proper apocalypse. </p> 
]]></description>
    </item>

    <item>
      <title>Actions speak louder than words</title>
      <link>https://raymon.dev/posts/2022/11/actions-speak-louder-than-words.html</link>
      <guid>https://raymon.dev/posts/2022/11/actions-speak-louder-than-words.html</guid>
      <pubDate>Sun, 06 Nov 2022 21:04:00 +0100</pubDate>
      <description><![CDATA[
        <p> Actions speak louder than words. I think that reminders by actions you took are the best to make a message stick. It works well to sort out conflicting thoughts; by taking action instead of spending more time in a limbo of thoughts. </p>  <p> A limbo of thoughts which somehow has economic efficiency residing in it permanently. Or so it seemed. It probably had to do with conversations I had lately, conversations about the crisis-crisis that is &ldquo;plaguing our society yet again&rdquo;. Or other conversations, on whatever self-inflicted issue topic addressed by the same folks who made it. The topic of actions being good or bad for the economy keeps popping up in such conversations. And every year the conclusion is, after a lot of shouting, that some things have improved. One of those is always that the economy grew a bit again. Another is that access to externally produced goods has improved. &ldquo;That is to accommodate for more people&rdquo;, a partial truth statement using poor language. It states without difference between meaning equally more, or that one is steadily outgrowing the other regardless of it. </p>  <p> At this stage of this thought, you get ideas like looking to the worlds regardless of money. Just seeing it as a whole as is. Constantly, physical stuff is moving around to far places, along with paper or bytes that go back and forwards between people. </p>  <p> It somehow justifies that a teenager stares at wall for an hour, and then permits the teenager to let a plastic figure come shipped from China to them. It is business as usual, because the numbers add up. Also, as a bonus, GDP just grew. Well done teenager, contributing to society! </p>  <p> By these examples, a minority people get a power-trip. From that point on, every decision accounts money, as it is so powerful if you have it. But you get nothing for it in return if you already have your basic needs in check. You only lose time to something that seems worth striving for. </p>  <p> If something costs 20 bucks to buy, lets say a scarf, you would buy it if you need it by simple reasoning along with the above. The yarn would be cheap, but the labor to make it is way too expensive. After two hours already it is not worth it anymore by time-spent only, according to the minimum-wage where I live. It is simple reasoning, there are tons of other reasons why you would still do it yourself. The point is more that it can be a plaguing thought, one that is permanently in that limbo. </p>  <p> And to remind myself of it just being that, an idea in the limbo, I made a gentle reminder to myself that also keeps me warm: </p>   <div id="orgbcff39b" class="figure"> <p><img src="../../../assets/images/scarf.jpg" alt="scarf.jpg" width="400px" /> </p> <p><span class="figure-number">Figure 1: </span>It is a self-made scarf with fringes, it took six hours to make.</p> </div> 
]]></description>
    </item>

    <item>
      <title>A public social media for the public sector</title>
      <link>https://raymon.dev/posts/2025/9/a-public-social-media-for-the-public-sector.html</link>
      <guid>https://raymon.dev/posts/2025/9/a-public-social-media-for-the-public-sector.html</guid>
      <pubDate>Thu, 25 Sep 2025 17:00:00 GMT</pubDate>
      <description><![CDATA[
        <p> <i>The newspaper of Utrecht University, which is called the DUB, interviewed me about the social media platform Mastodon.</i> </p>  <p> <i><a href="https://dub.uu.nl/nl/nieuws/mastodon-ook-beschikbaar-voor-universiteit-utrecht">The article covering it</a> has been translated into English, <a href="https://dub.uu.nl/en/news/utrecht-university-wants-stimulate-mastodon-use">which can be read in-full here.</a></i> </p>  <p> <i>The posts from <a href="https://www.surf.nl/">SURF</a> about it <a href="https://social.edu.nl/@wlaatje/115264330192162026">can be found here</a> and <a href="https://www.linkedin.com/posts/wladimirmufty_surf-mastodon-activity-7376919044244865024-TcDZ">here</a>.</i> </p> 
]]></description>
    </item>

    <item>
      <title>Being used to good software resulted in withdrawal symptoms</title>
      <link>https://raymon.dev/posts/2025/8/being-used-to-good-software-resulted-in-withdrawal-symptoms.html</link>
      <guid>https://raymon.dev/posts/2025/8/being-used-to-good-software-resulted-in-withdrawal-symptoms.html</guid>
      <pubDate>Fri, 19 Aug 2025 17:00:00 GMT</pubDate>
      <description><![CDATA[
        <p> It has been over five years since I had to use Microsoft Windows as the main operating system. Since the start of september, I started using an office laptop with Windows 11 on it as they did not offer Linux laptops (yet). And I was missing quite a few settings that I became so used to that I did not give them a second thought. </p> <div id="outline-container-orgefd5067" class="outline-2"> <h2 id="orgefd5067">Keyboard</h2> <div class="outline-text-2" id="text-orgefd5067"> <p> When writing, I am way too used to the vim-style of editing; regardless of the editor I always bind the keys in that way. So the first muscle memory that lead to confusion made THE LETTERS LARGE AGAIN, nO Not LikE that, aah that was not the escape key. Because with this style of editing, you press the escape key a lot to switch modes. And as the caps lock key is quite accessible, you swap it with the escape key so that the escape key becomes accessible. </p>  <p> The second muscle memory that lead to confusion was the &ldquo;élegant&rdquo;, no&#x2026;, &ldquo;elegant&rdquo; way of writing text with quotes. Right, I was used to using a compose key, but it is expected that you use a different locale that automatically composes. Which means that you have to remember to press the spacebar if the next character can be a composed with the previous character, fun! </p>  <p> What was even more fun, is that on this laptop the standard layout was the regular one, not the international one. So it did not compose at all, and I asked it to my coworkers. And they started rambling about alt-codes, looking up the character on the internet, or looking in the settings. One coworker said they did not write the characters at all, or used autocorrect. Eventually we got there, and I opened notepad to test it. And I noticed it had an AI in it, yikes. </p>  <p> I missed the compose key already, so I started looking for another solution. So many people said that I just have to get used to the compose-by-default way. Because I write quotation marks a lot when programming, and that would mean typing an extra space each time to cancel the compose. </p>  <p> Luckily I knew that <a href="https://learn.microsoft.com/en-us/windows/powertoys/">Microsoft PowerToys</a> exists, this was such a saver. It has the key swapping, and the Quick Accent utility that is more like a compose key. As a solution it is good enough, not that I type the accented characters that often anyways. </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>Source code should read like a newspaper</title>
      <link>https://raymon.dev/posts/2023/5/source-code-should-read-like-a-newspaper.html</link>
      <guid>https://raymon.dev/posts/2023/5/source-code-should-read-like-a-newspaper.html</guid>
      <pubDate>Tue, 16 May 2023 20:07:00 +0200</pubDate>
      <description><![CDATA[
        <p> Do you remember the last time you saw great code? Code where it feels that you wrote it yourself, contrary to bad code you wrote earlier and forgot it was yours. Good code becomes great code when it is flexible and easily navigated through by the reader. When you stop writing code as soon as it does what it needs to, you forget the reader of the code in the future. You will do yourself a favor by refactoring the code to a readable and navigable form; organize it while the ideas are still fresh in your mind. </p>  <p> There are generic structures you can utilize for the source code you write. There is a sense of code style, just as there is a writing style in prose. This can be a technical code style, which is typically dealt with by a linter that enforces nitpicks. Yet, this is not the only style for your source code, there are also styles for ordering your code. An example is ordering your code by abstraction, which is commonly known as a writing style for newspapers. </p>  <p> In a newspaper, you typically read the headline first, and a first paragraph that describes the article; the abstract. Abstract here means the content described in the highest abstraction, which will be the main function of our source code by analogy. So should your main function contain all details directly? Not by this analogy, as a newspaper has further paragraphs to elaborate and discuss those details. Those details are not the concern of the abstract, that is implementation detail for the further paragraphs. Every paragraph adds more detail, and allows the reader to decide if they need to read on. It does not leave open ends because details sit in the way, as those lower level details are in the later paragraphs. Ideally, you can read any amount of paragraphs from the start, and understand the program. The further you decide to read, the more details you know; yet you are never clueless about the purpose of the program until you read everything. </p> 
]]></description>
    </item>

    <item>
      <title>Learning React</title>
      <link>https://raymon.dev/posts/2022/7/learning-react.html</link>
      <guid>https://raymon.dev/posts/2022/7/learning-react.html</guid>
      <pubDate>Mon, 18 Jul 2022 17:12:00 +0200</pubDate>
      <description><![CDATA[
        <p> Learning frameworks after you learn underlying mechanics first, by attempting to make your own framework, works amazingly. That is why <a href="https://raymon.dev/posts/2020/6/website-front-end-update.html">I did not stick</a> with Vue.js for the front-end of this website, but went through the &ldquo;hassle&rdquo; of remaking it all on my own from scratch. Yes, the iceberg goes much deeper than the website-framework you are using. Personally, it defies the purpose to do everything from scratch on a single project when the components are fully interchangeable. It makes more sense to isolate the components you are doing from scratch to a project that can fully test it and grow alongside it. </p>  <div id="outline-container-orgcd56ed4" class="outline-2"> <h2 id="orgcd56ed4">React adventure</h2> <div class="outline-text-2" id="text-orgcd56ed4"> <p> So I was already familiar with Vue.js, and doing React functionally peeked my interest. I had an amazing experience learning-while-doing with the &ldquo;Learn React for Free&rdquo;-course on <a href="https://scrimba.com">scrimba</a> (which is an interactive learning platform for programming). </p>  <p> It started with learning the names React had given to the stuff you typically want to do. Later, it was about enjoying the nuggets of attention of detail the developers have put into the framework. </p>  <ul class="org-ul"> <li>Components are just JSX functions, thus can be passed to HOF&rsquo;s</li> <li>The easiness in-which you can make React lazy by passing as lambda&rsquo;s</li> <li>Effects-management</li> </ul> </div> </div> 
]]></description>
    </item>

    <item>
      <title>Why is your site static</title>
      <link>https://raymon.dev/posts/2020/10/why-is-your-site-static.html</link>
      <guid>https://raymon.dev/posts/2020/10/why-is-your-site-static.html</guid>
      <pubDate>Sun, 04 Oct 2020 10:05:00 GMT</pubDate>
      <description><![CDATA[
        <p> <a href="https://raymon.dev/posts/2020/7/why-is-your-site-not-static.html">A few posts back</a>, I talked about the pro and cons of making the site static. The initial blogpage had the posts page dynamic to save bandwidth. A valid point if you only consider loading the page once. But when it comes to longterm bandwidth usage by the F5 spamming monkeys, avoiding resending unchanged content becomes more than a nice-to-have. Static is the way to go after all for this site. </p>  <p> As a side-bonus, the server does not need to run node anymore. So the server is lighter as it only needs to serve static files. It now is Node-bloat™ free. So <a href="https://github.com/Raymonzut/Personal-Website/commit/3e0462b74bbbb73ed27ad487b6377104d07d1ee5">bye bye node.js fastify server</a>, even you are not needed anymore. The spooky JSON layer is also removed now; Before, the server produced a JSON result from the entered posts, which was used by the client to display the proper HTML. What remains is a customizable input format that is directly converted into HTML using some templates. Adding shorthand-notations is easier then before, as it is just another layer of translation. And thus by accident, I made a transpiler! </p> 
]]></description>
    </item>

    <item>
      <title>Creative coding</title>
      <link>https://raymon.dev/posts/2025/5/creative-coding.html</link>
      <guid>https://raymon.dev/posts/2025/5/creative-coding.html</guid>
      <pubDate>Fri, 30 May 2025 17:00:00 +0200</pubDate>
      <description><![CDATA[
        <p> This is an appreciation for the creative coders. For those that do it in their free time, and especially for those who have the courage and opportunity to do it part-time or even full-time. Taking their time to make exciting workshops, so that people who have no experience with programming can start with it. </p>  <p> Programming small sketches and animating them was one of early projects I did with programming. In some other posts I mentioned the use of <a href="https://processing.org/">Processing</a>, <a href="https://p5js.org/">P5.js</a> or more recently <a href="http://quil.info/">Quil</a> for canvas programming. I initially started with following tutorials on the internet, like <a href="https://thecodingtrain.com/">The Coding Train</a>, and repeating the code and making small modifications. </p>  <p> Lately I revisited what creative coding means, and got a lot of inspiration from artists and other creatives that are actively involved in it. Questioning the norm of software development, piecing it together in ways you do not expect. Or sometimes it just begins with a question, like &ldquo;why are websites always expected to be online?&rdquo;. The follow up then could be &ldquo;well, when does it make sense to be online?&rdquo;. If your answer is when the sun shines, great, you discovered the project of building a <a href="https://hackaday.com/2018/10/08/perfecting-the-solar-powered-web-server/">Solar powered webserver</a>. </p> <div id="outline-container-org41c3c89" class="outline-2"> <h2 id="org41c3c89">Having fun with printers</h2> <div class="outline-text-2" id="text-org41c3c89"> <p> They can also be projects that try to make ordinary and boring stuff more interesting. Like when you go shopping, and you get your receipt, have you ever looked closely at the receipt? And wondered if it could be less boring that just a total and info? It is actually really easy to print your own receipts and make them interesting. Hack it a bit, you can send plain ASCII to receipt printers. </p>  <p> Someone wrote a Python script to do this, which had way more lines than needed but got the job done. It made a connection and had quite a bit of setup, to eventually loop for user input. But just with some bash scripting and standard commands, it can be way simpler, as I found out when toying with a receipt printer. It is just &ldquo;lp -o raw -d &lt;DEVICE NAME&gt;&rdquo;, and pipe in the text or provide the file to print. </p>  <p> The possibilities are endless, you can use a command like cowsay and add the following to your custom receipts: </p>  <div class="org-src-container"> <pre class="src src-text"> __________________________ &lt; Thank you for your order &gt;  --------------------------         \   ^__^          \  (oo)\_______             (__)\       )\/\                 ||----w |                 ||     || </pre> </div>  <p> The conclusion is that the world needs more cows thanking customers on receipts. And that fun should be a ticket on the scrum board, because silly stuff like this makes the world a better place, one line at a time. </p>  <p> P.S. Friends reminded me that I printed the GNU/Linux copypasta on a receipt, and how random it was to get that handed to them. </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>Keep the context and history in check</title>
      <link>https://raymon.dev/posts/2023/2/keep-the-context-and-history-in-check.html</link>
      <guid>https://raymon.dev/posts/2023/2/keep-the-context-and-history-in-check.html</guid>
      <pubDate>Sat, 18 Feb 2023 21:00:00 +0100</pubDate>
      <description><![CDATA[
        <p> The internet is full of outdated beliefs. It moves around with a will of its own, forming shared narratives by belief in what gets tossed around. It keeps sticking to us; stick around in the minds of those who carry it like a plague, eventually fulfilling its own prophecy. </p>  <p> But, the stickiness can dissolve if you let it sit and not pass it along. One example is web frameworks, especially those who have been around for longer and have improved greatly since. They still get a bad reputation because of their history. </p>  <p> It is easy to go along with the experience of those who have been programming in it for longer, even though their use-cases and starting point were different. Because you still don&rsquo;t have the experience to join the discussion at that level, it is unfair in every way. The solution? Look into the matter yourself; give frequently changing software a fresh look, as if you are a beginner. Because you really are; just because it has the same name as before isn&rsquo;t enough to know the experience, only experience will tell. </p> 
]]></description>
    </item>

    <item>
      <title>Contracting yourself</title>
      <link>https://raymon.dev/posts/2020/11/contracting-yourself.html</link>
      <guid>https://raymon.dev/posts/2020/11/contracting-yourself.html</guid>
      <pubDate>Fri, 06 Nov 2020 22:05:00 GMT</pubDate>
      <description><![CDATA[
        <p> Are there agreements you can make to yourself? Think it through, give it some time for thought. What if you could simplify choices by considering agreements? Both going with your gut feeling or with principles fits here. </p>  <p> Attempt to write down how you make decisions. This will serve to give insight into your thinking, and brings awareness to what you consider for your next choice. If you have an important choice to make, its importance should allow you to take more time to consider a decision. You would re-evaluate later when you can think clearer, it makes the answers less rushed. </p> 
]]></description>
    </item>

    <item>
      <title>Merry Christmas</title>
      <link>https://raymon.dev/posts/2020/12/merry-christmas.html</link>
      <guid>https://raymon.dev/posts/2020/12/merry-christmas.html</guid>
      <pubDate>Fri, 25 Dec 2020 21:25:00 GMT</pubDate>
      <description><![CDATA[
        <p> Merry Christmas to y&rsquo;all reading these posts. </p>  <p> Here is a parody on the first part of the 1951 Christmas song &ldquo;It&rsquo;s Beginning to Look a Lot Like Christmas&rdquo;: </p>  <blockquote> <p> It is beginning to look like a blog-site, on every site you click. </p>  <p> Take a look, it&rsquo;s already past post five. </p>  <p> With silly stories, and documenting works. </p>  <p> It&rsquo;s beginning to look like a blog-site. </p>  <p> Served in just simple text. </p>  <p> But the prettiest sight to see, is the holly that will be. </p>  <p> No more JS,,, for,, thee, </p> </blockquote>  <p> The following is the original songtext: </p> <blockquote> <p> It&rsquo;s beginning to look a lot like Christmas, everywhere you go </p>  <p> Take a look in the five and ten glistening once again </p>  <p> With candy canes and silver lanes aglow </p>  <p> It&rsquo;s beginning to look a lot like Christmas </p>  <p> Toys in every store </p>  <p> But the prettiest sight to see, is the holly that will be </p>  <p> On your own front door </p> </blockquote> 
]]></description>
    </item>

    <item>
      <title>A progress-summary of the last months</title>
      <link>https://raymon.dev/posts/2022/3/a-progress-summary-of-the-last-months.html</link>
      <guid>https://raymon.dev/posts/2022/3/a-progress-summary-of-the-last-months.html</guid>
      <pubDate>Sun, 06 Mar 2022 14:16:00 GMT</pubDate>
      <description><![CDATA[
        <p> What has been completed </p> <ul class="org-ul"> <li>The <a href="https://raymon.dev/posts/2022/1/mblf.html">MBLF</a> compiler (this is a large milestone)</li> <li>This Personal Website <ul class="org-ul"> <li>has transfered to <a href="https://circl-lastname.github.io/hyperlisp/">HyperLisp!</a> as the markup syntax</li> <li>has more quality-of-content upgrades</li> </ul></li> <li>Complete transition to Arch-Linux on desktop <ul class="org-ul"> <li>Added more dotfiles along the way</li> </ul></li> <li>Completed 4 practicals within the followed CompSci course <ul class="org-ul"> <li>Quickhull with <a href="https://www.acceleratehs.org/">AccelerateHS</a></li> <li>Mini-C# compiler with ParserCombinators</li> <li>Logical-Chainer (Forward and Backward)</li> <li>A set of Prolog coding problems</li> </ul></li> <li>Toyed around with LISPS, following <a href="https://mitpress.mit.edu/sites/default/files/sicp/index.html">SICP</a></li> </ul> 
]]></description>
    </item>

    <item>
      <title>Career path and choices</title>
      <link>https://raymon.dev/posts/2025/3/career-path-and-choices.html</link>
      <guid>https://raymon.dev/posts/2025/3/career-path-and-choices.html</guid>
      <pubDate>Sun, 23 Mar 2025 10:00:00 +0100</pubDate>
      <description><![CDATA[
        <p> As much as it surprised me, the winter is already over again. Time is moving forward, and the thoughts of the summer coming close begin to form. This year that also means wrapping up studies, and entering the job market. </p>  <p> Fortunately, there is still an entire career ahead and plenty left to do. So as much as you could worry on the work you do early on, there is plenty of room to make mistakes if you consider how long the total career can be. And that gives a peace of mind, not to worry too much if a project turned out different than you expected. Because there are plenty of projects left to come, and sometimes you only understand their purpose much later. </p> <div id="outline-container-org59bd360" class="outline-2"> <h2 id="org59bd360">Essay from the past</h2> <div class="outline-text-2" id="text-org59bd360"> <p> To give an example, about five years ago, there was an essay I wrote with a few other people about how the internet changed over time. It is your typical introductory type of writing exercise about a topic that interest you, and with five people there was plenty to discuss and write about. There are some wild conclusions in that essay, which is awesome because it hallucinated way harder than the AI-chatbots that became popular a couple of years later. That makes it feel even more authentic, I am glad to look back on the pure human hallucination and recognize the growth since then. </p>  <p> Reading it back, mentally you can keep track of the accuracy of the statements. So when you read a sentence, you can imagine a score like those computer chess engines give when you do a move and it compares it to the most optimal move. The mistake and blunders that come out of nowhere are fantastic to read. </p>  <p> According to the essay, commercial websites take user accessiblity very seriously because they have to make a profit, and more users means more profit. That is a wild oversimplification, I had a good laugh reading that back. At the same time, there were also themes and topics that can be marked as great. It briefly touches on the idea of decentralization working in its favor, and how online forums have evolved over time. The introduction was based on the assumption that the internet became great because enthousiasts moved mountains to allow their growth, in spite of initial scepticism. </p>  <p> And I hope that will remain the case, that the internet will stay great because enthousiasts continue to put in the effort. So with the career and side projects that I do, let us hope that they contribute to that, as the internet has shown to be so valuable to so many people. </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>EditStream</title>
      <link>https://raymon.dev/posts/2021/2/editstream.html</link>
      <guid>https://raymon.dev/posts/2021/2/editstream.html</guid>
      <pubDate>Wed, 03 Feb 2021 14:00:00 GMT</pubDate>
      <description><![CDATA[
        <p> To be honest, after all these years of computers existing, there are enough text editors that are stable enough to work with and be used for a long time. Text editors have stood the test of time, most we do on personal computers is inputting text. So we better have an efficient way of transporting this data. Infact we do. For non-moving imagery we mostly figured it out. Large blobs of texts are saved as text, not as tons of screenshots (disregarding the unintentional screenshotting of everything among the less technically-aware). The moving imagery gets more interesting. It seems that saving content rendered is the chosen default. Which is a sensible default, it ensures it looks the same on each screen. There is no heavy reconstruction logic involved. If you would put it on a scale along with the other techniques I am about to mention, it is the most naive/hassle-free solution. </p>  <div id="outline-container-org8339176" class="outline-2"> <h2 id="org8339176">Improvements</h2> <div class="outline-text-2" id="text-org8339176"> <p> The reason why I argue this will be reworked is because it is really, <b>really</b> data heavy. Why do we love SVG so much compared regular images? Besides always looking crisp, it takes up constant space in respect to scaled version of the images (Also easier to edit, will touch on that later). And as constant space complexity is better then squared, it takes up less space. It also makes much more sense if what you want to capture was made with vector art. It would be a non-logical idea to save random images all as svg. The point is that we want fileformats resembling the creation. </p> </div> </div>  <div id="outline-container-org016bb63" class="outline-2"> <h2 id="org016bb63">Purpose</h2> <div class="outline-text-2" id="text-org016bb63"> <p> This is where file-formats are about: capturing the data needed to reconstruct the original entity with as much resemblence to the original as possible. Capturing it as close to the original allows intuitive editing and handling of the file. So when some script-kiddie on the internet is bashing their keyboard teaching programming 101, what would make more sense to save? Which one would it be? </p>  <ul class="org-ul"> <li>A: his current edit buffer and all changes he makes to it</li> <li>B: capture every pixel hundreds of times per second on their constantly changing 8K monitor</li> </ul>  <p> I would argue that it would be both <b>much</b> more space efficient and logical to go for option A. Just like with imagery, editstream will be the SVG for video of text-edit-sessions. But wait I here you say, how would you capture the rich configurations of the editors? Well, this is the best part of all: the format will see no difference in who typed it, so the reconstruction can be done with either your prefered editor config or with that of the original author. It is all config as meta-data. </p> </div> </div>  <div id="outline-container-org44a4003" class="outline-2"> <h2 id="org44a4003">Implementation</h2> <div class="outline-text-2" id="text-org44a4003"> <p> Now for actually implementing this seemingly superior format for certain usecases; There are already similar projects that can be leveraged for this: pair-programming, code-sharing, teletyping you name it. Take that idea and stream it to a file first. That is all. </p> </div> </div>  <div id="outline-container-org829303c" class="outline-2"> <h2 id="org829303c">It is already out there, you know</h2> <div class="outline-text-2" id="text-org829303c"> <p> So after drafting I found out it already exists, and it is called <a href="https://asciinema.org/">asciinema.</a> </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>The code architect is the writer</title>
      <link>https://raymon.dev/posts/2023/6/the-code-architect-is-the-writer.html</link>
      <guid>https://raymon.dev/posts/2023/6/the-code-architect-is-the-writer.html</guid>
      <pubDate>Sat, 17 Jun 2023 22:05:00 +0200</pubDate>
      <description><![CDATA[
        <p> While working on a software project, you will constantly be confronted with architecture that was constructed. The architecture will leave its mark on your work process, as it has influence on how easy it is to test it and apply it to different context, like different production environments. </p>  <p> And as you are the one who is working on the architecture, it is part of the result you deliver. You do not deliver just the architecture, you also deliver the developer experience for the next person who will work on it. Changes in the architecture that take more time to fully implement can still be started. Write them in the current architecture, as nudges for the developers to show the current heading. What would happen to the code, if architecture improvements are only drafted in a report? The code changes in the meantime and the intent may be lost. Larger changes still have a start that can be found as a minimal solution that gets the idea across. And as it is minimal, reverting also is. </p> 
]]></description>
    </item>

    <item>
      <title>Scouting stackoverflow</title>
      <link>https://raymon.dev/posts/2020/9/scouting-stackoverflow.html</link>
      <guid>https://raymon.dev/posts/2020/9/scouting-stackoverflow.html</guid>
      <pubDate>Fri, 25 Sep 2020 18:42:00 GMT</pubDate>
      <description><![CDATA[
        <p> Aah, stackoverflow. A rumor says that if it is not on stackoverflow, a solution does not exist yet. The website is full of devs reaching out to other devs. Both on the website and via search engines it provides answers to programming questions. </p>  <p> To my own surprise I actually never posted anything on stackoverflow. Neither as a question or answer. So it was time to change that, I figured to answer some posts. After browsing through the new questions, I found a post to answer. </p> 
]]></description>
    </item>

    <item>
      <title>Make use of existing information flows</title>
      <link>https://raymon.dev/posts/2023/4/make-use-of-existing-information-flows.html</link>
      <guid>https://raymon.dev/posts/2023/4/make-use-of-existing-information-flows.html</guid>
      <pubDate>Sat, 03 Apr 2023 21:35:07 +0200</pubDate>
      <description><![CDATA[
         <div id="outline-container-org0692f25" class="outline-2"> <h2 id="org0692f25">Using git tag descriptions in your CI</h2> <div class="outline-text-2" id="text-org0692f25"> <p> This is one of those ideas that sound ridiculous because it is, yet it has interesting points. Let&rsquo;s say you work with user stories for a group project, and that you are building software. You decide to work in sprints, meaning you will have an increment after each one. </p>  <p> How are you going to ensure all these new features will remain functional? You already have a perspective from which you can evaluate; the user stories. If all user stories are functional, so is your software is the promise. </p>  <p> It takes a lot of time to manually check all these stories. So you write your tests, fix bugs here and there but there still is doubt. But that still doesn&rsquo;t guarantee that you didn&rsquo;t miss some tests to write. </p>  <p> Is there a flow of information already providing the list of stories you want to support, and if so could you combine it with your tests? What if you did the following: </p>  <p> At the end of every sprint, print-out the completed story titles to a git tag. Concatenate all git tag descriptions that made after these sprints, to get your list of stories you should support. Build in a test in your test runner that checks if each of these story codes exists as descriptions of your tests. </p>  <p> Although this approach is extreme, I can see it&rsquo;s value in critical software. The takeaway lesson is to make use of existing information flows. </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>The story of how gourds became a videogame</title>
      <link>https://raymon.dev/posts/2026/3/the-story-of-how-gourds-became-a-videogame.html</link>
      <guid>https://raymon.dev/posts/2026/3/the-story-of-how-gourds-became-a-videogame.html</guid>
      <pubDate>Fri, 27 Mar 2026 17:00:00 GMT</pubDate>
      <description><![CDATA[
        <p> Making videogames worked great for me to learn programming, I still remember the struggle of understanding game engines. At some point I went into systems programming, until it was time to graduate and do a final project. </p>  <p> That final project was made three years ago and is still actively used. For instance, the project has been demonstrated as an example for the new graduation projects, which is quite an honor to hear afterwards. So I figured that it would be fun to shortly introduce the game here. </p> <div id="outline-container-orgf750766" class="outline-2"> <h2 id="orgf750766">The game with a fruity name</h2> <div class="outline-text-2" id="text-orgf750766"> <p> <a href="https://gourds.science.uu.nl">Gourds</a> is a slide puzzle with hexagonal pieces that occupy two spaces; they look like <a href="https://en.wikipedia.org/wiki/Bottle_gourd">bottle gourds</a>, hence the name. The goal is to match the colors of the pieces with the background, and if that happens the pieces disappear and show the background image. There is a level navigation that is also a larger background image, completing levels shows the larger image. </p>  <p> The game is playable as an intuitive web application, and includes a hundred predesigned levels and an endless mode. There is a leaderboard and an editor to let players design their own puzzles. </p>  <p> There are three possible moves that you can do in the game: a piece can either turn, slide of pivot. </p>  <p> <i>Feel free to try to <a href="https://gourds.science.uu.nl/">play the game!</a></i> </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>For a fraction of the cost of modern cloud</title>
      <link>https://raymon.dev/posts/2026/2/for-a-fraction-of-the-cost-of-modern-cloud.html</link>
      <guid>https://raymon.dev/posts/2026/2/for-a-fraction-of-the-cost-of-modern-cloud.html</guid>
      <pubDate>Sat, 21 Feb 2026 17:00:00 GMT</pubDate>
      <description><![CDATA[
        <p> Imagine for a moment that you work as a corporate recruiter, and that you are trying to find your next candidate programmer. </p>  <p> Will you hire a so-called vibe-coder, which has delegated all executive functions to a virtual chatbot. Or will you hire the &ldquo;wrote the CMS by hand&rdquo; wizzkid that thinks you are crazy for needing to consult the internet instead of local manpages. </p>  <p> It may just be a gut feeling, but it feels like a lot of cost can be saved by not hiring the first. That there are a lot of hidden costs added to projects in the form of technical debt by choosing for the first. </p>  <p> Further hidden costs would be the choice of frameworks and other tools that are quite niche or still in active development. I have had the delight of choosing a frontend framework more than once, which is not a lightweight decision for a website project. There are a lot of fancy options out there, but for a project with a lot of people the plain choice sticks best. If the website needs to be dynamic, going for React with JavaScript or TypeScript works well as it is well understood how the framework operates; it is battle-tested. </p>  <p> And the same logic can be applied to the selection of tools for cloud infrastructure. Tools like docker are also getting more sophisticated, making it sufficient to make the infrastructure solution work with lightweight tools. If all the customer asks for is a sandwich, using ten different kinds of spreads on one slice of bread does not make it better; they will probably just prefer a peanut butter and jelly sandwich. </p>  <p> Native cluster management exists with docker under swarm mode. And for a lot of projects, that may already be sufficient and also simple to understand. Hold the urge to be fancy, because you might add a bunch of tooling that at the end turns out to be redundant. </p>  <p> In addition, because the internet is full of large configs, chatbots will also sprinkle in a lot of unneeded configurations. So when you want a minimal setup, that is something to keep in mind if you let a chatbot draft up the initial configuration. </p> 
]]></description>
    </item>

    <item>
      <title>Sketching on the canvas with quil</title>
      <link>https://raymon.dev/posts/2024/12/sketching-on-the-canvas-with-quil.html</link>
      <guid>https://raymon.dev/posts/2024/12/sketching-on-the-canvas-with-quil.html</guid>
      <pubDate>Tue, 24 Dec 2024 16:00:00 +0100</pubDate>
      <description><![CDATA[
        <p> There is a certain joy in creative programming that is unique to it. And the best thing is that it does not have to be a game that you are building. It also applies to making a sketch or animation, which can be done with the same canvas tools. Usually I use <a href="https://processing.org/">Processing</a> or <a href="https://p5js.org/">P5.js</a> to make these kinds of prototypes, but recently I found <a href="http://quil.info/">Quil</a>. It is based on Processing, and supports creating these canvas applications in Clojure and ClojureScript with the same familiar API. </p> <div id="outline-container-orgfd9658c" class="outline-2"> <h2 id="orgfd9658c">Small polygon example in Quil</h2> <div class="outline-text-2" id="text-orgfd9658c"> <p> The library quil comes with a project template, which is setup conveniently that it automatically runs the application when you load the code. I chose to write it in Clojure, and generated the project with `lein new quil my-sketch`. It comes with a default animation of an animated circle, which reminded me of a polygon animation. </p>  <p> The animations are quite similar, and the existing color shifting the template has is a nice touch that we will keep. The original P5.js sketch will also be included at the end for reference. The first extension is to include the radius and amount of sides to the state: </p>   <div class="org-src-container"> <pre class="src src-clojure"><span style="color: #51afef;">(</span><span style="color: #51afef;">defn</span> <span style="color: #c678dd;">setup</span> <span style="color: #c678dd;">[]</span>   <span style="color: #c678dd;">(</span><span style="color: #ECBE7B;">q</span>/frame-rate <span style="color: #da8548; font-weight: bold;">30</span><span style="color: #c678dd;">)</span>   <span style="color: #c678dd;">(</span><span style="color: #ECBE7B;">q</span>/color-mode <span style="color: #a9a1e1;">:hsb</span><span style="color: #c678dd;">)</span>    <span style="color: #c678dd;">{</span><span style="color: #a9a1e1;">:color</span> <span style="color: #da8548; font-weight: bold;">0</span>    <span style="color: #a9a1e1;">:angle</span> <span style="color: #da8548; font-weight: bold;">0</span>    <span style="color: #a9a1e1;">:radius</span> <span style="color: #da8548; font-weight: bold;">50</span>    <span style="color: #a9a1e1;">:sides</span> <span style="color: #da8548; font-weight: bold;">5</span><span style="color: #c678dd;">}</span><span style="color: #51afef;">)</span> </pre> </div>   <p> The polygon animation demonstrates interactivity, and iterates the amount of sides. The minimum is a triangle, and the maximum looks like a circle. For simplicity the mouse input will be used to decrease and increase the amount of sides of the polygon. The radius will remain constant, and the angle will keep increasing to make the polygon rotate. The existing color shifting logic is also kept, which wraps around the hue value of the color. </p>  <div class="org-src-container"> <pre class="src src-clojure"><span style="color: #51afef;">(</span><span style="color: #51afef;">defn</span> <span style="color: #c678dd;">update-state</span> <span style="color: #c678dd;">[</span>state<span style="color: #c678dd;">]</span>   <span style="color: #c678dd;">{</span><span style="color: #a9a1e1;">:color</span> <span style="color: #98be65;">(</span>mod <span style="color: #a9a1e1;">(</span>+ <span style="color: #51afef;">(</span><span style="color: #a9a1e1;">:color</span> state<span style="color: #51afef;">)</span> <span style="color: #da8548; font-weight: bold;">0.7</span><span style="color: #a9a1e1;">)</span> <span style="color: #da8548; font-weight: bold;">255</span><span style="color: #98be65;">)</span>    <span style="color: #a9a1e1;">:angle</span> <span style="color: #98be65;">(</span>+ <span style="color: #a9a1e1;">(</span><span style="color: #a9a1e1;">:angle</span> state<span style="color: #a9a1e1;">)</span> <span style="color: #da8548; font-weight: bold;">0.1</span><span style="color: #98be65;">)</span>    <span style="color: #a9a1e1;">:radius</span> <span style="color: #da8548; font-weight: bold;">50</span>    <span style="color: #a9a1e1;">:sides</span> <span style="color: #98be65;">(</span><span style="color: #51afef;">if</span> <span style="color: #a9a1e1;">(</span><span style="color: #ECBE7B;">q</span>/mouse-pressed?<span style="color: #a9a1e1;">)</span>             <span style="color: #a9a1e1;">(</span><span style="color: #51afef;">if</span> <span style="color: #51afef;">(</span>= <span style="color: #a9a1e1;">:left</span> <span style="color: #c678dd;">(</span><span style="color: #ECBE7B;">q</span>/mouse-button<span style="color: #c678dd;">)</span><span style="color: #51afef;">)</span>               <span style="color: #51afef;">(</span>max <span style="color: #c678dd;">(</span>dec <span style="color: #98be65;">(</span><span style="color: #a9a1e1;">:sides</span> state<span style="color: #98be65;">)</span><span style="color: #c678dd;">)</span> <span style="color: #da8548; font-weight: bold;">3</span><span style="color: #51afef;">)</span>               <span style="color: #51afef;">(</span>min <span style="color: #c678dd;">(</span>inc <span style="color: #98be65;">(</span><span style="color: #a9a1e1;">:sides</span> state<span style="color: #98be65;">)</span><span style="color: #c678dd;">)</span> <span style="color: #da8548; font-weight: bold;">20</span><span style="color: #51afef;">)</span><span style="color: #a9a1e1;">)</span>             <span style="color: #a9a1e1;">(</span><span style="color: #a9a1e1;">:sides</span> state<span style="color: #a9a1e1;">)</span><span style="color: #98be65;">)</span><span style="color: #c678dd;">}</span><span style="color: #51afef;">)</span> </pre> </div>  <p> Drawing the polygon is a piece of cake if you draw it as a shape. That means that the lines are connected, and you only have to provide the next coordinates for the lines. Those coordinates are just rotations around a point with the correct radius. </p>  <div class="org-src-container"> <pre class="src src-clojure"><span style="color: #51afef;">(</span><span style="color: #51afef;">def</span> <span style="color: #dcaeea;">full-radians</span> <span style="color: #c678dd;">(</span>* <span style="color: #da8548; font-weight: bold;">2</span> <span style="color: #ECBE7B;">math</span>/PI<span style="color: #c678dd;">)</span><span style="color: #51afef;">)</span>  <span style="color: #51afef;">(</span><span style="color: #51afef;">defn</span> <span style="color: #c678dd;">draw-shapes</span> <span style="color: #c678dd;">[</span>state<span style="color: #c678dd;">]</span>   <span style="color: #c678dd;">(</span><span style="color: #ECBE7B;">q</span>/begin-shape<span style="color: #c678dd;">)</span>   <span style="color: #c678dd;">(</span><span style="color: #51afef;">doseq</span> <span style="color: #98be65;">[</span>i <span style="color: #a9a1e1;">(</span>range <span style="color: #da8548; font-weight: bold;">0</span> <span style="color: #51afef;">(</span><span style="color: #a9a1e1;">:sides</span> state<span style="color: #51afef;">)</span><span style="color: #a9a1e1;">)</span><span style="color: #98be65;">]</span>     <span style="color: #98be65;">(</span><span style="color: #51afef;">let</span> <span style="color: #a9a1e1;">[</span>angle <span style="color: #51afef;">(</span>+ <span style="color: #c678dd;">(</span>* <span style="color: #98be65;">(</span>/ full-radians <span style="color: #a9a1e1;">(</span><span style="color: #a9a1e1;">:sides</span> state<span style="color: #a9a1e1;">)</span><span style="color: #98be65;">)</span> i<span style="color: #c678dd;">)</span> <span style="color: #c678dd;">(</span><span style="color: #a9a1e1;">:angle</span> state<span style="color: #c678dd;">)</span><span style="color: #51afef;">)</span>           radius <span style="color: #51afef;">(</span><span style="color: #a9a1e1;">:radius</span> state<span style="color: #51afef;">)</span>           x <span style="color: #51afef;">(</span>* <span style="color: #da8548; font-weight: bold;">150</span> <span style="color: #c678dd;">(</span><span style="color: #ECBE7B;">q</span>/cos angle<span style="color: #c678dd;">)</span><span style="color: #51afef;">)</span>           y <span style="color: #51afef;">(</span>* <span style="color: #da8548; font-weight: bold;">150</span> <span style="color: #c678dd;">(</span><span style="color: #ECBE7B;">q</span>/sin angle<span style="color: #c678dd;">)</span><span style="color: #51afef;">)</span><span style="color: #a9a1e1;">]</span>       <span style="color: #a9a1e1;">(</span><span style="color: #ECBE7B;">q</span>/vertex x y<span style="color: #a9a1e1;">)</span><span style="color: #98be65;">)</span><span style="color: #c678dd;">)</span>   <span style="color: #c678dd;">(</span><span style="color: #ECBE7B;">q</span>/end-shape <span style="color: #a9a1e1;">:close</span><span style="color: #c678dd;">)</span><span style="color: #51afef;">)</span>  <span style="color: #51afef;">(</span><span style="color: #51afef;">defn</span> <span style="color: #c678dd;">draw-state</span> <span style="color: #c678dd;">[</span>state<span style="color: #c678dd;">]</span>   <span style="color: #c678dd;">(</span><span style="color: #ECBE7B;">q</span>/background <span style="color: #da8548; font-weight: bold;">40</span><span style="color: #c678dd;">)</span> <span style="color: #5B6268;">; </span><span style="color: #5B6268;">(q/angle-mode :degrees) only for cljs, so we use radians</span>   <span style="color: #c678dd;">(</span><span style="color: #ECBE7B;">q</span>/fill <span style="color: #98be65;">(</span><span style="color: #a9a1e1;">:color</span> state<span style="color: #98be65;">)</span> <span style="color: #da8548; font-weight: bold;">255</span> <span style="color: #da8548; font-weight: bold;">255</span><span style="color: #c678dd;">)</span>   <span style="color: #c678dd;">(</span><span style="color: #ECBE7B;">q</span>/with-translation <span style="color: #98be65;">[</span><span style="color: #a9a1e1;">(</span>/ <span style="color: #51afef;">(</span><span style="color: #ECBE7B;">q</span>/width<span style="color: #51afef;">)</span> <span style="color: #da8548; font-weight: bold;">2</span><span style="color: #a9a1e1;">)</span>                        <span style="color: #a9a1e1;">(</span>/ <span style="color: #51afef;">(</span><span style="color: #ECBE7B;">q</span>/height<span style="color: #51afef;">)</span> <span style="color: #da8548; font-weight: bold;">2</span><span style="color: #a9a1e1;">)</span><span style="color: #98be65;">]</span>     <span style="color: #98be65;">(</span>draw-shapes state<span style="color: #98be65;">)</span><span style="color: #c678dd;">)</span><span style="color: #51afef;">)</span> </pre> </div> </div> </div> <div id="outline-container-org5acf2c7" class="outline-2"> <h2 id="org5acf2c7">Small polygon example in P5.js</h2> <div class="outline-text-2" id="text-org5acf2c7"> <div class="org-src-container"> <pre class="src src-javascript"><span style="color: #51afef;">const</span> <span style="color: #dcaeea;">bgColor</span> = <span style="color: #da8548; font-weight: bold;">40</span>;  <span style="color: #51afef;">let</span> <span style="color: #dcaeea;">sliderDOM</span>;  <span style="color: #51afef;">let</span> <span style="color: #dcaeea;">polygon</span>;  <span style="color: #51afef;">class</span> Polygon {   constructor(x, y, r, color = <span style="color: #da8548; font-weight: bold;">255</span>) {     <span style="color: #a9a1e1;">this</span>.x = x;     <span style="color: #a9a1e1;">this</span>.y = y;     <span style="color: #a9a1e1;">this</span>.r = r;     <span style="color: #a9a1e1;">this</span>.color = color;   }    draw(sides, rotate) {     <span style="color: #a9a1e1;">this</span>.rotationDeg = frameCount;      fill(<span style="color: #a9a1e1;">this</span>.color);     angleMode(DEGREES);      beginShape();     <span style="color: #51afef;">for</span> (<span style="color: #51afef;">let</span> <span style="color: #dcaeea;">i</span> = <span style="color: #da8548; font-weight: bold;">0</span>; i &lt; sides; i++) {       <span style="color: #51afef;">let</span> <span style="color: #dcaeea;">x</span> = <span style="color: #a9a1e1;">this</span>.x + (<span style="color: #a9a1e1;">this</span>.r * cos(<span style="color: #da8548; font-weight: bold;">360</span> / sides * i + <span style="color: #a9a1e1;">this</span>.rotationDeg));       <span style="color: #51afef;">let</span> <span style="color: #dcaeea;">y</span> = <span style="color: #a9a1e1;">this</span>.y + (<span style="color: #a9a1e1;">this</span>.r * sin(<span style="color: #da8548; font-weight: bold;">360</span> / sides * i + <span style="color: #a9a1e1;">this</span>.rotationDeg));       vertex(x, y);     }     endShape(CLOSE);   } }  <span style="color: #51afef;">function</span> <span style="color: #c678dd;">setup</span>() {   createCanvas(<span style="color: #da8548; font-weight: bold;">500</span>, <span style="color: #da8548; font-weight: bold;">500</span>);   background(bgColor);    sliderDOM = document.getElementById(<span style="color: #98be65;">'range_sides'</span>);    polygon = <span style="color: #51afef;">new</span> <span style="color: #ECBE7B;">Polygon</span>(width / <span style="color: #da8548; font-weight: bold;">2</span>, height / <span style="color: #da8548; font-weight: bold;">2</span>, <span style="color: #da8548; font-weight: bold;">120</span>); }  <span style="color: #51afef;">function</span> <span style="color: #c678dd;">draw</span>() {   background(bgColor);    <span style="color: #51afef;">let</span> <span style="color: #dcaeea;">sides</span> = sliderDOM.value;    polygon.draw(sides, doRotation); } </pre> </div> </div> </div> 
]]></description>
    </item>

    <item>
      <title>Email and posting style</title>
      <link>https://raymon.dev/posts/2025/10/email-and-posting-style.html</link>
      <guid>https://raymon.dev/posts/2025/10/email-and-posting-style.html</guid>
      <pubDate>Sat, 18 Oct 2025 17:00:00 GMT</pubDate>
      <description><![CDATA[
        <p> What kind of data is moving around in modern software? That question has been on my mind lately, because I suspected it would be a whole lot of noise. A bunch of noise that is the result of the modern software that is often proprietory and lacks the care or need to be streamlined and thoughtful. </p>  <p> If you think I am exaggerating, I invite you to the following exercise. Open up a random email you received from a company, and look for the &ldquo;show source&rdquo; option in your email program. Chances are that you are presented with a large wall of HTML with probably a lot of noise that is not text content of the email. But okay, you say that is needed to make it look professional and pleasant to read, so far all reasonable. </p>  <p> What is not reasonable is the total size typically sent emails take up. And to understand that better, take a look at the structure of an email that is a reply. You know, with the title typically starting with &ldquo;Re: &#x2026;&rdquo;. Under the hood that email has a &ldquo;In-Reply-To&rdquo; header. So if you have the previous message, your email program can piece them together and visually show the chain of messages as a thread. </p>  <p> If you look closer to the raw text of such a reply email, you see something different. Instead of just linking to the reply, the reply is typically also quoted in full. Modern email clients like Microsoft Outlook do this when you press &ldquo;reply&rdquo; and have influenced what is considered &ldquo;normal&rdquo; via these provided defaults. </p>  <p> That means that the size of the email grows steadily, as each reply copies all previous conversation history again and again. Totally unneeded if you are replying to the same person, which should already have that message history. It should not be surprising that this allows selling more storage space to organisations. </p>  <p> Does this go by unnoticed? Because what about the size of the emails you receive? Anything under a megabyte does not sound like much to most people. Most work environments encourage email footers, typically with a company logo. And that logo is also typically not linked, but copied in full as an attachment. </p>  <p> People talk a lot about &ldquo;consider before you print this email&rdquo;, but what about the footprint of the email itself on datacenters? This behavior is not the fault of its users, it is a symptom of the software making it. The discovery of this information for me started with using a different email client. And with curiosity of how email functions and the discussions people had in the past about email. </p>  <p> Recently I was pleasantly surprised and educated by the format I received an email reply in. It was neatly in text form, with interleaved replies and no further noise. That lead me to revisiting this topic and eventually also to writing this article. </p>  <p> <i>Read more about <a href="https://en.wikipedia.org/wiki/Posting_style">posting style here</a></i> </p> 
]]></description>
    </item>

    <item>
      <title>Game SpaceStride</title>
      <link>https://raymon.dev/posts/2021/11/game-spacestride.html</link>
      <guid>https://raymon.dev/posts/2021/11/game-spacestride.html</guid>
      <pubDate>Fri, 19 Nov 2021 08:30:00 GMT</pubDate>
      <description><![CDATA[
        <p> Haskell, the language loved for its types, laziness, and declarative nature. I was already familiar with the language; A couple of years ago, it seemed like a nice language to try out project euler problems on. So if I were to make a game using it, the focus would be on learning common practices and convenient ways to structure your code. </p>  <p> And so a game was born. Would it be 3D? No, ofcourse not. 2D? Well that sounds more like it. What about making some graphics? Why not. Pair programming? Well THAT sounds really nice. </p>  <p> The entire project took only 35 hours ish, with 20 hours pair programming. So it was a gamejam. We had a lot of fun making it, and you can checkout the game here: <a href="https://github.com/Raymonzut/SpaceStride">Space Stride</a> A lot of the architecture on top of MVC is from <a href="https://sporto.github.io/elm-patterns/basic/impossible-states.html">this documentation on design patterns in Elm</a>. </p>  <p> To give an example how it translated to SpaceStride, just look at src/Model.hs. It has the following all-describing GameState: </p>   <div class="org-src-container"> <pre class="src src-haskell"><span class="linenr">16: </span><span style="color: #fb4934;">data</span> <span style="color: #fabd2f;">GameState</span> <span style="color: #83a598;">=</span> <span style="color: #fabd2f;">Playing</span>            { _playingGame <span style="color: #83a598;">::</span> <span style="color: #fabd2f;">PlayingState</span> } <span class="linenr">17: </span>               <span style="color: #83a598;">|</span> <span style="color: #fabd2f;">Paused</span>             { _pausedGame  <span style="color: #83a598;">::</span> <span style="color: #fabd2f;">PlayingState</span> } <span class="linenr">18: </span>               <span style="color: #83a598;">|</span> <span style="color: #fabd2f;">PlayerDead</span>         { _deadGame    <span style="color: #83a598;">::</span> <span style="color: #fabd2f;">PlayingState</span> <span class="linenr">19: </span>                                    , _animationFrameCount <span style="color: #83a598;">::</span> <span style="color: #fabd2f;">Int</span> <span class="linenr">20: </span>                                    } <span class="linenr">21: </span>               <span style="color: #83a598;">|</span> <span style="color: #fabd2f;">GameOverTypeName</span>   { _score <span style="color: #83a598;">::</span> <span style="color: #fabd2f;">Int</span> <span class="linenr">22: </span>                                    , _playerName <span style="color: #83a598;">::</span> <span style="color: #fabd2f;">String</span> <span class="linenr">23: </span>                                    } <span class="linenr">24: </span>               <span style="color: #83a598;">|</span> <span style="color: #fabd2f;">GameOverShowScores</span> { _score <span style="color: #83a598;">::</span> <span style="color: #fabd2f;">Int</span> <span class="linenr">25: </span>                                    , _playerName <span style="color: #83a598;">::</span> <span style="color: #fabd2f;">String</span> <span class="linenr">26: </span>                                    , _highscoreBoard <span style="color: #83a598;">::</span> <span style="color: #fabd2f;">HighScoreBoard</span> <span class="linenr">27: </span>                                    } </pre> </div>  <p> This already gives you tons of information about the game, and gives you a clear idea of the data that gets passed around. And it gets even better. These records can be enhanced with Lenses and Prisms. I absolutely fell in love with how declarative the code can get with this small addition. </p>  <p> To illustrate this, lets have a peek at src/Controller.hs. All you need to know is in the top-level functions. </p>  <p> For Playing, it looks like this: </p> <div class="org-src-container"> <pre class="src src-haskell"><span class="linenr">20: </span><span style="color: #b8bb26;">step</span> <span style="color: #83a598;">::</span> <span style="color: #fabd2f;">Float</span> <span style="color: #83a598;">-&gt;</span> <span style="color: #fabd2f;">GameState</span> <span style="color: #83a598;">-&gt;</span> <span style="color: #fabd2f;">IO</span> <span style="color: #fabd2f;">GameState</span> <span class="linenr">21: </span><span style="color: #b8bb26;">step</span> secs (<span style="color: #fabd2f;">Playing</span> pstate) <span class="linenr">22: </span>  <span style="color: #83a598;">|</span> delta <span style="color: #83a598;">&gt;</span> secsPerUpdate <span class="linenr">23: </span>  <span style="color: #83a598;">=</span> <span style="color: #fb4934;">do</span> randomNumber <span style="color: #83a598;">&lt;-</span> randomIO <span style="color: #83a598;">::</span> <span style="color: #fabd2f;">IO</span> <span style="color: #fabd2f;">Int</span> <span class="linenr">24: </span>       return <span style="color: #83a598;">$</span> (<span style="color: #fabd2f;">Playing</span> <span style="color: #83a598;">$</span> pstate <span class="linenr">25: </span>         <span style="color: #83a598;">&amp;</span> seed <span style="color: #83a598;">%~</span> const randomNumber <span class="linenr">26: </span>         <span style="color: #83a598;">&amp;</span> movePlayer delta <span class="linenr">27: </span>         <span style="color: #83a598;">&amp;</span> moveEnemies delta <span class="linenr">28: </span>         <span style="color: #83a598;">&amp;</span> pruneOffScreenEnemies <span class="linenr">29: </span>         <span style="color: #83a598;">&amp;</span> scrollBackground delta <span class="linenr">30: </span>         <span style="color: #83a598;">&amp;</span> attemptEnemySpawn <span class="linenr">31: </span>         <span style="color: #83a598;">&amp;</span> elapsedTime <span style="color: #83a598;">%~</span> const <span style="color: #d3869b; font-weight: bold;">0</span> <span class="linenr">32: </span>        )<span style="color: #83a598;">&amp;</span> collisionCheck </pre> </div> <p> And it reads just as you would describe it: If we are playing and it is time for an update, then we go to the next playing state. This state starts with the old one adds a new seed, which is constantly a new randomNumber, moves the player, moves the enemies, &#x2026; </p>  <p> This simplicity also bubbles down to the event handlers, where at no cost keybindings can choose to be dependent on the current GameState variant: </p> <div class="org-src-container"> <pre class="src src-haskell"><span class="linenr">59: </span><span style="color: #b8bb26;">inputKey</span> <span style="color: #83a598;">::</span> <span style="color: #fabd2f;">Event</span> <span style="color: #83a598;">-&gt;</span> <span style="color: #fabd2f;">GameState</span> <span style="color: #83a598;">-&gt;</span> <span style="color: #fabd2f;">GameState</span> <span class="linenr">60: </span><span style="color: #b8bb26;">inputKey</span> (<span style="color: #fabd2f;">EventKey</span> (<span style="color: #fabd2f;">Char</span> <span style="color: #b8bb26;">'p'</span>) <span style="color: #fabd2f;">Down</span> <span style="color: #fb4934;">_</span> <span style="color: #fb4934;">_</span>) (<span style="color: #fabd2f;">Playing</span> pstate) <span style="color: #83a598;">=</span> <span style="color: #fabd2f;">Paused</span> pstate <span class="linenr">61: </span><span style="color: #b8bb26;">inputKey</span> (<span style="color: #fabd2f;">EventKey</span> (<span style="color: #fabd2f;">Char</span> <span style="color: #b8bb26;">'p'</span>) <span style="color: #fabd2f;">Down</span> <span style="color: #fb4934;">_</span> <span style="color: #fb4934;">_</span>) (<span style="color: #fabd2f;">Paused</span>  pstate) <span style="color: #83a598;">=</span> <span style="color: #fabd2f;">Playing</span> pstate <span class="linenr">62: </span><span style="color: #b8bb26;">inputKey</span> (<span style="color: #fabd2f;">EventKey</span> (<span style="color: #fabd2f;">Char</span> <span style="color: #b8bb26;">'q'</span>) <span style="color: #fabd2f;">Down</span> <span style="color: #fb4934;">_</span> <span style="color: #fb4934;">_</span>) (<span style="color: #fabd2f;">Playing</span> pstate) <span style="color: #83a598;">=</span> <span style="color: #fabd2f;">GameOverTypeName</span> (getScore pstate) <span style="color: #b8bb26;">""</span> <span class="linenr">63: </span><span style="color: #b8bb26;">inputKey</span> (<span style="color: #fabd2f;">EventKey</span> (<span style="color: #fabd2f;">Char</span> <span style="color: #b8bb26;">'q'</span>) <span style="color: #fabd2f;">Down</span> <span style="color: #fb4934;">_</span> <span style="color: #fb4934;">_</span>) (<span style="color: #fabd2f;">Paused</span>  pstate) <span style="color: #83a598;">=</span> <span style="color: #fabd2f;">GameOverTypeName</span> (getScore pstate) <span style="color: #b8bb26;">""</span> </pre> </div>  <p> And likewise supports updating in the same clear way: </p> <div class="org-src-container"> <pre class="src src-haskell"><span class="linenr">64: </span><span style="color: #b8bb26;">inputKey</span> (<span style="color: #fabd2f;">EventKey</span> (<span style="color: #fabd2f;">MouseButton</span> <span style="color: #fabd2f;">LeftButton</span>) ks <span style="color: #fb4934;">_</span> __)  (<span style="color: #fabd2f;">Playing</span> pstate) <span style="color: #83a598;">=</span> <span style="color: #fabd2f;">Playing</span> <span style="color: #83a598;">$</span> pstate <span class="linenr">65: </span>  <span style="color: #83a598;">&amp;</span> (player <span style="color: #83a598;">.</span> moveDirection <span style="color: #83a598;">%~</span> updatePlayerDirection <span style="color: #b8bb26;">'a'</span> ks) <span class="linenr">66: </span><span style="color: #b8bb26;">inputKey</span> (<span style="color: #fabd2f;">EventKey</span> (<span style="color: #fabd2f;">MouseButton</span> <span style="color: #fabd2f;">RightButton</span>) ks <span style="color: #fb4934;">_</span> __) (<span style="color: #fabd2f;">Playing</span> pstate) <span style="color: #83a598;">=</span> <span style="color: #fabd2f;">Playing</span> <span style="color: #83a598;">$</span> pstate <span class="linenr">67: </span>  <span style="color: #83a598;">&amp;</span> (player <span style="color: #83a598;">.</span> moveDirection <span style="color: #83a598;">%~</span> updatePlayerDirection <span style="color: #b8bb26;">'d'</span> ks) <span class="linenr">68: </span><span style="color: #b8bb26;">inputKey</span> (<span style="color: #fabd2f;">EventKey</span> (<span style="color: #fabd2f;">Char</span> c) ks <span style="color: #fb4934;">_</span> <span style="color: #fb4934;">_</span>)     (<span style="color: #fabd2f;">Playing</span> pstate) <span style="color: #83a598;">=</span> <span style="color: #fabd2f;">Playing</span> <span style="color: #83a598;">$</span> pstate <span class="linenr">69: </span>  <span style="color: #83a598;">&amp;</span> (player <span style="color: #83a598;">.</span> moveDirection <span style="color: #83a598;">%~</span> updatePlayerDirection c ks) <span class="linenr">70: </span><span style="color: #b8bb26;">inputKey</span> <span style="color: #fb4934;">_</span> gstate <span style="color: #83a598;">=</span> gstate </pre> </div> 
]]></description>
    </item>

    <item>
      <title>Uniting software</title>
      <link>https://raymon.dev/posts/2021/3/uniting-software.html</link>
      <guid>https://raymon.dev/posts/2021/3/uniting-software.html</guid>
      <pubDate>Sat, 20 Mar 2021 14:00:00 GMT</pubDate>
      <description><![CDATA[
        <p> It starts innocent, without any notion of the larger picture. Just writing code for the sake of writing code. A great way to gain experience. Powerful when kept as a tool for improving skill. But what are the ways in which it ain&rsquo;t powerful? </p>  <p> Go back to fundamentals of what source-code allows; It is the creation of programs. No rocket science indeed. The more source code you have written in a certain programming language, the richer the logic of the created program can be. Viewing source-code is as the composition of logic acting on data hits you deeply; These components are striving for reusability, capturing identical abstractions between their uses. </p>  <p> Uniting software would be the act of considering common parts between projects. A clear example would be static-site-generators, which captures content being static from the start/when updating the site. The capture is general enough to allow different types of outputs; HTML, RSS, Gopher-Markdown, etc. So it allows a simpeler codebase and more features. Great! Steps taken to reconsider the &ldquo;capture&rdquo; the project has, is refactoring on the highest level. </p> 
]]></description>
    </item>

    <item>
      <title>Tooling blame game</title>
      <link>https://raymon.dev/posts/2021/12/tooling-blame-game.html</link>
      <guid>https://raymon.dev/posts/2021/12/tooling-blame-game.html</guid>
      <pubDate>Sun, 05 Dec 2021 15:00:00 GMT</pubDate>
      <description><![CDATA[
        <p> Yesterday, while programming the solutions to Day 4 of <a href="https://raymon.dev/posts/2021/12/advent-of-code-2021.html">Advent of Code 2021</a>, I stumbled into a mistake that was way too fun to not share. </p>  <div id="outline-container-orga7ed4e6" class="outline-2"> <h2 id="orga7ed4e6">The painful experience</h2> <div class="outline-text-2" id="text-orga7ed4e6"> <p> So imagine the following scenario: you have just written a source file with 100 lines of code, tested individual components, and are now running it for the first time as a whole. You are doing REPL-driven development, and are now running the main function inside the REPL. You are waiting, and waiting, and there is just no output. You begin to question why, so you jump back to the source file and reload that into the REPL. But it does not load it, it keeps getting stuck on &ldquo;Loading file X into REPL&rdquo;. And before you know it, your entire editor stutters, CPU and RAM usage explodes, and your system almost becomes un-usable. &ldquo;A restart will fix it right?&rdquo; </p>  <p> As you restart the development environment, the same thing happens again. You intensely stare at the code you have just written. Five minutes ago it still had value, but now seems to only be some random text on your screen. Not admitting your defeat just yet, by fleeing to a programming language with tooling you know, you give up for the coming 1.5 hours. </p> </div> </div>  <div id="outline-container-org54b2614" class="outline-2"> <h2 id="org54b2614">Getting back on track</h2> <div class="outline-text-2" id="text-org54b2614"> <p> So after this break, you see that all tooling reading your code breaks. The breakthrough is when you realize an empty REPL still works. And that one can read in other source files just fine. So there is something wrong with the code you have written, it bricks everything apparently. So after a binary search through your written code, (with a possible entire system freeze at each step) you find this snippet: </p>  <div class="org-src-container"> <pre class="src src-clojure"><span class="linenr">63: </span><span style="color: #fe8019;">(</span><span style="color: #fb4934;">defn</span> <span style="color: #b8bb26;">bingo?</span> <span style="color: #cc241d;">[</span>card<span style="color: #cc241d;">]</span> <span class="linenr">64: </span>  <span style="color: #cc241d;">(</span><span style="color: #fb4934;">or</span> <span style="color: #b8bb26;">(</span>bingo-horizontal? card<span style="color: #b8bb26;">)</span> <span class="linenr">65: </span>      <span style="color: #b8bb26;">(</span>bingo-vertical? card<span style="color: #b8bb26;">)</span><span style="color: #cc241d;">)</span><span style="color: #fe8019;">)</span> <span class="linenr">66: </span> <span class="linenr">67: </span><span style="color: #fe8019;">(</span>-main<span style="color: #fe8019;">)</span> <span style="color: #928374;">;; </span><span style="color: #928374;">And it is this expression that ruins it all</span> <span class="linenr">68: </span><span style="color: #fe8019;">(</span><span style="color: #fb4934;">defn</span> <span style="color: #b8bb26;">score-of-card</span> <span style="color: #cc241d;">[</span>card<span style="color: #cc241d;">]</span> <span class="linenr">69: </span>  <span style="color: #cc241d;">(</span><span style="color: #fb4934;">if</span> <span style="color: #b8bb26;">(</span>bingo? card<span style="color: #b8bb26;">)</span> <span class="linenr">70: </span>    <span style="color: #b8bb26;">(</span>reduce + <span style="color: #83a598;">(</span>map score-of-row card<span style="color: #83a598;">)</span><span style="color: #b8bb26;">)</span> <span class="linenr">71: </span>    <span style="color: #d3869b; font-weight: bold;">0</span><span style="color: #cc241d;">)</span><span style="color: #fe8019;">)</span> <span class="linenr">72: </span> </pre> </div>  <p> It got lingered around while debugging. Probably a wrong copy-paste. But that main was not correct yet. The main happens to loop forever. And thus, while reading this file in, it was getting stuck on evaluating it. </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>Example post for my new org-gen post page!</title>
      <link>https://raymon.dev/posts/2021/4/example-post-for-my-new-org-gen-post-page!.html</link>
      <guid>https://raymon.dev/posts/2021/4/example-post-for-my-new-org-gen-post-page!.html</guid>
      <pubDate>Wed, 28 Apr 2021 11:25:00 GMT</pubDate>
      <description><![CDATA[
        <p> My new posts page is live, this post has been generated from an org file </p> 
]]></description>
    </item>

    <item>
      <title>Hopping around</title>
      <link>https://raymon.dev/posts/2022/2/hopping-around.html</link>
      <guid>https://raymon.dev/posts/2022/2/hopping-around.html</guid>
      <pubDate>Mon, 14 Feb 2022 09:26:00 GMT</pubDate>
      <description><![CDATA[
        <p> I have had a fair deal of distro-hopping over the years. The journey was well worth it and fun to take, so I wanted to share the highlights with you. </p>  <div id="outline-container-org77ba859" class="outline-2"> <h2 id="org77ba859">In short</h2> <div class="outline-text-2" id="text-org77ba859"> <p> Here is a chronological table of the linux distro&rsquo;s per year: </p>  <table border="0" cellspacing="0" cellpadding="6" rules="all" frame="void">   <colgroup> <col  class="org-left" />  <col  class="org-left" />  <col  class="org-right" /> </colgroup> <thead> <tr> <th scope="col" class="org-left">PC</th> <th scope="col" class="org-left">Laptop</th> <th scope="col" class="org-right">Year</th> </tr> </thead> <tbody> <tr> <td class="org-left">-</td> <td class="org-left">ZorinOS</td> <td class="org-right">2017</td> </tr>  <tr> <td class="org-left">Mint</td> <td class="org-left">Lubuntu</td> <td class="org-right">2018</td> </tr>  <tr> <td class="org-left">Pop!_OS</td> <td class="org-left">Pop!_OS</td> <td class="org-right">2019</td> </tr>  <tr> <td class="org-left">Arch</td> <td class="org-left">Arch</td> <td class="org-right">2020</td> </tr>  <tr> <td class="org-left">Arch</td> <td class="org-left">Arch</td> <td class="org-right">2021</td> </tr>  <tr> <td class="org-left">Artix</td> <td class="org-left">Artix</td> <td class="org-right">2021</td> </tr>  <tr> <td class="org-left">Artix</td> <td class="org-left">Artix</td> <td class="org-right">2022</td> </tr>  <tr> <td class="org-left">Arch</td> <td class="org-left">Arch</td> <td class="org-right">2022</td> </tr>  <tr> <td class="org-left">Debian</td> <td class="org-left">Debian</td> <td class="org-right">2023</td> </tr> </tbody> </table>  <p> At one point I ran a linux-triple-boot on my PC to test several operating systems. Yeah you read that right, <b>triple</b>. OS-prober had as much fun as I had maintaining it. </p> </div> </div>  <div id="outline-container-org67027d9" class="outline-2"> <h2 id="org67027d9">A walk through time</h2> <div class="outline-text-2" id="text-org67027d9"> </div> <div id="outline-container-orgca99b04" class="outline-3"> <h3 id="orgca99b04">The good old days</h3> <div class="outline-text-3" id="text-orgca99b04"> <p> So I started out as a Windows user. Out of a curiosity for alternatives, the idea that an OS doesn&rsquo;t need to be one monolith peeked my interest. After all, if an OS has different parts, why are you not able to swap them out? </p>  <p> Switching to another OS when still needing being able to use one is a challenge. In the period you take the leap, it is the most difficult, while you are the least prepared. So there were two ways to make the switch easier: </p> <ul class="org-ul"> <li>Keep Windows to fall back on</li> <li>Start with something that has roughly the same workflow as Windows.</li> </ul> <p> This by no means made it easy, there were still enough hurdles to overcome. But those were not to blame on the alternative; The Windows way of doing stuff was so baked in, which wanted to keep me going. </p>  <p> So I asked which alternative would get me going, and picked <a href="https://zorin.com/os/">ZorinOS</a> as a start with the low-end laptop. </p> </div> </div>  <div id="outline-container-org792d504" class="outline-3"> <h3 id="org792d504">ZorinOS</h3> <div class="outline-text-3" id="text-org792d504"> <p> So after getting started, it surprised me how much easier it was than anticipated. I wasn&rsquo;t using it differently than the Windows install yet, except when it came to package management. Having the option to update whenever you want, whatever you want, however you want was so much better! </p>  <p> The OS was also good in still having every option in a GUI, while being able to configure the internals if you would like. </p>  <p> There was one thing still bothering me: As it was running on a T60P, performance was still an issue. Compared to Windows 10 on that thing (it came with Windows Vista originally), this OS was actually usable. But it was far from snappy. If only there was something <span class="underline">lighter</span>. </p> </div> </div>  <div id="outline-container-orged03f84" class="outline-3"> <h3 id="orged03f84">Lubuntu; Light-weight Ubuntu</h3> <div class="outline-text-3" id="text-orged03f84"> <p> And that was the point where Lubuntu came into the picture. The extra experience gained with using ZorinOS was enough to try this distro out. And it actually running well on the old Thinkpad. </p>  <p> It also got me into the whole family of Ubuntu based distro&rsquo;s, so I decided it was finally time to try one of those on my main PC. The distro of choice was <a href="https://linuxmint.com/">Linux Mint</a>. </p> </div> </div>  <div id="outline-container-orgd81bdd3" class="outline-3"> <h3 id="orgd81bdd3">Linux Mint &amp; Pop!_OS</h3> <div class="outline-text-3" id="text-orgd81bdd3"> <p> Mint worked flawlessly, and is still a solid distro to start to start with if your previous experience was Windows. </p>  <p> It was because of Mint I stayed with linux as my main OS, Windows was biting dust by now But as I was still feeling adventurous, and I wanted to say goodbye to Windows for good, so I completely moved to <a href="https://pop.system76.com/">Pop!_OS</a>. </p>  <p> Because I had it on a live USB, why not try to boot it on the Thinkpad? That worked well, which I could not believe at first. This was so hilarious, that I also installed it on there and kept it like this for the next 3 years. </p> </div> </div>  <div id="outline-container-org2b221e2" class="outline-3"> <h3 id="org2b221e2">Arch</h3> <div class="outline-text-3" id="text-org2b221e2"> <p> And then came Arch. I tried out Arch from scratch and learned a ton. I upgraded the laptop so it did not have to run a minimal operating system anymore. Configuring it all from scratch once was enough for me, so I switched to <a href="https://github.com/LukeSmithxyz/LARBS">LARBS</a> to learn how the installed programs can work together. </p>  <p> I might try <a href="https://en.wikipedia.org/wiki/Hyperbola_GNU/Linux-libre">Hyperbola GNU</a> or <a href="https://voidlinux.org/">void</a> on the old T60P some day just to try. Arch (PC) and Artix (Laptop) suited me fine, it did not feel like they were worth replacing. </p> </div> </div>  <div id="outline-container-org2fe32cf" class="outline-3"> <h3 id="org2fe32cf">Debian</h3> <div class="outline-text-3" id="text-org2fe32cf"> <p> Although the arch based distro&rsquo;s do work well, there is elegance to using a stable release instead. It does not feel needed to have the newest software, and the updates also tend to be large. As I already had experience with systems based on Debian, it is trivial to use and some would even say boring as it just works. </p> </div> </div> </div>  <div id="outline-container-org4b3efa1" class="outline-2"> <h2 id="org4b3efa1">Wrapping up</h2> <div class="outline-text-2" id="text-org4b3efa1"> <p> So it was quite a trip to finally end up with one of the most straightforward choices. Along the way I got to experience the differences between the distro&rsquo;s, and now know much more about them. </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>The conference that reignited the dream</title>
      <link>https://raymon.dev/posts/2026/2/the-conference-that-reignited-the-dream.html</link>
      <guid>https://raymon.dev/posts/2026/2/the-conference-that-reignited-the-dream.html</guid>
      <pubDate>Mon, 02 Feb 2026 17:00:00 GMT</pubDate>
      <description><![CDATA[
        <p> Last weekend, I went to <a href="https://fosdem.org/2026/">FOSSDEM &rsquo;26</a> to enjoy a social circle with likeminded people that build awesome open source software. I also enjoyed drinking <a href="https://en.wikipedia.org/wiki/Lassi">lassi</a> for the first time with friends, which they suggested and instantly made me crave more of it. </p>  <p> It felt great to be around people who just understand this passion, and make a living doing what they love. And that made me aware of the dream I still pursue as a software engineer, to eventually reconcile this passion into day-to-day work. </p>  <p> Luckily there were plenty of people sharing how they managed to do it, which reignited this dream of mine to double-down on it. </p>  <p> Oh, and the security talks, they were also great, it is insane how far that technology has come. </p>  <p> Oh, and stickers, can never have too many stickers of the various open source projects, love it! </p>  <p> The trip itself was quite comfortable, I took the international train from Rotterdam to Brussels. It only stopped at Antwerpen, as it was the direct line to Belgium and that saved a lot of time. That most people there speak French is still funny to me, so I also practised that language a bit. Did that go well? Not quite, I will just say that the results were mixed, and that mishearing &ldquo;droit&rdquo; and &ldquo;trois&rdquo; leads to an interesting conversation. </p> 
]]></description>
    </item>

    <item>
      <title>Can you use AI for work</title>
      <link>https://raymon.dev/posts/2023/1/can-you-use-ai-for-work.html</link>
      <guid>https://raymon.dev/posts/2023/1/can-you-use-ai-for-work.html</guid>
      <pubDate>Mon, 09 Jan 2023 22:00:00 +0100</pubDate>
      <description><![CDATA[
        <p> Can you use tools for your work? </p>  <p> Can you use computers for your work? </p>   <p> I see no difference between the two era&rsquo;s, and neither with next era created by AI. </p>   <p> As in every technological advancement, your individual capacity increases if you have access to the tools. </p>  <p> As in every technological advancement, there is a delay where you can be an early adopter vs when everyone expects you to use X given the expected outcome or even job. </p>   <p> And just as with the mass adoption of computers, the works that are around in mass will change. </p>  <p> And just as with the mass adoption of computers, there will be a mass adoption of AI for work that will cause earlier work to become less rare and easier to create. </p>   <p> If outcome is your priority, there will be more outcome. </p>  <p> If outcome is your priority, prepare for any means used to achieve it. </p>   <p> A tool is just a tool, don&rsquo;t expect to learn the skill if the tool does all the effort, you then only learn to operate the tool. </p>  <p> You will only fool yourself. And if everyone fools themselves with it, <a href="https://philosiblog.com/2016/07/11/learning-without-thought-is-labor-lost-thought-without-learning-is-perilous/">the labor itself is lost</a>. </p> 
]]></description>
    </item>

    <item>
      <title>Mobile phones</title>
      <link>https://raymon.dev/posts/2020/8/mobile-phones.html</link>
      <guid>https://raymon.dev/posts/2020/8/mobile-phones.html</guid>
      <pubDate>Sun, 09 Aug 2020 18:47:00 GMT</pubDate>
      <description><![CDATA[
        <p> What a day it is to be alive. The last months I have been thinking of alternatives to the modern smartphone. Like perhaps the good old cellphones, simple and functional. These are now commonly referred to as dumbphones, as opposed to smartphones which have slowly become the standard. </p>  <p> Suppose you want to make the switch to a dumbphone, what are the roadblocks that lie ahead? Smartphone specific messaging services need a solid replacement when you used a smartphone before. Having your contacts switch over to other protocols could be unrealistic. You can adapt slowly, by simplifying the amount of services you use first. This also includes other services, like 2FA. I opted for the tool <a href="https://www.passwordstore.org/">pass</a> together with the extension pass-otp to replace 2FA. I like pass as you can script it. </p>  <p> Ideally, I wouldn&rsquo;t even carry a smartphone. But until that is a reality, let&rsquo;s focus on other stuff shall we? </p> 
]]></description>
    </item>

    <item>
      <title>Advent of Code 2021</title>
      <link>https://raymon.dev/posts/2021/12/advent-of-code-2021.html</link>
      <guid>https://raymon.dev/posts/2021/12/advent-of-code-2021.html</guid>
      <pubDate>Fri, 03 Dec 2021 17:30:00 GMT</pubDate>
      <description><![CDATA[
        <div id="outline-container-orgfd3c658" class="outline-2"> <h2 id="orgfd3c658">Introduction</h2> <div class="outline-text-2" id="text-orgfd3c658"> <p> Aah, it is December everybody! For the coders among us, this means an entire month of themed fun. I am talking about the <a href="https://adventofcode.com/">Advent of Code</a> event, 2021 edition. </p>  <p> The solutions I will make will be in any LISP. To start off, the LISP of choice is <a href="https://raymon.dev/posts/2021/12/clojure.html">Clojure</a> I will attempt the first ten problems, as after the 10th of December I will focus on exams. </p> </div> </div>  <div id="outline-container-org1652dbe" class="outline-2"> <h2 id="org1652dbe">Three days in</h2> <div class="outline-text-2" id="text-org1652dbe"> <p> So as it is the 3rd of December at the time of writing, I have already completed the first 3 days. And, by surprise, it is going well. The first problem being the easiest usually allowed me to focus on setting up a proper development environment. Initially I started with a <a href="https://leiningen.org/">Leiningen</a> project, but quickly moved to bare <i>deps.edn</i> file (to keep it simpler). </p> </div> </div>  <div id="outline-container-org0217361" class="outline-2"> <h2 id="org0217361">After December</h2> <div class="outline-text-2" id="text-org0217361"> <p> After I complete all the problems, I will post <a href="https://github.com/Raymonzut/Advent-of-Code-2021">the solutions in this repository</a> </p>  <p> So happy coding to all of you all participating! </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>Building the Journal Collection</title>
      <link>https://raymon.dev/posts/2022/9/building-the-journal-collection.html</link>
      <guid>https://raymon.dev/posts/2022/9/building-the-journal-collection.html</guid>
      <pubDate>Tue, 25 Sep 2022 21:51:00 +0200</pubDate>
      <description><![CDATA[
        <p> When choosing where to store my notes, having one clear place to store is most important to me. That is why I didn&rsquo;t have much preference for the medium at first, as long it was only one. </p>  <p> This post is part one of the journey to build a life-long information system. </p>  <p> &#x2014; </p>  <p> So let us stick to physical notes for now. A few years back, I started taking notes seriously with a purpose. The main idea was to get rid of sticky-notes, and have one place to find all the small notes; a journal. </p>   <div id="orgcf5c704" class="figure"> <p><img src="../../../assets/images/bullet_journal.jpg" alt="bullet_journal.jpg" width="500px" /> </p> <p><span class="figure-number">Figure 1: </span>The current journal used at the time of writing</p> </div>  <p> There are presets you can use on any notebook; I prefer free writing with fixed logs for time-periods (days, months, future). </p>  <p> It was a place to write, track and get things done. All kinds of lists, like book to read or already read, got a place where they could easily be found, used and extended. So I questioned where the notes on those books should be stored. In the random notebooks I used till now? Or somewhere where you could also work with the notes? This will be discussed in the next part. </p> 
]]></description>
    </item>

    <item>
      <title>What will you consider changing in codebases</title>
      <link>https://raymon.dev/posts/2022/10/what-will-you-consider-changing-in-codebases.html</link>
      <guid>https://raymon.dev/posts/2022/10/what-will-you-consider-changing-in-codebases.html</guid>
      <pubDate>Sat, 29 Oct 2022 21:20:00 +0200</pubDate>
      <description><![CDATA[
        <p> <i>You shouldn&rsquo;t fear changing your code, who else will change it if you won&rsquo;t out of fear?</i> </p>  <p> Change, after change, after change. Isn&rsquo;t software just done after some point? The set of responsibilities the software has moves around. There seems to be a temptation to make software be more and do more, all while reducing its lifetime by hackjobs. </p>  <p> Even software that doesn&rsquo;t change in the source code, it still rots. The language its source code is in, how known the software is and the users that actively use it; they can all decline as the software gets older. </p>  <p> It is all replaceable and updateable, by developers that change in their preference. The same software can keep on existing in other forms; by being rewritten in other programming languages according to the original as the specification. If the software you build is still not done, and needs the support from the new features of the dependencies, then you should adapt to the larger shifts in ecosystems that developers work in and libraries exist for. If the software you build is already done, it would only need to if the ease of installation and ease of using it as a dependency is at risk; That is, if you still want active use. If none of the above apply, software can serve as inspiration in the current form, even when it doesn&rsquo;t compile anymore. The source code can tell the story, and it becomes a part of history. </p>  <p> So would you consider changing the programming language of your project. Or does that feel the same like distro-hopping, where it only affects the starting-conditions? It doesn&rsquo;t have to feel that way, as the old and new languages can co-exist. Bonus points if the newer languages transpiles to the old one, or any bytecode that the old one uses. It allows to use the old ecosystem as a stable base, incrementally update the old code where needed, and have an present day advanced ecosystem to work in for the new code. This made me go back to Java land, JVM languages take advantage of the decades used to build the Java ecosystem. </p> 
]]></description>
    </item>

    <item>
      <title>Typesetting</title>
      <link>https://raymon.dev/posts/2022/12/typesetting.html</link>
      <guid>https://raymon.dev/posts/2022/12/typesetting.html</guid>
      <pubDate>Sun, 25 Dec 2022 21:11:00 +0100</pubDate>
      <description><![CDATA[
        <p> Most digital editors you are used to directly show the changes you make. That kind of editor is called a WYSIWYG-editor; a What You See Is What You Get editor. </p>  <p> Compare that to editors where you write and do not directly see the result; for example LaTeX for writing. When you are used to seeing the changes instantly, you may also apply this mindset to LaTeX. Then you are the equivalent of a F5-spamming monkey, when it is not really needed. </p>  <p> Are you really productive when you keep waiting for it to compile on every minor change? When do you see the pattern of your change, and will you trust that it will give the output that it should? </p> 
]]></description>
    </item>

    <item>
      <title>Getting Rusty</title>
      <link>https://raymon.dev/posts/2022/4/getting-rusty.html</link>
      <guid>https://raymon.dev/posts/2022/4/getting-rusty.html</guid>
      <pubDate>Wed, 13 Apr 2022 22:21:00 +0200</pubDate>
      <description><![CDATA[
        <p> A new project I am picking up is re-visiting old game-engine projects, and rewriting them with better suited libraries and structure. </p>  <div id="outline-container-org0009620" class="outline-2"> <h2 id="org0009620">Java game-engine framework from highschool</h2> <div class="outline-text-2" id="text-org0009620"> <p> This one used JFrame, and was already decent. It had code that belonged together, but was not enforced to stay grouped. Extracting these related bits of code does wonders for readability. This also fixed the lengthy-ness, and allowed names to make more sense in their context. </p>  <p> The last phase is what I absolutely love about refactoring; re-ordering and making it read like a newspaper, being able to understand the entire code by reading only the top sub-routine calls. </p>  <p> It gives me joy to be able to read code like this (translated to English, from the original java game-engine framework) </p>  <div class="org-src-container"> <pre class="src src-java"><span style="color: #fb4934;">public</span> BasicGame( <span style="color: #fabd2f;">int</span> <span style="color: #83a598;">screenWidth</span>                 , <span style="color: #fabd2f;">int</span> <span style="color: #83a598;">screenHeight</span>) {     <span style="color: #fb4934;">this</span>.width  = screenWidth;     <span style="color: #fb4934;">this</span>.height = screenHeight;      initWindow();     initCompositor();     initGameState();     initIO();      attachToWindow();      gameLoop(); } </pre> </div> </div> </div> 
]]></description>
    </item>

    <item>
      <title>Clojure</title>
      <link>https://raymon.dev/posts/2021/12/clojure.html</link>
      <guid>https://raymon.dev/posts/2021/12/clojure.html</guid>
      <pubDate>Fri, 03 Dec 2021 17:00:00 GMT</pubDate>
      <description><![CDATA[
        <div id="outline-container-org23e9fa7" class="outline-2"> <h2 id="org23e9fa7">Into the land of LISP</h2> <div class="outline-text-2" id="text-org23e9fa7"> <p> My journey with clojure started a year ago. This LISP and others were already on my radar for a while. </p>  <p> They came up when searching for different programming paradigms, and which language supported them. </p>  <p> The adventure has since let me into wanting to read SICP, so stay tuned for that post once read. </p> </div> </div>  <div id="outline-container-orgba74cd3" class="outline-2"> <h2 id="orgba74cd3">Clojure</h2> <div class="outline-text-2" id="text-orgba74cd3"> <p> The <a href="https://clojure.org/">clojure website</a> has <a href="https://clojure.org/community/books">a collection of helpful books</a>. From that list, I read the following book: </p> <ul class="org-ul"> <li>Living Clojure: An Introduction and Training Plan for Developers, 1st edition</li> </ul>  <p> It was the perfect fit, as it was somewhat shorter and more hands-on. So after only 212 pages, I already had all the knowledge needed to get started with writing any program desired. </p>  <p> To test this, I applied the new learned knowledge with some practice problems on <a href="https://www.4clojure.com">4Clojure</a>. Each of these problems focuses on a set of features/functions in the language, in order to solve it concisely. The solutions to the problems surprised me in how simple they were. The simplicity was elegant, and made me curious enough to continue the journey. </p>  <p> (The 4Clojure site has since shut down, similar problems are still available) </p>  <p> So after doing some of these problems, both the theory and knowing when to use it started to click. </p> </div>  <div id="outline-container-org5f77de7" class="outline-3"> <h3 id="org5f77de7">Own projects</h3> <div class="outline-text-3" id="text-org5f77de7"> <p> In continuation, I made the following projects in Clojure: </p> <ul class="org-ul"> <li><a href="https://github.com/Raymonzut/RockPaperScissorsClojure">Rock paper scissors</a></li> <li><a href="https://github.com/Raymonzut/IrOnIc-CaSe">IrOnIc-CaSe</a></li> <li>A small to-do list CLI</li> </ul>  <p> This was all to tinker around with the language, and get a feel for how the actual programming experience is. </p> </div> </div>  <div id="outline-container-orga1898fa" class="outline-3"> <h3 id="orga1898fa">Something for you, the reader?</h3> <div class="outline-text-3" id="text-orga1898fa"> <p> To find out if clojure fits your style, have a read of the <a href="https://clojure.org/about/rationale">clojure rationale</a> </p> </div> </div> </div> 
]]></description>
    </item>

    <item>
      <title>That is all you need to know to start</title>
      <link>https://raymon.dev/posts/2022/6/that-is-all-you-need-to-know-to-start.html</link>
      <guid>https://raymon.dev/posts/2022/6/that-is-all-you-need-to-know-to-start.html</guid>
      <pubDate>Sun, 29 Jun 2022 17:10:00 +0200</pubDate>
      <description><![CDATA[
        <p> This is a heavily discussed topic when picking up a new skill or thing to do. When do you know enough to start? Subconsciously, by asking this question, many makeup an image of a perfect start they need. Be realistic, that is never the case. If your start is perfect without error, there was no learning, you already knew how to do it. </p>  <p> That is why the conclusion of most is to learn just enough to know what you can do, and little enough that is does not take a lot of time and makes you stop persuing. To show how little you have to know for certain impossible looking skills, here are a few: </p>  <div id="outline-container-orgcf81a82" class="outline-2"> <h2 id="orgcf81a82">Using the keyboard only</h2> <div class="outline-text-2" id="text-orgcf81a82"> <p> Alright, so what is the minimum? And how can you force yourself to learn the skill? Two simple answers: </p>  <ul class="org-ul"> <li>Learn how to open a browser tab and search into your favorite search engine from any Operating System state</li> <li>Unplug your computer-mouse and physically hide it</li> </ul>  <p> And boom, either you quit, which isn&rsquo;t a word in my dictionary, or you come out as a new person that does not rely on the computer mouse. </p>  <p> Before you know it, you will be coding in vim, ranting about how DE&rsquo;s are bloat and WM&rsquo;s and Arch are computing perfection. </p> </div> </div>  <div id="outline-container-orgdf6fa3b" class="outline-2"> <h2 id="orgdf6fa3b">Using proper Operating Systems only</h2> <div class="outline-text-2" id="text-orgdf6fa3b"> <p> Be honest, most don&rsquo;t bother changing the Operating System of the computer they have gotten. Call it laziness, call it ignorance, I call it being stuck in a room with windows, while there is a whole world of alternative out there. </p>  <p> So as the keyboard example, make what you are used to really hard and what you want to use good enough to start and expand within on. For me this meant installing a basic dual boot of a Linux distro, setting GRUB to boot-last-boot and boot into it once. </p> </div> </div>  <div id="outline-container-orge836bd9" class="outline-2"> <h2 id="orge836bd9">Conclusions</h2> <div class="outline-text-2" id="text-orge836bd9"> <p> Setting defaults that work towards your goal are the key. Our minds are chaotic, and rational only at their peak, if at all. The occasional motivation is perfect to set yourself up for success, change your environment for the better. Perfection here is your worst possible action still being a possitive one. </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>Storage of the blog articles</title>
      <link>https://raymon.dev/posts/2025/7/storage-of-the-blog-articles.html</link>
      <guid>https://raymon.dev/posts/2025/7/storage-of-the-blog-articles.html</guid>
      <pubDate>Sat, 19 Jul 2025 17:00:00 +0200</pubDate>
      <description><![CDATA[
        <p> The infrastructure behind this website is kept relatively simple to other modern websites. </p>  <p> In the early days of this website, about five years ago, it had a mongodb database for the blog articles. It made a request to that database each time someone was trying to access a blog article. Quickly I figured out that <a href="https://raymon.dev/posts/2020/10/why-is-your-site-static.html">static was the way to go</a>, which removed much of the complexity and made the infrastructure almost boring in a good way. </p> <div id="outline-container-org97dd4ae" class="outline-2"> <h2 id="org97dd4ae">Do I miss the database?</h2> <div class="outline-text-2" id="text-org97dd4ae"> <p> Recently I looked at SQL again, and wondered what tools I would use in a larger project. One need that can be overlooked is the need for proper migration tools. For personal projects that I only use myself, it does not matter if it is offline for a while to migrate some data manually. </p>  <p> But I wanted to dive more into modern tooling, because for other projects I was used to schema migration frameworks. One language I had not tried that in yet was Rust. </p>  <p> In <a href="https://www.rust-lang.org/">Rust</a> there is <a href="https://diesel.rs/">Diesel</a>, which comes with a CLI for exactly this migration management. I used it in combination with a <a href="https://www.postgresql.org/">PostgreSQL</a> database and <a href="https://dbeaver.io/">DBeaver</a> for viewing the database. The getting started guide has an example on a blog demo, which is why I mention it here. </p>  <p> When I was done with that guide I had a piece of software that I could use for this personal website. So it left the question, should I actually integrate it into the website? </p> </div> </div> <div id="outline-container-org21cf765" class="outline-2"> <h2 id="org21cf765">The filesystem is enough</h2> <div class="outline-text-2" id="text-org21cf765"> <p> To spoil the conclusion, I did not change the original infrastructure to have a database (again). As an exercise, I did make a migration script that could read all the blog posts into the database. </p>  <p> The purpose of the database would mainly be for backups of the original posts. Which is currently already possible by just copying the entire posts folder with the org and generated html files. </p>  <p> Other reasons for just using the file system is that there is no business logic to the blog posts. The guide mentions a boolean field for publishing or not, which I currently implement by drafting a post and not generating the html yet. And the volume of blog posts is relatively small, even if it were to become thousands of articles it would not be an issue. So the conclusion is that, while I briefly missed the database, that I stick to the filesystem. </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>Microblogging</title>
      <link>https://raymon.dev/posts/2021/9/microblogging.html</link>
      <guid>https://raymon.dev/posts/2021/9/microblogging.html</guid>
      <pubDate>Fri, 03 Sep 2021 11:00:00 GMT</pubDate>
      <description><![CDATA[
        <p> When researching the gopher protocol, I came across an explanation and instruction by <a href="https://hexdsl.co.uk/">HexDSL</a>. It included microblogging with gopher, which was a neat way to do blogging. </p>  <p> So then the posts are more frequent, with smaller posts. More of a idea-dump/what have I been up to kind of thing. He did it on the gopher protocol, which was a protocol I did not hear of before. It is quite an elegant and minimal protocol to use instead of HTTP(s). The website you are currently visisting is also reachable over Gopher, it has a simple landing page that redirects to the HTTP(s) site for the blog. </p>  <p> Accessing the internet through gopher feels like you travelled back in time, in a good way. The websites of enthousiasts are way more visible, and popular content is mirrored. You can access these sites via a gopher client like <a href="https://gophie.org/">gophie</a>, it is worth taking a look around and perhaps you may also make your website accessable here. </p> 
]]></description>
    </item>

    <item>
      <title>Website front-end update</title>
      <link>https://raymon.dev/posts/2020/6/website-front-end-update.html</link>
      <guid>https://raymon.dev/posts/2020/6/website-front-end-update.html</guid>
      <pubDate>Fri, 19 Jun 2020 19:25:00 GMT</pubDate>
      <description><![CDATA[
        <p> The website didn&rsquo;t feel quite right. Using a JavaScript framework that added many new layers of abstraction was good for the quick prototype. It kept the project going. Still, something was itching. An urge to obliterate the black hole that goes by the name node_modules. Sorry soydevs, ain&rsquo;t going along with the Hype Train. </p>  <p> As the current framework, vue.js, did not fit the fine-grained control preferred for this site, a challenge came up: rewrite the entire front-end in a day. No more. Just one day. To spice it up some more, no JS dependencies allowed. </p>  <p> Less BLOAT!!! It does not float my boat. Here is a confession: front-end is not my specialty, at all. I could use some help with that. Focusing on the features of the site instead of centering a div, which can be hard from time to time according to some, keeps me smiling instead of crying (not literally, crybabies). </p>  <p> And, surprisingly, it worked out perfectly. The site works just like before, without the shitty performance and with even more hidden extra features I could sneak in. As the site is mostly HTML and CSS, it displays fine without JS enabled. So for the more secure browser users, they can actually see the site (mostly). Only the post page does not work, as is fetched on the client side. </p>  <p> For those still wanting to check out the post, a RSS feed will be added soon ;). And yes, I am aware these users can&rsquo;t read this post, so I will make it really obvious the RSS feed is added. </p>  <p> Check out the changes I made here: <a href="https://gitlab.com/Raymonzut/Personal-Website/-/commit/25b90a3432fe7c5d8e09c3dcec46f3b7f5b50a41">GitLab</a> </p> 
]]></description>
    </item>

    <item>
      <title>Email and composing messages</title>
      <link>https://raymon.dev/posts/2025/8/email-and-composing-messages.html</link>
      <guid>https://raymon.dev/posts/2025/8/email-and-composing-messages.html</guid>
      <pubDate>Sat, 09 Aug 2025 17:00:00 GMT</pubDate>
      <description><![CDATA[
        <p> Finally, it is time to go ranting about widely used software again. About how it lacks the most basic features, in favor of adding tons of bells and whistles. I will give a small introduction into how I usually compose and store my emails, to show how simple it can be. </p> <div id="outline-container-orgbbfd5f4" class="outline-2"> <h2 id="orgbbfd5f4">Composing my emails</h2> <div class="outline-text-2" id="text-orgbbfd5f4"> <p> In this regard I keep it very basic, which means writing <a href="https://useplaintext.email">emails in plain text</a>. The feature I use the most is the reference feature for plain text. Most good email viewers will render the citation number as a hyperlink, to the listed citation address. Here is a small example for if you never seen this before: </p>  <div class="org-src-container"> <pre class="src src-txt">  Dear reader,    Here is the fact of the day.   Python is a programming language.[1]    Best regards,    Me    [1] https://www.python.org/ </pre> </div>  <p> And then the email viewer makes the occurrences of [1] clickable, redirecting to the website listed at the end. Besides plain text being more secure, I also just like the simplicity of it. Compared to doing in-text hyperlinks, this format also makes it easier to extract sources; they are right at the end of the document. </p>  <p> Unfortunately, the email program Outlook does not render citations like this, which is a program many people use. But atleast it renders the link as a hyperlink so it is still usable, but they are missing out on a great feature, that is for sure. What they are not missing out on, is a whole bunch of AI features that just consume enormous amounts of computing power. Like reading all your emails and giving AI suggestions, which is a feature I do not trust the &ldquo;disable&rdquo; toggle to actually disable. I do like the advanced features like email rules, yet another way to be a programmer, but I have had mixed succes with Outlook. </p>  <p> Other settings to consider is how to handle replies. Quoting in replies seems to have shifted towards replies above the original message, including the signature. So that you read the reply first, and only read the history if you are interested in that. </p> </div> <div id="outline-container-org0cb362e" class="outline-3"> <h3 id="org0cb362e">Fancy signatures</h3> <div class="outline-text-3" id="text-org0cb362e"> <p> One aspect which I do like about HTML emails, is that you can have fancy signatures at the end of your message. In larger organisations, it helps to put proper contact information at the end. I usually do that in a smaller font and in italics, to make it look professional. It is one of the places where I do like putting hyperlinks, as it is just very practical and saves time on the other end. </p> </div> </div> </div> <div id="outline-container-org4aa423d" class="outline-2"> <h2 id="org4aa423d">Storing my emails</h2> <div class="outline-text-2" id="text-org4aa423d"> <p> When I am done with emails, I simply archive them to keep my inbox clean. If I respond and still expect an answer, I move the sent email to a subfolder of sent so that I can quickly look into once in a while. And once a message comes in, I see it back in the thread of messages, so I can quickly archive the previous thread in favor of the more recent one in my inbox. This is also something that Outlook does not understand, it displays this subfolder elsewhere as another sent folder with that subfolder. </p> </div> </div> <div id="outline-container-org5a57d64" class="outline-2"> <h2 id="org5a57d64">Conclusion</h2> <div class="outline-text-2" id="text-org5a57d64"> <p> So I just use another client that does understand all these basic things, and has good defaults. If you are in control of the mail server, I can highly recommend <a href="https://roundcube.net/">Roundcube</a> as the client, it has all the features I mentioned here. If you are looking for something that uses an existing mail adres for like work, I can recommend <a href="https://www.thunderbird.net">Thunderbird</a> as it has good customization. If you like emacs, you probably have an email client on it already. If you like vim, there are also clients like <a href="http://www.mutt.org/">Mutt</a>/<a href="https://neomutt.org/">NeoMutt</a>. </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>Enriching the graph code for discrete-event simulation</title>
      <link>https://raymon.dev/posts/2024/6/enriching-the-graph-code-for-discrete-event-simulation.html</link>
      <guid>https://raymon.dev/posts/2024/6/enriching-the-graph-code-for-discrete-event-simulation.html</guid>
      <pubDate>Sun, 16 Jun 2024 17:00:00 +0200</pubDate>
      <description><![CDATA[
        <p> For discrete-event simulation, there is a connection between the event graph and the event handler. It is possible to enrich the description of the graph with the distributions for the scheduling. This has the advantage that the event handler can just call schedule from the current event to the event it wants to schedule, and the corresponding distribution will be looked up in the graph. </p>  <p> An example of this setup is shown here, it models a simple graph that spawns bananas. Each banana event spawns a single apple event which does nothing further. The event graph is visualized using a tikzpicture in LaTeX, so the additional information is added as comments. </p>  <div class="org-src-container"> <pre class="src src-tex"><span style="color: #51afef;">\begin</span>{<span style="color: #c678dd;">tikzpicture</span>}   <span style="color: #51afef;">\node</span>[ellipse, draw, minimum width=2.5cm, minimum height=2.5cm, align=center] (B) at (0,0) {Banana}   <span style="color: #51afef;">\node</span>[ellipse, draw, minimum width=2.5cm, minimum height=2.5cm, align=center] (A) at (4,0) {Apple}   <span style="color: #51afef;">\draw</span>[-&gt;] (B) to (A); <span style="color: #5B6268;">% np.random.uniform(0, 10)</span>   <span style="color: #51afef;">\scheduleEventArrow</span>{B} <span style="color: #5B6268;">% Banana; 3; np.random.uniform(0, 80)</span> <span style="color: #51afef;">\end</span>{<span style="color: #c678dd;">tikzpicture</span>} </pre> </div>  <p> All distributions should be specified for the graph, otherwise a warning is issued. This example uses standard distributions, drawn from the numpy library. Other types of distributions are also easily made, for example an empirical module can also be exposed besides numpy to support distributions based on the empirical data. That way they can be called the same way, so you would for example write empirical.random_arrival() as a comment. </p>  <p> The remaining event handler to write hooks into the information of the event graph. So when you call schedule_event(), you no longer have to specify the distribution; that was already provided in the event graph as comments. </p>  <div class="org-src-container"> <pre class="src src-python"><span style="color: #51afef;">global</span> event_queue <span style="color: #51afef;">global</span> statistics  <span style="color: #dcaeea;">event_queue</span> = [] <span style="color: #dcaeea;">statistics</span> = [] <span style="color: #dcaeea;">sources</span> = [] <span style="color: #dcaeea;">connections</span> = []  <span style="color: #51afef;">with</span> <span style="color: #c678dd;">open</span>(<span style="color: #98be65;">"event_graph_sample.tex"</span>, <span style="color: #98be65;">'r'</span>, encoding=<span style="color: #98be65;">"UTF-8"</span>) <span style="color: #51afef;">as</span> f:   (<span style="color: #dcaeea;">sources</span>, <span style="color: #dcaeea;">_</span>, <span style="color: #dcaeea;">connections</span>) = graph.read_event_graph(f.readlines())  <span style="color: #51afef;">def</span> <span style="color: #c678dd;">event_handler</span>(event):   <span style="color: #51afef;">if</span> event[<span style="color: #98be65;">'label'</span>] == <span style="color: #98be65;">'A'</span>:     <span style="color: #51afef;">pass</span>   <span style="color: #51afef;">if</span> event[<span style="color: #98be65;">'label'</span>] == <span style="color: #98be65;">'B'</span>:     schedule_event(event[<span style="color: #98be65;">'label'</span>], <span style="color: #98be65;">'A'</span>, connections)  <span style="color: #51afef;">def</span> <span style="color: #c678dd;">update_statistics</span>():   statistics.append(model[<span style="color: #98be65;">'time'</span>])  run_model(<span style="color: #51afef;">lambda</span>: queue_from_sources(sources), event_handler, update_statistics) </pre> </div> 
]]></description>
    </item>

    <item>
      <title>Revision and influence on relevance</title>
      <link>https://raymon.dev/posts/2023/7/revision-and-influence-on-relevance.html</link>
      <guid>https://raymon.dev/posts/2023/7/revision-and-influence-on-relevance.html</guid>
      <pubDate>Mon, 31 Jul 2023 22:02:00 +0200</pubDate>
      <description><![CDATA[
        <p> By stumbling across old notes, you get a glimpse of what you were occupied with in the past. And that might be different than your current focus, perhaps so different that the note may be discarded. If that note is just a fleeting note, you may not even remember that you had it. Or it may be a note that was part of a pile of notes. Just waiting for you to be addressed or forgotten like deprecated todo&rsquo;s in a codebase. So it seems that regular revision is the key, but that does not solve managing large volumes of them, that questions why they are created in the first place. Letting tasks linger around creates noise, which is fine as there is space for noise. If the noise is overwhelming, making the important tasks standout more is often the first solution, putting extra exclamation marks around !!THIS IMPORTANT TASK!!. But then there is even a !!!MORE IMPORTANT TASK!!, we know where this ends up. </p>  <p> Then you may think it over, and realize that adding such importance only added chaos, so you might give removing and grouping a try. By which you realize it works, and you overdo grouping to the point it becomes way too rigid and becomes a chore to maintain. Yes, removing and separating adds value to the items, to the point you sense similarity and can search it. And for this sense of similarity you can use categories you are already familiar with, you are hacking your own association skills. Remember that it is just an entry point from which you start reading notes, so making it too specific makes it unused and unusable as there may only be one note adhering to it. Allowing chaos in notes means having room for the notes to belong to, and be discard from without having to restructure or to crawl to many notes to find the right one. </p>  <p> Ow, and there is no need to apply structure to all you have lived with unorganized in the past and worked fine with, that would be redundant work. Often I hear these complaints on sorting email, that the inbox has thousands of items and it is too daunting to go through. So archive it all, so you can still search it like you normally do, and start like how you want with an empty inbox. You will thank yourself later. </p> 
]]></description>
    </item>

    <item>
      <title>Switch statements in CSharp</title>
      <link>https://raymon.dev/posts/2022/5/switch-statements-in-csharp.html</link>
      <guid>https://raymon.dev/posts/2022/5/switch-statements-in-csharp.html</guid>
      <pubDate>Fri, 20 May 2022 19:10:00 +0200</pubDate>
      <description><![CDATA[
        <p> Note: if you decide to implement what is discussed in this blog post, refer to this blog post. </p>   <p> Look carefully at this snippet of code: </p>  <div class="org-src-container"> <pre class="src src-csharp"><span style="color: #fb4934;">switch</span><span style="color: #fe8019;">(</span>mode<span style="color: #fe8019;">)</span> <span style="color: #fe8019;">{</span>     <span style="color: #fb4934;">case</span> Mode.ELITEmode:         <span style="color: #fb4934;">if</span> <span style="color: #cc241d;">(</span>someCondition<span style="color: #cc241d;">)</span>             <span style="color: #fb4934;">return</span> <span style="color: #d3869b;">false</span>;     <span style="color: #fb4934;">case</span> Mode.NORMALmode:         <span style="color: #fb4934;">break</span>;     <span style="color: #fb4934;">default</span>:         <span style="color: #fb4934;">throw</span> <span style="color: #fb4934;">new</span> <span style="color: #fabd2f;">ArgumentOutOfRangeException</span><span style="color: #cc241d;">()</span>; <span style="color: #fe8019;">}</span> </pre> </div>  <p> Do you see anything odd? This is not valid C# code sadly, here is the version that is valid: </p>  <div class="org-src-container"> <pre class="src src-csharp"><span style="color: #fb4934;">switch</span><span style="color: #fe8019;">(</span>mode<span style="color: #fe8019;">)</span> <span style="color: #fe8019;">{</span>     <span style="color: #fb4934;">case</span> Mode.ELITEmode:         <span style="color: #fb4934;">if</span> <span style="color: #cc241d;">(</span>someCondition<span style="color: #cc241d;">)</span>             <span style="color: #fb4934;">return</span> <span style="color: #d3869b;">false</span>;         <span style="color: #fb4934;">goto</span> <span style="color: #d3869b;">normal</span>;     <span style="color: #fb4934;">case</span> Mode.NORMALmode: <span style="color: #d3869b;">normal</span>:         <span style="color: #fb4934;">break</span>;     <span style="color: #fb4934;">default</span>:         <span style="color: #fb4934;">throw</span> <span style="color: #fb4934;">new</span> <span style="color: #fabd2f;">ArgumentOutOfRangeException</span><span style="color: #cc241d;">()</span>; <span style="color: #fe8019;">}</span> </pre> </div>  <p> Eew goto-statement! </p>  <div id="outline-container-org97c452d" class="outline-2"> <h2 id="org97c452d">Generating proper fall-through switch statements with this hack</h2> <div class="outline-text-2" id="text-org97c452d"> <p> So do you want to make a language feature in C#? Implement this one, doesn&rsquo;t even take much thought: slap unique label between around case lines like this for every case. Pre-process it as follows: </p> </div>  <div id="outline-container-orge7ab08f" class="outline-3"> <h3 id="orge7ab08f">Before</h3> <div class="outline-text-3" id="text-orge7ab08f"> <div class="org-src-container"> <pre class="src src-csharp"><span style="color: #fb4934;">switch</span><span style="color: #fe8019;">(</span>mode<span style="color: #fe8019;">)</span> <span style="color: #fe8019;">{</span>     <span style="color: #fb4934;">case</span> Mode.NORMIEmode:     <span style="color: #fb4934;">case</span> Mode.ELITEmode:         <span style="color: #fb4934;">if</span> <span style="color: #cc241d;">(</span>someCondition<span style="color: #cc241d;">)</span>             <span style="color: #fb4934;">return</span> <span style="color: #d3869b;">false</span>;     <span style="color: #fb4934;">case</span> Mode.NORMALmode:         <span style="color: #fb4934;">break</span>;     <span style="color: #fb4934;">case</span> Mode.NORMALmode:         <span style="color: #fb4934;">break</span>;     <span style="color: #fb4934;">default</span>:         <span style="color: #fb4934;">throw</span> <span style="color: #fb4934;">new</span> <span style="color: #fabd2f;">ArgumentOutOfRangeException</span><span style="color: #cc241d;">()</span>; <span style="color: #fe8019;">}</span> </pre> </div> </div> </div>  <div id="outline-container-org93238f4" class="outline-3"> <h3 id="org93238f4">After; label version</h3> <div class="outline-text-3" id="text-org93238f4"> <div class="org-src-container"> <pre class="src src-csharp"><span style="color: #fb4934;">switch</span><span style="color: #fe8019;">(</span>mode<span style="color: #fe8019;">)</span> <span style="color: #fe8019;">{</span>     <span style="color: #fb4934;">case</span> Mode.NORMIEmode: <span style="color: #d3869b;">UNIQUE_CASE_1</span>:         <span style="color: #928374;">// </span><span style="color: #928374;">Note that empty body case already has this fall-through</span>         <span style="color: #928374;">// </span><span style="color: #928374;">Just not executed code in-between</span>         <span style="color: #fb4934;">goto</span> <span style="color: #d3869b;">UNIQUE_CASE_2</span>;     <span style="color: #fb4934;">case</span> Mode.ELITEmode: <span style="color: #d3869b;">UNIQUE_CASE_2</span>:         <span style="color: #fb4934;">if</span> <span style="color: #cc241d;">(</span>someCondition<span style="color: #cc241d;">)</span>             <span style="color: #fb4934;">return</span> <span style="color: #d3869b;">false</span>;         <span style="color: #fb4934;">goto</span> <span style="color: #d3869b;">UNIQUE_CASE_3</span>;     <span style="color: #fb4934;">case</span> Mode.NORMALmode: <span style="color: #d3869b;">UNIQUE_CASE_3</span>:         <span style="color: #fb4934;">break</span>; <span style="color: #928374;">// </span><span style="color: #928374;">or continue; or return;</span>         <span style="color: #928374;">// </span><span style="color: #928374;">Still generate, not called anyway</span>         <span style="color: #928374;">// </span><span style="color: #928374;">Look into optimizing later ;D</span>         <span style="color: #fb4934;">goto</span> <span style="color: #d3869b;">UNIQUE_CASE_4</span>;     <span style="color: #fb4934;">case</span> Mode.IMPOSSIBLEmode: <span style="color: #d3869b;">UNIQUE_CASE_4</span>:         <span style="color: #fb4934;">break</span>;     <span style="color: #fb4934;">default</span>:         <span style="color: #fb4934;">throw</span> <span style="color: #fb4934;">new</span> <span style="color: #fabd2f;">ArgumentOutOfRangeException</span><span style="color: #cc241d;">()</span>; <span style="color: #fe8019;">}</span> </pre> </div> </div> </div> <div id="outline-container-org95008cf" class="outline-3"> <h3 id="org95008cf">After; repeat expression version</h3> <div class="outline-text-3" id="text-org95008cf"> <div class="org-src-container"> <pre class="src src-csharp"><span style="color: #fb4934;">switch</span><span style="color: #fe8019;">(</span>mode<span style="color: #fe8019;">)</span> <span style="color: #fe8019;">{</span>     <span style="color: #fb4934;">case</span> Mode.NORMIEmode:         <span style="color: #928374;">// </span><span style="color: #928374;">Note that empty body case already has this fall-through</span>         <span style="color: #928374;">// </span><span style="color: #928374;">Just not executed code in-between</span>         <span style="color: #fb4934;">goto</span> <span style="color: #fb4934;">case</span> Mode.ELITEmode;     <span style="color: #fb4934;">case</span> Mode.ELITEmode:         <span style="color: #fb4934;">if</span> <span style="color: #cc241d;">(</span>someCondition<span style="color: #cc241d;">)</span>             <span style="color: #fb4934;">return</span> <span style="color: #d3869b;">false</span>;         <span style="color: #fb4934;">goto</span> <span style="color: #fb4934;">case</span> Mode.NORMALmode;     <span style="color: #fb4934;">case</span> Mode.NORMALmode:         <span style="color: #fb4934;">break</span>; <span style="color: #928374;">// </span><span style="color: #928374;">or continue; or return;</span>         <span style="color: #928374;">// </span><span style="color: #928374;">Still generate, not called anyway</span>         <span style="color: #928374;">// </span><span style="color: #928374;">Look into optimizing later ;D</span>         <span style="color: #fb4934;">goto</span> <span style="color: #fb4934;">case</span> Mode.IMPOSSIBLEmode;     <span style="color: #fb4934;">case</span> Mode.IMPOSSIBLEmode:         <span style="color: #fb4934;">break</span>;     <span style="color: #fb4934;">default</span>:         <span style="color: #fb4934;">throw</span> <span style="color: #fb4934;">new</span> <span style="color: #fabd2f;">ArgumentOutOfRangeException</span><span style="color: #cc241d;">()</span>; <span style="color: #fe8019;">}</span> </pre> </div> </div> </div> </div>  <div id="outline-container-org9fee7e4" class="outline-2"> <h2 id="org9fee7e4">Comparing to other analysis</h2> <div class="outline-text-2" id="text-org9fee7e4"> <p> On <a href="https://stackoverflow.com/questions/174155/switch-statement-fallthrough-in-c">a StackOverflow discussion</a>, it pointed out the language feature where you repeat the matched expression after the `goto` keyword; But I will argue the label method is nicer, as it allows a consistent output of the pre-processor, instead of copying whatever expression is cased against. Whatever you may prefer for your preprocessor to output, in both cases you introduce something to go to the next case. </p> </div> </div> 
]]></description>
    </item>

    <item>
      <title>Using open datasets in software for mutual benefit</title>
      <link>https://raymon.dev/posts/2025/8/using-open-datasets-in-software-for-mutual-benefit.html</link>
      <guid>https://raymon.dev/posts/2025/8/using-open-datasets-in-software-for-mutual-benefit.html</guid>
      <pubDate>Fri, 08 Aug 2025 17:00:00 +0200</pubDate>
      <description><![CDATA[
        <p> Without a doubt, gathering data for an application can be one of the hardest tasks. Because let&rsquo;s face it, your application is not done when you can demonstrate the functionality. That is the beginning, because the next phase is the adoption phase of your software. </p>  <p> I want to zoom in on the result of that phase, what does the adoption of your software mean to the outside world? If people start to use your software and improve the data it is using, is that it or does that improvement translate elsewhere? This is where open datasets come in. Once you dive into them you cannot go without them anymore. </p>  <p> Take an example like <a href="https://www.openstreetmap.org">OpenStreetMap</a>, and why projects like <a href="https://www.veggiekarte.de/">VeggieKarte</a> use its data. This dataset provide a good starting point for that application, as it can query the supported food preference if it has been entered. When people improve the data inside of OpenStreetMap, your application benefits. And when your users improve the data and update further outdated information like opening hours and contact details, everyone else also benefits. Or when someones new favorite veggie restaurant opened, and it has not been registered yet, they register it for everyone to see on the map. </p>  <p> That is the natural strength of using open datasets, that all applications now using the dataset are improved. Once this ball is rolling, the collaborative power is immense. So take a good look at the software you use, and if they allow open contributions to the data they use. If you are out of luck, there is always Wikipedia that can use more edits. </p> 
]]></description>
    </item>

    <item>
      <title>The assoc that makes a vector grow</title>
      <link>https://raymon.dev/posts/2024/11/the-assoc-that-makes-a-vector-grow.html</link>
      <guid>https://raymon.dev/posts/2024/11/the-assoc-that-makes-a-vector-grow.html</guid>
      <pubDate>Wed, 27 Nov 2024 17:00:00 +0100</pubDate>
      <description><![CDATA[
        <p> Vectors are quite interesting in clojure, in particular when you combine them with the assoc operation. The docs for the assoc function says: &ldquo;When applied to a vector, returns a new vector that contains val at index. Note - index must be &lt;= (count vector)&rdquo;. Notice how it does not say that the index must be strictly less than the count of the vector, but less or equal to it. That means that the returned vector can be one larger than the original vector. </p>  <p> The main usecase is to update existing values or to set a next value. That is the limit, skipping more indices does throw an IndexOutOfBounds exception. As soon as you do that though, a map/dictionary/associative array makes more sense anyway. But we can still mess around with this assoc on vectors, and implement some other primitives. </p>  <p> The first thing we can implement is the conj function. It is an assoc with the count of the current vector, they have the same effect. </p> <div class="org-src-container"> <pre class="src src-clojure"><span style="color: #51afef;">(</span>conj <span style="color: #c678dd;">[</span><span style="color: #da8548; font-weight: bold;">1</span> <span style="color: #da8548; font-weight: bold;">2</span><span style="color: #c678dd;">]</span> <span style="color: #da8548; font-weight: bold;">3</span><span style="color: #51afef;">)</span> <span style="color: #5B6268;">;; </span><span style="color: #5B6268;">=&gt; [1 2 3]</span> <span style="color: #51afef;">(</span>assoc <span style="color: #c678dd;">[</span><span style="color: #da8548; font-weight: bold;">1</span> <span style="color: #da8548; font-weight: bold;">2</span><span style="color: #c678dd;">]</span> <span style="color: #c678dd;">(</span>count <span style="color: #98be65;">[</span><span style="color: #da8548; font-weight: bold;">1</span> <span style="color: #da8548; font-weight: bold;">2</span><span style="color: #98be65;">]</span><span style="color: #c678dd;">)</span> <span style="color: #da8548; font-weight: bold;">3</span><span style="color: #51afef;">)</span> <span style="color: #5B6268;">;; </span><span style="color: #5B6268;">=&gt; [1 2 3]</span> </pre> </div>  <p> And as soon as you implement conj for a single element, you can also implement it for multiple elements. Just doing it right after each other works, a reduce with the indices grows the vector one element at a time. Each of the elements will have the intented index along with it, as the assoc requires an index. </p>  <div class="org-src-container"> <pre class="src src-clojure"><span style="color: #51afef;">(</span><span style="color: #51afef;">-&gt;&gt;</span> <span style="color: #c678dd;">[</span><span style="color: #98be65;">[</span><span style="color: #da8548; font-weight: bold;">0</span> <span style="color: #da8548; font-weight: bold;">10</span><span style="color: #98be65;">]</span> <span style="color: #98be65;">[</span><span style="color: #da8548; font-weight: bold;">1</span> <span style="color: #da8548; font-weight: bold;">20</span><span style="color: #98be65;">]</span> <span style="color: #98be65;">[</span><span style="color: #da8548; font-weight: bold;">2</span> <span style="color: #da8548; font-weight: bold;">30</span><span style="color: #98be65;">]</span> <span style="color: #98be65;">[</span><span style="color: #da8548; font-weight: bold;">3</span> <span style="color: #da8548; font-weight: bold;">40</span><span style="color: #98be65;">]</span> <span style="color: #98be65;">[</span><span style="color: #da8548; font-weight: bold;">4</span> <span style="color: #da8548; font-weight: bold;">50</span><span style="color: #98be65;">]</span><span style="color: #c678dd;">]</span>      <span style="color: #c678dd;">(</span>reduce <span style="color: #98be65;">(</span><span style="color: #51afef;">fn</span> <span style="color: #a9a1e1;">[</span>xs <span style="color: #51afef;">[</span>i v<span style="color: #51afef;">]</span><span style="color: #a9a1e1;">]</span> <span style="color: #a9a1e1;">(</span>assoc xs i v<span style="color: #a9a1e1;">)</span><span style="color: #98be65;">)</span> <span style="color: #98be65;">[]</span><span style="color: #c678dd;">)</span><span style="color: #51afef;">)</span> <span style="color: #5B6268;">;; </span><span style="color: #5B6268;">=&gt; [10 20 30 40 50]</span> </pre> </div>  <p> From here it is a small step to implement concat. Instead of the empty vector to start the reduce, use the first list and iterate over the second list to be concatenated. All of the indices used to assoc need to be incremented, as the elements will be placed after the first list. A small detail is that it returns a vector, as at every point it remains a vector. </p>  <div class="org-src-container"> <pre class="src src-clojure"><span style="color: #51afef;">(</span>concat <span style="color: #c678dd;">[</span><span style="color: #da8548; font-weight: bold;">10</span> <span style="color: #da8548; font-weight: bold;">20</span> <span style="color: #da8548; font-weight: bold;">30</span><span style="color: #c678dd;">]</span> <span style="color: #c678dd;">[</span><span style="color: #da8548; font-weight: bold;">40</span> <span style="color: #da8548; font-weight: bold;">50</span> <span style="color: #da8548; font-weight: bold;">60</span><span style="color: #c678dd;">]</span><span style="color: #51afef;">)</span> <span style="color: #5B6268;">;; </span><span style="color: #5B6268;">=&gt; (10 20 30 40 50 60)</span>  <span style="color: #51afef;">(</span><span style="color: #51afef;">-&gt;&gt;</span> <span style="color: #c678dd;">[</span><span style="color: #da8548; font-weight: bold;">40</span> <span style="color: #da8548; font-weight: bold;">50</span> <span style="color: #da8548; font-weight: bold;">60</span><span style="color: #c678dd;">]</span>      <span style="color: #c678dd;">(</span>map vector <span style="color: #98be65;">(</span>map #<span style="color: #a9a1e1;">(</span>+ <span style="color: #dcaeea;">%</span> <span style="color: #51afef;">(</span>count <span style="color: #c678dd;">[</span><span style="color: #da8548; font-weight: bold;">10</span> <span style="color: #da8548; font-weight: bold;">20</span> <span style="color: #da8548; font-weight: bold;">30</span><span style="color: #c678dd;">]</span><span style="color: #51afef;">)</span><span style="color: #a9a1e1;">)</span> <span style="color: #a9a1e1;">[</span><span style="color: #da8548; font-weight: bold;">0</span> <span style="color: #da8548; font-weight: bold;">1</span> <span style="color: #da8548; font-weight: bold;">2</span><span style="color: #a9a1e1;">]</span><span style="color: #98be65;">)</span><span style="color: #c678dd;">)</span>      <span style="color: #c678dd;">(</span>reduce <span style="color: #98be65;">(</span><span style="color: #51afef;">fn</span> <span style="color: #a9a1e1;">[</span>xs <span style="color: #51afef;">[</span>i v<span style="color: #51afef;">]</span><span style="color: #a9a1e1;">]</span> <span style="color: #a9a1e1;">(</span>assoc xs i v<span style="color: #a9a1e1;">)</span><span style="color: #98be65;">)</span> <span style="color: #98be65;">[</span><span style="color: #da8548; font-weight: bold;">10</span> <span style="color: #da8548; font-weight: bold;">20</span> <span style="color: #da8548; font-weight: bold;">30</span><span style="color: #98be65;">]</span><span style="color: #c678dd;">)</span><span style="color: #51afef;">)</span> <span style="color: #5B6268;">;; </span><span style="color: #5B6268;">=&gt; [10 20 30 40 50 60]</span> </pre> </div> 
]]></description>
    </item>

    <item>
      <title>The world of ontologies</title>
      <link>https://raymon.dev/posts/2024/7/the-world-of-ontologies.html</link>
      <guid>https://raymon.dev/posts/2024/7/the-world-of-ontologies.html</guid>
      <pubDate>Mon, 01 Jul 2024 17:00:00 +0200</pubDate>
      <description><![CDATA[
        <p> There are books and mainly papers to read when studying advanced topics, but some light reading material helps much more to get started. That is where you turn to one of the most fascinating projects of the internet; Wikipedia. Often described as an unreliable source yet perfect for context, it is the goto place for all kinds of topics. The design of it is quite genius, but I want to dive a bit deeper into a whole other layer that Wikipedia offers. </p>  <p> Or should I say WikiData, as that is what this is about. It is one of the many projects that start with Wiki- in the name, and it is the knowledge backbone for the structured data. So what is structured data, not those pesky XML documents right? There is a whole area of internet technologies that I was not aware of called Semantic Web Technologies. And it is possible to serialize them to XML, as OWL/XML or RDF/XML. This is not going to be a full explanation of what it all means, as it is much more fun to go through this learning process yourself if you never heard about it. </p>  <p> To me it meant learning about all kinds of technologies that power projects that do stuff that you would not believe a computer could reliably do. Like if someone would tell you, you would think it would be some specific software, but as it turns out it has been generalized and standardized to a high level; W3C high. Make your own little ontology and connect it to the rest of the internet and by logic make it behave like a magic answering machine, all fully transparent and extendable. Stretching the line of extendability to the point you ask what you have been doing wrong with data projects in the past. So much handrolling of this parsing and interpreting of data, when you could have used the shiny ontology and improve someone elses dataset instead. Because your data probably sucks, and the code that you operate it with even more so. </p> 
]]></description>
    </item>

    <item>
      <title>Git Server Update</title>
      <link>https://raymon.dev/posts/2022/9/git-server-update.html</link>
      <guid>https://raymon.dev/posts/2022/9/git-server-update.html</guid>
      <pubDate>Wed, 21 Sep 2022 19:32:00 +0200</pubDate>
      <description><![CDATA[
        <p> The git-repo&rsquo;s I store mostly remain local to where they were first created. When starting out making projects, they were just plain folders ofcourse, there wasn&rsquo;t much to version. After it grew, that collections of unfinished projects became sentimental, and deserved a &ldquo;place on the shelf&rdquo;. That show-off shelf that I used was called GitHub, as it is for most developers. </p>  <p> After a few years of tinkering, the paranoia of single point of failure asked for a solution. That solutions being mirroring to other git-servers; GitLab and a self-hosted git-server. </p>  <p> The self-hosted one required no extra installs, as it was git clone &#x2013;bare till the end of repo&rsquo;s was there. So it didn&rsquo;t have one of those fancy front-end dashboards, issue-trackers and the rest of the jazz which makes it seem like a proper project to outsiders. So, announcing it here, it is now <a href="https://git.raymon.dev/raymon">available for you to see as git-tea</a>. </p> 
]]></description>
    </item>

  </channel>
</rss>
