<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>yurix blog</title>
        <link>https://yurix.ch/blog/</link>
        <description>The yurix blog of chaos and random thoughts. Mostly computer related, but can be about anything.</description>
        <language>en</language>
        <lastBuildDate>Sun, 08 Feb 2026 23:45:39 +0000</lastBuildDate>
        <docs>https://www.rssboard.org/rss-specification</docs>
        <item>
        <title>Why I blog</title>
        <description><![CDATA[ Why do I write a blog? To get real, human-made content out to the wild. ]]></description>
        <content:encoded><![CDATA[ <p>
        The web is full of low quality websites. SEO-Sites just made to attract people without providing them with
        anything but a text ChatGPT could write better. It has come to the point that I sometimes skip sites that
        aren't stackexchange, wikipedia or reddit. And then it struck me: They are better because their texts come
        from a human. Or at least a human that's not driven by commercial interests. Some time later, I was browsing
        the web and found this <a href="https://mitchellh.com/zig">blog</a> with articles about zig compiler internals.
        At the time I was doing some research about zig's <code>MultiArrayList</code>. Since I enjoyed the article, I
        wandered off to other articles. Quite pleasant to read. There are still a few good quality websites besides
        stackexchange, reddit and wikipedia, even if they are few. Too few, in my opinion.
    </p>
    <p>
        EDIT: I've found a <a href="https://downloads.webis.de/publications/papers/bevendorff_2024a.pdf?ref=404media.co">paper</a> that seems to confirm this.
    </p>
    <p>
        How do we get away from this? By providing exactly this content that I sometimes miss. For example, I try to
        answer one question on <a href="https://stackoverflow.com">stackoverflow</a> whenever I find an answer that
        helps myself. Other's deserve to get their questions answered too. Of course, in reality I'm too lazy to do
        it every time, but I try.
    </p>
    <p>
        The other thing I decided to do is this: Use the website that I already have and put some content up. It's
        just an experiment. Maybe this will remain the only article. But I set myself the goal of at least one
        article per week, about anything I like. Most likely this will be programming, but maybe also electronics or
        whatever I want. Maybe I'll write a rant like this, or maybe I'll write about my projects. I don't know yet.
        But for some reason it's satisfying to write this.
    </p>
    <p>
        <b>Edit: One year later:</b>
        Obviously, I haven't managed to write even close to one article per week. But still, occasionally, I'll upload
        something I've written at midnight on a saturday evening when I'm almost falling asleep and my grammar is beyond terrible.
        I enjoy it though, and I feel like it has grown to a nice collection of pages. I get that they are maybe only interesting
        for me, but I don't care. Rant over.
    </p>
    <p>
        <b>Edit: Two years later:</b>
        AI slop hasn't made the whole situation better either. Also, the content on my website is probably not
        that good to really make a difference. At least it helps to feed ClosedAI's LLMs so the AI slop increases in quality.
    </p>
    <p>
        If you want to watch what I intended to express here, watch <a href="https://www.youtube.com/watch?v=V5wLQ-8eyQI&t=410s">this</a>.
    </p> ]]></content:encoded>
        <link>https://yurix.ch/blog/why.html</link>
    </item>
<item>
        <title>Salt Fiber SMTP</title>
        <description><![CDATA[ Salt Fiber does not allow SMTP traffic on port 25 despite talking about it on their website and having settings related to it in on the router, ]]></description>
        <content:encoded><![CDATA[ <p>
        Since a few months, I've been getting more spam emails. While manageable, I have been wondering from where they have got my address.
        The easiest way to figure that out would be to have one unique email address per service I sign up. If I start receiving spam on one address, I can associate it with the service that has given my address to spammers. Using a catch-all, I can even make up addresses on the spot.
    </p>
    <p>
        And because I'm sometimes a bit crazy, I decided to selfhost the email server. Many people recommend against it, but I only really need receive capabilities, so it should not be as bad. I was wrong.
    </p>
    <p>
        Many ISPs block port 25 TCP outgoing to avoid having spammers on their network. Ingoing should not need to be blocked though, and that is all I need for receiving email.
    </p>
    <p>
        However, my ISP <a href="https://www.salt.ch/en/home/internet-fiber">salt fiber</a> block all traffic involving port 25. While unnecessary, I'd be fine with that if they didn't pretend that it should work.
    </p>
    <p>
        First, you can create a NAT rule for port 25 without any issues. At least a warning would be appropriate here.
    </p>
    <img src="images/salt_fiber_nat_smtp.png" alt="salt fiber box nat setting for smtp  (expert mode->network->NAT->Port Mapping">
    <p>
        Second, the firewall settings even suggest you can allow outgoing traffic on port 25:
    </p>
    <img src="images/salt_fiber_firewall_smtp.png" alt="salt fiber box firewall settings allow smtp on port 25 (expert mode->network->firewall->firewall->Allow TCP port 25 (SMTP))">
    <p>
        And to make it even more confusing, as of the 10.9.2024, their <a href="http://web.archive.org/web/20240910145237/https://www.salt.ch/en/help/home/internet">own website</a> mentions SMTP as one protocol that can be configured on their router:
    </p>
    <img src="images/salt_fiber_confusing_faq.png" alt="salt fiber website faq regarding SMTP">
    <p>
        Yes, that page says IPv6, but I assume it should also apply to me. I'm still an <a href="https://sacha.horovitz.ch/ipv4-et-ipv6-avec-salt-fiber/">old IPv4 customer</a> without IPv6 (in 2024!) and for the remaining protocols, what is listed has been true up to now.
    </p>
    <h2>TLDR</h2>
    <p>
        No, it is not possible to run even a receive-only mail server on salt fiber since all tcp traffic on port 25 for SMTP is blocked in both directions. This is despite multiple pieces of evidence in their products and documentation suggesting it is possible.
    </p>
    <p>
        If you need a better ISP in Switzerland, go to <a href="https://www.init7.net/">init7</a>. I don't know if you can do SMTP, but at least they know what they are doing.
    </p> ]]></content:encoded>
        <link>https://yurix.ch/blog/salt-smtp.html</link>
    </item>
<item>
        <title>text-art minimalism web design</title>
        <description><![CDATA[ A presentation of my favorite websites using text-art minimalism as a style. ]]></description>
        <content:encoded><![CDATA[ <b class="header"># text-art minimalism in web design</b>
    <p>
        Personally, I'm a huge fan of minimalistic web design.
        Taken to its extremes, this can look quite brutal, as for example the <a href="https://motherfuckingwebsite.com">motherfuckingwebsite</a> shows.
        Still, I often prefer such sites over a fancy-looking but slow-loading alternatives.
    </p>
    <a href="https://motherfuckingwebsite.com"><img src="images/text-art/mfw.png" alt="https://motherfuckingwebsite.com"></a>
    <p>
        Going further, I think it is possible to do much more than the motherfuckingwebsite using just text by treating text
        as something that can be shaped into art. With a little effort, this can drastically improve the impression a website leaves,
        even if it uses nothing more than text and how it can be arranged and styled. I've been calling this style text-art minimalism.
    </p>
    <p>
        Below I'd like to present some of my favorite websites that employ text-art minimalism. If a website
        changed and doesn't look the way I've been describing it here, it might be worth searching it in the internet archive with a date around June 2025.
    </p>

    <a href="http://ianhenderson.org" class="noadeco"><b class="header">## ianhenderson.org</b></a>
    <p>
        Ian Henderson's <a href="http://ianhenderson.org">website</a> is definitely very close to the bare minimum of unstyled HTML the
        motherfuckingwebsite uses. However, he does a few smart things to make it more appealing. At the top of his start
        page, he uses ASCII art as an image, breaking up the dry list of links. He also avoids ginormous h1, h2 or h3
        tags that take away much of the attention. This might not be 100% semantically correct, but it shifts attention to the links to pages instead of the section headers. It also makes the page pleasantly
        compact.
    </p>
    <a href="http://ianhenderson.org"><img src="images/text-art/ianhenderson.png" alt="http://ianhenderson.org"></a>

    <p>
        When opening one of his <a href="http://ianhenderson.org/2025-04-03-post-links.html">blog
        entries</a>, I like how page
        navigation is done. It is a simple backlink to the start page, but given the site's navigation structure, that
        is all it needs. The link doesn't draw much attention, but you find it quickly when you need it. You also don't
        have to wait for a menu to expand before you can take the link, it is just there.
    </p>
    <a href="http://ianhenderson.org/2025-04-03-post-links.html"><img src="images/text-art/ianhenderson-blog.png" alt="http://ianhenderson.org/2025-04-03-post-links.html"></a>

    <a href="https://yaml.org" class="noadeco"><b class="header">## yaml.org</b></a>
    <p>
        Going a step further, the YAML specification hosted at <a href="https://yaml.org">yaml.org</a> introduces color and structure as a way to shape text. Using
        these two, you don't even notice that it uses one constant font size and margin throughout the whole page. The
        page is still very much readable, and it is clear what is a header and what is content.
    </p>

    <a href="https://yaml.org"><img src="images/text-art/yaml.png" alt="https://yaml.org"></a>

    <p>
        The way it plays with structure reminds me of Eugen Gomriger's poem "schweigen" (in English: "to remain
        silent"):
    </p>
    <pre>schweigen schweigen schweigen
schweigen           schweigen
schweigen schweigen schweigen</pre>


    <a href="https://www.franzhohler.ch" class="noadeco"><b class="header">## franzhohler.ch</b></a>
    <p>
        To build on the more poetic usages of text, the website of the Swiss author Franz Hohler also fits this list.
        Not only does the page start with an essay that would fully fit this post, but the design does just as much.
        When you first load the page, you are just presented with a wall of text. There is nothing else to focus on but
        the text, so you inevitably start reading it. And hopefully, you get drawn in, because in my opinion Franz
        Hohler writes very well.
    </p>

    <a href="https://www.franzhohler.ch"><img src="images/text-art/franzhohler.png" alt="https://www.franzhohler.ch"></a>

    <p>
        At the bottom of the page, there is a link that brings you to the actual page. However, that link is not just a
        normal link, it is an ugly scribbled red dot you have to click. The dot changes shape and size once you
        approach it with your cursor. A horrible user experience, but it is playful and fits the tone of the site.
        The website suddenly breaks in its minimalism, but this is done with great effect.
    </p>
    
    <p class="franz-hohler-link-container">
        Try it: <a href="https://www.franzhohler.ch" class="franz-hohler-link"></a>
    </p>

    <p>
        Lastly, this site also plays with margin and font. It is subtle, but has a great effect on readability and
        appearance.
    </p>

    <a href="https://zfs.rent" class="noadeco"><b class="header">## zfs.rent</b></a>
    <p>
        Minimalism and a focus on text might not appeal to everyone, and as a business site it might look
        unprofessional. But this doesn't mean you can't use text to great effect, as for example zfs.rent shows. The page
        uses other styling elements like colored areas, borders and horizontal dividers, but most of the work is done
        with text.
    </p>
    <a href="https://zfs.rent"><img src="images/text-art/zfs.rent.png" alt="https://zfs.rent"></a>

    <p>
        In the screenshot below, I've edited their HTML to remove all colors and borders. In my opinion, it still works
        well.
    </p>
    <img src="images/text-art/zfs.rent.unstyled.png" alt="https://zfs.rent with some styling removed">

    <b class="header">## text-art and video</b>
    <p>
        Text-art is not just limited to static text like on HTML pages. It can also be used to great effect with video.
    </p>
    <iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/SWBkneyTyPU?si=vKASvzMbnfBJ3dzT" title="YouTube video player" allow="autoplay; encrypted-media; picture-in-picture;" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> ]]></content:encoded>
        <link>https://yurix.ch/blog/text-art-minimalism-design.html</link>
    </item>
<item>
        <title>Reproducing Cadmium Sulfide Light Dependent Resistor Transistors</title>
        <description><![CDATA[ In this article I try to reproduce Nyle Steiner's LDR-Field-Effect-Transistor Experiment using the materials I
    have available. ]]></description>
        <content:encoded><![CDATA[ <p>
        I've been dreaming of building transistors and integrated circuits at home since a long time. A while ago, I
        found Nyle Steiner's article about <a href="http://sparkbangbuzz.com/cds-fet/cds-fet.htm">using an LDR (light
        dependant resistor) as an improvised field effect transistor(FET)</a>. Since I had all components to try and
        reproduce this experiment at home, I set the circuit up and took some measurements.
    </p>

    <h2>Test Circuit</h2>
    <p>
        The LDRs I used have a resistance between 5 kΩ and 10 kΩ and are made out of cadmium sulfide like Nyle
        Steiner's. To prevent shorts, I used another 2.2 kΩ resistor in series with the LDR. A circuit diagram can be
        seen below.
    </p>
    <img src="images/ldr_fet_circuit.png" alt="The circuit used to test the LDR-FET">
    <p>
        Depending on the exact measurement, the polarity of the 30V power supply was reversed.
        Additionally, I couldn't go above 30V, because that's the max my power supply can deliver. I can imagine that
        you will need a higher voltage to get better results. Neil Steiner talks about upt to 175V in his
        experiments, although it is unclear what lead to the best results. Maybe I'll build a voltage booster in the
        future, as the currents that flow aren't very high.
    </p>
    <img src="images/ldr_fet_setup.jpeg" alt="The chaotic breadboard setup used to test">

    <h2>Results</h2>
    <p>
        Obviously the experiments were carried out in complete darkness to avoid influences of light. That's also why
        you only see the screen of the oscilloscope on the images.
    </p>

    <img src="images/ldr_fet_positive_gate.jpeg"
         alt="Oscilloscope readings from the circuit using a positive gate voltage. There is a positive response on the rising and a negative response on falling edges, but it converges back to the initial state.">
    <p>
        Using a positive gate voltage (blue line) triggers a small response on the edges. The power supply voltage is
        +30V and the battery around 8V.
    </p>

    <img src="images/ldr_fet_negative_gate.jpeg"
         alt="Oscilloscope readings from the circuit using a positive gate voltage. There is a positive response on the rising and a negative response on falling edges, but it converges back to the initial state.">
    <p>
        Using a positive gate voltage (blue line) triggers a small response on the edges. The power supply voltage is
        +30V and the battery around 8V.
    </p>

    <img src="images/ldr_fet_negative_gate_different_voltage.jpeg"
         alt="Oscilloscope readings from the circuit using a negative gate voltage. There is a positive response on the rising and a negative response on falling edges, but it converges back to the initial state. By using different gate voltages, we get different responses">
    <p>
        Using a negative gate voltage (blue line) triggers a small response on the edges. The battery voltage is
        around 8V. The power supply(gate) voltage has been changed from 30V(left side) down to 15V(right side). It
        can be seen that a lower voltage leads to a smaller response on the edges.
    </p>

    <p>Without the water, no effect can be observed.</p>

    <h2>Discussion</h2>
    <p>
        Looking at the data, it isn't clear whether it is a FET that we are observing. There are only changes on the
        edges, not while holding a voltage level. These spikes immediately fall back to the normal level. I could
        imagine that this is capacitance or inductance, but I don't know electronics well enough to confirm or deny
        it. It is weird that the effect isn't the same for positive and negative edges though.
        On the other hand, Nyle Steiner mentions that he observes a similar effect:
    </p>
    <blockquote cite="http://sparkbangbuzz.com/cds-fet/cds-fet.htm">
        The response of this device also seemed to have a dynamic characteristic. That is, whenever the reversing switch
        was activated, the current through R2 would suddenly change and then slowly creep back toward the previous
        value. By running a sawtooth waveform into the gate however, I was able to establish to my satisfaction, that
        indeed the output current was responding to the input voltage.
    </blockquote>
    <p>
        However, his article doesn't provide enough data to see if this is the same effect. Since I don't have a wave
        generator available, I can't check if it works better with waveforms, like Nyle Steiner did it.
    </p>


    <h2>Conclusion</h2>
    <p>
        While an effect can be observed when the gate voltage changes, it is unclear to me if it is caused by a FET
        effect. Perhaps the higher voltage Neil used in his experiments makes a difference, but I can't test it since I
        don't have access to a power supply providing more than 30V.
    </p>

    <p>
        <b>
            EDIT: Looking at the graphs again with a better understanding of electronics, they look exactly like
            capacitors charging and discharging. A MOSFET or this improvised LDR-FET do also act as capacitors since
            they contain two conductors (the LDR's resistance is still close to a conductor) separated by an isolator
        </b>
    </p> ]]></content:encoded>
        <link>https://yurix.ch/blog/ldr-fet.html</link>
    </item>
<item>
        <title>A screenshot is better than a thousand Words for debugging</title>
        <description><![CDATA[ TLDR: When troubleshooting issues with a web app, please include enough information so others can understand your diagnosis when asking for help. You are more likely to get help, and it makes everything much faster, ultimately benefiting you. The best way to do that is in my opinion to just post a screenshot of your problem. ]]></description>
        <content:encoded><![CDATA[ <p>
        <i>Attention: rant incoming - Please don't feel offended if I send this to you, it's just that after the hundredth message like the one below I have lost the patience writing the same thing over and over again.</i>
    </p>
    <p>
        As a contributor and developer of the <a href="https://eveseat.github.io/docs/">SeAT</a> eve corporation and alliance management tool, I frequently interact with users that have to troubleshoot problems with the application. A common pattern in these support requests is that they look something like this:
    </p>
    <blockquote>
        I can't access (data provided by an upstream API) on the web UI and I get an error saying the request is too long. I've increased the maximum request length in my nginx settings, but it doesn't help.
    </blockquote>
    <p>
        From this message, I see that:
    </p>
    <ol>
        <li>You have a problem</li>
        <li>It looks like it has something to do with an HTTP request from the browser.</li>
        <li>You changed something and it doesn't help</li>
    </ol>
    <p>
        This is just not enough so that I can provide assistance. I therefore need to ask for more context if I even write back.
        Most likely, I'll ask for the specific error instead of the paraphrased version. I might get a message like this:
    </p>
    <blockquote>
        Request Too Long - The length of the request headers is too long.
    </blockquote>
    <p>
        That message tells me that your action of changing the nginx setting is not completely unreasonable, but since we advise people to install the application behind a reverse proxy, we still don't know if the error is from the reverse proxy or the application itself. A simple snippet of text like this error is often insufficient to tell from where an error originates. Visually, I can tell application errors apart from reverse proxy errors since they use different error page designs. I therefore ask whether the background color of the error is white or a blue-gray. They reply with:
    </p>
    <blockquote>
        It is yellow
    </blockquote>
    <p>
        This is very much confusing. I've never seen a yellow error page with this application. I might think about it for a day and then ask for a screenshot to really confirm it is yellow.
    </p>
    <p>
        The screenshot shows that it is a terminal window. Additionally, besides the error I see a command that displays the logs of the upstream API. It is therefore an error with the upstream API.
    </p>
    <p>
        How is it even possible that it takes this long to figure that out? It is mostly the first message:
    </p>
    <p>
        <q>I can't access the data</q> means the tables that are supposed to display data are empty. They therefore did the correct thing and looked at the logs and reported the error, although paraphrased. However, they never mentioned where they got the error from, making it look like it was in the browser and leading the investigation down the wrong way.
    </p>
    <h2>How it could have been</h2>
    <p>
        Even still using the same, suboptimal text message, the screenshot could be attached alongside the message from the start. This would have immediately changed the following things:
    </p>
    <ul>
        <li>The error is not in a browser</li>
        <li>It is from the upstream API since the screenshot inadvertently provides the missing hint that I am looking at the API logs</li>
        <li>One roundtrip to get a non-paraphrased error message could be saved.</li>
        <li>Your nginx fix cannot work since API requests don't go through nginx.</li>
    </ul>

    <h2>Conclusion</h2>
    <p>
        This is just one made-up and of course exaggerated example, but I've experienced multiple situations where simply including a screenshot would have helped massively.
    </p>
    <p>
        Going forward, <b>please just include a screenshot of the thing that makes you think something is wrong</b> alongside your diagnosis of what is wrong, so I can check if it makes sense. Ultimately, it will help you!
    </p>
    <p>
        <s>Of course, this article is intentionally without any screenshot as illustrations :)</s>
    </p> ]]></content:encoded>
        <link>https://yurix.ch/blog/give_me_a_screenshot.html</link>
    </item>
<item>
        <title>Eve ESI Quirks</title>
        <description><![CDATA[ Some missing parts of the EVE Online ESI API documentation CCP doesn't care to fix. ]]></description>
        <content:encoded><![CDATA[ <p>Use the creator code <code>RECURSIVETREE</code> during checkout on the <a href="https://store.eveonline.com" target="_blank">eve store</a> to support me with up to 5% of your purchase :)</p>
    <p>
        If you are new to EVE Online third party tool development and excited to get started with using ESI, I must unfortunately disappoint you.
        ESI is in <a href="https://esistatus.com/">on fire</a>.
        CCP doesn't invest nearly as much time into maintaining and documenting ESI as it is required for smooth operations.
        You can count yourself lucky if they fix an endpoint after it goes down, but fixing old bugs or updating the documentation just doesn't happen.
        At least, this has been the case in the past years (I'm writing this in November 2024).
        With this post, I aim to share some undocumented behaviours and tricks that could be useful for others.
    </p>
    <h2>/markets/{region_id}/orders/</h2>
    <p>
        For citadels, this endpoint returns buy orders with a larger range than just the citadel itself. Sell orders and buy orders within a citadel are not returned. To get a complete picture of the market in a region, combine this endpoint with scrapes of citadel markets using the citadel market endpoint.
    </p>
    <h2>/markets/{region_id}/history/</h2>
    <p>
        There are invisible, undocumented rate limits on this endpoint. If you exceed them, you can get banned. A safe value is around 100 requests per minute.
    </p>
    <p>
        Also, please don't even ask why they have undocumented rate limits...
    </p>
    <h2>Structure Names</h2>
    <p>
        To get the name of a citadel from a location_id, for example from the assets endpoint, you can use the /universe/structures/{structure_id}/ endpoint. However, when you can't docke there, this endpoint doesn't work and there is no other way to get the name of the structure.
    </p>
    <h2>SSO</h2>
    <p>
        Apparently, requesting ALL scopes can trigger an error <code>400 - Request too long</code>. The only fix is to remove a few scopes.
    </p>
    <p>
        The same can happen if you select "remember me" on too many accounts.
    </p> ]]></content:encoded>
        <link>https://yurix.ch/blog/esi-quirks.html</link>
    </item>
<item>
        <title>Traefik+k3s: What they don't teach</title>
        <description><![CDATA[ While traefik is per default shipped with k3s, the configuration is not ready to be used out of the box when TLS is
    desired. ]]></description>
        <content:encoded><![CDATA[ <p>
        I run a VPS with <a href="https://k3s.io/">k3s</a> for a few personal projects. k3s includes <a href="https://traefik.io/traefik/">traefik</a>, a reverse proxy, per default. However, I've kind of struggled how to actually use it. k3s docs go as far as to say it is included and you should manage it with helm. Traefik docs are generally a bit lacking, and since it support docker compose, kubernetes and everything imaginable, it is also sometimes a question of figuring out how to specifically solve a problem on kubernetes.
    </p>
    <p>
        The goal of this article is to explain the configuration required to use traefik on k3s with TLS.
    </p>
    <h2>Enabling TLS</h2>
    <p>
        The first step is to configure the let's encrypt acme provider for tls certificates. For this, we have to add a `HelmChartConfig` resource object. In it, we can override the helm chart options. For let's encrypt certificates, we have to specify a certificate resolver linked to the let's encrypt website, and a contact email. See the config below:
    </p>
    <pre>
        <code>
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: traefik
  namespace: kube-system
spec:
  valuesContent: |-
    additionalArguments:
      - "--certificatesresolvers.letsencrypt.acme.email=email@you.com"          # <--- here: add your email
      - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.caServer=https://acme-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.letsencrypt.acme.storage=/data/acme.json"
        </code>
    </pre>
    <h2>TLS persistence</h2>
    <p>
        While the config from above is enough to get and use a certificate, the certificate is not stored persistently. This means that whenever the traefik pod restarts, a new certificate is rerequested, until eventually the <a href="https://letsencrypt.org/docs/duplicate-certificate-limit/">duplicate certificate limit</a> of only 5 certificates/week is reached. In that case, you won't get any certificates anymore!
    </p>
    <p>
        However, there is an easy fix: the certificates can be stored in a persistent volume claim. This can be done with the following addition:
    </p>
    <pre>
        <code>
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: traefik
  namespace: kube-system
spec:
  valuesContent: |-
    persistence:                    # <--- here: persistence setting
      enabled: true                 # <--- here: explicitly enable persistence
      storageClass: local-path      # <--- here: specify a storage provisioner for the certificate
    additionalArguments:
      - "--certificatesresolvers.letsencrypt.acme.email=recursivetreemail@gmail.com"
      - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.caServer=https://acme-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.letsencrypt.acme.storage=/data/acme.json"
        </code>
    </pre>

    <h2>Using traefik as a reverse proxy</h2>
    <p>
        Traefik can use the gateway and ingress ingress system, but they are a bit awkward to use compared to the alternative, CRDs. HTTP routing is done using a IngressRoute object:
    </p>
    <pre>
        <code>
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: name
spec:
  entryPoints:
    - websecure                     # <--- here: websecure for https, web for http
  routes:
    - match: Host(`example.com`)
      kind: Rule
      services:
        - name: backend-service     # <--- here: The name of the service all traffic should be forwarded to.
          port: 8000
  tls:                              # <--- here: only required on https
    certResolver: letsencrypt       # <--- here: only required on https
        </code>
    </pre>
    <p>
        In general, IngressRoute is surprisingly well-documented in the traefik docs.
    </p> ]]></content:encoded>
        <link>https://yurix.ch/blog/traefik-k3s.html</link>
    </item>
<item>
        <title>Makefiles for website generation</title>
        <description><![CDATA[ Makefiles can be a solution for generating a website with diverse content generation methods. ]]></description>
        <content:encoded><![CDATA[ <p>
        Over time, I've been accumulating various small websites that I want to keep online on the same domain as this blog. This can be everything from an
        <a href="/eatlessenergy">old project</a>, the <a href="/fllcounter/documentation.html">documentation</a> for a
        file format, to a random patch file that needs to be accessible over HTTP. Most of these things don't deserve
        their own domain or subdomain, but I still want to keep them online. They feel just about right to stuff in a subdirectory.
    <p>
        I use simple static files for yurix. Other parts, like this blog article, use a script to generate static pages.
        The pages generated by scripts also use all kinds of scripting languages and frameworks. In short: not only the content is diverse,
        the way that content is built is diverse too. In the end, I have to assemble it all into one directory before uploading it
        to my hosting provider via FTP.
    </p>
    <p>
        This assembly step has been manual and error-prone until now. I've always wanted to automate it, but the diversity in the way the content is being generated means the automation framework needs to be very flexible.
    </p>
    <p>
        I've considered using bash scripts. The issue with that is that it takes quite long to assemble everything. You don't have any parallelism and everything has to be redone all the times. Full rebuilds are not always necessary, and adding a simple missing comma shouldn't take what feels like ages before I see the change in the browser. I want incremental rebuilds.
    </p>
    <p>
        The solution I found is a Makefile. While Makefiles are mostly known for being used for building C applications, they actually just specify shell commands and their dependencies. That can be a C compiler or a linker, but you can also call a python script or simply <code>cp</code> to copy a file. The shell gives me the flexibility of calling any possible tool I could use for the website. It also feels easy to use because I usually invoke these tools on the CLI anyway.
    </p>
    <p>
        On top of that, you can specify dependencies of files for incremental rebuilds. After fixing a typo, I can rebuild and reload the page in 100ms. It is sometimes a bit hard to figure out and specify all dependencies of an output, but I've yet to encounter a situation where it wasn't possible.
    </p>
    <p>
        You can even use other build systems from a Makefile. Just call the build system from your Makefile. It is all shell. If your build system supports incremental compilation, you can also instruct Make to always call the build system so it can check if it has to do incremental updates. That way, you can avoid two incremental systems fighting each other because one thinks the other has to update, while the second thinks it doesn't have to.
    </p>
    <p>
        Makefiles might sound a bit old-fashioned, but they are actually really useful to wrap incremental compilation around basically everything.
    </p> ]]></content:encoded>
        <link>https://yurix.ch/blog/makefiles-for-web.html</link>
    </item>
<item>
        <title>Sky2d - My first big programming project</title>
        <description><![CDATA[ Sky2d is one of my oldest programming project, dating back to around 2017. It is a 2D, factorio-like and minecraft-inspired
    game. ]]></description>
        <content:encoded><![CDATA[ <p>
        When I learned programming, one of my first project was to develop a game. The idea was to take modded skyblock minecraft
        and turn it into a 2D-game (This is maybe also the name, cough cough..). I envisioned it to be quite similar to factorio.
    </p>
    <p>
        At the time, I only had a Raspberry Pi Model 3b with a tiny, terribly bad screen as a computer. This did influence the game
        quite drastically: The windows size of the game is fixed to 256 by 256 pixels. On my screen back then, this was perfectly fine,
        but on a better, larger screen it is a bit small. However, this size is hardcoded into the UI and I don't dare to try and fix it.
        Here is that screen:
    </p>
    <img src="images/screen_vs_ipad.jpeg" alt="A size comparison between the screen and a IPad: The IPad is much bigger">
    <p>
        Today I can't believe I spent countless hours on that tiny screen, but I was a broken 12-year-old back then.
        In der Not frisst der Teufel Fliegen goes the German saying.
    </p>
    <h2>Gameplay</h2>
    <p>
        Walking is done using WASD. At the top, you see your inventory. You can change the active item stack with the numbers 0 to 9.
        Blocks are placed using a left click and mined using a right click.
    </p>
    <p>
        In a new game, you start with a few blocks of dirt and seeds. Seeds can be used to grow more seeds and given enough seed, it is possible to craft something from them.
        Generally, you want to start farming seeds by planting a seed onto dirt by left-clicking a seed onto dirt. It will grow and after around 30s,
        drop a stack of 2-3 seeds. You can collect them by walking over them. The following images demonstrate the process:
    </p>
    <img src="images/sky2d/game_start.png" alt="The games as seen when launching a new game. A dirt island, a player with some seeds and a crafting table">
    <img src="images/sky2d/seed_farming.png" alt="The same image, but the player has planted a few seeds">
    <img src="images/sky2d/seed_collecting.png" alt="The seeds have grown and can be collected">

    <p>
        With enough seeds, a tree sapling can be crafted from seeds. For this, right click the crafting table at the bottom of the island.
        You can scroll through the recipes using the right and left arrow keys. Find the tree sapling recipe and craft a sapling.
        Plant the sapling to grow a tree and harvest wood.
    </p>
    <img src="images/sky2d/crafting.png" alt="An image from the crafting screen">
    <img src="images/sky2d/tree.png" alt="Thew first tree has been planted">
    <p>
        The wood can be used to craft more things like composters to compost seeds into more dirt, allowing more farming.
        It is also possible to build chests, automatic seed collectors and a tool table to manufacture tools
    </p>
    <p>
        Using Q, you can open a fancy achievements screen.
    </p>

    <h2>Development History</h2>
    <p>
        After 2 months of intense development in 6th grade, I mostly forgot about it. A complete playthrough lasted about
        5 minutes, depending on how much I speedran it. Even after ceasing to work on theis project, I didn't stop with programming and
        even made another game, carace ("car race") that I might cover at some point.
    </p>
    <p>
        Many years later in 2021, I found the game files on a random USB stick I had lying around. Out of curiosity,
        I decided to try and get it to run. It worked, just as I remembered it. I even decided to finish a few features I was working
        on when I stopped development for the first time. But then again, I put it back and let it rot on my disk.
    </p>
    <p>
        In 2023, I again stumbled over it when sorting my files. Just like in 2021, I couldn't resist the urge to try it out again
        and continue development for an evening.
    </p>
    <p>
        As you can see, this is very much a personal project that has grown to my heart. The code quality is terrible, the game
        is quirky, but I enjoy occasionally working on it, and I'm even somewhat proud having created this game.
    </p>
    <h2>Download</h2>
    <p>
        The game uses many textures stolen from minecraft. As much as I'd like to share it, I don't want to get into troubles for it.
    </p> ]]></content:encoded>
        <link>https://yurix.ch/blog/sky2d.html</link>
    </item>
<item>
        <title>Building XTRKCAD on Apple Silicon</title>
        <description><![CDATA[ XTRKCAD is a Model Railway CAD program that runs on macOS unfortunately only provides intel builds. However, you can build it on your own for arm64 and Apple Silicon. ]]></description>
        <content:encoded><![CDATA[ <p>
        <a href="https://sourceforge.net/projects/xtrkcad-fork/">xtrkcad</a> is probably one of the best free model railroad planners that run on macOS. However, they only provide downloads for older intel-cpu based macs. (the switch to arm by apple was around 2020). You can run xtrkcad in rosetta, a translation layer allowing older intel apps to run on Apple Silicon, but I prefer native builds.
    </p>
    <p>
        Building for apple silicon natively turned out to be a bit more difficult than anticipated.
        The <a href="https://sourceforge.net/p/xtrkcad-fork/wiki/BuildNotes/">documentation</a> is rather sparse.
        Additionally, I'm using homebrew and not macports.
    </p>
    <h2>Installing Homebrew</h2>
    <p>
        This guide heavily uses <a href="https://brew.sh/">homebrew</a>. You should therefore go and install it if you haven't already.
    </p>
    <h2>Building from source</h2>
    <p>
        To build from source, obviously the source code is required. It is stored on the mercurial version control system, not git, like most software is today. Get the source like this:
    </p>
    <pre><code style="white-space: pre-line">   brew install mercurial
                                                mkdir xtrackcad
                                                cd xtrackcad
                                                hg clone http://hg.code.sf.net/p/xtrkcad-fork/xtrkcad src/  </code></pre>
    <p>
        Next is installing all dependencies. The first install command are common libraries that are found on the main brew index. The second line is for a library called Mini-XML. Mini-XML is on brew, but only for a newer, incompatible version. I've created a brew tap(repo) that provides the dependency. here is a <a href="https://github.com/recursivetree/homebrew-xtrkcad/blob/main/Formula/libmxml%403.rb">link</a> to the source code of the tap and here of the <a href="https://www.msweet.org/mxml/">Mini-XML website</a>.
    </p>
    <pre><code style="white-space: pre-line">    brew install cmake gtk+ inkscape libzip freeimage
                                                brew install recursivetree/xtrkcad/libmxml@3    </code></pre>
    <p>
        Finally build the software:
    </p>
    <pre><code style="white-space: pre-line">   cmake -S src -B build
                                                make -j4 -C build
                                                make -j4 -C build install</code></pre>
    <p>
        I've had it happen that the svg to png conversion fails. In that case, remove the build directory and build again. For me, that has always helped.
    </p>
    <p>
        It is also possible that you will run into linking issues about missing libraries. Since homebrew doesn't install libraries in the typical places, some tools have trouble finding them.
        The easies fix I've found is to open <code>src/CMakeLists.txt</code> and add the following line:
        <code>link_directories(/opt/homebrew/lib)</code>.
    </p>
    <p>
        If everything worked, you should now be able to launch the app using the command <code>xtrkcad</code>.
    </p>
    <h3>Bonus - Generating .app Files</h3>
    <pre><code style="white-space: pre-line">   make -j4 -C build package   </code></pre>
    <p>
        A .dmg file will be generated in the <code>build</code> folder that contains the <code>.app</code> file.
        However, I haven't figured out how to include the required dynamic libraries,
        so it will most likely crash when running it on different computers.
    </p>
    <h2>Using my Homebrew tap</h2>
    <p>
        Alternatively, I've built a homebrew formula that automates the above build steps.
        Due to how homebrew works, it was not possible to specify a dependency on inkscape.
        Therefore, it has to be installed manually beforehand.
    </p>
    <pre><code style="white-space: pre-line">   brew install inkscape
                                                brew install recursivetree/xtrkcad/xtrkcad</code></pre>
    <p>
        If everything worked, you should now be able to launch the app using the command <code>xtrkcad</code>.
    </p>
    <p>The source for the xtrkcad formula can be found <a href="https://github.com/recursivetree/homebrew-xtrkcad/blob/main/Formula/xtrkcad.rb">here</a>.
        It performs the same steps as described above, except it applies a <a href="https://yurix.ch/wpref.diff">patch</a> that allows xtrkcad to find its <code>share</code> directory, since again, due to homebrew's design it is located in non-standard places.
    </p>

    <h2>Closing Words</h2>
    <p>
        I know this guide does not have the highest quality. It is more of a note sheet for myself. If you run into any issues or have something to comment, contact me at <a href="mailto:blog@ycloud.yurix.ch">blog@ycloud.yurix.ch</a>.
    </p> ]]></content:encoded>
        <link>https://yurix.ch/blog/xtrackcad-apple-silicon.html</link>
    </item>
<item>
        <title>RSS Feeds</title>
        <description><![CDATA[ The RSS feeds of the yurix blog. ]]></description>
        <content:encoded><![CDATA[ <p>
        This blog provides multiple RSS feeds according to the language of the post.
    </p>
    <ul>
        <li>English: <a href="rss-feed-en.xml">yurix.ch/blog/rss-feed-en.xml</a></li>
        <li>German/Deutsch: <a href="rss-feed-de.xml">yurix.ch/blog/rss-feed-de.xml</a></li>
        <li>All: <a href="rss-feed.xml">yurix.ch/blog/rss-feed.xml</a></li>
    </ul> ]]></content:encoded>
        <link>https://yurix.ch/blog/rss.html</link>
    </item>
<item>
        <title>Minecraft Server With FreeDNS Subdomains</title>
        <description><![CDATA[ Hosting a minecraft server on a free dns provider like FreeDNS is not without issues due to the way mojang implements
    server banning. Luckily, there are solutions. ]]></description>
        <content:encoded><![CDATA[ <p>
        Some time ago, I set up a minecraft server for me and a few friends. We host it on a machine we already had, and where a few other things run alongside it.
        One of these other services is a website using a subdomain from <a href="https://freedns.afraid.org/">FreeDNS</a>. They are a great, free provider of subdomains
        for projects that don't need their own top-level domain. This other services requires reverse DNS to be set up, which is quite important as it turns out.
    </p>
    <p>
        After setting up the server, nobody could join it. There was just a <i>connection refused</i> error. Pinging the server with mcstatus did work though, meaning that the server
        was running and reachable. This looked very strange. Through googling the problem, we found a <a href="https://community.cloudflare.com/t/minecraft-dns-unknown-host/536151/4">discussion</a>
        in the cloudflare forums with the same problem. It turns out that Mojang, the company behind minecraft has banned all subdomains of the FreeDNS top-level domains from being played on in online mode,
        meaning with verification that the player has actually bought minecraft and is not a cracked account. And this is where it starts to matter that reverse DNS is set up for this server: Using reverse DNS,
        Mojang can associate the IP address of your server with the domain that has been blocked. Removing the reverse DNS entry luckily fixes the issue, but figuring this out took quite some time and nerves.
    </p>
    <h2>Rant about wildcard-bans</h2>
    <p>
        Mojang has quite a few reason why they should ban servers, I'm not questioning that. However, I disagree with the way they implement it. Mojang hosts a list of
        <a href="https://sessionserver.mojang.com/blockedservers">SHA-1</a> hashes of domains they ban. This list is quite short, and this is due to the way they ban domains:
        Instead of specifically banning an offending domain, they wildcard-ban the domain and all their subdomains. Wildcard-banning subdomains is an ineffective way to stop banned servers.
    </p>
    <p>
        First, it is not uncommon that minecraft servers use free subdomains provided by FreeDNS and the like. Most people set up a minecraft server to play with their friends, and not to
        publicly host a server. It is therefore by no means required to have your own top-level domain, a subdomain provided by FreeDNS is more than enough for your needs. The problem with wildcard-banning is
        that totally unrelated server that happen to use the same top-level domain are banned aswell.
    </p>
    <p>
        Expanding on that, the error message given in the client is quite vague and doesn't explain the problem. This makes sense from Mojang's point of view, as they want to pretend the server doesn't
        even exist, but from the user's point of view, their server doesn't work with no reason give as to why. Only with a lot of googling and a technical understanding that is beyond that of a typical administrator
        hosting a server for his friends, I was able to pinpoint and resolve the issue. Figuring this out beforehand: No chance, the issue is way to niche and undocumented for this. This is also the reason why I have decided to write this article: To shine some light on the problematic and hopefully help someone with a similar issue.
    </p>
    <p>
        Lastly, banning domains isn't even an effective way of banning server. I could just remove the reverse DNS entry and was able to join via IP address. The domain name of course still didn't work, but you could still join the server. Additionally, a serious ban evader could just buy a new domain and move over to that. it adds some inconvenience, but in the end, the server admin keeps the upper hand in this game of cat and mouse.
    </p>
    <p>
        In conclusion, the collateral damage caused by banning free DNS services causes more harm than it prevents banned servers from operating. Free subdomains are commonly used for private minecraft servers, the symptoms of being banned by Mojangs current system are difficult to detect, and a wildcard-subdomain ban can easily be evaded. My hope is that Mojang revises upon its policies and find a better system of banning servers.
    </p>
    <h2>Resolving the issue</h2>
    <p>
        After this essay-shaped rant (I have to write an essay tommorrow and used this article to get in the right mood), here are a few steps to detect and fix the issue:
    </p>
    <ol>
        <li>
            Check whether your server has reverse DNS enabled. To do this, resolve the IP of your server by running: <code>host yurix.ch</code>.
            The result should look like <code>yurix.ch has address 149.126.4.22</code>. Use this to run a reverse DNS lookup: <code>host &lt;IP from above&gt;</code>.
            This results in a response like <code>22.4.126.149.in-addr.arpa domain name pointer s013.cyon.net.</code>. As you can see, it does not match with yurix.ch. This is good.
            It should no match.
        </li>
        <li>
            If it does match, make sure to check whether you have actually been banned. For this, we need the SHA-1 hash of <code>*.your-top-level-domain.com</code>. The SHA-1 hash can for example be found using
            <a href="https://emn178.github.io/online-tools/sha1.html">this</a> calculator. Next, open the <a href="https://sessionserver.mojang.com/blockedservers">list of banned domains</a> and check whether your hash
            is in the list of blocked domains. If it is, you are affected by the problem described here.
        </li>
        <li>
            The easiest way to fix the issue is to remove the reverse DNS entry. I have tested this, and it seems to work, although it did take more than a day for all DNS caches to expire.
            Alternatively, you could use a different domain that is not banned, or use a IP with no domains pointing to it.
        </li>
    </ol> ]]></content:encoded>
        <link>https://yurix.ch/blog/minecraft-hosting-adventures.html</link>
    </item>
<item>
        <title>Building a Computer from Electronic Components</title>
        <description><![CDATA[ Over the last half year, I've been building my own version of a 16-bit, breadboard glue logic CPU based on a transport-triggered architecture. In this article, I present the current status and what I've learned. ]]></description>
        <content:encoded><![CDATA[ <p>
        Note: This is a newer version of this article. The old article written in the middle of the project can be found <a href="building_a_cpu.html">here</a>.
    </p>

    <p>
        Computer architecture is an interesting topic. While you can learn quite a lot about it by reading books and articles, doing something practical is a bit difficult. Besides the <a href="https://tinytapeout.com/">TinyTapeout</a> project, it is basically impossible to get integrated circuits manufactured as a private customer.
    </p>

    <p>
        However, as for example <a href="https://www.youtube.com/playlist?list=PLowKtXNTBypGqImE405J2565dvjafglHU">Ben Eater</a> and <a href="https://www.youtube.com/playlist?list=PLFhc0MFC8MiCDOh3cGFji3qQfXziB9yOw">James Sharman</a> have shown, it is possible to build a computer out of glue logic chips. They are a group of simple ICs that implement functionalities like logic gates, registers or even adders. While they are not typically used to build CPUs anymore, around the 1970s there have been many CPUs made with them. Today, it is still possible to build a simple computer using glue logic.
    </p>

    <p>
        Over the last half year, I've been building my own version of a glue logic CPU. It is a 16-bit computer using 16-bit words. In total, it has 64 KB of memory organized as 32k 16-bit words. Communication to a "big computer" (e.g. a laptop) can be done over SPI. An Arduino acts as a USB translator. This is also the primary way of loading programs onto the computer.
    </p>

    <img src="images/thecpu_november23.jpeg" alt="image of the cpu I built">

    <h2>Architecture</h2>
    <p>
        This computer is based on a transport-triggered architecture(TTA) very similar to the one described by Douglas W. Jones on his <a href="https://homepage.cs.uiowa.edu/~dwjones/arch/risc/">website</a>.
        A transport-triggered architecture means there is one instruction: Move data. All other operations are memory-mapped. Because there is just one instruction, an opcode can be omitted and an instruction only consists of a source and destination.
    </p>

    <p>
        A group of memory-mapped registers, for example, the operands of the subtraction device, are called a function unit since they help with performing an action, and form one unit.
    </p>

    <p>
        The function units are all connected over the so-called data-bus. This is one long bus that connects all function units. All data movements go through the data bus.
    </p>
    <img src="images/tta_arch_overview.png" alt="sketch of a TTA architecture showing how function units are connected over a bus">
    <p>
        In the picture of the finished CPU, the blue wires are the data bus. As it can be seen, it stretches over the whole CPU and connects many regions.
    </p>

    <h3>Memory-Mapped Function Units</h3>
    <p>
        The computer has the following function units memory-mapped:
    </p>
    <ul>
        <li>subtraction</li>
        <li>unconditional branches</li>
        <li>conditional branches (conditions: all bits set or is negative)</li>
        <li>SPI input and output</li>
        <li>main memory</li>
        <li>swapping the high part of a 16-bit word into the low parts</li>
        <li>breakpoints</li>
    </ul>
    <p>
        With these features, the CPU isn't very powerful and difficult to program, but it is more than enough to e.g. find prime numbers using the sieve algorithm.
    </p>

    <h2>Construction</h2>
    <p>
        The computer is built out of 74-series chips mounted on breadboards. It is wired using hook-up wire and in parts using wire wrap because I ran out of hook-up wire.
        The breadboards are mounted on a piece of wood. This allows me to move the computer around.
    </p>
    <p>
        I've included a few LEDs to visualize important parts of the CPU state. They have proven to be invaluable for debugging together with a single-step mode.
    </p>

    <h2>Programming</h2>
    <p>
        I've created a custom assembler for programming. An example program that can search for primes using the sieve algorithm can be found <a href="resources/cpu/primes.asm.txt" target="_blank">here</a>.
    </p>
    <p>
        Writing the assembler was my first big project using the zig programming language, and you notice it while reading its code. Therefore, I won't share it.
        It isn't particularly interesting though. It parses the file, converts it to an intermediate representation, optimizes immediate values, resolves the labels and emits a binary.
    </p>
    <p>
        Additionally, I started work on a cross-assembler that takes in RISC-V assembly and translates it to assembly for my CPU.
        However, since there is no function unit for binary operations like AND, I doubt I will ever finish it.
    </p>

    <h2>Advice</h2>
    <p>
        It was an interesting experience, and I learned a lot from building this CPU. Here are a few points I want to share with anyone attempting a similar project:
    </p>
    <ul>
        <li>Keep it simple. It will take you long enough to finish the project, so don't make it needlessly complicated. You can always do a second build/upgrade your current one. </li>
        <li>Build small: in retrospect, building it 16-bit wasn't worth it. Going 16-bit means you have to lay twice as many wires per function unit, and laying wires is what took the most time.</li>
        <li>Investing some time to test the computer properly is very much worth it.</li>
        <li>Use program-counter-relative jumps</li>
        <li>
            Don't forget the power supply. You will need to supply your project with power. Ideally, your power
            supply is short-circuit proven. Because I didn't have anything better, I <s>used</s>fried and arduino
            as a USB adapter. Don't do it. Get a lab power supply, resettable fuses, or just anything to protect you.
            While I haven't managed to destroy my CPU with short circuits yet, I managed to create plenty of them.
        </li>
        <li>
            A modular architecture like a transport-triggered architecture is worth it. With TTAs, you can always add and remove function units.
            This allows for some flexibility at the start, not all function units have to be planned completely, or you can even add completely new function units you didn't think about before.
        </li>
    </ul>

    <h2>More Information</h2>
    <p>
        I started this project as my matura project. This is a project I had to do in my final year of high school. Besides actually building the computer, I also had to write a report about it.
        It is way more detailed than this article ever can be. Check it out <a href="resources/cpu/2023_MA_Computer-From-Scratch.pdf" target="_blank">here</a>.
    </p> ]]></content:encoded>
        <link>https://yurix.ch/blog/building_a_cpu2.html</link>
    </item>
<item>
        <title>Hybrid VLAN port on mikrotik</title>
        <description><![CDATA[ This is a minimal example how to configure hybrid VLAN ports on mikrotik devices since I couldn't find any other examples on the internet. ]]></description>
        <content:encoded><![CDATA[ <p>
        While setting up my MikroTik RB5009 router, I wanted to configure a hybrid VLAN port. This took me longer than expected and I didn't get it working just from reading the docs. What I missed the most is a simple example that doesn't configure DHCP and whatever else that is unrelated to the actual problem. To help future me and maybe others, I decided to share a minimal example how to configure hybrid VLAN ports. For an explanation how VLANs work and what hybrid ports are, there are plenty of  better examples in the internet. Just google it.
    </p>
    <p>
        VLAN 10 is for untagged traffic. VLAN 99 is for tagged traffic.
    </p>
    <pre>
        <code>
# ----------------------------------------
# MikroTik Hybrid VLAN port example config
# ----------------------------------------

# create a bridge
/interface bridge
add frame-types=admit-only-vlan-tagged name=bridge1

# add a port to the bridge, set the VLAN for untagged traffic
/interface bridge port
add bridge=bridge1 interface=ether1 pvid=10

# configure the VLAN "routing" table
/interface bridge vlan
add bridge=bridge1 tagged=ether1,bridge1 vlan-ids=99
add bridge=bridge1 tagged=bridge1 untagged=ether1 vlan-ids=10

# add vlan interfaces to test the setup
/interface vlan
add interface=bridge1 name=DEFAULT-VLAN vlan-id=10
add interface=bridge1 name=MGMT-VLAN vlan-id=99

# add IP addresses to test the setup
/ip address
add address=192.168.99.1/24 interface=MGMT-VLAN network=192.168.99.0
add address=192.168.10.1/24 interface=DEFAULT-VLAN network=192.168.10.0

# enable vlan filtering
/interface bridge
set 0 vlan-filtering=yes
        </code>
    </pre>
    <p>
        To test it you can ping 192.168.10.1 for the untagged traffic and 192.168.99.1 for the tagged traffic. You'll have to manually configure the network interfaces on your client device.
    </p> ]]></content:encoded>
        <link>https://yurix.ch/blog/mikrotik-hybrid-vlan-port.html</link>
    </item>
<item>
        <title>Terminus Corporation History</title>
        <description><![CDATA[ Terminus was a small EVE Online corporation that did faction warfare and other shenanigans. Sadly, most members quit,
    but here is its history. ]]></description>
        <content:encoded><![CDATA[ <p>Use the creator code <code>RECURSIVETREE</code> during checkout on the <a href="https://store.eveonline.com" target="_blank">eve store</a> to support me with up to 5% of your purchase.</p>

    <p>
        While going through some files on my laptop, I found a copy of the old terminus <a href="https://github.com/recursivetree/seat-info">seat-info</a> pages. Since this was probably the best time I had in EVE and I want to keep the memories, I decided to publish the chronicles of the Terminus. corporation.
    </p>
    <h2>The Beginning</h2>

    <h3>Jabber & Highsec</h3>
    <p>
        Because it was before my time, I can only say that <i>*magically*</i>, a few guys got
        together as a group. I think they did faction warfare(still with the old mechanics), but it doesn't really matter
        that much. What matters more is that one day, they decided to create
         <i>JabberWock Mining and Industry</i>, a small mining and
        industry corporation in Northern Placid around Osmeden and Adacyne.
    </p>
    <p>
        This was also the time I joined. JabberWock was my first corporation.
    </p>
    <p>
        While I wouldn't join a highsec mining corporation anymore, it was a fun time we spent with orca racing and rock crunching.
    </p>
    <p>
        A bit later, Lucius, until now just a line member, was promoted to leadership, but actually wanted
        to have his own corp AND stay in Jabber. This lead to the creation of the
        alliance  <i>The Faceless.</i> and it's first members, <i>JabberWock Mining
        and Industry</i> and <i>Legion of Terra</i>, Lucius's corp.
    </p>
    <p>
        Some time later,  our beloved raitaru <i>FunkyTown</i> and our pocos got
        wardecced, we had to defend them. This is where everything started. While we were successful with defending FunkyTown and many many newbies like me saw their first blood, it showed
        that the corp had almost no income streams and PVP experience. That had to change, and the wormhole
        project was born.
    </p>

    <h3>The Wormhole</h3>
    <p>
        We did move in a C2 wormhole, built a few capitals (yes, after the patch,
        and all components hauled in with DST, not fun!) and set up a ton of
        Athanors to mine. We had fun (<a href="https://zkillboard.com/kill/94550394/"
                                 newtab>most expensive fax loss in the game</a>), but problems with
        recruiting enough members, so we were unable to respond when threatened to be evicted.
        Realizing we had no chance, we evacuated and sold the structures and
        capitals.
    </p>

    <h2>Terminus</h2>
    <p>
        All that time in the wormhole, we still were part of <i>The Faceless.</i>
        Socially, we were two groups tho, the wormholers and the highsec miners.
        This is why we (the wormholers) decided to split of into a new corp, and
        <i>Terminus</i> was born. The whole wormhole project and the evacuation
        did cost a lot for everyone, and we wanted a place to rebuild, hence we
        decide to rent a system. Because the Beeitnam War was ending around the same
        time, we saw that renting from Legacy Coalition was no good idea, Goons didn't have any space and Horde wasn't an option for other reasons, in the
        end, only Fraternity was really an option. And that's how we moved into
        Branch.
    </p>
    <p>
        While the PVE content was good, in terms of PVP, Branch had nothing to
        offer, so we moved into facwar while keeping a foot in null.
    </p>
    <h2>Faction Warfare</h2>
    <p>
        Our first staging area was in Slays in Southern Placid where we terrorized the area of Iges, Uphallant, Covryn, Dastryns and sometimes even Ostingele. It was also the time we started to make friends with Cynosural Field Theory.
    </p>
    <p>
        When content started to drown in Southern Placid, we moved up to Northern Placid and the Maut pipe to fight the newly formed United Caldari Navy caldari faction warfare alliance from <a href="https://zkillboard.com/kill/100978541/">Nayrok</a> <a href="https://zkillboard.com/kill/85431726/">the</a> <a href="https://zkillboard.com/kill/100931228/">freighter</a> <a href="https://zkillboard.com/kill/100801548/">feeder</a>. This provided some content for a while.
    </p>
    <img src="images/salt_mining_ucn.jpg" alt="terminus is mining UCN salt using mining barges">
    <p>
        I don't know when exactly, but around that time, we also abandoned nullsec. We didn't use it nearly enough and our landlords demanded more rent, while doing nothing against BOSS roaming from Venal. In hindsight, it was probably due to their terrible organization: They didn't notice we left until three months later because the bills haven't been paid. Additionally, they never kicked us from their discord, but messed up the permissions to that I could impersonate Noraus, the Fraternity leader and ping @everyone in #announcements. I can't find screenshots of it anymore though. Fun times.
    </p>
    <p>
        During summer 2022 we also made a deployment into syndicate, but I was on holidays.
    </p>
    <p>
        In autumn, things started to happen: We were again down in the Slays area and wanted to kill a enemy Astrahus with a coalition of galmil corporation. Uniting galmil was difficult and our agreement to work together fragile. Anyways, we were successful and killed the astra, but our ally JREX FC youngpuke wasn't happy at all because "we were not supposed to win and only there for the content", "we batphoned and lost our honor" etc. We were allies up to now despite a complicated history, but that day we and our friend the potato alliance decided to just leave galmil. We had enough.
    </p>
    <p>
        And this is how Terminus started to collapse: By winning an astrahus timer.
    </p>
    <h2>Pandemic Horde</h2>
    <p>
        Since everyone was kind of exhausted at this point, we decided to take a break and join Pandemic Horde. However, just as we joined, the first Fire Coalition war broke out and we were just burning structures uncontested for weeks. Our activity declined and many took a break. The few people that remained active generally joined another corp in Horde or elsewhere.
    </p>

    <h2>Drill-And-Kill</h2>
    <p>
        We're so back! Join the corp with the most glorious name ever, Drill-And-Kill. Terminus. is now our structure holding corp.
    </p>

    <p>Use the creator code <code>RECURSIVETREE</code> during checkout on the <a href="https://store.eveonline.com" target="_blank">eve store</a> to support me with up to 5% of your purchase.</p> ]]></content:encoded>
        <link>https://yurix.ch/blog/terminus.html</link>
    </item>
<item>
        <title>Building a CPU - 50% through the project</title>
        <description><![CDATA[ Building a diy, homebrew CPU is one of the craziest and largest project I've ever attempted. This post tells the
    experiences I've made. ]]></description>
        <content:encoded><![CDATA[ <img src="images/thecpu.jpg" alt="The breadboard CPU I built">
    <p>
        As part of my education, I have to do a bigger project before finishing school. I've always been very
        interested in computer architecture and design, so I decided to combine the two: Build a CPU as a project.
    </p>
    <p>
        This is obviously an ambitious project, additionally because I didn't just want to build the simplest things
        possible. And this is already the most important advice I can give to anyone: Keep it as simple as possible.
        And if you think it is simple enough, make it 10 times simpler.
    </p>
    <p>
        Anyways, how does one actually build a CPU? Producing your own chip is pretty much out of question, the cost
        are way to high. For example, the semiconductor prototyping platform <a href="https://efabless.com/">
        efabless.com</a> lists a price of <i>only</i> 10'000$.
    </p>
    <p>
        Since I want a real product and not just a simulation in something like an FPGA, I decided to build the thing
        using 74-Series glue-logic integrated circuits. They are great. To connect them, I use breadboards and wire.
    </p>
    <img src="images/74seriesic.jpeg" alt="A 74-Series integrated circuit as a PDIP chip">
    <p>
        However, I mainly wanted this post to be about my learnings. Here is a list
    </p>
    <ul>
        <li>
            Keep it simple. It will take you long enough to finish the project, so don't make it needlessly
            complicated. You can always do a second build/upgrade your current one.
        </li>
        <li>
            Cutting wires sucks. If anyone knows a better solution on breadboards, let me know.
        </li>
        <li>
            Don't forget the power supply. You will need to supply your project with power. Ideally, your power
            supply is short circuit prove. Because I didn't have anything better, I <s>used</s>fried and arduino
            as a USB adapter. Don't do it. Get a lab power supply, resettable fuses, anything to protect you.
            While I haven't managed to destroy my CPU with short circuits yet, I managed to create plenty of them.
        </li>
        <li>
            Try to make your architecture modular. This way, you can
            <ul>
                <li>
                    Add more features later on
                </li>
                <li>
                    Test parts of the CPU earlier
                </li>
            </ul>
        </li>
        <li>
            Simulate your CPU before building it. It doesn't need to be super detailed on an electronic component
            level, it's enough to model the ISA. I've found many, sometimes severe oversights while doing this
            that saved me a lot of time should I've missed them.
            <ul>
                <li>Don't write it in python, doing bit manipulations in python is a bit annoying. I can
                    recommend <a href="https://ziglang.org">zig</a> for it, as it allows you to specify the bit
                    width of an integer type to the bit, e.g. you can have an <code>u5</code>: A 5-bit unsigned
                    integer.
                </li>
            </ul>
        </li>
        <li>
            Multiply the breadboard space requirements by at least 1.5 times the amount you've calculated you'll
            need.
        </li>
    </ul>

    <p>
        Maybe one day I'll write about the details of the architecture of a CPU, but until then, these are my
        experiences I wanted to get out and share with the wild. On James Sharmann's discord from time to time people
        ask questions that exactly need this kind of answer, so I hope it helps ¯\_(ツ)_/¯.
    </p> ]]></content:encoded>
        <link>https://yurix.ch/blog/building_a_cpu.html</link>
    </item>
<item>
        <title>Software Project Spotlight: discordless</title>
        <description><![CDATA[ Discordless is a tool to archive discord by inserting a man-in-the-middle proxy to record discord traffic. ]]></description>
        <content:encoded><![CDATA[ <p>Discord is a chat and voice chat app originally developed for gaming, but since its launch it has been adopted by
        many online communities outside of gaming that would have traditionally hosted a publicly accessible forum or
        mailing list. This is problematic since discord is part of the deep web: While many of these communities are
        open for anyone who joins their discord server, discord is not indexed and searchable by search engines. I think
        it is sad if this knowledge is no longer as easily accessible and discoverable.</p>
    <p>Luckily, at least what is on discord is preserved relatively well: I haven't noticed any data get deleted,
        and using the search function, you can go back many years.</p>
    <p>However, Discord is a private company, interested in making a profit. Access to discord is free and while they
        sell Nitro, a subscription offering some perks like larger file uploads or a longer message character limit, the
        advantage it provides doesn't warrant the costs for most people. Most likely, Nitro sales alone don't
        provide enough money to sustainably operate the platform. It is probably only a question of time until
        enshitification or paywalls start. In a sense, it has already started with <a
                href="https://www.reddit.com/r/technews/comments/1jfs1ls/discord_is_getting_mobile_ads/">ads
            occasionally appearing on mobile</a>.</p>
    <p>To preserve the knowledge and conversations of discord, I've started to automatically archive conversations
        from discord and eventually plan to mirror them on the web. This solves both problems: A web archive of a
        discord server is indexable, and it can also stay accessible long after communities have migrated to other
        platforms if discord eventually is no longer usable.</p>
    <p>The issue with archiving discord: It is not something discord officially supports. As for inofficial ways, there
        are options. You could write a bot that records all messages, but that is against the terms of service. </p>
    <p>Instead, I'm using a method developed by a project called <a href="https://github.com/Roachbones/discordless">discordless</a>.
        Discordless is a man-in-the-middle proxy that automatically records all discord traffic. In a next step,
        a script converts the recorded traffic into formats like HTML or <a href="https://github.com/slatinsky/DiscordChatExporter-frontend">DiscordChatExporter</a> compatible JSON.</p>
    <p>Some advantages of discordless' approach include that it is difficult to detect. We are not spamming discord's APIs. As far
        as I'm aware, it doesn't violate discord's terms of service. Only sharing your recordings publicly
        might infringe on the copyright of people who sent messages.</p>
    <p>Another strength of discordless is that it records the raw traffic. This means that old messages can be
        reexported with improved exporters when improvements are made.</p>
    <p>Discordless is not without its share of issues. One problem is to get discord to use the proxy. For performance
        reasons, you probably don't want to send all traffic through the proxy. On desktop operating systems, this
        can be achieved by specifying the <code>--proxy-server=&lt;your server&gt;</code> option on the commandline, but
        at least on macOS, there is no easy way to do this with an app in your launch menu. In the end, I've
        resorted to not having discord in the launch menu, but an Automator app that just launches discord
        with these arguments.</p>
    <p>A similar issue is on iOS: You can only specify a proxy per WiFi. If you join a new WiFi, you'll have to
        reenter the proxy server details. This is annoying enough that I've only done it for the most important
        networks, like at home and at my university.</p>
    <p>
        A proxy can only record messages I'm loading in the discord app, so there is no guarantee it will get all messages. But since I'm fairly active, it will get most.
    </p>
    <p>Discordless is a small, slightly disorganized project, but it contains the scripts and techniques that makes it
        possible to archive and publicly mirror knowledge hidden in discord.</p>
    <p><a href="https://github.com/Roachbones/discordless">discordless github</a></p> ]]></content:encoded>
        <link>https://yurix.ch/blog/discordless.html</link>
    </item>
<item>
        <title>Removing a secondary Wi-Fi interface on macOS sequoia</title>
        <description><![CDATA[ This guide shows how to delete a secondary Wi-Fi interface (Wi-Fi 2) in the network setting on macOS sequoia. For some reason, this must be done in the terminal since the user interface doesn't seem to offer a remove button. ]]></description>
        <content:encoded><![CDATA[ <p>
        In the macOS network settings, you can add a second Wi-Fi interface. This can be used to e.g. configure a static IP and a dynamic IP from DHCP at the same time.
    </p>

    <img src="images/mac-secondary-wifi.png" alt="secondary wi-fi interface in mac os network settings">

    <p>
        However on macOS sequoia, you can't remove this network interface using the user interface once you no longer need it.
        I've found this way to remove it via the terminal:
    </p>
    <ol>
        <li>
            Open Terminal.app
        </li>
        <li>
            Type <code>networksetup -listallnetworkservices</code> and press enter.
        </li>
        <li>
            A list of network interfaces should be printed. Somewhere, a interface similar to <code>Wi-Fi 2</code> should be listed.
            The name might not exactly match the name shown in the network settings. For example, I get <code>WLAN 2</code> in the network settings, but <code>Wi-Fi 2</code> from the command. Note the exact name from the command.
        </li>
        <li>
            Next, execute <code>sudo networksetup -removenetworkservice "_name of interface_"</code> where you insert the exact name of the interface noted above, in my case this would be <code>sudo networksetup -removenetworkservice "Wi-Fi 2"</code>
        </li>
        <li>The network device should be removed.</li>
    </ol> ]]></content:encoded>
        <link>https://yurix.ch/blog/macos-sequoia-secondary-wifi.html</link>
    </item>
<item>
        <title>NetBSD on the i.MX23-OLinuXino</title>
        <description><![CDATA[ Some notes on how to boot NetBSD on the i.MX23-OLinuXino in it new, devicetree-ified version. ]]></description>
        <content:encoded><![CDATA[ <p>In the second half of 2025, I spent some time adding support for booting NetBSD on the i.MX23-OLinuXino
        using device trees and u-boot. All old i.MX23-OLinuXino guides have been lost in the depths of the internet and
        not
        even the internet archive has all pieces, so I&#39;ve decided to collect all information on one page.</p>
    <p>This guide is not a full step-by-step guide. Rather, it should be seen as a collection of notes to make it
        easier,
        but I won&#39;t be providing detailed instructions/commands for e.g. how to partition the SD card.</p>
    <p>If you struggle to get it working, feel free to <a href="aboutme.html">contact</a> me. Perhaps one day, I&#39;ll
        also add it to the
        prebuild images on <a href="https://armbsd.org">armbsd.org</a>.</p>
    <p>The i.MX23 SoC has many names, sometimes it is also called i.MX233 or MX23. Even Freescale/NXP couldn&#39;t
        decide on one
        name and calls it different across documents. These three names should be used synonymously and aren&#39;t a
        typo.</p>
    <h2>Supported Hardware</h2>
    <table>
        <thead>
        <tr>
            <th>Device</th>
            <th>State</th>
        </tr>
        </thead>
        <tbody>
        <tr>
            <td>Debug UART</td>
            <td>Working</td>
        </tr>
        <tr>
            <td>Application UART</td>
            <td>Not implemented</td>
        </tr>
        <tr>
            <td>Audio Output</td>
            <td>Working</td>
        </tr>
        <tr>
            <td>Audio Input</td>
            <td>Not implemented</td>
        </tr>
        <tr>
            <td>USB</td>
            <td>Working</td>
        </tr>
        <tr>
            <td>ECC+crypto accelerators</td>
            <td>Not implemented</td>
        </tr>
        <tr>
            <td>SD card</td>
            <td>Working</td>
        </tr>
        <tr>
            <td>Display Outputs</td>
            <td>Not implemented</td>
        </tr>
        <tr>
            <td>GPIO</td>
            <td>Working</td>
        </tr>
        <tr>
            <td>SPI, I2C</td>
            <td>bit-banging via gpio possible</td>
        </tr>
        </tbody>
    </table>
    <h2>Booting NetBSD</h2>
    <p>The i.MX23 boots NetBSD using u-boot. The u-boot bootloader, kernel and device trees are stored on the SD card,
        while the root filesystem is either on the SD card or an USB device.</p>
    <p>The SD card needs to be set up in a specific way:</p>
    <ul>
        <li>MBR partitions</li>
        <li>The first partition is of type 0x53 (83 in decimal) and contains u-boot.</li>
        <li>The second partition is FAT32 and contains the device tree and kernel uImage.</li>
        <li>The third partition is for the root filesystem.</li>
    </ul>
    <h2>Building u-boot</h2>
    <p>U-Boot for the i.MX233-Olinuxino is packaged as <a href="https://pkgsrc.se/wip/u-boot-imx23-olinuxino">wip/u-boot-imx23-olinuxino</a>
        in pkgsrc-wip. Instructions for how to build it can be found on the <a href="https://www.pkgsrc.org/wip/">pkgsrc-wip
            page</a>.</p>
    <p>This produces u-boot in /usr/pkg/share/u-boot/imx23-olinuxino/u-boot.sb.</p>
    <p>Alternatively, it is possible to directly compile from the u-boot sources:</p>
    <pre><code>gmake mx23_olinuxino_defconfig
CROSS_COMPILE=arm-none-eabi- gmake u-boot.sb
</code></pre>
    <h2>Getting the Kernel</h2>
    <p>The i.MX23 runs the GENERIC_V5 kernel configuration.</p>
    <ul>
        <li>You can download the kernel from <a
                href="https://nycdn.netbsd.org/pub/NetBSD-daily/HEAD/latest/evbarm-earmv5/binary/">https://nycdn.netbsd.org/pub/NetBSD-daily/HEAD/latest/evbarm-earmv5/binary/</a>
            The correct file is <code>GENERIC_V5.ub</code>. This file is the same as <code>netbsd.ub</code> when
            building from source. The device tree
            can be extracted from the DTB set.
        </li>
        <li>You can build the kernel from source:
            <pre><code>./build.sh -u -j8 -U -m evbearmv5-el tools
./build.sh -u -j8 -U -m evbearmv5-el kernel=GENERIC_V5
./build.sh -u -j8 -U -m evbearmv5-el dtb
</code></pre>
            The output <code>netbsd.ub</code> and <code>imx23-olinuxino.dtb</code> will be somewhere in the destdir.
        </li>
    </ul>
    <h2>Preparing the SD card</h2>
    <p>Partition the SD card:</p>
    <ul>
        <li>MBR partitions</li>
        <li>The first partition is of type 0x53 (83 in decimal) and contains u-boot. 32MB is enough</li>
        <li>The second partition is FAT32 and contains the device tree and kernel uImage. 32-128MB is appropriate.</li>
        <li>The third partition is for the root filesystem.</li>
    </ul>
    <p>Initially, I started out be modifying the linux image. This might be an option if you struggle to create a 0x53
        partition.</p>
    <p>To burn u-boot: <code>dd if=u-boot.sb of=/dev/sd_card_part_1 bs=512 seek=4</code>.
        The <code>seek=4</code> is important. Nobody really knows why, but your olinuxino won&#39;t boot without it.</p>
    <p>Create a FAT32 filesystem on the second partition. Copy <code>netbsd.ub</code> and
        <code>imx23-olinuxino.dtb</code> onto it.</p>
    <p>Next, you can set up the root filesystem. Alternatively, you can also use the installer.</p>
    <h2>Using the installer</h2>
    <p>To use the installer, you have to build the kernel from source.</p>
    <p>Add a file <code>sys/arch/evbarm/conf/GENERIC_V5.local</code> with the following contents to the source tree:</p>
    <pre><code>no options MEMORY_DISK_DYNAMIC
options MEMORY_DISK_IS_ROOT
options MEMORY_DISK_RBFLAGS=RB_SINGLE
options MEMORY_DISK_ROOT_SIZE=6144
</code></pre>
    <p>Build the kernel as usual.</p>
    <p>Next, we need a ramdisk containing the installer. You can download the <code>ramdisk.fs</code> from here: <a
            href="https://nycdn.netbsd.org/pub/NetBSD-daily/HEAD/20260208145819Z/evbarm-earmv5/installation/ramdisk/">https://nycdn.netbsd.org/pub/NetBSD-daily/HEAD/20260208145819Z/evbarm-earmv5/installation/ramdisk/</a>
    </p>
    <p>To embedd the ramdisk into the kernel, run:</p>
    <pre><code>$TOOLDIR/arm--netbsdelf-eabi-mdsetimage $BUILDDIR/GENERIC_V5/netbsd ramdisk.fs
$TOOLDIR/arm--netbsdelf-eabi-objcopy -S -O binary $BUILDDIR/GENERIC_V5/netbsd install-netbsd
$TOOLDIR/nbmkubootimage -A arm -T kernel_noload -O linux -C none -e 0 -n &quot;NetBSD/earmv5 11.99.5&quot; install-netbsd install-netbsd.ub
</code></pre>
    <p>Then copy it onto the SD card as usual.</p>
    <p>The following article about ramdisk/installer might be interesting too: <a
            href="https://bentsukun.ch/posts/ramdisk-kernel/">https://bentsukun.ch/posts/ramdisk-kernel/</a></p>
    <h2>Common Issues</h2>
    <p>Sometimes NetBSD crashes early on in the boot process due to an invalid device tree header. This is due to u-boot
        picking an unfortunate memory layout where NetBSD&#39;s BSS section overlaps the device tree. You can avoid it
        using this
        boot.scr script for NetBSD (compiled using <code>mkimage -C none -A arm -T script -d imx23-boot.cmd
            imx23-boot.scr</code>, then copy it to the SD card):</p>
    <pre><code>env set fdt_high 0x41000000;
fatload mmc 0:2 0x41000000 imx23-olinuxino.dtb;
fatload mmc 0:2 0x41800000 uImage;
bootm 0x41800000 - 0x41000000;
</code></pre> ]]></content:encoded>
        <link>https://yurix.ch/blog/imx23-olinuxino.html</link>
    </item>
    </channel>
</rss>