<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href="/atom.xsl?rss=true" type="text/xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://gohugo.io/" version="0.164.0">Hugo</generator><icon>https://blog.icpmol.es/favicon.ico</icon><title type="html">Mole of Moles</title><link href="https://blog.icpmol.es/" rel="alternate" type="text/html" title="html"/><link href="https://blog.icpmol.es/index.xml" rel="alternate" type="application/rss+xml" title="rss"/><link href="https://blog.icpmol.es/index.json" rel="alternate" type="application/json" title="json"/><updated>2026-08-26T13:42:21+02:00</updated><author><name>Iacopo Moles</name><email>iacopo@icpmol.es</email></author><id>https://blog.icpmol.es/</id><entry><title type="html">1784631627</title><link href="https://blog.icpmol.es/bits/1784631627/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/bits/1780923712/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1780674852/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1772036881/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1763163911/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1743332572/?utm_source=atom_feed" rel="related" type="text/html" title=""/><id>https://blog.icpmol.es/bits/1784631627/</id><section>Bit</section><published>2026-07-21T13:00:27+02:00</published><updated>2026-07-21T13:00:27+02:00</updated><content type="html"><![CDATA[<p>For some reason Clion decided to update the <a href="https://www.jetbrains.com/clion/whatsnew/2026-2/#build-tools-and-project-formats">bundled Cmake version</a> in the 2026.2 update.</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">shell</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ /snap/clion/473/bin/clion --version
</span></span><span class="line"><span class="cl">CLion 2026.1.4
</span></span><span class="line"><span class="cl">Build <span class="c1">#CL-261.26222.59</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ /snap/clion/473/bin/cmake/linux/x64/bin/cmake --version
</span></span><span class="line"><span class="cl">cmake version 4.2.2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">CMake suite maintained and supported by Kitware <span class="o">(</span>kitware.com/cmake<span class="o">)</span>.</span></span></code></pre></div>
</details>


<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">shell</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ /snap/clion/479/bin/clion --version
</span></span><span class="line"><span class="cl">CLion 2026.2
</span></span><span class="line"><span class="cl">Build <span class="c1">#CL-262.8665.262</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ /snap/clion/479/bin/cmake/linux/x64/bin/cmake --version
</span></span><span class="line"><span class="cl">cmake version 4.3.1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">CMake suite maintained and supported by Kitware <span class="o">(</span>kitware.com/cmake<span class="o">)</span>.</span></span></code></pre></div>
</details>

<p>Thank you for breaking my builds ig</p>
]]></content><preview>For some reason Clion decided to update the bundled Cmake version in the 2026.2 update.
shell $ /snap/clion/473/bin/clion --version CLion 2026.1.4 Build #CL-261.26222.59 $ /snap/clion/473/bin/cmake/linux/x64/bin/cmake --version cmake version 4.2.2 CMake suite maintained and supported by Kitware (kitware.com/cmake). shell $ /snap/clion/479/bin/clion --version CLion 2026.2 Build #CL-262.8665.262 $ /snap/clion/479/bin/cmake/linux/x64/bin/cmake --version cmake version 4.3.1 CMake suite maintained and supported by Kitware (kitware.com/cmake). Thank you for breaking my builds ig</preview><category scheme="taxonomy:Tags" term="" label=""/></entry><entry><title type="html">1782640235</title><link href="https://blog.icpmol.es/bits/1782640235/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/posts/zephyr_install/?utm_source=atom_feed" rel="related" type="text/html" title="How to install Zephyr RTOS without the non-sense"/><link href="https://blog.icpmol.es/bits/1758006493/?utm_source=atom_feed" rel="related" type="text/html" title=""/><id>https://blog.icpmol.es/bits/1782640235/</id><section>Bit</section><published>2026-06-28T11:50:35+02:00</published><updated>2026-06-28T11:50:35+02:00</updated><content type="html"><![CDATA[<p><a href="https://nheko-reborn.github.io/">Nheko</a> is a multiplatform Matrix client written in QT6. Unfortunately on Ubuntu 24.04 due to a bug changing the default font <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> leads to a crash at startup. This means that the GUI is inaccessible to roll it back.</p>
<p>The solution is to edit the config files directly. For a Flatpack installation:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># access the flatpak shell</span>
</span></span><span class="line"><span class="cl">flatpak run --command<span class="o">=</span>bash im.nheko.Nheko  </span></span></code></pre></div>
</details>


<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
        <span class="codeblock_file_path"><i>(im.nheko.Nheko)</i>
            <b>~
            <span class="terminalIcon">$&gt;</span>
            </b>
        </span>
</summary>

<div class="highlight" path="~" prefix="im.nheko.Nheko"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="nv">$XDG_CONFIG_HOME</span></span></span></code></pre></div>
</details>

<p>The output will be in the form  <code>$HOME/.var/app/im.nheko.Nheko/config</code>, navigate to it and open the <code>nheko/nheko.conf</code> file.</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">ini</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="na">emoji_font_family</span><span class="o">=</span><span class="s">default</span>
</span></span><span class="line"><span class="cl"><span class="na">...</span>
</span></span><span class="line"><span class="cl"><span class="na">font_family</span><span class="o">=</span><span class="s">default</span></span></span></code></pre></div>
</details>

<p>Restore the font family settings to default.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Why would you want to change fonts? Well, it&rsquo;s messaging app and I want to display emojis sometimes.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content><preview>Nheko is a multiplatform Matrix client written in QT6. Unfortunately on Ubuntu 24.04 due to a bug changing the default font 1 leads to a crash at startup. This means that the GUI is inaccessible to roll it back.
The solution is to edit the config files directly. For a Flatpack installation:
bash # access the flatpak shell flatpak run --command=bash im.nheko.Nheko bash (im.nheko.Nheko) ~ $&amp;gt; echo $XDG_CONFIG_HOME The output will be in the form $HOME/.var/app/im.nheko.Nheko/config, navigate to it and open the nheko/nheko.conf file.</preview><category scheme="taxonomy:Tags" term="matrix" label="matrix"/><category scheme="taxonomy:Tags" term="linux" label="linux"/><category scheme="taxonomy:Tags" term="flatpak" label="flatpak"/></entry><entry><title type="html">1780923712</title><link href="https://blog.icpmol.es/bits/1780923712/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/bits/1780674852/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1772036881/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1763163911/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1743332572/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1742917934/?utm_source=atom_feed" rel="related" type="text/html" title=""/><id>https://blog.icpmol.es/bits/1780923712/</id><section>Bit</section><published>2026-06-08T15:01:52+02:00</published><updated>2026-06-08T15:01:52+02:00</updated><content type="html"><![CDATA[<p>Guess who just stumpled upon Ea-nāṣir&rsquo;s descendants on Aliexpress?</p>
<img 
    src="https://blog.icpmol.es/bits/1780923712/image_hu_b305a160a8d09259.jpg"  alt="&ldquo;Aliexpress seller replying: The supplier replied that electroplated copper can be magnetically attracted.&rdquo;"loading="lazy"
    width="414" 
    height="100"
    />
[Is this fraud or a future physic Nobel prize?]]]></content><preview>Guess who just stumpled upon Ea-nāṣir&amp;rsquo;s descendants on Aliexpress?
[Is this fraud or a future physic Nobel prize?]</preview><category scheme="taxonomy:Tags" term="" label=""/></entry><entry><title type="html">1780674852</title><link href="https://blog.icpmol.es/bits/1780674852/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/bits/1772036881/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1763163911/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1743332572/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1742917934/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1730020187/?utm_source=atom_feed" rel="related" type="text/html" title=""/><id>https://blog.icpmol.es/bits/1780674852/</id><section>Bit</section><published>2026-06-05T17:54:12+02:00</published><updated>2026-06-05T17:54:12+02:00</updated><content type="html"><![CDATA[<p>On Ubuntu 24.04 in case you need to convert a <code>.toml</code> into a <code>.json</code> the best way is to install <code>tomljson</code> provided by the <code>golang-github-pelletier-go-toml</code> package instead of the more straightforward <code>toml2json</code>.</p>
<p>The latter is just a python script provided by the reserialize <a href="https://launchpad.net/ubuntu/+source/reserialize">package</a> with lot of bugs.</p>
<p>On later version I suggest <code>rust-toml2json</code> via <code>apt</code>.</p>
]]></content><preview>On Ubuntu 24.04 in case you need to convert a .toml into a .json the best way is to install tomljson provided by the golang-github-pelletier-go-toml package instead of the more straightforward toml2json.
The latter is just a python script provided by the reserialize package with lot of bugs.
On later version I suggest rust-toml2json via apt.</preview><category scheme="taxonomy:Tags" term="" label=""/></entry><entry><title type="html">1779815244</title><link href="https://blog.icpmol.es/bits/1779815244/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/bits/1768558026/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1768212516/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1763420709/?utm_source=atom_feed" rel="related" type="text/html" title=""/><id>https://blog.icpmol.es/bits/1779815244/</id><section>Bit</section><published>2026-05-26T19:07:24+02:00</published><updated>2026-05-26T19:07:24+02:00</updated><content type="html"><![CDATA[<p>Noooooo!</p>
<p>My morally neutral research!</p>
<img 
    src="https://blog.icpmol.es/bits/1779815244/image_hu_b623d635ba3f9964.jpg"  alt="&ldquo;Robot lawnmower and hedgehog looking at each others&rdquo;"loading="lazy"
    width="651" 
    height="342"
    />
[They are both obsessed about rings IYKYK]<p><a href="https://laas.hal.science/hal-03768385v1">Source</a></p>
]]></content><preview>Noooooo!
My morally neutral research!
[They are both obsessed about rings IYKYK]Source</preview><category scheme="taxonomy:Tags" term="thesis" label="Thesis"/></entry><entry><title type="html">How to install Zephyr RTOS without the non-sense</title><link href="https://blog.icpmol.es/posts/zephyr_install/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/bits/1758006493/?utm_source=atom_feed" rel="related" type="text/html" title=""/><id>https://blog.icpmol.es/posts/zephyr_install/</id><section>Post</section><published>2026-04-26T10:59:08+02:00</published><updated>2026-04-26T10:59:08+02:00</updated><content type="html"><![CDATA[<p>At the time of writing storage <a href="https://web.archive.org/web/20260424125649/https://pcpartpicker.com/trends/price/internal-hard-drive/">has become slightly expensive</a>, this is a huge problem when dealing with Zephyr due to its notoriously high storage requirements. The main reason is that it tries to download all the modules for all the supported architectures, while usually you are only interested in developing for a single target architecture.</p>
<p>Unfortunately the official docs don&rsquo;t know which is your target architecture and resolve it by providing a &ldquo;one size fits all&rdquo; solution, with the expected drawbacks in storage.</p>
<p>In this guide I&rsquo;ll demonstrate how to create a <a href="https://docs.zephyrproject.org/4.4.0/develop/west/workspaces.html#t2-star-topology-application-is-the-manifest-repository">T2 topology</a> Zephyr workspace for an RP2040 board on Ubuntu. It can be extended to other boards if necessary.</p>
<h2 id="dependencies"><a class="anchor  mark-html" href="#dependencies">Dependencies</a></h2>
<p><a href="https://docs.zephyrproject.org/4.4.0/develop/getting_started/installation_linux.html#installation-linux">Source</a></p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt update
</span></span><span class="line"><span class="cl">sudo apt upgrade
</span></span><span class="line"><span class="cl">sudo apt-get install --no-install-recommends git cmake ninja-build gperf <span class="se">\
</span></span></span><span class="line"><span class="cl">  ccache dfu-util device-tree-compiler wget <span class="se">\
</span></span></span><span class="line"><span class="cl">  python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file <span class="se">\
</span></span></span><span class="line"><span class="cl">  make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 <span class="se">\
</span></span></span><span class="line"><span class="cl">  libusb-1.0-0-dev   </span></span></code></pre></div>
</details>

<h2 id="install-zephyr-sdk"><a class="anchor  mark-html" href="#install-zephyr-sdk">Install Zephyr SDK</a></h2>
<p><a href="https://docs.zephyrproject.org/4.4.0/develop/toolchains/zephyr_sdk.html">Source</a></p>

  
  
    <blockquote class="alert alert-note">
      <p class="alert-heading">
        ℹ️
        Note
      </p>
      <p>This targets <code>zephyr-sdk-1.0.1</code>, change it according to your needs.</p>
    </blockquote>
  <h3 id="download"><a class="anchor  mark-html" href="#download">Download</a></h3>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> ~
</span></span><span class="line"><span class="cl">wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v1.0.1/zephyr-sdk-1.0.1_linux-x86_64_gnu.tar.xz</span></span></code></pre></div>
</details>

<h3 id="extract"><a class="anchor  mark-html" href="#extract">Extract</a></h3>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">tar xvf zephyr-sdk-1.0.1_linux-x86_64_gnu.tar.xz</span></span></code></pre></div>
</details>

<h3 id="install"><a class="anchor  mark-html" href="#install">Install</a></h3>
<p>Copy the extracted files to the install directory,</p>

  
  
    <blockquote class="alert alert-note">
      <p class="alert-heading">
        ℹ️
        Note
      </p>
      <p>This targets <code>/usr/local</code></p>
<p>Change it depending on your needs to one of the suggested <a href="https://docs.zephyrproject.org/4.4.0/develop/toolchains/zephyr_sdk.html#:~:text=It%20is%20recommended%20to%20extract%20the%20Zephyr%20SDK%20bundle%20at%20one%20of%20the%20following%20locations">locations</a>.</p>
    </blockquote>
  
<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo mv zephyr-sdk-1.0.1 /usr/local</span></span></code></pre></div>
</details>

<p>Register the package</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /usr/local/zephyr-sdk-1.0.1
</span></span><span class="line"><span class="cl">sudo ./setup.sh</span></span></code></pre></div>
</details>

<p>Follow the instructions.</p>
<h2 id="create-the-workspace"><a class="anchor  mark-html" href="#create-the-workspace">Create the workspace</a></h2>

  
  
    <blockquote class="alert alert-note">
      <p class="alert-heading">
        ℹ️
        Note
      </p>
      <p>I will assume the workspace is in <code>$HOME/projects/zephyr-ws</code>, change it according to your preferences.</p>
    </blockquote>
  <p>Navigate your working directory to the workspace</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> <span class="nv">$HOME</span>/projects/zephyr-ws</span></span></code></pre></div>
</details>

<p>Initialize and activate the virtual environment</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
        <span class="codeblock_file_path">
            <b>zephyr_ws
            <span class="terminalIcon">$&gt;</span>
            </b>
        </span>
</summary>

<div class="highlight" path="zephyr_ws"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python3 -m venv .venv</span></span></code></pre></div>
</details>

<h3 id="instantiate-the-virtual-environment"><a class="anchor  mark-html" href="#instantiate-the-virtual-environment">Instantiate the virtual environment**</a></h3>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
        <span class="codeblock_file_path">
            <b>zephyr_ws
            <span class="terminalIcon">$&gt;</span>
            </b>
        </span>
</summary>

<div class="highlight" path="zephyr_ws"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">source</span> .venv/bin/activate</span></span></code></pre></div>
</details>


  
  
    <blockquote class="alert alert-important">
      <p class="alert-heading">
        !
        Important
      </p>
      <p>Repeat this operation every time you open a new shell. To make sure everything is configured correctly check the <code>(.venv)</code> symbol at the start of your shell.</p>
    </blockquote>
  <h3 id="install-west"><a class="anchor  mark-html" href="#install-west">Install west</a></h3>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
        <span class="codeblock_file_path"><i>(.venv)</i>
            <b>zephyr_ws
            <span class="terminalIcon">$&gt;</span>
            </b>
        </span>
</summary>

<div class="highlight" path="zephyr_ws" prefix=".venv"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pip install west</span></span></code></pre></div>
</details>

<h2 id="create-manifest"><a class="anchor  mark-html" href="#create-manifest">Create manifest</a></h2>
<p>Create a folder for your manifest</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
        <span class="codeblock_file_path">
            <b>zephyr_ws
            <span class="terminalIcon">$&gt;</span>
            </b>
        </span>
</summary>

<div class="highlight" path="zephyr_ws"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir manifest-repo</span></span></code></pre></div>
</details>

<p>Inside the <code>manifest-repo</code> folder create a <code>west.yml</code> with the following content:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">yaml</span>
        <span class="codeblock_file_path">
            <b>manifest-repo/west.yml
            <span class=""></span>
            </b>
        </span>
</summary>

<div class="highlight" path="manifest-repo/west.yml"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">manifest</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">remotes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">zephyrproject</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">url-base</span><span class="p">:</span><span class="w"> </span><span class="l">https://github.com/zephyrproject-rtos</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">projects</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">zephyr</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">repo-path</span><span class="p">:</span><span class="w"> </span><span class="l">zephyr</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">remote</span><span class="p">:</span><span class="w"> </span><span class="l">zephyrproject</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">revision</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;v4.4-branch&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">clone-depth</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">import</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">path-prefix</span><span class="p">:</span><span class="w"> </span><span class="l">external</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">name-allowlist</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="l">cmsis_6</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="l">picolibc</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="l">hal_rpi_pico</span></span></span></code></pre></div>
</details>

<p>You can select different modules depending on your board, check the official <a href="https://docs.zephyrproject.org/latest/develop/manifest/index.html">modules list</a> (or <a href="https://github.com/search?q=topic%3Amodule+org%3Azephyrproject-rtos&amp;type=Repositories&amp;p=1">alternativelly</a>).</p>
<p>In general try to have at least the HAL for your board.</p>

  
  
    <blockquote class="alert alert-note">
      <p class="alert-heading">
        ℹ️
        Note
      </p>
      <p>This example targets Zephyr 4.4, change it depending on your needs</p>
    </blockquote>
  <h2 id="initialize-the-workspace"><a class="anchor  mark-html" href="#initialize-the-workspace">Initialize the workspace</a></h2>
<p>Back in the workspace folder:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
        <span class="codeblock_file_path"><i>(.venv)</i>
            <b>zephyr_ws
            <span class="terminalIcon">$&gt;</span>
            </b>
        </span>
</summary>

<div class="highlight" path="zephyr_ws" prefix=".venv"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">west init</span></span></code></pre></div>
</details>

<p>This will create a <code>.west</code> folder, inside edit the <code>config</code> file to:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">ini</span>
        <span class="codeblock_file_path">
            <b>zephyr_ws/.west/config
            <span class=""></span>
            </b>
        </span>
</summary>

<div class="highlight" path="zephyr_ws/.west/config"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="k">[manifest]</span>
</span></span><span class="line"><span class="cl"><span class="na">path</span> <span class="o">=</span> <span class="s">manifest-repo</span>
</span></span><span class="line"><span class="cl"><span class="na">file</span> <span class="o">=</span> <span class="s">west.yml</span></span></span></code></pre></div>
</details>

<p>This will pull all the dependencies of your project</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
        <span class="codeblock_file_path"><i>(.venv)</i>
            <b>zephyr_ws
            <span class="terminalIcon">$&gt;</span>
            </b>
        </span>
</summary>

<div class="highlight" path="zephyr_ws" prefix=".venv"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">west update
</span></span><span class="line"><span class="cl">west packages pip --install</span></span></code></pre></div>
</details>

<h2 id="first-project"><a class="anchor  mark-html" href="#first-project">First project</a></h2>
<p>You can now test the installation by compiling an example project:</p>
<p>Copy the blinky example from <code>zephyr_ws/external/samples/basic/blinky</code></p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
        <span class="codeblock_file_path"><i>(.venv)</i>
            <b>zephyr_ws
            <span class="terminalIcon">$&gt;</span>
            </b>
        </span>
</summary>

<div class="highlight" path="zephyr_ws" prefix=".venv" minimized="false"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cp zephyr_ws/external/samples/basic/blinky .
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> blinky</span></span></code></pre></div>
</details>

<p>Compile for your board</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
        <span class="codeblock_file_path"><i>(.venv)</i>
            <b>zephyr_ws/blinky
            <span class="terminalIcon">$&gt;</span>
            </b>
        </span>
</summary>

<div class="highlight" path="zephyr_ws/blinky" prefix=".venv" minimized="false"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">west build -b<span class="o">=</span>rpi_pico</span></span></code></pre></div>
</details>

<p>If it compiles successfully then you&rsquo;re done.</p>
<p>To start a new project just create a new folder in <code>zephyr_ws/</code> with the necessary file structure.</p>]]></content><preview>At the time of writing storage has become slightly expensive, this is a huge problem when dealing with Zephyr due to its notoriously high storage requirements. The main reason is that it tries to download all the modules for all the supported architectures, while usually you are only interested in developing for a single target architecture.
Unfortunately the official docs don&amp;rsquo;t know which is your target architecture and resolve it by providing a &amp;ldquo;one size fits all&amp;rdquo; solution, with the expected drawbacks in storage.</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="zephyr" label="zephyr"/><category scheme="taxonomy:Tags" term="ubuntu" label="ubuntu"/><category scheme="taxonomy:Tags" term="linux" label="linux"/><category scheme="taxonomy:Tags" term="embedded" label="Embedded"/><category scheme="taxonomy:Tags" term="rp2040" label="rp2040"/></entry><entry><title type="html">Precautions for USB-C soldering irons</title><link href="https://blog.icpmol.es/posts/smps_grounding/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/bits/1751197436/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1749845315/?utm_source=atom_feed" rel="related" type="text/html" title=""/><id>https://blog.icpmol.es/posts/smps_grounding/</id><section>Post</section><published>2026-04-11T17:25:33+02:00</published><updated>2026-04-11T17:25:33+02:00</updated><content type="html"><![CDATA[<p>A few weeks back I was looking for an USB-C soldering iron to replace my previous one. While documenting the pros/cons I stumbled upon some interesting knowledge: Switching Mode Power Supplies are awful.</p>
<p>You may experience it when using a laptop with a metal chassis: if you use it long enough and then you touch some metal objects connected to ground you&rsquo;ll get zapped by the static electricity.</p>
<p>For soldering irons this means that your soldering tip will have a voltage differential of around 90V to ground. The current will be really small because the secondary/DC circuit is protected by a small capacitor, so it&rsquo;s technically safe for humans. You can&rsquo;t say the same to fragile electronic components, which will sometime fail due to the ESD. One simple precaution is to use a power bank when soldering delicate components.</p>
<p>There is another solution:</p>
<h2 id="the-doohickey"><a class="anchor  mark-html" href="#the-doohickey">The doohickey</a></h2>
<img 
    src="https://blog.icpmol.es/posts/smps_grounding/t90_hu_1e0f31a8d6567b58.jpg"  alt="Photo of a plug with live and neutral prongs cut off, and with earth connected to the ground pin of an USB-C female/female adapter"loading="lazy"
    width="1654" 
    height="2339"
    />
[Straight from the Alientek T90 user manual]<p>(Remember to use the name of the manufacturer if you don&rsquo;t wanna end up reading about soviet tanks)<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>This is an option ig, with people really going through this route <sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup><sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>. Other suggestions are the Apple USB-C chargers with a 3 pin plugs.</p>
<h2 id="causes"><a class="anchor  mark-html" href="#causes">Causes</a></h2>
<p>For more information on why this happens Wikipedia has a nice <a href="https://web.archive.org/web/20120315203753/http://www.sitmlucknow.com/publication/Jha%5B2%5D.pdf">reference</a>.</p>
<h2 id="demonstration"><a class="anchor  mark-html" href="#demonstration">Demonstration</a></h2>
<p>Video demonstrations, found thanks to <a href="https://www.reddit.com/r/PINE64official/comments/10ls0gf/comment/j5zaw47/">this reddit comment</a>.</p>



<figure class="lite-youtube-container">
    
    <lite-youtube videoid="Bptw0Jf81IQ" style="background-image: url('/hqdefault_546493070683008070_hu_f2a14e297a07aecf.webp');">
    <a href="https://youtube.com/watch?v=Bptw0Jf81IQ" class="lty-playbtn u-repost-of" title="Play Video">
      <span class="lyt-visually-hidden">Youtube video</span>
    </a>
    </lite-youtube>
    
<figcaption class="small u-repost-of" > <a href="https://youtube.com/watch?v=Bptw0Jf81IQ" >Youtube Video</a></figcaption>
</figure>



<figure class="lite-youtube-container">
    
    <lite-youtube videoid="fT-XY2kDcdQ" style="background-image: url('/hqdefault_6916428021126698503_hu_705c2e9ce590d928.webp');">
    <a href="https://youtube.com/watch?v=fT-XY2kDcdQ" class="lty-playbtn u-repost-of" title="Play Video">
      <span class="lyt-visually-hidden">Youtube video</span>
    </a>
    </lite-youtube>
    
<figcaption class="small u-repost-of" > <a href="https://youtube.com/watch?v=fT-XY2kDcdQ" >Youtube Video</a></figcaption>
</figure>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><code>latest</code> @ <a href="https://en.alientek.com/Product_Details/68.html">https://en.alientek.com/Product_Details/68.html</a>
<br> <code>v1.0</code> @ <a href="https://doc.switch-science.com/media/files/25ac61e3-2d2f-4f24-a20f-8f8a2710cdb8.pdf">https://doc.switch-science.com/media/files/25ac61e3-2d2f-4f24-a20f-8f8a2710cdb8.pdf</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><a href="https://community.element14.com/technologies/test-and-measurement/b/blog/posts/easy-grounding-for-usb-soldering-irons">https://community.element14.com/technologies/test-and-measurement/b/blog/posts/easy-grounding-for-usb-soldering-irons</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p><a href="https://www.alexwhittemore.com/ts100-grounding-system/">https://www.alexwhittemore.com/ts100-grounding-system/</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>]]></content><preview>A few weeks back I was looking for an USB-C soldering iron to replace my previous one. While documenting the pros/cons I stumbled upon some interesting knowledge: Switching Mode Power Supplies are awful.</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="electronics" label="electronics"/><category scheme="taxonomy:Tags" term="soldering" label="soldering"/><category scheme="taxonomy:Tags" term="esd" label="ESD"/><category scheme="taxonomy:Tags" term="emi" label="EMI"/></entry><entry><title type="html">1772036881</title><link href="https://blog.icpmol.es/bits/1772036881/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/bits/1763163911/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1743332572/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1742917934/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1730020187/?utm_source=atom_feed" rel="related" type="text/html" title=""/><id>https://blog.icpmol.es/bits/1772036881/</id><section>Bit</section><published>2026-02-25T17:28:01+01:00</published><updated>2026-02-25T17:28:01+01:00</updated><content type="html"><![CDATA[<p>Interesting experience with a DMCA notification from Google:</p>
<p>A few years ago I mentioned staticman <em>dot</em> net in a blog post.</p>
<p>Some time ago the domain expired and it was squatted by someone (allegedly) illegally streaming NBA matches.</p>
<p>The NBA decided to send a takedown notice to everyone linking to that domain.</p>
<p><a href="https://github.com/eduardoboucas/staticman/issues/475">Other people complaining</a></p>
]]></content><preview>Interesting experience with a DMCA notification from Google:
A few years ago I mentioned staticman dot net in a blog post.
Some time ago the domain expired and it was squatted by someone (allegedly) illegally streaming NBA matches.
The NBA decided to send a takedown notice to everyone linking to that domain.
Other people complaining</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="" label=""/></entry><entry><title type="html">Deploying artifacts from Github Actions using SCP</title><link href="https://blog.icpmol.es/posts/github_actions_sftp/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/bits/1735136159/?utm_source=atom_feed" rel="related" type="text/html" title=""/><id>https://blog.icpmol.es/posts/github_actions_sftp/</id><section>Post</section><published>2026-01-31T16:23:34+01:00</published><updated>2026-01-31T16:23:34+01:00</updated><content type="html"><![CDATA[<p>Problem:</p>
<p>You need to push some artifacts from a Github Actions runner into a folder in a server where you only have SSH enabled.</p>
<h2 id="create-a-new-user"><a class="anchor  mark-html" href="#create-a-new-user">Create a new user</a></h2>
<p>This is a basic safety measure. It limits the directories the SSH/SCP connection can access.</p>
<p>In this case we will create a user called <code>dummy</code></p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo adduser dummy
</span></span><span class="line"><span class="cl"><span class="c1"># follow the commands       </span></span></span></code></pre></div>
</details>

<p>Do not add it to the sudo group.</p>
<p>Test the new user account:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">su dummy
</span></span><span class="line"><span class="cl"><span class="c1"># try the new password</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span>   </span></span></code></pre></div>
</details>

<h2 id="generate-an-ssh-keypair"><a class="anchor  mark-html" href="#generate-an-ssh-keypair">Generate an SSH keypair</a></h2>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh-keygen
</span></span><span class="line"><span class="cl"><span class="c1"># change the defaults if necessary but keep it without a keyphrase</span></span></span></code></pre></div>
</details>

<p>You&rsquo;ll end up with two new files in <code>~/.ssh</code>:</p>
<ul>
<li>
<p><code>id_{algorithm}</code>: <em>private key</em></p>
</li>
<li>
<p><code>id_{algorithm}.pub</code>: <em>public key</em></p>
</li>
</ul>
<p>For now add the public key to the authorized_keys file</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat id_<span class="o">{</span>algorithm<span class="o">}</span>.pub &gt;&gt; authorized_keys</span></span></code></pre></div>
</details>

<h2 id="github-actions"><a class="anchor  mark-html" href="#github-actions">Github actions</a></h2>
<p>You can now add them to your repository secrets.</p>
<ol>
<li>
<p>Horizontal navigation bar: &ldquo;Settings&rdquo;</p>
</li>
<li>
<p>Left Navigation bar: &ldquo;Security&rdquo; -&gt; &ldquo;Secrete and variables&rdquo;  -&gt; &ldquo;Actions&rdquo;</p>
</li>
<li>
<p>&ldquo;Secrets&rdquo; -&gt; &ldquo;Repository secrets&rdquo; -&gt; &ldquo;New Repository Secret&rdquo;</p>
</li>
<li>
<p>Fill:</p>
<ul>
<li>Name: <code>SSH_PRIVATE_KEY</code></li>
<li>Secret: The content of <code>id_{algorithm}</code> obtained from before.

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> ~/.ssh
</span></span><span class="line"><span class="cl">cat id_<span class="o">{</span>algorithm<span class="o">}</span></span></span></code></pre></div>
</details>

</li>
</ul>
</li>
<li>
<p>&ldquo;Add Secret&rdquo;</p>
</li>
</ol>
<p>In your YAML recipe:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">yaml</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl">- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">load priv key</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">    mkdir $HOME/.ssh/
</span></span></span><span class="line"><span class="cl"><span class="sd">    touch $HOME/.ssh/known_hosts 
</span></span></span><span class="line"><span class="cl"><span class="sd">    ssh-keyscan -H &#34;{ip_address_of_your_server}&#34; &gt; $HOME/.ssh/known_hosts 
</span></span></span><span class="line"><span class="cl"><span class="sd">    echo &#34;${{ secrets.SSH_PRIVATE_KEY }}&#34; &gt; $HOME/.ssh/id_{algorithm} 
</span></span></span><span class="line"><span class="cl"><span class="sd">    chmod 400 $HOME/.ssh/id_{algorithm}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl">- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">do work</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">rm -rf /</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  
</span></span></span><span class="line"><span class="cl">- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">upload to vps</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">scp -i $HOME/.ssh/id_{algorithm} -r {artifact} dummy@${ ip_address_of_your_server }:{destination_path}</span></span></span></code></pre></div>
</details>

<p>Remenber to change <code>id_{algorithm}</code> and <code>{ip_address_of_your_server}</code></p>]]></content><preview>Problem:
You need to push some artifacts from a Github Actions runner into a folder in a server where you only have SSH enabled.</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="gitub-actions" label="Gitub Actions"/><category scheme="taxonomy:Tags" term="ssh" label="SSH"/><category scheme="taxonomy:Tags" term="sftp" label="SFTP"/></entry><entry><title type="html">1768558026</title><link href="https://blog.icpmol.es/bits/1768558026/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/bits/1768212516/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1763420709/?utm_source=atom_feed" rel="related" type="text/html" title=""/><id>https://blog.icpmol.es/bits/1768558026/</id><section>Bit</section><published>2026-01-16T11:07:06+01:00</published><updated>2026-01-16T11:07:06+01:00</updated><content type="html"><![CDATA[<p>It&rsquo;s supported by <a href="https://www.dgtal.org/">DGtal</a>. It&rsquo;s literally on <a href="https://www.cgal.org/">CGAL</a>. It&rsquo;s on <a href="https://gdal.org/">GDAL</a> with ads. You can probably find it on <a href="https://www.mdal.xyz/">MDAL</a>. Dude it&rsquo;s on <a href="https://dggal.org/">DGGAL</a>. It&rsquo;s on <a href="https://reading-escience-centre.gitbooks.io/edal-user-guide/content/">EDAL</a>. You can watch it on <a href="https://pdal.org">PDAL</a>. You can go to PDAL and watch it. Log onto PDAL right now.</p>
]]></content><preview>It&amp;rsquo;s supported by DGtal. It&amp;rsquo;s literally on CGAL. It&amp;rsquo;s on GDAL with ads. You can probably find it on MDAL. Dude it&amp;rsquo;s on DGGAL. It&amp;rsquo;s on EDAL. You can watch it on PDAL. You can go to PDAL and watch it. Log onto PDAL right now.</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="thesis" label="Thesis"/></entry><entry><title type="html">1768212516</title><link href="https://blog.icpmol.es/bits/1768212516/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/bits/1763420709/?utm_source=atom_feed" rel="related" type="text/html" title=""/><id>https://blog.icpmol.es/bits/1768212516/</id><section>Bit</section><published>2026-01-12T11:08:36+01:00</published><updated>2026-01-12T11:08:36+01:00</updated><content type="html"><![CDATA[
<blockquote class="regular-quote"cite="https://en.wikipedia.org/wiki/Anna_Karenina_principle">
    <p>All convex sets are alike; each non-convex set is NP-Hard in its own way.</p>

    
    <p class="blockquote-caption">
    Leo Tolstoy
    </p>

</blockquote>

]]></content><preview>All convex sets are alike; each non-convex set is NP-Hard in its own way.
Leo Tolstoy</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="thesis" label="Thesis"/></entry><entry><title type="html">1763484591</title><link href="https://blog.icpmol.es/bits/1763484591/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/bits/1763163911/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1762006720/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/posts/qgis_fields2cover/?utm_source=atom_feed" rel="related" type="text/html" title="QGIS + Fields2Cover"/><id>https://blog.icpmol.es/bits/1763484591/</id><section>Bit</section><published>2025-11-18T17:49:51+01:00</published><updated>2025-11-18T17:49:51+01:00</updated><content type="html">&lt;p>What the thesis turned out to be&lt;/p>
&lt;img 
    src="https://blog.icpmol.es/bits/1763484591/Afghanistan_Dynamic_Planning_hu_4bee058b1b9a829.jpg"  alt="Infamous Afghanistan powerpoint presentation"loading="lazy"
    width="1920" 
    height="1440"
    />
[Am I just overreacting? Maybe]</content><preview>What the thesis turned out to be
[Am I just overreacting? Maybe]</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="thesis" label="thesis"/></entry><entry><title type="html">1763420709</title><link href="https://blog.icpmol.es/bits/1763420709/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/bits/1763420709/</id><section>Bit</section><published>2025-11-18T00:05:09+01:00</published><updated>2025-11-18T00:05:09+01:00</updated><content type="html"><![CDATA[<p>Insane lore drop</p>
<img 
    src="https://blog.icpmol.es/bits/1763420709/image_hu_f938a04458cd373e.jpg"  alt="Description of lawnmower blades interference with the AHRS"loading="lazy"
    width="842" 
    height="387"
    />
[I would&#39;ve snapped if it happened during the final stages of the project]<p><a href="http://wjwwood.io/projects.html#:~:text=Lawnmower%20(2009%2D2012)-,2012%20Paper,-2012%20Presenation">Source</a></p>
]]></content><preview>Insane lore drop
[I would&amp;#39;ve snapped if it happened during the final stages of the project]Source</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="thesis" label="Thesis"/></entry><entry><title type="html">1763163911</title><link href="https://blog.icpmol.es/bits/1763163911/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/bits/1762006720/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/posts/qgis_fields2cover/?utm_source=atom_feed" rel="related" type="text/html" title="QGIS + Fields2Cover"/><link href="https://blog.icpmol.es/bits/1743332572/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1742917934/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1730020187/?utm_source=atom_feed" rel="related" type="text/html" title=""/><id>https://blog.icpmol.es/bits/1763163911/</id><section>Bit</section><published>2025-11-15T00:44:00+01:00</published><updated>2025-11-15T00:44:00+01:00</updated><content type="html"><![CDATA[<p>What the thesis felt like so far.</p>



<figure class="lite-youtube-container">
    
    <lite-youtube videoid="5W4NFcamRhM" style="background-image: url('/hqdefault_17745549377108396762_hu_4ac74901d6cb8704.webp');">
    <a href="https://youtube.com/watch?v=5W4NFcamRhM" class="lty-playbtn u-repost-of" title="Play Video">
      <span class="lyt-visually-hidden">Youtube video</span>
    </a>
    </lite-youtube>
    
<figcaption class="small u-repost-of" > <a href="https://youtube.com/watch?v=5W4NFcamRhM" >Youtube Video</a></figcaption>
</figure>
]]></content><preview>What the thesis felt like so far.
Youtube video Youtube Video</preview><category scheme="taxonomy:Tags" term="thesis" label="thesis"/><category scheme="taxonomy:Tags" term="" label=""/></entry><entry><title type="html">1762006720</title><link href="https://blog.icpmol.es/bits/1762006720/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/posts/qgis_fields2cover/?utm_source=atom_feed" rel="related" type="text/html" title="QGIS + Fields2Cover"/><id>https://blog.icpmol.es/bits/1762006720/</id><section>Bit</section><published>2025-11-01T15:18:40+01:00</published><updated>2025-11-01T15:18:40+01:00</updated><content type="html">&lt;p>JUST ONE MORE ABSTRACTION LAYER BRO JUST ONE MORE ABSTRACTION LAYER BRO JUST ONE MORE  ABSTRACTION LAYER BRO JUST ONE MORE ABSTRACTION LAYER BRO I SWEAR BRO JUST ONE MORE, I SWEAR&lt;/p>
</content><preview>JUST ONE MORE ABSTRACTION LAYER BRO JUST ONE MORE ABSTRACTION LAYER BRO JUST ONE MORE ABSTRACTION LAYER BRO JUST ONE MORE ABSTRACTION LAYER BRO I SWEAR BRO JUST ONE MORE, I SWEAR</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="docker" label="docker"/><category scheme="taxonomy:Tags" term="thesis" label="thesis"/></entry><entry><title type="html">QGIS + Fields2Cover</title><link href="https://blog.icpmol.es/posts/qgis_fields2cover/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/posts/qgis_fields2cover/</id><section>Post</section><published>2025-10-03T20:06:04+02:00</published><updated>2025-10-03T20:06:04+02:00</updated><content type="html"><![CDATA[<p>Tutorial on how to export polygons in QGIS into geojson for later use in Fields2Cover</p>
<h2 id="create-a-polygon-layer"><a class="anchor  mark-html" href="#create-a-polygon-layer">Create a polygon layer</a></h2>
<p>Open QGIS.</p>
<img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/create_database_hu_9e3eeaa25e490450.jpg"  alt="Create the database"loading="lazy"
    width="644" 
    height="568"
    />
[]<p>In the left side bar, right-click &ldquo;SpatiaLite&rdquo; and select &ldquo;Create Database&hellip;&rdquo;</p>
<p>You will be asked to save the database in a <code>.sqlite</code> file somewhere on your disk.
In my case I called it <code>tutorial.sqlite</code>.</p>
<img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/new_table_hu_196a682b25d9e593.jpg"  alt="Create a new table"loading="lazy"
    width="490" 
    height="438"
    />
[]<p>Right-click on the generated database and select &ldquo;New Table&hellip;&rdquo;</p>
<p>Create the following schema:
<img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/fields_hu_a1f7f234a8969c1.jpg"  alt="Custom schema"loading="lazy"
    width="1165" 
    height="601"
    />
[]</p>
<p>Save with &ldquo;OK&rdquo;</p>
<p>Double click on the newly created table to add it to your layers.</p>
<p>Add other layers below (eg: OpenStreetMap, orthophoto providers, etc&hellip;).</p>
<p>In the top menu, go to &ldquo;View&rdquo; -&gt; &ldquo;Toolbars&rdquo; and enable &ldquo;Advanced Digitizing Toolbar&rdquo;</p>
<img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/toolbar_hu_6b1b7a17579804ca.jpg"  alt="How to enable ring toolbar"loading="lazy"
    width="1920" 
    height="1080"
    />
[]<p>It should look like:</p>
<img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/overview_map_hu_97c517ea758f0cda.jpg"  alt="Overview of the interface with map"loading="lazy"
    width="1860" 
    height="1048"
    />
[]<h2 id="how-to-draw"><a class="anchor  mark-html" href="#how-to-draw">How to draw</a></h2>
<p>In the layer panel, select the project layer created previously and then press on the pencil icon in the toolbar</p>
<img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/edit_zoom_hu_81dede4281e9a1fd.jpg"  alt="Edit mode"loading="lazy"
    width="450" 
    height="332"
    />
[]<p>Now you can add your outer perimeter by pressing the &ldquo;Add Polygon Feature&rdquo; icon.</p>
<img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/image_hu_3b8977ecaece2a4b.jpg"  alt="How to add polygons"loading="lazy"
    width="508" 
    height="162"
    />
[]<p>The polygon will obscure everything underneath making it hard to see the obstacles. We can fix this by changing the opacity of the layer.</p>
<p>Right click on the layer and select &ldquo;Properties&rdquo;</p>
<img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/transparency_menu_hu_e794c0dbdf00dacd.jpg"  alt="Fix opacity"loading="lazy"
    width="1920" 
    height="1080"
    />
[]<p>In the new window, use the navigation panel to select &ldquo;Symbology&rdquo;.</p>
<p>Open the &ldquo;Later Rendering&rdquo; menu at the bottom and change the opacity. Save with &ldquo;OK&rdquo;.</p>
<img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/transparency_hu_39f491ad8ee0a084.jpg"  alt="Opacity Settings"loading="lazy"
    width="827" 
    height="956"
    />
[]<p>In the toolbars, press the &ldquo;Select Feature&rdquo; and click on your previosly created area. It will change color, usually into yellow.</p>
<img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/select_area_hu_fbeb5f2dd2fa5ff.jpg"  alt="How to select polygons"loading="lazy"
    width="238" 
    height="150"
    />
[]<p>Now we can add the obstacles: select the &ldquo;Add Ring&rdquo; from the toolbar and trace the shape of the obstacles.</p>
<img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/add_ring_hu_e861123bfe672737.jpg"  alt="How to select obstacles"loading="lazy"
    width="706" 
    height="143"
    />
[]<p>After being done with it: exit the edit mode by pressing the pencil icon again and save your obect database by pressing the Floppy Disk icon  💾.</p>
<img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/save_in_db_hu_12bd5c5abb5a6755.jpg"  alt="Save icon"loading="lazy"
    width="1860" 
    height="1048"
    />
[]<p>To export your file:</p>
<p>Right click on the object layer and go to &ldquo;Export&rdquo; -&gt; &ldquo;Save Feature As&rdquo;</p>
<img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/export_menu_hu_ab8c4c0c62e1c932.jpg"  alt="Menu navigation for export"loading="lazy"
    width="1920" 
    height="1080"
    />
[]<p>In the new window:</p>
<ul>
<li>Select GeoJson as the format</li>
<li>Pick a destination for the exported file</li>
<li>De-select the optional integer field</li>
<li>De-select &ldquo;Persist Layer Metadata&rdquo;</li>
</ul>
<img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/export_settings_hu_caa696ae06139b1b.jpg"  alt="Export settings"loading="lazy"
    width="593" 
    height="671"
    />
[]<p>Now that you have a &ldquo;.json&rdquo; file you can import in F2C with</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">c&#43;&#43;</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">F2CFields</span> <span class="n">fields</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">f2c</span><span class="o">::</span><span class="n">Parser</span><span class="o">::</span><span class="n">importJson</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="n">DATA_PATH</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#34;tutorial.geojson&#34;</span><span class="p">,</span> <span class="n">fields</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> 
</span></span></code></pre></div>
</details>

<p><a href="https://github.com/icpmoles/Fields2Cover/blob/main/experiments/poli.cpp">Full example</a></p>
<p>Final result:</p>
<p><img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/poli_utm_hu_4a94d2203a601c26.jpg"  alt="UTM Coordinates"loading="lazy"
    width="560" 
    height="420"
    />
[] <img 
    src="https://blog.icpmol.es/posts/qgis_fields2cover/poli_hu_feb647bb42425c8a.jpg"  alt="EPSG:6708"loading="lazy"
    width="560" 
    height="420"
    />
[]</p>]]></content><preview>Tutorial on how to export polygons in QGIS into geojson for later use in Fields2Cover</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="qgis" label="qgis"/><category scheme="taxonomy:Tags" term="fields2cover" label="fields2cover"/><category scheme="taxonomy:Tags" term="thesis" label="thesis"/></entry><entry><title type="html">1758097406</title><link href="https://blog.icpmol.es/bits/1758097406/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/bits/1758097406/</id><section>Bit</section><published>2025-09-17T10:23:26+02:00</published><updated>2025-09-17T10:23:26+02:00</updated><content type="html"><![CDATA[<p>The most impressive Julia + Dear Imgui I&rsquo;ve ever seen</p>
<p><a href="https://github.com/e271828e/Flight.jl">https://github.com/e271828e/Flight.jl</a></p>
]]></content><preview>The most impressive Julia + Dear Imgui I&amp;rsquo;ve ever seen
https://github.com/e271828e/Flight.jl</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="julia" label="Julia"/></entry><entry><title type="html">1758006493</title><link href="https://blog.icpmol.es/bits/1758006493/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/bits/1758006493/</id><section>Bit</section><published>2025-09-16T09:08:13+02:00</published><updated>2025-09-16T09:08:13+02:00</updated><content type="html"><![CDATA[<p>I&rsquo;m using mpv on Linux and the screen keeps turning off.</p>
<p>There are probably some fixes around ( <code>--stop-screensaver</code> maybe?) but it&rsquo;s funny how XKCD 196 keeps haunting Linux</p>
<p><img 
    src="https://blog.icpmol.es/bits/1758006493/image_hu_12624682f9291d4b.jpg"  alt="Screenshoot from the mpv documentation"loading="lazy"
    width="1170" 
    height="351"
    />
[STATUS: WONTFIX, Minor inconvenience]
<a href="https://github.com/mpv-player/mpv/wiki/FAQ#help-mpv-doesnt-disable-the-screensaver-during-playback">Source</a></p>
]]></content><preview>I&amp;rsquo;m using mpv on Linux and the screen keeps turning off.
There are probably some fixes around ( --stop-screensaver maybe?) but it&amp;rsquo;s funny how XKCD 196 keeps haunting Linux
[STATUS: WONTFIX, Minor inconvenience] Source</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="mpv" label="mpv"/><category scheme="taxonomy:Tags" term="linux" label="linux"/></entry><entry><title type="html">1751197436</title><link href="https://blog.icpmol.es/bits/1751197436/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/bits/1749845315/?utm_source=atom_feed" rel="related" type="text/html" title=""/><id>https://blog.icpmol.es/bits/1751197436/</id><section>Bit</section><published>2025-06-29T11:43:56+00:00</published><updated>2025-06-29T11:43:56+00:00</updated><content type="html"><![CDATA[<p>In case anyone from Italy stumbles upon some old oscilloscopes branded as <em>TELAV</em><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>:</p>
<p>They are all rebranded Hung Chang oscilloscopes, especially the &ldquo;TELAV 09635&rdquo; (a rebranded &ldquo;Hung Chang OS-635&rdquo;) and the &ldquo;TELAY 09620&rdquo; and &ldquo;AWS MODEL 620C&rdquo;<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> (both rebrands of the &ldquo;Hung Chang OS-620&rdquo;).</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>TECNICHE ELETTRONICHE AVANZATE S.a.S., sometimes misread as <em>TELAY</em> due to the horrible graphic design of their logo&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>A.W. Sperry Instruments, Inc.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content><preview>In case anyone from Italy stumbles upon some old oscilloscopes branded as TELAV1:
They are all rebranded Hung Chang oscilloscopes, especially the &amp;ldquo;TELAV 09635&amp;rdquo; (a rebranded &amp;ldquo;Hung Chang OS-635&amp;rdquo;) and the &amp;ldquo;TELAY 09620&amp;rdquo; and &amp;ldquo;AWS MODEL 620C&amp;rdquo;2 (both rebrands of the &amp;ldquo;Hung Chang OS-620&amp;rdquo;).
TECNICHE ELETTRONICHE AVANZATE S.a.S., sometimes misread as TELAY due to the horrible graphic design of their logo&amp;#160;&amp;#x21a9;&amp;#xfe0e;
A.W. Sperry Instruments, Inc.&amp;#160;&amp;#x21a9;&amp;#xfe0e;</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="electronics" label="electronics"/></entry><entry><title type="html">1749845315</title><link href="https://blog.icpmol.es/bits/1749845315/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/bits/1749845315/</id><section>Bit</section><published>2025-06-13T22:08:35+02:00</published><updated>2025-06-13T22:08:35+02:00</updated><content type="html"><![CDATA[<p>It turns out that the PWM signal on PC fans doesn&rsquo;t require much current. Max 5mA according to the Intel specifications.</p>
<img 
    src="https://blog.icpmol.es/bits/1749845315/image_hu_3fd14008d9e1289f.jpg"  alt="2.1.4 PWM Control Input Signal from the Intel specification"loading="lazy"
    width="667" 
    height="280"
    />
[]<p><a href="https://www.intel.com/content/dam/support/us/en/documents/intel-nuc/intel-4wire-pwm-fans-specs.pdf">Source</a></p>
<p>The trick is to place a driver inside the fan capable of obtaining the necessary voltage/current.</p>
<img 
    src="https://blog.icpmol.es/bits/1749845315/image-1_hu_7276cf5a2d089727.jpg"  alt="Schematics for the driver circuit inside the fan"loading="lazy"
    width="338" 
    height="309"
    />
[]<p><a href="https://www.mouser.com/pdfDocs/San_Ace_EPWMControlFunction.pdf">Source</a></p>
<p>This exonerates the MoBo engineers from accounting for high current requirements when designing the PWM controller and avoids wasting energy driving up and down a potentially high current through the connectors and cables.</p>
]]></content><preview>It turns out that the PWM signal on PC fans doesn&amp;rsquo;t require much current. Max 5mA according to the Intel specifications.
[]Source
The trick is to place a driver inside the fan capable of obtaining the necessary voltage/current.
[]Source
This exonerates the MoBo engineers from accounting for high current requirements when designing the PWM controller and avoids wasting energy driving up and down a potentially high current through the connectors and cables.</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="atx" label="ATX"/><category scheme="taxonomy:Tags" term="electronics" label="electronics"/></entry><entry><title type="html">1743332572</title><link href="https://blog.icpmol.es/bits/1743332572/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/bits/1742917934/?utm_source=atom_feed" rel="related" type="text/html" title=""/><link href="https://blog.icpmol.es/bits/1730020187/?utm_source=atom_feed" rel="related" type="text/html" title=""/><id>https://blog.icpmol.es/bits/1743332572/</id><section>Bit</section><published>2025-03-30T13:02:52+02:00</published><updated>2025-03-30T13:02:52+02:00</updated><content type="html"><![CDATA[<p>Fun little games/challenges about control:</p>
<p><a href="https://janismac.github.io/ControlChallenges/">https://janismac.github.io/ControlChallenges/</a></p>
]]></content><preview>Fun little games/challenges about control:
https://janismac.github.io/ControlChallenges/</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="" label=""/></entry><entry><title type="html">1742917934</title><link href="https://blog.icpmol.es/bits/1742917934/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/bits/1730020187/?utm_source=atom_feed" rel="related" type="text/html" title=""/><id>https://blog.icpmol.es/bits/1742917934/</id><section>Bit</section><published>2025-03-25T16:52:14+01:00</published><updated>2025-03-25T16:52:14+01:00</updated><content type="html"><![CDATA[<p>From &ldquo;Control of Machines with Friction - Brian Armstrong&rdquo;</p>
<details>
<summary>Click for more</summary>

<blockquote class="regular-quote">
    <p>Friction is universally present in the motion of bodies in contact. The modern science of tribology seeks to explain the atomic details of friction; but the universality of friction may also be understood from a different perspective. Leonardo da Vinci, among his many investigations, studied the relationship between friction and the music of the heavens. He knew the music to be produced by the bumping and rubbing of the heavenly spheres and was concerned with the possibility of friction between these heavenly bodies:</p>

<blockquote class="regular-quote">
    <p>&ldquo;Had however this friction really existed, in the many centuries that these heavens have revolved they would have been consumed by their own immense speed of every day &hellip; we arrive therefore at the conclusion that the friction would have rubbed away the boundaries of each heaven, and in proportion as its movement is swifter towards the centre than toward the poles it would be more consumed in the centre than at the poles, and then there would not be friction any more, and the sound would cease, and the dancers would stop &hellip;&rdquo;
Leonardo da Vinci (1452-1519), The Notebooks, F 56 V</p>

    
</blockquote>

<p>The music of the heavens being eternal, Leonardo understood that friction is absent from the state of grace. Thus confined to this mortal world, friction is a consequence of original sin.</p>

    
</blockquote>

</details>]]></content><preview>From &amp;ldquo;Control of Machines with Friction - Brian Armstrong&amp;rdquo;
Click for more Friction is universally present in the motion of bodies in contact. The modern science of tribology seeks to explain the atomic details of friction; but the universality of friction may also be understood from a different perspective. Leonardo da Vinci, among his many investigations, studied the relationship between friction and the music of the heavens. He knew the music to be produced by the bumping and rubbing of the heavenly spheres and was concerned with the possibility of friction between these heavenly bodies:</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="" label=""/></entry><entry><title type="html">1740300152</title><link href="https://blog.icpmol.es/bits/1740300152/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/bits/1740300152/</id><section>Bit</section><published>2025-02-23T09:42:32+01:00</published><updated>2025-02-23T09:42:32+01:00</updated><content type="html"><![CDATA[<p>Quanser Interactive Labs v1.0.0.5 for MATLAB 2019b:</p>
<p><a href="https://quanserinc.box.com/shared/static/lhf0gilgy1zu5hedkokb9mi025gzcu19.zip">https://quanserinc.box.com/shared/static/lhf0gilgy1zu5hedkokb9mi025gzcu19.zip</a></p>
<p><a href="https://github.com/quanser/Mathworks_QLabs/blob/913b8e3859acf6393f46a1f314c7895258dc72be/QLabs.m#L15">Source</a></p>
]]></content><preview>Quanser Interactive Labs v1.0.0.5 for MATLAB 2019b:
https://quanserinc.box.com/shared/static/lhf0gilgy1zu5hedkokb9mi025gzcu19.zip
Source</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="quanser" label="quanser"/><category scheme="taxonomy:Tags" term="matlab" label="matlab"/></entry><entry><title type="html">1735136159</title><link href="https://blog.icpmol.es/bits/1735136159/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/posts/chrome-doh/?utm_source=atom_feed" rel="related" type="text/html" title="Enable DoH when Chrome is managed"/><id>https://blog.icpmol.es/bits/1735136159/</id><section>Bit</section><published>2024-12-25T15:15:59+01:00</published><updated>2024-12-25T15:15:59+01:00</updated><content type="html"><![CDATA[<p>How to add your private keys to the native Windows SSH client:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">powershell</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="c"># By default the ssh-agent service is disabled. Configure it to start automatically.</span>
</span></span><span class="line"><span class="cl"><span class="c"># Make sure you&#39;re running as an Administrator.</span>
</span></span><span class="line"><span class="cl"><span class="nb">Get-Service</span> <span class="nb">ssh-agent</span> <span class="p">|</span> <span class="nb">Set-Service</span> <span class="n">-StartupType</span> <span class="n">Automatic</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Start the service</span>
</span></span><span class="line"><span class="cl"><span class="nb">Start-Service</span> <span class="nb">ssh-agent</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># This should return a status of Running</span>
</span></span><span class="line"><span class="cl"><span class="nb">Get-Service</span> <span class="nb">ssh-agent</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Now load your key files into ssh-agent</span>
</span></span><span class="line"><span class="cl"><span class="nb">ssh-add</span> <span class="nv">$env:USERPROFILE</span><span class="p">\.</span><span class="n">ssh</span><span class="p">\</span><span class="n">id_ecdsa</span></span></span></code></pre></div>
</details>

<p><a href="https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement">Source</a></p>
]]></content><preview>How to add your private keys to the native Windows SSH client:
powershell # By default the ssh-agent service is disabled. Configure it to start automatically. # Make sure you&amp;#39;re running as an Administrator. Get-Service ssh-agent | Set-Service -StartupType Automatic # Start the service Start-Service ssh-agent # This should return a status of Running Get-Service ssh-agent # Now load your key files into ssh-agent ssh-add $env:USERPROFILE\.ssh\id_ecdsa Source</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="ssh" label="SSH"/><category scheme="taxonomy:Tags" term="windows" label="windows"/></entry><entry><title type="html">1731333010</title><link href="https://blog.icpmol.es/bits/1731333010/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/bits/1731333010/</id><section>Bit</section><published>2024-11-11T14:50:10+01:00</published><updated>2024-11-11T14:50:10+01:00</updated><content type="html"><![CDATA[<p>Enabling OverlayFS for Raspbian</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">shell</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo raspi-config nonint enable_overlayfs</span></span></code></pre></div>
</details>

<p>reboot</p>
<p>To disable it:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">shell</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo raspi-config nonint disable_overlayfs</span></span></code></pre></div>
</details>

<p>reboot</p>
]]></content><preview>Enabling OverlayFS for Raspbian
shell sudo raspi-config nonint enable_overlayfs reboot
To disable it:
shell sudo raspi-config nonint disable_overlayfs reboot</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="raspbian" label="raspbian"/></entry><entry><title type="html">1730020701</title><link href="https://blog.icpmol.es/bits/1730020701/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/bits/1730020701/</id><section>Bit</section><published>2024-10-27T10:18:21+01:00</published><updated>2024-10-27T10:18:21+01:00</updated><content type="html"><![CDATA[<p>How to use LibreOffice to convert in PDF all the <code>.doc</code> files in a folder</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir pdfout
</span></span><span class="line"><span class="cl">soffice --headless --convert-to pdf --outdir ./pdfout *.doc</span></span></code></pre></div>
</details>

<p>It also works with <code>.docx</code>, <code>.ppt</code>, <code>.pptx</code> etc</p>
]]></content><preview>How to use LibreOffice to convert in PDF all the .doc files in a folder
bash mkdir pdfout soffice --headless --convert-to pdf --outdir ./pdfout *.doc It also works with .docx, .ppt, .pptx etc</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="libreoffice" label="LibreOffice"/></entry><entry><title type="html">1730020187</title><link href="https://blog.icpmol.es/bits/1730020187/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/bits/1730020187/</id><section>Bit</section><published>2024-10-27T10:09:47+01:00</published><updated>2024-10-27T10:09:47+01:00</updated><content type="html"><![CDATA[
<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Hello World&#34;</span></span></span></code></pre></div>
</details>

]]></content><preview>bash echo &amp;#34;Hello World&amp;#34;</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="" label=""/></entry><entry><title type="html">Quadratic Form of a Skew Symmetric Matrix</title><link href="https://blog.icpmol.es/posts/quadratic-skew-symmetric/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/posts/quadratic-skew-symmetric/</id><section>Post</section><published>2024-10-26T21:41:21+02:00</published><updated>2024-10-26T21:41:21+02:00</updated><content type="html"><![CDATA[<p>While reading some control theory books or papers you may stumble onto expressions like the following:</p>

<blockquote class="regular-quote">
    <p>
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20S%20"/>
</span>
 is a skew-symmetric matrix  (i.e.  
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20S%20%3d%20-S%5eT%20"/>
</span>
 ) so we have 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20X%5eT%20S%20X%20%3d%200%20%5cspace%20%5cspace%20%5cforall%20X%20"/>
</span>
</p>

    
</blockquote>

<p>With no demonstrations whatsoever.</p>
<p><img 
    src="https://blog.icpmol.es/posts/quadratic-skew-symmetric/image-1_hu_f284eec7ef6b9d02.jpg"  alt="From the book: &ldquo;Robotics: Modelling, Planning and Control&rdquo;, Bruno Siciliano"loading="lazy"
    width="1760" 
    height="267"
    />
[]
<img 
    src="https://blog.icpmol.es/posts/quadratic-skew-symmetric/image-2_hu_fd2c7cd621f39c87.jpg"  alt="From the book: &ldquo;Nonlinear Control&rdquo;, Hassan K. Khalil "loading="lazy"
    width="737" 
    height="226"
    />
[]</p>
<p>Let&rsquo;s demonstrate it once and for all.</p>
<h2 id="proof"><a class="anchor  mark-html" href="#proof">Proof</a></h2>

  <img src="https://latex.codecogs.com/png.latex?%20X%5eT%20S%20X%20%3d%20n%20"/>
<p>With 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20n%20"/>
</span>
 a scalar. Being a scalar we have: 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20n%20%3d%20n%5eT."/>
</span>
</p>

  <img src="https://latex.codecogs.com/png.latex?%20n%20%3d%20n%5eT%20%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20X%5eT%20S%20X%20%3d%20%28%20X%5eT%20S%20X%29%5eT%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20X%5eT%20S%20X%20%3d%20%20X%5eT%20S%5eT%20%28X%5eT%20%29%5eT%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20X%5eT%20S%20X%20%3d%20X%5eT%20S%5eT%20X%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20X%5eT%20S%20X%20%3d%20-%20X%5eT%20S%20X%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20n%20%3d%20-%20n%20%5ciff%20n%20%3d%200%20"/>
<h2 id="2d-check"><a class="anchor  mark-html" href="#2d-check">2D Check</a></h2>

  <img src="https://latex.codecogs.com/png.latex?%20%20S%20%3d%0a%5cbegin%7bbmatrix%7d%0a%200%20%26%20s%20%5c%5c%0a-s%20%26%200%20%0a%5cend%7bbmatrix%7d%2c%20%20X%20%3d%20%5cbegin%7bbmatrix%7d%20x%20%5c%5c%20y%20%5cend%7bbmatrix%7d%0a"/>

  <img src="https://latex.codecogs.com/png.latex?%20X%5eT%20S%20X%20%3d%20%5cbegin%7bbmatrix%7d%20x%20%26%20y%20%5cend%7bbmatrix%7d%20%5cbegin%7bbmatrix%7d%200%20%26%20s%20%5c%5c%20-s%20%26%200%20%5cend%7bbmatrix%7d%20%5cbegin%7bbmatrix%7d%20x%20%5c%5c%20y%20%5cend%7bbmatrix%7d%20%3d%20%20%5cbegin%7bbmatrix%7d%20x%20%26%20y%20%5cend%7bbmatrix%7d%20%5cbegin%7bbmatrix%7d%20sy%20%5c%5c%20-sx%20%5cend%7bbmatrix%7d%20%3d%20sxy%20-sxy%20%3d%200%0a"/>]]></content><preview>While reading some control theory books or papers you may stumble onto expressions like the following:
is a skew-symmetric matrix (i.e. ) so we have With no demonstrations whatsoever.</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="control-theory" label="Control Theory"/><category scheme="taxonomy:Tags" term="linear-algebra" label="Linear Algebra"/></entry><entry><title type="html">Automating your Now page with Hugo</title><link href="https://blog.icpmol.es/posts/now-page/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/posts/hosting-comparison-2024/?utm_source=atom_feed" rel="related" type="text/html" title="Hugo rendering 2024: Github Pages vs Netlify vs Cloudflare Pages vs Render vs Vercel"/><link href="https://blog.icpmol.es/posts/hosting-comparisons/?utm_source=atom_feed" rel="related" type="text/html" title="Hugo rendering: Github Pages vs Netlify vs Cloudflare Pages"/><id>https://blog.icpmol.es/posts/now-page/</id><section>Post</section><published>2024-08-25T00:19:46+04:00</published><updated>2024-08-25T00:19:46+04:00</updated><content type="html"><![CDATA[<p>A week ago on <a href="https://news.ycombinator.com/item?id=41264716">Hacker News</a> someone shared their setup for an automated <code>/now</code> page. Their idea was nice but I felt like they didn&rsquo;t take full advantage of Hugo. This is how I reimplemented some of that functionality in an alternative way.</p>
<p>Fun fact: Hugo supports downloading JSON, CSV, XML, Images and is also capable of processing them at render time.</p>
<h2 id="movies"><a class="anchor  mark-html" href="#movies">Movies</a></h2>
<p>Like the original blog I also used letterboxd becuase it&rsquo;s free. (Usually I use Trakt + Showly but it requires a subscription). We create a simple shortcode and then call it from the markdown.</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">markdown</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">{{&lt; letterboxd &gt;}}</span></span></code></pre></div>
</details>


<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">go-html-template</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">$data</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">dict</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="s">&#34;https://letterboxd.com/yourusername/rss/&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="nx">resources</span><span class="na">.GetRemote</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="na">.Err</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="nx">errorf</span><span class="w"> </span><span class="s">&#34;%s&#34;</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="cp">{{</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="nx">$data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">transform</span><span class="na">.Unmarshal</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="cp">{{</span><span class="w"> </span><span class="nx">errorf</span><span class="w"> </span><span class="s">&#34;Unable to get remote resource %q&#34;</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="nx">$data</span><span class="na">.channel.item</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">ul</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;consumed-list&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">first</span><span class="w"> </span><span class="nx">3</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="nx">$title</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="na">.filmTitle</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="nx">$year</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="na">.filmYear</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="nx">$posterUrl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">index</span><span class="w"> </span><span class="o">(</span><span class="nx">findRE</span><span class="w"> </span><span class="s">`(https://.+\.jpg)`</span><span class="w"> </span><span class="na">.description</span><span class="w"> </span><span class="o">)</span><span class="w"> </span><span class="nx">0</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;consumed-element&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://www.themoviedb.org/movie/</span><span class="cp">{{</span><span class="w"> </span><span class="na">.movieId</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="nx">$thumbnail</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">resources</span><span class="na">.GetRemote</span><span class="w"> </span><span class="nx">$posterUrl</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="na">.Err</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">            <span class="cp">{{</span><span class="w"> </span><span class="nx">warnf</span><span class="w"> </span><span class="s">&#34;%s&#34;</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;$posterUrl&#34;</span> 
</span></span><span class="line"><span class="cl">            <span class="na">width</span><span class="o">=</span><span class="s">&#34;100&#34;</span> 
</span></span><span class="line"><span class="cl">            <span class="na">loading</span><span class="o">=</span><span class="s">&#34;lazy&#34;</span> 
</span></span><span class="line"><span class="cl">            <span class="na">alt</span><span class="o">=</span><span class="s">&#34;Poster of </span><span class="cp">{{</span><span class="w"> </span><span class="nx">$title</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="cp">}}</span> 
</span></span><span class="line"><span class="cl">            <span class="cp">{{</span><span class="w"> </span><span class="nx">$filter</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">images</span><span class="na">.Process</span><span class="w"> </span><span class="s">&#34;resize 100x q90 webp&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">            <span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">images</span><span class="na">.Filter</span><span class="w"> </span><span class="nx">$filter</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.RelPermalink</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> 
</span></span><span class="line"><span class="cl">            <span class="na">width</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Width</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> 
</span></span><span class="line"><span class="cl">            <span class="na">height</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Height</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> 
</span></span><span class="line"><span class="cl">            <span class="na">alt</span><span class="o">=</span><span class="s">&#34;Poster Image of </span><span class="cp">{{</span><span class="w"> </span><span class="nx">$title</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> 
</span></span><span class="line"><span class="cl">            <span class="na">loading</span><span class="o">=</span><span class="s">&#34;lazy&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="k">end</span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="k">end</span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://www.themoviedb.org/movie/</span><span class="cp">{{</span><span class="w"> </span><span class="na">.movieId</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> <span class="p">&gt;</span><span class="cp">{{</span><span class="w"> </span><span class="nx">$title</span><span class="w"> </span><span class="cp">}}</span><span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> (<span class="cp">{{</span><span class="nx">$year</span><span class="cp">}}</span>)<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">{{/*  &lt;pre&gt;{{ debug.Dump $data }}&lt;/pre&gt;  */}}</span></span></span></code></pre></div>
</details>

<p>This will automatically download and parse the RSS, download the posters from TMDB and optimize them.</p>
<h2 id="books"><a class="anchor  mark-html" href="#books">Books</a></h2>
<p>This time instead I used <a href="https://openlibrary.org/">OpenLibrary</a> because it has a slightly more complete collection.</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">markdown</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">{{&lt; openlibrary &#34;currently-reading&#34; &gt;}}
</span></span><span class="line"><span class="cl">{{&lt; openlibrary &#34;already-read&#34; &gt;}}</span></span></code></pre></div>
</details>


<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">go-html-template</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">$type</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="k">index</span><span class="w"> </span><span class="na">.Params</span><span class="w"> </span><span class="nx">0</span><span class="o">)</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="cm">{{/*  types: already-read currently-reading want-to-read https://openlibrary.org/dev/docs/api/mybooks  */}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">$data</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">dict</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">printf</span><span class="w"> </span><span class="s">&#34;https://openlibrary.org/people/mekBot/books/%s.json&#34;</span><span class="w">  </span><span class="nx">$type</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="nx">resources</span><span class="na">.GetRemote</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="na">.Err</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="nx">errorf</span><span class="w"> </span><span class="s">&#34;%s&#34;</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="cp">{{</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="nx">$data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">transform</span><span class="na">.Unmarshal</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="cp">{{</span><span class="w"> </span><span class="nx">errorf</span><span class="w"> </span><span class="s">&#34;Unable to get remote resource %q&#34;</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">{{/*  {{ $data.reading_log_entries }}  */}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="nx">$data</span><span class="na">.reading_log_entries</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">ul</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;consumed-list&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">first</span><span class="w"> </span><span class="nx">3</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">      <span class="cp">{{</span><span class="w"> </span><span class="nx">$date</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">index</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="s">&#34;logged_date&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">      <span class="cp">{{</span><span class="w"> </span><span class="nx">$title</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">index</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="s">&#34;work&#34;</span><span class="w"> </span><span class="s">&#34;title&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">      <span class="cp">{{</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">index</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="s">&#34;work&#34;</span><span class="w"> </span><span class="s">&#34;key&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">      <span class="cp">{{</span><span class="w"> </span><span class="nx">$year</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">index</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="s">&#34;work&#34;</span><span class="w"> </span><span class="s">&#34;first_publish_year&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">      <span class="cp">{{</span><span class="w"> </span><span class="nx">$cover</span><span class="w"> </span><span class="o">:=</span><span class="w">  </span><span class="k">index</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="s">&#34;work&#34;</span><span class="w"> </span><span class="s">&#34;cover_id&#34;</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">string</span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">      <span class="cp">{{</span><span class="w"> </span><span class="nx">$thumbnailUrl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">printf</span><span class="w"> </span><span class="s">&#34;https://covers.openlibrary.org/b/id/%s-L.jpg&#34;</span><span class="w"> </span><span class="nx">$cover</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">      <span class="cp">{{</span><span class="w"> </span><span class="nx">$authors</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">index</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="s">&#34;work&#34;</span><span class="w"> </span><span class="s">&#34;author_names&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;consumed-element&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://openlibrary.org</span><span class="cp">{{</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="nx">$thumbnail</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">resources</span><span class="na">.GetRemote</span><span class="w"> </span><span class="nx">$thumbnailUrl</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="na">.Err</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">            <span class="cp">{{</span><span class="w"> </span><span class="nx">warnf</span><span class="w"> </span><span class="s">&#34;%s&#34;</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">img</span> 
</span></span><span class="line"><span class="cl">            <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://covers.openlibrary.org/b/id/</span><span class="cp">{{</span><span class="w"> </span><span class="nx">string</span><span class="w">  </span><span class="nx">$cover</span><span class="w"> </span><span class="cp">}}</span><span class="s">-S.jpg&#34;</span> 
</span></span><span class="line"><span class="cl">            <span class="na">width</span><span class="o">=</span><span class="s">&#34;100&#34;</span> 
</span></span><span class="line"><span class="cl">            <span class="na">loading</span><span class="o">=</span><span class="s">&#34;lazy&#34;</span> 
</span></span><span class="line"><span class="cl">            <span class="na">alt</span><span class="o">=</span><span class="s">&#34;Cover Image of </span><span class="cp">{{</span><span class="nx">$title</span><span class="cp">}}</span><span class="s">&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="cp">}}</span> 
</span></span><span class="line"><span class="cl">            <span class="cp">{{</span><span class="w"> </span><span class="nx">$filter</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">images</span><span class="na">.Process</span><span class="w"> </span><span class="s">&#34;resize 100x q90 webp&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">            <span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">images</span><span class="na">.Filter</span><span class="w"> </span><span class="nx">$filter</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">                <span class="p">&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.RelPermalink</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> 
</span></span><span class="line"><span class="cl">                <span class="na">width</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Width</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> 
</span></span><span class="line"><span class="cl">                <span class="na">height</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Height</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> 
</span></span><span class="line"><span class="cl">                <span class="na">alt</span><span class="o">=</span><span class="s">&#34;Cover Image of </span><span class="cp">{{</span><span class="nx">$title</span><span class="cp">}}</span><span class="s">&#34;</span> 
</span></span><span class="line"><span class="cl">                <span class="na">loading</span><span class="o">=</span><span class="s">&#34;lazy&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="k">end</span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="k">end</span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://openlibrary.org</span><span class="cp">{{</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span><span class="p">&gt;</span><span class="cp">{{</span><span class="w"> </span><span class="nx">$title</span><span class="w"> </span><span class="cp">}}</span><span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> (<span class="cp">{{</span><span class="nx">$year</span><span class="cp">}}</span>)
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>written by <span class="p">&lt;</span><span class="nt">em</span><span class="p">&gt;</span><span class="cp">{{</span><span class="w"> </span><span class="nx">delimit</span><span class="w"> </span><span class="nx">$authors</span><span class="w"> </span><span class="s">&#34;, &#34;</span><span class="w"> </span><span class="s">&#34; and &#34;</span><span class="cp">}}</span><span class="p">&lt;/</span><span class="nt">em</span><span class="p">&gt;&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> 
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span></span></span></code></pre></div>
</details>

<p>Like before, it downloads the file, parses the JSON, looks up the cover and embeddeds it into the page.</p>
<p>It has some quirks like: the JSON orders the entries based the logged date when it was added in your &ldquo;general&rdquo; collection and not when it was moved in a specific collection, so when you change a book from &ldquo;reading&rdquo; to &ldquo;finished reading&rdquo; it won&rsquo;t be in the first entry.</p>
<h2 id="games"><a class="anchor  mark-html" href="#games">Games</a></h2>
<p>I don&rsquo;t play that many games tbh so I didn&rsquo;t bother.</p>
<h2 id="tv-shows"><a class="anchor  mark-html" href="#tv-shows">TV Shows</a></h2>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">markdown</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">{{&lt; serializd &#34;yourusername&#34; &gt;}}</span></span></code></pre></div>
</details>


<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">go-html-template</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">$username</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="k">index</span><span class="w"> </span><span class="na">.Params</span><span class="w"> </span><span class="nx">0</span><span class="o">)</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">$refurl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">printf</span><span class="w"> </span><span class="s">&#34;https://www.serializd.com/user/%s/currently_watching&#34;</span><span class="w">  </span><span class="nx">$username</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">$requrl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">printf</span><span class="w"> </span><span class="s">&#34;https://www.serializd.com/api/user/%s/currently_watching_page/1?sort_by=date_added_desc&#34;</span><span class="w">  </span><span class="nx">$username</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">$data</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">dict</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">$opts</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">dict</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="s">&#34;method&#34;</span><span class="w"> </span><span class="s">&#34;GET&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="s">&#34;body&#34;</span><span class="w"> </span><span class="s">`{&#34;complete&#34;: true}`</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="s">&#34;headers&#34;</span><span class="w"> </span><span class="o">(</span><span class="nx">dict</span><span class="w">  
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="s">&#34;Accept&#34;</span><span class="w"> </span><span class="s">&#34;application/json, text/plain, */*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="s">&#34;Accept-Encoding&#34;</span><span class="w"> </span><span class="s">&#34;deflate, br, zstd&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="s">&#34;Accept-Language&#34;</span><span class="w"> </span><span class="s">&#34;en-US,en;q=0.9&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="s">&#34;Dnt&#34;</span><span class="w"> </span><span class="s">&#34;1&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="s">&#34;Referer&#34;</span><span class="w"> </span><span class="nx">$refurl</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="s">&#34;Sec-Ch-Ua&#34;</span><span class="w"> </span><span class="s">`&#34;Chromium&#34;;v=&#34;123&#34;, &#34;Not:A-Brand&#34;;v=&#34;8&#34;`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="s">&#34;Sec-Ch-Ua-Mobile&#34;</span><span class="w"> </span><span class="s">&#34;?1&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="s">&#34;Sec-Ch-Ua-Platform&#34;</span><span class="w"> </span><span class="s">`&#34;Android&#34;`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="s">&#34;Sec-Fetch-Dest&#34;</span><span class="w"> </span><span class="s">&#34;empty&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="s">&#34;Sec-Fetch-Mode&#34;</span><span class="w"> </span><span class="s">&#34;cors&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="s">&#34;Sec-Fetch-Site&#34;</span><span class="w"> </span><span class="s">&#34;same-origin&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="s">&#34;user-agent&#34;</span><span class="w"> </span><span class="s">&#34;Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="s">&#34;x-requested-with&#34;</span><span class="w"> </span><span class="s">&#34;serializd_vercel&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">)</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="nx">resources</span><span class="na">.GetRemote</span><span class="w"> </span><span class="nx">$requrl</span><span class="w"> </span><span class="nx">$opts</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="na">.Err</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="cp">{{</span><span class="nx">debug</span><span class="na">.Dump</span><span class="w"> </span><span class="nx">$opts</span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="cp">{{</span><span class="nx">debug</span><span class="na">.Dump</span><span class="w"> </span><span class="na">.</span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="nx">warnf</span><span class="w"> </span><span class="s">&#34;line 23 error: %s&#34;</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>(Error occured while retrieving the data)<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="cp">{{</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="nx">$data</span><span class="w"> </span><span class="o">=</span><span class="w">  </span><span class="na">.Content</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">transform</span><span class="na">.Unmarshal</span><span class="w"> </span><span class="cp">}}</span> 
</span></span><span class="line"><span class="cl">  <span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="cp">{{</span><span class="w"> </span><span class="nx">errorf</span><span class="w"> </span><span class="s">&#34; Line 28 Unable to get remote resource %q&#34;</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="nx">$data</span><span class="na">.items</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">ul</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;consumed-list&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">first</span><span class="w"> </span><span class="nx">3</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="nx">$title</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">index</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="s">&#34;showName&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="nx">$showid</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">index</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="s">&#34;showId&#34;</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">string</span><span class="w">  </span><span class="cp">}}</span> 
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="nx">$filename</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">index</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="s">&#34;bannerImage&#34;</span><span class="w">  </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="nx">$posterUrl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">printf</span><span class="w"> </span><span class="s">&#34;https://serializd-tmdb-images.b-cdn.net/t/p/w400%s&#34;</span><span class="w"> </span><span class="nx">$filename</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;consumed-element&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://www.serializd.com/show/</span><span class="cp">{{</span><span class="w"> </span><span class="nx">$showid</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> <span class="p">&gt;</span> 
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="nx">$thumbnail</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">resources</span><span class="na">.GetRemote</span><span class="w"> </span><span class="nx">$posterUrl</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="na">.Err</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">            <span class="cp">{{</span><span class="w"> </span><span class="nx">warnf</span><span class="w"> </span><span class="s">&#34;%s&#34;</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;$posterUrl&#34;</span> <span class="na">width</span><span class="o">=</span><span class="s">&#34;100&#34;</span> <span class="na">loading</span><span class="o">=</span><span class="s">&#34;lazy&#34;</span> <span class="na">alt</span><span class="o">=</span><span class="s">&#34;Poster of </span><span class="cp">{{</span><span class="w"> </span><span class="nx">$title</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="cp">}}</span> 
</span></span><span class="line"><span class="cl">            <span class="cp">{{</span><span class="w"> </span><span class="nx">$filter</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">images</span><span class="na">.Process</span><span class="w"> </span><span class="s">&#34;resize 100x q90 webp&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">            <span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">images</span><span class="na">.Filter</span><span class="w"> </span><span class="nx">$filter</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">                <span class="p">&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.RelPermalink</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> <span class="na">width</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Width</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> <span class="na">height</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Height</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> <span class="na">alt</span><span class="o">=</span><span class="s">&#34;Poster Image of </span><span class="cp">{{</span><span class="w"> </span><span class="nx">$title</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> <span class="na">loading</span><span class="o">=</span><span class="s">&#34;lazy&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="k">end</span><span class="cp">}}</span>  
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="k">end</span><span class="cp">}}</span> 
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://www.serializd.com/show/</span><span class="cp">{{</span><span class="w"> </span><span class="nx">$showid</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> <span class="p">&gt;</span><span class="cp">{{</span><span class="w"> </span><span class="nx">$title</span><span class="w"> </span><span class="cp">}}</span><span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span></span></span></code></pre></div>
</details>

<h2 id="final-result"><a class="anchor  mark-html" href="#final-result">Final result</a></h2>
<p>My now page is visible <a href="https://icpmol.es/now">here</a>.</p>]]></content><preview>A week ago on Hacker News someone shared their setup for an automated /now page. Their idea was nice but I felt like they didn&amp;rsquo;t take full advantage of Hugo. This is how I reimplemented some of that functionality in an alternative way.</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="hugo" label="hugo"/></entry><entry><title type="html">Hugo rendering 2024: Github Pages vs Netlify vs Cloudflare Pages vs Render vs Vercel</title><link href="https://blog.icpmol.es/posts/hosting-comparison-2024/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://blog.icpmol.es/posts/hosting-comparisons/?utm_source=atom_feed" rel="related" type="text/html" title="Hugo rendering: Github Pages vs Netlify vs Cloudflare Pages"/><id>https://blog.icpmol.es/posts/hosting-comparison-2024/</id><section>Post</section><published>2024-06-13T20:07:30+00:00</published><updated>2024-06-13T20:07:30+00:00</updated><content type="html"><![CDATA[<p>Given the various choices of hosting for your static files you may be unsure which one to pick.
These are the features and performances of the top four services with their free tier.</p>
<p>The list includes:</p>
<ul>
<li>Github Pages</li>
<li>Render.com</li>
<li>Cloudflare Pages</li>
<li>Vercel</li>
<li>Netlify</li>
</ul>
<table>
	<thead>
			<tr>
					<th>Features</th>
					<th>Github Pages</th>
					<th>Cloudflare Pages</th>
					<th>Netflify</th>
					<th>Vercel</th>
					<th>Render</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Multiple subomains<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></td>
					<td>❌</td>
					<td>✅</td>
					<td>✅</td>
					<td>✅</td>
					<td>✅</td>
			</tr>
			<tr>
					<td>Custom subdomains</td>
					<td>[github username].github.io</td>
					<td>[github repo name].pages.dev</td>
					<td>*.netlify.app</td>
					<td>*.vercel.app</td>
					<td>*.onrender.com</td>
			</tr>
			<tr>
					<td>Private Git Submodules</td>
					<td>✅</td>
					<td>❌ <sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></td>
					<td>✅</td>
					<td>❌ <sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></td>
					<td>✅</td>
			</tr>
			<tr>
					<td>SSLabs score</td>
					<td>A</td>
					<td>A</td>
					<td>A+</td>
					<td>A+</td>
					<td>A+</td>
			</tr>
			<tr>
					<td>Byte Serving for video</td>
					<td>✅</td>
					<td>❌ <sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup></td>
					<td>✅</td>
					<td>✅</td>
					<td>✅</td>
			</tr>
			<tr>
					<td>Monthly Bandwith</td>
					<td>100GB</td>
					<td>n/a</td>
					<td>100GB</td>
					<td>100GB</td>
					<td>100GB</td>
			</tr>
			<tr>
					<td>Builds limits</td>
					<td>10 builds per hour</td>
					<td>500 times per month</td>
					<td>300 minutes per month</td>
					<td>100h per month ?</td>
					<td>500 minutes per month</td>
			</tr>
			<tr>
					<td>Maximum file size</td>
					<td>100 MB</td>
					<td>25 MB</td>
					<td>n/a</td>
					<td>n/a</td>
					<td>n/a</td>
			</tr>
			<tr>
					<td>Storage Size</td>
					<td>5 GB</td>
					<td>n/a</td>
					<td>100 GB</td>
					<td>n/a</td>
					<td>n/a</td>
			</tr>
			<tr>
					<td>Build Previews</td>
					<td>❌</td>
					<td>✅</td>
					<td>✅</td>
					<td>✅</td>
					<td>✅</td>
			</tr>
			<tr>
					<td>Download times: 418 Kb of HTML <sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup></td>
					<td>119 ms</td>
					<td>188 ms</td>
					<td>192 ms</td>
					<td>244 ms</td>
					<td>190 ms</td>
			</tr>
	</tbody>
</table>
<!-- | Test Build: Hugo | 1597 ms | 1320 ms | 1852 ms | |
| Test Build: Total | 33s | 58s | 40s | | -->



<figure>



<picture >
    <source media="(prefers-color-scheme: light)" srcset=/posts/hosting-comparison-2024/plot.min.svg />
    <source media="(prefers-color-scheme: dark)" srcset=/posts/hosting-comparison-2024/plot_d.min.svg >
    <img src= /posts/hosting-comparison-2024/plot_d.min.svg />
</picture>
   <figcaption class="small" > HTML File download times</figcaption> </figure>


<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>All three offer you to use your own domain name.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>They don&rsquo;t support private submodules at all, ask their support Discord if you don&rsquo;t believe me&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Specifically I wasn&rsquo;t able to use some private submodules out of the box. <a href="https://github.com/orgs/vercel/discussions/44">It&rsquo;s a known problem</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>Probably they do it to avoid abuse and to not compete with the <a href="https://www.cloudflare.com/products/cloudflare-stream/">Cloudflare Stream</a> products.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p>Average of 200 tests with <a href="https://github.com/reorx/httpstat">httpstat</a> against a <a href="/lorem">test page</a>. Stats eleaborated with Julia <a href="https://github.com/icpmoles/httpbenchmark">Source repo</a>&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>]]></content><preview>Given the various choices of hosting for your static files you may be unsure which one to pick. These are the features and performances of the top four services with their free tier.</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="hugo" label="hugo"/><category scheme="taxonomy:Tags" term="hosting" label="hosting"/><category scheme="taxonomy:Tags" term="rendering" label="rendering"/><category scheme="taxonomy:Tags" term="ci/cd" label="CI/CD"/><category scheme="taxonomy:Tags" term="github-pages" label="github pages"/><category scheme="taxonomy:Tags" term="netlify" label="netlify"/><category scheme="taxonomy:Tags" term="github" label="github"/><category scheme="taxonomy:Tags" term="cloudflare" label="cloudflare"/><category scheme="taxonomy:Tags" term="vercel" label="vercel"/><category scheme="taxonomy:Tags" term="render.com" label="render.com"/></entry><entry><title type="html">How to setup ROS Noetic in WSL through Ubuntu 20.04 Focal</title><link href="https://blog.icpmol.es/posts/ros-polimi/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/posts/ros-polimi/</id><section>Post</section><published>2024-02-28T20:01:43+01:00</published><updated>2024-02-28T20:01:43+01:00</updated><content type="html"><![CDATA[<p>Guide for Matteo Matteucci&rsquo;s <a href="http://chrome.deib.polimi.it/index.php?title=Robotics">Robotics class</a> at PoliMi</p>
<p>Scope: to install the environment needed for the labs without having to deal with Docker or dual booting in Ubuntu.</p>
<p>Target: PCs running Windows 10 or up supporting virtualization.</p>
<h2 id="basic-installation"><a class="anchor  mark-html" href="#basic-installation">Basic Installation</a></h2>
<p>First you need to set-up WSL in your machine. From a <strong>Windows</strong> command line run:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">powershell</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-update</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-install</span> <span class="n">Ubuntu</span><span class="p">-</span><span class="mf">20.04</span></span></span></code></pre></div>
</details>

<p>And fill the username and password as you please.</p>
<p>Now you should get a linux shell, in other case you can launch it from the start menu (simply search Ubuntu, it should also apper in the recently installed section) or from the dropdown menu of the terminal (my suggested method).</p>
<p>Let&rsquo;s update some packages as a precaution and then continue.</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt update
</span></span><span class="line"><span class="cl">sudo apt upgrade -y</span></span></code></pre></div>
</details>

<p>n.b: If you&rsquo;re using the internal PoliMi Wifi you may get some errors, simply switching the Wifi from &ldquo;Public Network&rdquo; to &ldquo;Private Network&rdquo; should fix it. You may have to change it back once you&rsquo;re done with this tutorial.</p>
<p>Now we start dealing with the core ROS installation. These commands are taken from the <a href="https://github.com/osrf/docker_images/blob/df19ab7d5993d3b78a908362cdcd1479a8e78b35/ros/noetic/ubuntu/focal/ros-core/Dockerfile">Docker repository</a></p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt-get install -q -y --no-install-recommends dirmngr gnupg2
</span></span><span class="line"><span class="cl">sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
</span></span><span class="line"><span class="cl">sudo  sh -c <span class="s1">&#39;echo &#34;deb http://packages.ros.org/ros/ubuntu focal main&#34; &gt;&gt; /etc/apt/sources.list.d/ros1-latest.list&#39;</span>
</span></span><span class="line"><span class="cl">sudo apt-get update 
</span></span><span class="line"><span class="cl">sudo apt-get install -y --no-install-recommends ros-noetic-ros-core<span class="o">=</span>1.5.0-1*
</span></span><span class="line"><span class="cl"><span class="nb">source</span> <span class="s2">&#34;/opt/ros/noetic/setup.bash&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;source /opt/ros/noetic/setup.bash&#34;</span> &gt;&gt; ~/.bashrc
</span></span><span class="line"><span class="cl"><span class="nb">source</span> ~/.bashrc</span></span></code></pre></div>
</details>

<p>These are the commands for the &ldquo;base&rdquo; ROS installation taken from <a href="https://github.com/osrf/docker_images/blob/df19ab7d5993d3b78a908362cdcd1479a8e78b35/ros/noetic/ubuntu/focal/ros-base/Dockerfile">here</a></p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt-get install --no-install-recommends -y  build-essential  python3-rosdep  python3-rosinstall   python3-vcstools 
</span></span><span class="line"><span class="cl">sudo rosdep init 
</span></span><span class="line"><span class="cl">rosdep update --rosdistro noetic
</span></span><span class="line"><span class="cl">sudo apt-get update 
</span></span><span class="line"><span class="cl">sudo apt-get install -y --no-install-recommends ros-noetic-ros-base<span class="o">=</span>1.5.0-1*</span></span></code></pre></div>
</details>

<p>Now finally for the &ldquo;perception&rdquo; ROS <a href="https://github.com/osrf/docker_images/blob/df19ab7d5993d3b78a908362cdcd1479a8e78b35/ros/noetic/ubuntu/focal/perception/Dockerfile">package</a></p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt-get install -y --no-install-recommends   ros-noetic-perception<span class="o">=</span>1.5.0-1* </span></span></code></pre></div>
</details>


  
  
    <blockquote class="alert alert-note">
      <p class="alert-heading">
        ℹ️
        Note
      </p>
      <p>Basically in the <code>Dockerfile</code> shared in class what we just did was simply the first section.</p>
<p>(This is not a command!)</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">dockerfile</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dockerfile" data-lang="dockerfile"><span class="line"><span class="cl"><span class="c"># Start from the ROS Noetic perception image</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w"> </span><span class="s">ros:noetic-perception</span></span></span></code></pre></div>
</details>
    </blockquote>
  <p>Now we continue with the other installation commands:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt-get install -y --no-install-recommends nano <span class="se">\
</span></span></span><span class="line"><span class="cl">  vim tmux gedit ros-noetic-rqt* <span class="se">\
</span></span></span><span class="line"><span class="cl">  net-tools iproute2 ros-noetic-plotjuggler* <span class="se">\
</span></span></span><span class="line"><span class="cl">  ros-noetic-foxglove-bridge ros-noetic-turtlesim <span class="se">\
</span></span></span><span class="line"><span class="cl">  ros-noetic-tf*</span></span></code></pre></div>
</details>

<h2 id="update-for-lesson-7"><a class="anchor  mark-html" href="#update-for-lesson-7">Update for lesson 7</a></h2>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt-get install -y --no-install-recommends  <span class="se">\
</span></span></span><span class="line"><span class="cl">  ros-noetic-stage* ros-noetic-gmapping <span class="se">\
</span></span></span><span class="line"><span class="cl">  ros-noetic-slam-toolbox* ros-noetic-move-base* <span class="se">\
</span></span></span><span class="line"><span class="cl">  ros-noetic-amcl ros-noetic-global-planner <span class="se">\
</span></span></span><span class="line"><span class="cl">  ros-noetic-dwa-local-planner ros-noetic-navfn <span class="se">\
</span></span></span><span class="line"><span class="cl">  ros-noetic-turtlebot3-* ros-noetic-teleop-twist-keyboard <span class="se">\
</span></span></span><span class="line"><span class="cl">  ros-noetic-pointcloud-to-laserscan </span></span></code></pre></div>
</details>

<p>You should already be in the home directory but just in case:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p ~/catkin_ws/src
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> ~/catkin_ws/
</span></span><span class="line"><span class="cl">ln -s /opt/ros/noetic/share/catkin/cmake/toplevel.cmake src/CMakeLists.txt
</span></span><span class="line"><span class="cl">catkin_make
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;source ~/catkin_ws/devel/setup.bash&#34;</span>  &gt;&gt; ~/.bashrc</span></span></code></pre></div>
</details>

<p>To test it:</p>
<p>In three different tabs execute these commands in this order:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">roscore
</span></span><span class="line"><span class="cl">rosrun turtlesim turtlesim_node
</span></span><span class="line"><span class="cl">rosrun turtlesim turtle_teleop_key</span></span></code></pre></div>
</details>

<h3 id="in-case-you-wanted-to-run-everything-in-one-shot"><a class="anchor  mark-html" href="#in-case-you-wanted-to-run-everything-in-one-shot">In case you wanted to run everything in one shot:</a></h3>
<p>After opening the Linux shell:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt update
</span></span><span class="line"><span class="cl">sudo apt upgrade -y
</span></span><span class="line"><span class="cl">sudo apt-get install -q -y --no-install-recommends dirmngr gnupg2
</span></span><span class="line"><span class="cl">sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
</span></span><span class="line"><span class="cl">sudo  sh -c <span class="s1">&#39;echo &#34;deb http://packages.ros.org/ros/ubuntu focal main&#34; &gt;&gt; /etc/apt/sources.list.d/ros1-latest.list&#39;</span>
</span></span><span class="line"><span class="cl">sudo apt-get update 
</span></span><span class="line"><span class="cl">sudo apt-get install -y --no-install-recommends ros-noetic-ros-core<span class="o">=</span>1.5.0-1*
</span></span><span class="line"><span class="cl"><span class="nb">source</span> <span class="s2">&#34;/opt/ros/noetic/setup.bash&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;source /opt/ros/noetic/setup.bash&#34;</span> &gt;&gt; ~/.bashrc
</span></span><span class="line"><span class="cl"><span class="nb">source</span> ~/.bashrc
</span></span><span class="line"><span class="cl">sudo apt-get install --no-install-recommends -y  build-essential  python3-rosdep  python3-rosinstall   python3-vcstools 
</span></span><span class="line"><span class="cl">sudo rosdep init 
</span></span><span class="line"><span class="cl">rosdep update --rosdistro noetic
</span></span><span class="line"><span class="cl">sudo apt-get update 
</span></span><span class="line"><span class="cl">sudo apt-get install -y --no-install-recommends ros-noetic-ros-base<span class="o">=</span>1.5.0-1*
</span></span><span class="line"><span class="cl">sudo apt-get install -y --no-install-recommends   ros-noetic-perception<span class="o">=</span>1.5.0-1* 
</span></span><span class="line"><span class="cl">sudo apt-get install -y --no-install-recommends nano vim tmux gedit ros-noetic-rqt* net-tools iproute2 ros-noetic-plotjuggler* ros-noetic-foxglove-bridge ros-noetic-turtlesim ros-noetic-tf*
</span></span><span class="line"><span class="cl">sudo apt-get install -y --no-install-recommends  ros-noetic-stage* ros-noetic-gmapping ros-noetic-slam-toolbox* ros-noetic-move-base* ros-noetic-amcl ros-noetic-global-planner ros-noetic-dwa-local-planner ros-noetic-navfn ros-noetic-turtlebot3-* ros-noetic-teleop-twist-keyboard ros-noetic-pointcloud-to-laserscan 
</span></span><span class="line"><span class="cl">mkdir -p ~/catkin_ws/src
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> ~/catkin_ws/
</span></span><span class="line"><span class="cl">ln -s /opt/ros/noetic/share/catkin/cmake/toplevel.cmake src/CMakeLists.txt
</span></span><span class="line"><span class="cl">catkin_make
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;source ~/catkin_ws/devel/setup.bash&#34;</span>  &gt;&gt; ~/.bashrc</span></span></code></pre></div>
</details>

<h2 id="quality-of-life-improvements-you-can-skip-this"><a class="anchor  mark-html" href="#quality-of-life-improvements-you-can-skip-this">Quality of life improvements (you can skip this)</a></h2>
<p>If you want an easier tmux experience with mouse support (like scrolling for output history, click to change pane, etc) and color:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> <span class="nv">$HOME</span>
</span></span><span class="line"><span class="cl">touch ~/.tmux.conf
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;setw -g mouse on&#34;</span> &gt;&gt; ~/.tmux.conf
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;setw -g default-terminal &#34;</span>tmux-256color<span class="s2">&#34;&#34;</span> &gt;&gt; ~/.tmux.conf</span></span></code></pre></div>
</details>

<h2 id="cloning"><a class="anchor  mark-html" href="#cloning">Cloning</a></h2>
<p>Now your ROS developement environment is fully functioning, so we can just &ldquo;clone&rdquo; the distro to be able to interact in a multihost configuration. Write down your Ubuntu username, it&rsquo;s just the name of the account that we setup in the first step. It also appears before the <code>@</code> in your shell.</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo nano /etc/wsl.conf</span></span></code></pre></div>
</details>

<p>Now we have to modify the text file into this:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">conf</span>
</summary>

<pre tabindex="0"><code class="language-conf" data-lang="conf">[boot]
systemd=true
[user]
default=UsernameThatIJustToldYouToWriteDOwn</code></pre>
</details>

<p>And now just <code>CTRL + O</code> to save, same name,<code>CTRL + X</code>  to exit.</p>
<p>Now create an empty folder in a place of your liking (possibly in a disk with at least 20Gb)</p>
<p>Open a Powershell terminal in that folder and type:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">powershell</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">wsl</span> <span class="p">-</span><span class="n">-shutdown</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span><span class="p">.</span><span class="py">exe</span> <span class="p">-</span><span class="n">-export</span> <span class="n">Ubuntu</span><span class="p">-</span><span class="mf">20.04</span> <span class="n">UbuntuRosBck</span><span class="p">.</span><span class="n">tar</span></span></span></code></pre></div>
</details>

<p>Just wait&hellip;.</p>
<p>If everything went correctly then you can type in the same terminal:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">powershell</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">wsl</span><span class="p">.</span><span class="py">exe</span> <span class="p">-</span><span class="n">-import</span> <span class="n">UbuntuRosSecondary</span> <span class="p">./</span><span class="n">filesystemsecondary</span> <span class="n">UbuntuRosBck</span><span class="p">.</span><span class="n">tar</span></span></span></code></pre></div>
</details>

<p>Wait, again. As soon as the process is complete we can just launch the instance with</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">powershell</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">wsl</span><span class="p">.</span><span class="py">exe</span> <span class="p">-</span><span class="n">-distribution</span> <span class="n">UbuntuRosSecondary</span> </span></span></code></pre></div>
</details>

<p>Now we have two identical WSL instances that we can launch from the start menu or from the terminal drop down.</p>
<img 
    src="https://blog.icpmol.es/posts/ros-polimi/finalterm_hu_9171fc732da952cd.jpg"  alt="How your Terminal dropdown should look like"loading="lazy"
    width="955" 
    height="574"
    />
[]<p>Now, going back to the directory where we exported the backup at the start of this step we have two big files: <code>UbuntuRosBck.tar</code> and <code>filesystem\ext4.vhdx</code></p>

  
  
    <blockquote class="alert alert-warning">
      <p class="alert-heading">
        ⚠️
        Warning
      </p>
      <p><strong>Precaution when moving the generated files pt. 1</strong></p>
<p>For <code>filesystem\ext4.vhdx</code>: DON&rsquo;T TOUCH, MOVE OR DELETE IT. It contains all your data.</p>
    </blockquote>
  
  
  
    <blockquote class="alert alert-tip">
      <p class="alert-heading">
        💡
        Tip
      </p>
      <p><strong>Precaution when moving the generated files pt. 2</strong></p>
<p>For <code>UbuntuRosBck.tar</code> instead you can either delete it or you can also share it with your friends.</p>
    </blockquote>
  <h3 id="testing"><a class="anchor  mark-html" href="#testing">Testing</a></h3>
<p>With this configuration you don&rsquo;t have to fiddle with Master IPs and such like for Docker. To test it just run like this:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">roscore
</span></span><span class="line"><span class="cl">rosrun turtlesim turtlesim_node
</span></span><span class="line"><span class="cl">rosrun turtlesim turtle_teleop_key</span></span></code></pre></div>
</details>

<img 
    src="https://blog.icpmol.es/posts/ros-polimi/image_hu_f04320accded90b2.jpg"  alt="Turtlesim running on multiple machines"loading="lazy"
    width="1915" 
    height="1020"
    />
[]<h2 id="sharing-is-caring"><a class="anchor  mark-html" href="#sharing-is-caring">Sharing is Caring</a></h2>
<p><code>UbuntuRosBck.tar</code> basically contain a full linux distro with all the ROS packages already installed. You can transfer it on their PC and then in an empty folder just run:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">powershell</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">wsl</span><span class="p">.</span><span class="py">exe</span> <span class="p">-</span><span class="n">-import</span> <span class="n">UbuntuRosPrimary</span> <span class="p">./</span><span class="n">filesystemprimary</span> <span class="n">UbuntuRosBck</span><span class="p">.</span><span class="py">tar</span>
</span></span><span class="line"><span class="cl"><span class="n">wsl</span><span class="p">.</span><span class="py">exe</span> <span class="p">-</span><span class="n">-import</span> <span class="n">UbuntuRosSecondary</span> <span class="p">./</span><span class="n">filesystemsecondary</span> <span class="n">UbuntuRosBck</span><span class="p">.</span><span class="n">tar</span></span></span></code></pre></div>
</details>

<p>Ideally this should just run™</p>
<p>Be mindful to not put anything personal or harmful inside and to give them the password you used in the first step. It&rsquo;s technically a local VM so it shouldn&rsquo;t bee too much of a risk from that point of view.</p>

  
  
    <blockquote class="alert alert-caution">
      <p class="alert-heading">
        ❗
        Caution
      </p>
      <p>Just in case it&rsquo;s not clear:</p>
<p><strong>Your WSL password, not your Windows password!</strong></p>
    </blockquote>
  <p>Also, like for the previous section: please never delete the <code>filesystemprimary\ext4.vhdx</code> and <code>filesystemsecondary\ext4.vhdx</code>files but you can delete <code>UbuntuRosBck.tar</code> file without causing problems.</p>
<h2 id="quick-course-in-wsl"><a class="anchor  mark-html" href="#quick-course-in-wsl">Quick course in WSL</a></h2>
<p>In case you never used WSL these are some nice tips that can become handy when developing with ROS.</p>
<h3 id="vs-code-integration"><a class="anchor  mark-html" href="#vs-code-integration">VS Code Integration</a></h3>
<p>If you have VS Code installed in Windows then you can open it in your current directory with just</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">code .</span></span></code></pre></div>
</details>

<p>Don&rsquo;t forget the point.</p>
<p>For code completion, in your <code>catkin_ws</code>:</p>
<p>From the linux shell.</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> ~/catkin_ws
</span></span><span class="line"><span class="cl">mkdir .vscode
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> .vscode
</span></span><span class="line"><span class="cl">touch c_cpp_properties.json
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> ..
</span></span><span class="line"><span class="cl">code .</span></span></code></pre></div>
</details>

<p>Install the <a href="https://marketplace.visualstudio.com/items?itemName=betwo.b2-catkin-tools">catink_tools extension</a>.</p>
<p>Then paste this in the <code>.vscode/c_cpp_properties.json</code> file.</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">json</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;configurations&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;Linux&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;includePath&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">                <span class="s2">&#34;${workspaceFolder}/**&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="s2">&#34;/opt/ros/noetic/include&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="p">],</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;defines&#34;</span><span class="p">:</span> <span class="p">[],</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;compilerPath&#34;</span><span class="p">:</span> <span class="s2">&#34;/usr/bin/gcc&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;cStandard&#34;</span><span class="p">:</span> <span class="s2">&#34;c17&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;cppStandard&#34;</span><span class="p">:</span> <span class="s2">&#34;gnu++14&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;intelliSenseMode&#34;</span><span class="p">:</span> <span class="s2">&#34;${default}&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;configurationProvider&#34;</span><span class="p">:</span> <span class="s2">&#34;b2.catkin_tools&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;version&#34;</span><span class="p">:</span> <span class="mi">4</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
</details>

<h3 id="accessing-your-files"><a class="anchor  mark-html" href="#accessing-your-files">Accessing your files</a></h3>
<p>At any moment you can launch your Windows file explorer in the current directory with just</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type terminalIcon">bash</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">explorer.exe .</span></span></code></pre></div>
</details>

<p>Don&rsquo;t forget the point.</p>
<p>It will also show up in the left bar of the built-in file explorer.</p>
<p>To access your ROS file simply go to <code>ubuntu-20.04 -&gt; home -&gt; &quot;your username&quot; -&gt; catkin_ws</code></p>
<img 
    src="https://blog.icpmol.es/posts/ros-polimi/image-1_hu_1b1d08298aacf067.jpg"  alt="Where to find the Linux distro"loading="lazy"
    width="786" 
    height="462"
    />
[]]]></content><preview>Guide for Matteo Matteucci&amp;rsquo;s Robotics class at PoliMi
Scope: to install the environment needed for the labs without having to deal with Docker or dual booting in Ubuntu.
Target: PCs running Windows 10 or up supporting virtualization.</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="ubuntu" label="Ubuntu"/><category scheme="taxonomy:Tags" term="ros" label="ROS"/></entry><entry><title type="html">The dire state of MathML support</title><link href="https://blog.icpmol.es/posts/mathml-support/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/posts/mathml-support/</id><section>Post</section><published>2023-11-26T16:24:03+01:00</published><updated>2023-11-26T16:24:03+01:00</updated><content type="html"><![CDATA[<p>What is the state of MathML in 2023? Can we finally use it and forget about MathJax or Katex for the time being?</p>
<p>Let&rsquo;s try something simple: I&rsquo;m going to put a Latex expression and see how Katex compares to &ldquo;raw&rdquo; MathML code generated by the coutless renderers you can <a href="https://temml.org/">find online</a>:</p>
<h2 id="latex-code"><a class="anchor  mark-html" href="#latex-code">Latex Code:</a></h2>
<details class="btn">
<summary>Show Latex Code</summary>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">latex</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-latex" data-lang="latex"><span class="line"><span class="cl"><span class="k">\vec</span> x <span class="k">\equal</span> 
</span></span><span class="line"><span class="cl"><span class="k">\begin</span><span class="nb">{</span>bmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">\begin</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">1 <span class="nb">&amp;</span> 2 <span class="nb">&amp;</span> 3<span class="k">\\</span>
</span></span><span class="line"><span class="cl">a <span class="nb">&amp;</span> b <span class="nb">&amp;</span> c
</span></span><span class="line"><span class="cl"><span class="k">\end</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl"><span class="nb">&amp;</span>
</span></span><span class="line"><span class="cl"><span class="k">\begin</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">4 <span class="nb">&amp;</span> 5 <span class="nb">&amp;</span> 6<span class="k">\\</span>
</span></span><span class="line"><span class="cl">d <span class="nb">&amp;</span> e <span class="nb">&amp;</span> f
</span></span><span class="line"><span class="cl"><span class="k">\end</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl"><span class="k">\\</span>
</span></span><span class="line"><span class="cl"><span class="k">\begin</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">6 <span class="nb">&amp;</span> 5 <span class="nb">&amp;</span> 4<span class="k">\\</span>
</span></span><span class="line"><span class="cl">z <span class="nb">&amp;</span> y <span class="nb">&amp;</span> x
</span></span><span class="line"><span class="cl"><span class="k">\end</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl"><span class="nb">&amp;</span>
</span></span><span class="line"><span class="cl"><span class="k">\begin</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">3 <span class="nb">&amp;</span> 2 <span class="nb">&amp;</span> 1<span class="k">\\</span>
</span></span><span class="line"><span class="cl">r <span class="nb">&amp;</span> s <span class="nb">&amp;</span> t
</span></span><span class="line"><span class="cl"><span class="k">\end</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">\end</span><span class="nb">{</span>bmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">\begin</span><span class="nb">{</span>bmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl"><span class="k">\pi</span> <span class="k">\\</span> <span class="k">\pi</span>/2 <span class="k">\\</span> <span class="k">\frac</span><span class="nb">{</span><span class="k">\pi</span><span class="nb">}{</span>3<span class="nb">}</span> <span class="k">\\</span> 3<span class="k">\pi</span> <span class="k">\\</span> <span class="k">\pdv</span><span class="nb">{</span>f<span class="nb">}{</span>t<span class="nb">}</span> <span class="k">\\</span> <span class="k">\alpha</span>
</span></span><span class="line"><span class="cl"><span class="k">\end</span><span class="nb">{</span>bmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">+
</span></span><span class="line"><span class="cl"><span class="k">\vec</span> <span class="nb">{</span>z<span class="nb">^</span>T<span class="nb">}</span> <span class="k">\vec</span> g
</span></span><span class="line"><span class="cl"><span class="k">\begin</span><span class="nb">{</span>bmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">\begin</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">1 <span class="nb">&amp;</span> 2 <span class="nb">&amp;</span> 3<span class="k">\\</span>
</span></span><span class="line"><span class="cl">a <span class="nb">&amp;</span> b <span class="nb">&amp;</span> c
</span></span><span class="line"><span class="cl"><span class="k">\end</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl"><span class="nb">&amp;</span>
</span></span><span class="line"><span class="cl"><span class="k">\begin</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">4 <span class="nb">&amp;</span> 5 <span class="nb">&amp;</span> 6<span class="k">\\</span>
</span></span><span class="line"><span class="cl">d <span class="nb">&amp;</span> e <span class="nb">&amp;</span> f
</span></span><span class="line"><span class="cl"><span class="k">\end</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl"><span class="k">\\</span>
</span></span><span class="line"><span class="cl"><span class="k">\begin</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">6 <span class="nb">&amp;</span> 5 <span class="nb">&amp;</span> 4<span class="k">\\</span>
</span></span><span class="line"><span class="cl">z <span class="nb">&amp;</span> y <span class="nb">&amp;</span> x
</span></span><span class="line"><span class="cl"><span class="k">\end</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl"><span class="nb">&amp;</span>
</span></span><span class="line"><span class="cl"><span class="k">\begin</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">3 <span class="nb">&amp;</span> 2 <span class="nb">&amp;</span> 1<span class="k">\\</span>
</span></span><span class="line"><span class="cl">r <span class="nb">&amp;</span> s <span class="nb">&amp;</span> t
</span></span><span class="line"><span class="cl"><span class="k">\end</span><span class="nb">{</span>pmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">\end</span><span class="nb">{</span>bmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">\begin</span><span class="nb">{</span>bmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl"><span class="k">\pi</span> <span class="k">\\</span> <span class="k">\pi</span>/2 <span class="k">\\</span> <span class="k">\frac</span><span class="nb">{</span><span class="k">\pi</span><span class="nb">}{</span>3<span class="nb">}</span> <span class="k">\\</span> 3<span class="k">\pi</span> <span class="k">\\</span> <span class="k">\pdv</span><span class="nb">{</span>f<span class="nb">}{</span>t<span class="nb">}</span> <span class="k">\\</span> <span class="k">\alpha</span>
</span></span><span class="line"><span class="cl"><span class="k">\end</span><span class="nb">{</span>bmatrix<span class="nb">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">+ <span class="k">\sum</span><span class="nb">_{</span>i=<span class="k">\vec</span> <span class="nb">{</span>x<span class="nb">_</span>0<span class="nb">}}^{</span><span class="k">\vec</span> <span class="nb">{</span>x<span class="nb">_</span>n<span class="nb">}}</span>g(<span class="k">\vec</span> x<span class="nb">_</span>i)<span class="k">\Lambda</span><span class="nb">_</span>2</span></span></code></pre></div>
</details>

</details>
<h2 id="katex-rendering"><a class="anchor  mark-html" href="#katex-rendering">Katex Rendering</a></h2>

  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%20x%20%3d%20%5cbegin%7bbmatrix%7d%5cbegin%7bpmatrix%7d1%20%26%202%20%26%203%5c%5ca%20%26%20b%20%26%20c%5cend%7bpmatrix%7d%26%5cbegin%7bpmatrix%7d4%20%26%205%20%26%206%5c%5cd%20%26%20e%20%26%20f%5cend%7bpmatrix%7d%5c%5c%5cbegin%7bpmatrix%7d6%20%26%205%20%26%204%5c%5cz%20%26%20y%20%26%20x%5cend%7bpmatrix%7d%26%5cbegin%7bpmatrix%7d3%20%26%202%20%26%201%5c%5cr%20%26%20s%20%26%20t%5cend%7bpmatrix%7d%5cend%7bbmatrix%7d%5cbegin%7bbmatrix%7d%5cpi%20%5c%5c%20%5cpi%2f2%20%5c%5c%20%5cfrac%7b%5cpi%7d%7b3%7d%20%5c%5c%203%5cpi%20%5c%5c%20%5cfrac%7b%5cpartial%20f%7d%7b%5cpartial%20t%7d%20%5c%5c%20%5calpha%5cend%7bbmatrix%7d%2b%5cvec%20%7bz%5eT%7d%20%5cvec%20g%5cbegin%7bbmatrix%7d%5cbegin%7bpmatrix%7d1%20%26%202%20%26%203%5c%5ca%20%26%20b%20%26%20c%5cend%7bpmatrix%7d%26%5cbegin%7bpmatrix%7d4%20%26%205%20%26%206%5c%5cd%20%26%20e%20%26%20f%5cend%7bpmatrix%7d%5c%5c%5cbegin%7bpmatrix%7d6%20%26%205%20%26%204%5c%5cz%20%26%20y%20%26%20x%5cend%7bpmatrix%7d%26%5cbegin%7bpmatrix%7d3%20%26%202%20%26%201%5c%5cr%20%26%20s%20%26%20t%5cend%7bpmatrix%7d%5cend%7bbmatrix%7d%5cbegin%7bbmatrix%7d%5cpi%20%5c%5c%20%5cpi%2f2%20%5c%5c%20%5cfrac%7b%5cpi%7d%7b3%7d%20%5c%5c%203%5cpi%20%5c%5c%20%5cfrac%7b%5cpartial%20f%7d%7b%5cpartial%20t%7d%20%5c%5c%20%5calpha%5cend%7bbmatrix%7d%2b%20%5csum_%7bi%3d%5cvec%20%7bx_0%7d%7d%5e%7b%5cvec%20%7bx_n%7d%7dg%28%5cvec%20x_i%29%5cLambda_2%20"/>
<h2 id="mathml-with-default-font-family"><a class="anchor  mark-html" href="#mathml-with-default-font-family">MathML with default font family</a></h2>

<math display="block" class="tml-display" style="display:block math;font-family:revert">
    
        <mrow>
          <mover>
            <mi>x</mi>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mo>=</mo>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center center">
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>1</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>3</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>a</mi>
                        </mtd>
                        <mtd>
                          <mi>b</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>c</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>4</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>6</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>d</mi>
                        </mtd>
                        <mtd>
                          <mi>e</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>f</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>6</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>4</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>z</mi>
                        </mtd>
                        <mtd>
                          <mi>y</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>x</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>3</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>1</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>r</mi>
                        </mtd>
                        <mtd>
                          <mi>s</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>t</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center">
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>π</mi>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mi>π</mi>
                    <mo lspace="0em" rspace="0em">⁄</mo>
                    <mn>2</mn>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mi>π</mi>
                    <mn>3</mn>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mn>3</mn>
                    <mi>π</mi>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mrow>
                      <mi>∂</mi>
                      <mi>f</mi>
                    </mrow>
                    <mrow>
                      <mi>∂</mi>
                      <mi>t</mi>
                    </mrow>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>α</mi>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mo>+</mo>
          <mover>
            <msup>
              <mi>z</mi>
              <mi>T</mi>
            </msup>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mover>
            <mi>g</mi>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center center">
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>1</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>3</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>a</mi>
                        </mtd>
                        <mtd>
                          <mi>b</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>c</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>4</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>6</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>d</mi>
                        </mtd>
                        <mtd>
                          <mi>e</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>f</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>6</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>4</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>z</mi>
                        </mtd>
                        <mtd>
                          <mi>y</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>x</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>3</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>1</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>r</mi>
                        </mtd>
                        <mtd>
                          <mi>s</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>t</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center">
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>π</mi>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mi>π</mi>
                    <mo lspace="0em" rspace="0em">⁄</mo>
                    <mn>2</mn>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mi>π</mi>
                    <mn>3</mn>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mn>3</mn>
                    <mi>π</mi>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mrow>
                      <mi>∂</mi>
                      <mi>f</mi>
                    </mrow>
                    <mrow>
                      <mi>∂</mi>
                      <mi>t</mi>
                    </mrow>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>α</mi>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mo>+</mo>
          <mrow>
            <munderover>
              <mo movablelimits="false">∑</mo>
              <mrow>
                <mi>i</mi>
                <mo>=</mo>
                <mover>
                  <msub>
                    <mi>x</mi>
                    <mn>0</mn>
                  </msub>
                  <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
                </mover>
              </mrow>
              <mover>
                <msub>
                  <mi>x</mi>
                  <mi>n</mi>
                </msub>
                <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
              </mover>
            </munderover>
          </mrow>
          <mi>g</mi>
          <mo form="prefix" stretchy="false">(</mo>
          <msub>
            <mover>
              <mi>x</mi>
              <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
            </mover>
            <mi>i</mi>
          </msub>
          <mo form="postfix" stretchy="false">)</mo>
          <msub>
            <mrow>
              <mi mathvariant="normal">Λ</mi>
            </mrow>
            <mn>2</mn>
          </msub>
        </mrow>
      </math>
<p>They should render pretty similar depending on your browser. For example on Windows 11 it works &ldquo;fine&rdquo; on both Chrome and Firefox while on Android I&rsquo;ve encountered some errors in Chrome.</p>
<p>What if we wanted to change the font to have a better control and fix some of the shortcomings of default fonts?</p>
<p>My choice went on Asana, Firamath, GFSNeohellenicMath, Stix 2 and TEX Gyre Schola:</p>
<p><h3>Font family: Asana</h5>
<math display="block" class="tml-display" style="display:block math;font-family:Asana">
    
        <mrow>
          <mover>
            <mi>x</mi>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mo>=</mo>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center center">
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>1</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>3</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>a</mi>
                        </mtd>
                        <mtd>
                          <mi>b</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>c</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>4</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>6</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>d</mi>
                        </mtd>
                        <mtd>
                          <mi>e</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>f</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>6</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>4</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>z</mi>
                        </mtd>
                        <mtd>
                          <mi>y</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>x</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>3</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>1</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>r</mi>
                        </mtd>
                        <mtd>
                          <mi>s</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>t</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center">
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>π</mi>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mi>π</mi>
                    <mo lspace="0em" rspace="0em">⁄</mo>
                    <mn>2</mn>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mi>π</mi>
                    <mn>3</mn>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mn>3</mn>
                    <mi>π</mi>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mrow>
                      <mi>∂</mi>
                      <mi>f</mi>
                    </mrow>
                    <mrow>
                      <mi>∂</mi>
                      <mi>t</mi>
                    </mrow>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>α</mi>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mo>+</mo>
          <mover>
            <msup>
              <mi>z</mi>
              <mi>T</mi>
            </msup>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mover>
            <mi>g</mi>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center center">
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>1</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>3</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>a</mi>
                        </mtd>
                        <mtd>
                          <mi>b</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>c</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>4</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>6</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>d</mi>
                        </mtd>
                        <mtd>
                          <mi>e</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>f</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>6</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>4</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>z</mi>
                        </mtd>
                        <mtd>
                          <mi>y</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>x</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>3</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>1</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>r</mi>
                        </mtd>
                        <mtd>
                          <mi>s</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>t</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center">
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>π</mi>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mi>π</mi>
                    <mo lspace="0em" rspace="0em">⁄</mo>
                    <mn>2</mn>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mi>π</mi>
                    <mn>3</mn>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mn>3</mn>
                    <mi>π</mi>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mrow>
                      <mi>∂</mi>
                      <mi>f</mi>
                    </mrow>
                    <mrow>
                      <mi>∂</mi>
                      <mi>t</mi>
                    </mrow>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>α</mi>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mo>+</mo>
          <mrow>
            <munderover>
              <mo movablelimits="false">∑</mo>
              <mrow>
                <mi>i</mi>
                <mo>=</mo>
                <mover>
                  <msub>
                    <mi>x</mi>
                    <mn>0</mn>
                  </msub>
                  <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
                </mover>
              </mrow>
              <mover>
                <msub>
                  <mi>x</mi>
                  <mi>n</mi>
                </msub>
                <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
              </mover>
            </munderover>
          </mrow>
          <mi>g</mi>
          <mo form="prefix" stretchy="false">(</mo>
          <msub>
            <mover>
              <mi>x</mi>
              <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
            </mover>
            <mi>i</mi>
          </msub>
          <mo form="postfix" stretchy="false">)</mo>
          <msub>
            <mrow>
              <mi mathvariant="normal">Λ</mi>
            </mrow>
            <mn>2</mn>
          </msub>
        </mrow>
      </math>
<h3>Font family: Firamath</h5>
<math display="block" class="tml-display" style="display:block math;font-family:Firamath">
    
        <mrow>
          <mover>
            <mi>x</mi>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mo>=</mo>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center center">
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>1</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>3</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>a</mi>
                        </mtd>
                        <mtd>
                          <mi>b</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>c</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>4</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>6</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>d</mi>
                        </mtd>
                        <mtd>
                          <mi>e</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>f</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>6</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>4</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>z</mi>
                        </mtd>
                        <mtd>
                          <mi>y</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>x</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>3</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>1</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>r</mi>
                        </mtd>
                        <mtd>
                          <mi>s</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>t</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center">
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>π</mi>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mi>π</mi>
                    <mo lspace="0em" rspace="0em">⁄</mo>
                    <mn>2</mn>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mi>π</mi>
                    <mn>3</mn>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mn>3</mn>
                    <mi>π</mi>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mrow>
                      <mi>∂</mi>
                      <mi>f</mi>
                    </mrow>
                    <mrow>
                      <mi>∂</mi>
                      <mi>t</mi>
                    </mrow>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>α</mi>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mo>+</mo>
          <mover>
            <msup>
              <mi>z</mi>
              <mi>T</mi>
            </msup>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mover>
            <mi>g</mi>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center center">
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>1</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>3</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>a</mi>
                        </mtd>
                        <mtd>
                          <mi>b</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>c</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>4</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>6</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>d</mi>
                        </mtd>
                        <mtd>
                          <mi>e</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>f</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>6</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>4</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>z</mi>
                        </mtd>
                        <mtd>
                          <mi>y</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>x</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>3</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>1</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>r</mi>
                        </mtd>
                        <mtd>
                          <mi>s</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>t</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center">
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>π</mi>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mi>π</mi>
                    <mo lspace="0em" rspace="0em">⁄</mo>
                    <mn>2</mn>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mi>π</mi>
                    <mn>3</mn>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mn>3</mn>
                    <mi>π</mi>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mrow>
                      <mi>∂</mi>
                      <mi>f</mi>
                    </mrow>
                    <mrow>
                      <mi>∂</mi>
                      <mi>t</mi>
                    </mrow>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>α</mi>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mo>+</mo>
          <mrow>
            <munderover>
              <mo movablelimits="false">∑</mo>
              <mrow>
                <mi>i</mi>
                <mo>=</mo>
                <mover>
                  <msub>
                    <mi>x</mi>
                    <mn>0</mn>
                  </msub>
                  <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
                </mover>
              </mrow>
              <mover>
                <msub>
                  <mi>x</mi>
                  <mi>n</mi>
                </msub>
                <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
              </mover>
            </munderover>
          </mrow>
          <mi>g</mi>
          <mo form="prefix" stretchy="false">(</mo>
          <msub>
            <mover>
              <mi>x</mi>
              <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
            </mover>
            <mi>i</mi>
          </msub>
          <mo form="postfix" stretchy="false">)</mo>
          <msub>
            <mrow>
              <mi mathvariant="normal">Λ</mi>
            </mrow>
            <mn>2</mn>
          </msub>
        </mrow>
      </math>
<h3>Font family: FSNeohellenicMath</h5>
<math display="block" class="tml-display" style="display:block math;font-family:FSNeohellenicMath">
    
        <mrow>
          <mover>
            <mi>x</mi>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mo>=</mo>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center center">
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>1</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>3</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>a</mi>
                        </mtd>
                        <mtd>
                          <mi>b</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>c</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>4</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>6</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>d</mi>
                        </mtd>
                        <mtd>
                          <mi>e</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>f</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>6</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>4</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>z</mi>
                        </mtd>
                        <mtd>
                          <mi>y</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>x</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>3</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>1</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>r</mi>
                        </mtd>
                        <mtd>
                          <mi>s</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>t</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center">
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>π</mi>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mi>π</mi>
                    <mo lspace="0em" rspace="0em">⁄</mo>
                    <mn>2</mn>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mi>π</mi>
                    <mn>3</mn>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mn>3</mn>
                    <mi>π</mi>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mrow>
                      <mi>∂</mi>
                      <mi>f</mi>
                    </mrow>
                    <mrow>
                      <mi>∂</mi>
                      <mi>t</mi>
                    </mrow>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>α</mi>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mo>+</mo>
          <mover>
            <msup>
              <mi>z</mi>
              <mi>T</mi>
            </msup>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mover>
            <mi>g</mi>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center center">
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>1</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>3</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>a</mi>
                        </mtd>
                        <mtd>
                          <mi>b</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>c</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>4</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>6</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>d</mi>
                        </mtd>
                        <mtd>
                          <mi>e</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>f</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>6</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>4</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>z</mi>
                        </mtd>
                        <mtd>
                          <mi>y</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>x</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>3</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>1</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>r</mi>
                        </mtd>
                        <mtd>
                          <mi>s</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>t</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center">
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>π</mi>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mi>π</mi>
                    <mo lspace="0em" rspace="0em">⁄</mo>
                    <mn>2</mn>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mi>π</mi>
                    <mn>3</mn>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mn>3</mn>
                    <mi>π</mi>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mrow>
                      <mi>∂</mi>
                      <mi>f</mi>
                    </mrow>
                    <mrow>
                      <mi>∂</mi>
                      <mi>t</mi>
                    </mrow>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>α</mi>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mo>+</mo>
          <mrow>
            <munderover>
              <mo movablelimits="false">∑</mo>
              <mrow>
                <mi>i</mi>
                <mo>=</mo>
                <mover>
                  <msub>
                    <mi>x</mi>
                    <mn>0</mn>
                  </msub>
                  <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
                </mover>
              </mrow>
              <mover>
                <msub>
                  <mi>x</mi>
                  <mi>n</mi>
                </msub>
                <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
              </mover>
            </munderover>
          </mrow>
          <mi>g</mi>
          <mo form="prefix" stretchy="false">(</mo>
          <msub>
            <mover>
              <mi>x</mi>
              <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
            </mover>
            <mi>i</mi>
          </msub>
          <mo form="postfix" stretchy="false">)</mo>
          <msub>
            <mrow>
              <mi mathvariant="normal">Λ</mi>
            </mrow>
            <mn>2</mn>
          </msub>
        </mrow>
      </math>
<h3>Font family: STIXTwo</h5>
<math display="block" class="tml-display" style="display:block math;font-family:STIXTwo">
    
        <mrow>
          <mover>
            <mi>x</mi>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mo>=</mo>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center center">
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>1</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>3</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>a</mi>
                        </mtd>
                        <mtd>
                          <mi>b</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>c</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>4</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>6</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>d</mi>
                        </mtd>
                        <mtd>
                          <mi>e</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>f</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>6</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>4</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>z</mi>
                        </mtd>
                        <mtd>
                          <mi>y</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>x</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>3</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>1</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>r</mi>
                        </mtd>
                        <mtd>
                          <mi>s</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>t</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center">
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>π</mi>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mi>π</mi>
                    <mo lspace="0em" rspace="0em">⁄</mo>
                    <mn>2</mn>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mi>π</mi>
                    <mn>3</mn>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mn>3</mn>
                    <mi>π</mi>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mrow>
                      <mi>∂</mi>
                      <mi>f</mi>
                    </mrow>
                    <mrow>
                      <mi>∂</mi>
                      <mi>t</mi>
                    </mrow>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>α</mi>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mo>+</mo>
          <mover>
            <msup>
              <mi>z</mi>
              <mi>T</mi>
            </msup>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mover>
            <mi>g</mi>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center center">
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>1</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>3</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>a</mi>
                        </mtd>
                        <mtd>
                          <mi>b</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>c</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>4</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>6</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>d</mi>
                        </mtd>
                        <mtd>
                          <mi>e</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>f</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>6</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>4</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>z</mi>
                        </mtd>
                        <mtd>
                          <mi>y</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>x</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>3</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>1</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>r</mi>
                        </mtd>
                        <mtd>
                          <mi>s</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>t</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center">
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>π</mi>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mi>π</mi>
                    <mo lspace="0em" rspace="0em">⁄</mo>
                    <mn>2</mn>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mi>π</mi>
                    <mn>3</mn>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mn>3</mn>
                    <mi>π</mi>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mrow>
                      <mi>∂</mi>
                      <mi>f</mi>
                    </mrow>
                    <mrow>
                      <mi>∂</mi>
                      <mi>t</mi>
                    </mrow>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>α</mi>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mo>+</mo>
          <mrow>
            <munderover>
              <mo movablelimits="false">∑</mo>
              <mrow>
                <mi>i</mi>
                <mo>=</mo>
                <mover>
                  <msub>
                    <mi>x</mi>
                    <mn>0</mn>
                  </msub>
                  <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
                </mover>
              </mrow>
              <mover>
                <msub>
                  <mi>x</mi>
                  <mi>n</mi>
                </msub>
                <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
              </mover>
            </munderover>
          </mrow>
          <mi>g</mi>
          <mo form="prefix" stretchy="false">(</mo>
          <msub>
            <mover>
              <mi>x</mi>
              <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
            </mover>
            <mi>i</mi>
          </msub>
          <mo form="postfix" stretchy="false">)</mo>
          <msub>
            <mrow>
              <mi mathvariant="normal">Λ</mi>
            </mrow>
            <mn>2</mn>
          </msub>
        </mrow>
      </math>
<h3>Font family: TexGyreSchola</h5>
<math display="block" class="tml-display" style="display:block math;font-family:TexGyreSchola">
    
        <mrow>
          <mover>
            <mi>x</mi>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mo>=</mo>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center center">
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>1</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>3</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>a</mi>
                        </mtd>
                        <mtd>
                          <mi>b</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>c</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>4</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>6</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>d</mi>
                        </mtd>
                        <mtd>
                          <mi>e</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>f</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>6</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>4</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>z</mi>
                        </mtd>
                        <mtd>
                          <mi>y</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>x</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>3</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>1</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>r</mi>
                        </mtd>
                        <mtd>
                          <mi>s</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>t</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center">
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>π</mi>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mi>π</mi>
                    <mo lspace="0em" rspace="0em">⁄</mo>
                    <mn>2</mn>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mi>π</mi>
                    <mn>3</mn>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mn>3</mn>
                    <mi>π</mi>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mrow>
                      <mi>∂</mi>
                      <mi>f</mi>
                    </mrow>
                    <mrow>
                      <mi>∂</mi>
                      <mi>t</mi>
                    </mrow>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>α</mi>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mo>+</mo>
          <mover>
            <msup>
              <mi>z</mi>
              <mi>T</mi>
            </msup>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mover>
            <mi>g</mi>
            <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
          </mover>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center center">
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>1</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>3</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>a</mi>
                        </mtd>
                        <mtd>
                          <mi>b</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>c</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>4</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>6</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>d</mi>
                        </mtd>
                        <mtd>
                          <mi>e</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>f</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>6</mn>
                        </mtd>
                        <mtd>
                          <mn>5</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>4</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>z</mi>
                        </mtd>
                        <mtd>
                          <mi>y</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>x</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
                <mtd style="padding-right:0em;">
                  <mrow>
                    <mo fence="true" form="prefix">(</mo>
                    <mtable columnalign="center center center">
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mn>3</mn>
                        </mtd>
                        <mtd>
                          <mn>2</mn>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mn>1</mn>
                        </mtd>
                      </mtr>
                      <mtr>
                        <mtd style="padding-left:0em;">
                          <mi>r</mi>
                        </mtd>
                        <mtd>
                          <mi>s</mi>
                        </mtd>
                        <mtd style="padding-right:0em;">
                          <mi>t</mi>
                        </mtd>
                      </mtr>
                    </mtable>
                    <mo fence="true" form="postfix">)</mo>
                  </mrow>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix">[</mo>
            <mtable columnalign="center">
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>π</mi>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mi>π</mi>
                    <mo lspace="0em" rspace="0em">⁄</mo>
                    <mn>2</mn>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mi>π</mi>
                    <mn>3</mn>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mrow>
                    <mn>3</mn>
                    <mi>π</mi>
                  </mrow>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mfrac>
                    <mrow>
                      <mi>∂</mi>
                      <mi>f</mi>
                    </mrow>
                    <mrow>
                      <mi>∂</mi>
                      <mi>t</mi>
                    </mrow>
                  </mfrac>
                </mtd>
              </mtr>
              <mtr>
                <mtd style="padding-left:0em;padding-right:0em;">
                  <mi>α</mi>
                </mtd>
              </mtr>
            </mtable>
            <mo fence="true" form="postfix">]</mo>
          </mrow>
          <mo>+</mo>
          <mrow>
            <munderover>
              <mo movablelimits="false">∑</mo>
              <mrow>
                <mi>i</mi>
                <mo>=</mo>
                <mover>
                  <msub>
                    <mi>x</mi>
                    <mn>0</mn>
                  </msub>
                  <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
                </mover>
              </mrow>
              <mover>
                <msub>
                  <mi>x</mi>
                  <mi>n</mi>
                </msub>
                <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
              </mover>
            </munderover>
          </mrow>
          <mi>g</mi>
          <mo form="prefix" stretchy="false">(</mo>
          <msub>
            <mover>
              <mi>x</mi>
              <mo stretchy="false" style="transform:scale(0.75) translate(10%, 30%);">→</mo>
            </mover>
            <mi>i</mi>
          </msub>
          <mo form="postfix" stretchy="false">)</mo>
          <msub>
            <mrow>
              <mi mathvariant="normal">Λ</mi>
            </mrow>
            <mn>2</mn>
          </msub>
        </mrow>
      </math></p>
<p>The parenthesis behaviour on the multiline parts is a bit heptic on Chrome, on the other hand Firefox works fine with all of them.</p>
<p>The problem with Firefox is that it doesn&rsquo;t recognize the <code>max-width=100%</code> and <code>overflow: auto hidden</code> so it goes beyond the page layout in the MathML sections, while Katex works just fine. If you know if that&rsquo;s a bug in Firefox or an error of mine please get in touch with me.</p>
<p>One solution might be to try to keep all the math parts as compact as possible while using one of the working fonts but that&rsquo;s really limiting tbh.</p>
<p>For now I decided to reamain on client-side Katex with default output settings, despite the overhead of the JS library the user experience and mantainability is just better that way.</p>]]></content><preview>What is the state of MathML in 2023? Can we finally use it and forget about MathJax or Katex for the time being?</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="mathml" label="mathml"/><category scheme="taxonomy:Tags" term="katex" label="katex"/></entry><entry><title type="html">Static Preload</title><link href="https://blog.icpmol.es/posts/static-preload/theory/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/posts/static-preload/theory/</id><section>Post</section><published>2023-11-18T21:44:03+01:00</published><updated>2023-11-18T21:44:03+01:00</updated><content type="html"><![CDATA[<p>A simple method to calculate the static preload in a lumped body multi Degrees of Freedom system</p>
<h2 id="tldr"><a class="anchor  mark-html" href="#tldr">tl,dr:</a></h2>

  
  
    <blockquote class="alert alert-tip">
      <p class="alert-heading">
        💡
        Tip
      </p>
      <p><strong>Final Formula</strong>
Given a system of 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?s"/>
</span>
 springs and 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?n"/>
</span>
 bodies in 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?N"/>
</span>
 degrees of freedom, we can calculate the static preload of our springs at equilibrium by:
</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%20%7b%5cDelta%20l_o%7d%20%3d%20%5bA%5d%5e%7b-1%7d%5bb%5d%20"/>
<p>with 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%20%7b%5cDelta%20l_o%7d%20"/>
</span>
 as the vector of our 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?s"/>
</span>
 ordered solution, with</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5bA%5d%3d%5b%5clambda_k%5d%5eT%5bk_%7bph%7d%5d"/>
<p> and </p>

  <img src="https://latex.codecogs.com/png.latex?%5bb%5d%3d-g%5b%5clambda_g%5d%5eT%5cvec%20m_%7bph%7d%20"/>
<p>
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%5b%5clambda_k%5d"/>
</span>
 is our standard lagrangian matrix for the springs, 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%5b%5clambda_g%5d"/>
</span>
 instead is built by selecting the components of vertical displacement from 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%5b%5clambda_m%5d"/>
</span>
 (lagrangian matrix of the inertial terms) and 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%5cvec%20m_%7bph%7d"/>
</span>
 as the list of masses in column form.</p>
    </blockquote>
  <h2 id="proof-1-dof-case"><a class="anchor  mark-html" href="#proof-1-dof-case">Proof 1-DOF case</a></h2>
<p>Let&rsquo;s start by defining our problem. 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?x"/>
</span>
 is our free coordinate, so we have:</p>

  <img src="https://latex.codecogs.com/png.latex?%20V%28x%29%20%3d%20V_k%28x%29%20%2b%20V_g%28x%29%20"/>
<p>
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?V"/>
</span>
 is the potential energy of our system and it can be divided into an elastic component 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20V_k%20"/>
</span>
 and a gravitational component 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20V_g%20"/>
</span>
.</p>
<p>The equilibrium is defined as the point 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?x_0"/>
</span>
 so that </p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cfrac%7b%5cpartial%20V%7d%7b%5cpartial%20x%7d%5crvert_%7bx_0%7d%3d0%20"/>
<p>
</p>

  <img src="https://latex.codecogs.com/png.latex?%20%20%5cfrac%7b%5cpartial%20V_k%7d%7b%5cpartial%20x%7d%5crvert_%7bx_0%7d%2b%5cfrac%7b%5cpartial%20V_g%7d%7b%5cpartial%20x%7d%5crvert_%7bx_0%7d%3d0%20"/>
<p>To simplify our math let&rsquo;s suppose that 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?x_0%3d0"/>
</span>
 (it&rsquo;s a simple change of coordinates that will help in the N-dof case).</p>
<p>The first step is to derive the components of the potential energy:</p>
<h3 id="elastic-energy-1-dof"><a class="anchor  mark-html" href="#elastic-energy-1-dof">Elastic energy 1-dof</a></h3>
<p>
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?V_k"/>
</span>
 describes the energy stored in an ideal linear spring with Hooke&rsquo;s coefficient 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?k"/>
</span>
 subject to a deformation 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20%5cDelta%20l"/>
</span>
</p>

  <img src="https://latex.codecogs.com/png.latex?%20V_k%28x%29%20%3d%20%5csum_%7bi%3d1%7d%5e%7bs%7d%20%5cfrac%7b1%7d%7b2%7d%20k_i%20%5cDelta%20l_i%5e2%28x%29%20"/>
<p>We can ignore the index for now and express 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20%5cDelta%20l%20%28x%29"/>
</span>
 as 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20%5cDelta%20l%28x%29%20%3d%20l%28x%29%20-%20l_r%20"/>
</span>
, with 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?l%28x%29"/>
</span>
 as the total length of our spring and 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?l_r"/>
</span>
 as the initial length of the spring at resting position, thus giving us the convention of positive sign for tension and negative sign for compression of our spring.</p>
<p>We can expand it as: </p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cDelta%20l%28x%29%20%5capprox%20%5cDelta%20l%280%29%20%2b%20%5cfrac%7b%5cpartial%20%5cDelta%20l%20%7d%7b%5cpartial%20x%7d%5crvert_%7bx%3d0%7d%20x%20%2b%5cfrac%7b1%7d%7b2%7d%5cfrac%7b%5cpartial%5e2%20%5cDelta%20l%20%7d%7b%5cpartial%20x%5e2%7d%5crvert_%7bx%3d0%7d%20x%5e2%20%3d%5cDelta%20l_0%20%2b%20%5clambda_k%280%29x%20%2b%20%5cfrac%7b1%7d%7b2%7d%5cnu_k%280%29x%5e2%20"/>
<p>We are going to square and derive this expression, so every term of 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?x"/>
</span>
 with power greater or equal than two 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20%5c%7b%20x%5en%20%3a%20n%5cgeq%202%20%5c%7d%20"/>
</span>
 is going to show up as a function of 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?x%5e%7bn-1%7d"/>
</span>
 and when evaluated at 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?x%3d0"/>
</span>
 they simply dissapear.
</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cDelta%20l%28x%29%5crvert_%7bx%3d0%7d%20%5capprox%20%5cDelta%20l_0%20%2b%20%5clambda_k%280%29x%20%3d%20%5cDelta%20l_0%20%2b%20%5clambda_%7bk0%7d%20x%20%20"/>
<p>
When putting it back into the sum we get:</p>

  <img src="https://latex.codecogs.com/png.latex?%20V_k%28x%29%20%5crvert_%7bx%3d0%7d%20%5capprox%20%5csum_%7bi%3d1%7d%5e%7bs%7d%20%5cfrac%7b1%7d%7b2%7d%20k_i%20%28%5cDelta%20l_%7bi0%7d%20%2b%20%5clambda_%7bik0%7d%20x%20%29%5e2%20%3d%20%5csum_%7bi%3d1%7d%5e%7bs%7d%20%5cfrac%7b1%7d%7b2%7d%20k_i%20%28%5cDelta%20l_%7bi0%7d%5e2%20%2b%20%5clambda_%7bik0%7d%5e2%20x%5e2%20%2b%202%20%5cDelta%20l_%7bi0%7d%20%5clambda_%7bik0%7d%20x%20%29%20"/>
<p>Let&rsquo;s evaluate the derivative in respect to 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?x"/>
</span>
:</p>
<p>
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%5cDelta%20l_0%5e2"/>
</span>
 is a constant and gets eliminated by the derivative, the other sqare term becomes 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%5clambda_%7bk0%7d%5e2%20x"/>
</span>
 and goes to zero when evaluated at 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?x%3d0"/>
</span>
, so only the mixed term 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?2%5cDelta%20l_o%20%5clambda_%7bk0%7d%20x"/>
</span>
 survives and the derivative becomes:</p>

  <img src="https://latex.codecogs.com/png.latex?%20%20%5cfrac%20%7b%5cpartial%20V_k%20%7d%7b%5cpartial%20x%7d%5crvert_%7bx%3d0%7d%3d%20%5csum_%7bi%3d1%7d%5es%20k_i%20%5cDelta%20l_%7bi0%7d%20%5clambda_%7bik0%7d%20%20"/>
<p>We can rewrite this in vector form as:</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5bk_%7bph%7d%5d%20%3d%20diag%28k_1%3b%20k_2%3b%20...%20%3b%20k_s%29%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%20%7b%5cDelta%20l_0%20%7d%20%3d%20%5b%20%5cDelta%20l_%7b10%7d%3b%20%5cDelta%20l_%7b20%7d%3b%20...%20%3b%20%5cDelta%20l_%7bs0%7d%5d%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%20%5clambda_%7bk%7d%20%3d%20%5b%5clambda_%7b1k%7d%3b%5clambda_%7b2k%7d%3b...%3b%5clambda_%7bsk%7d%5d%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20%20%5cfrac%7b%5cpartial%20V_g%28x%29%7d%7b%5cpartial%20x%7d%5crvert_%7bx%3d0%7d%20%3d%20%5cvec%20%5clambda_%7bk%7d%5eT%20%5bk_%7bph%7d%5d%20%5cvec%20%7b%5cDelta%20l_0%20%7d%20"/>
<h3 id="gravitational-energy-1-dof"><a class="anchor  mark-html" href="#gravitational-energy-1-dof">Gravitational energy 1-dof</a></h3>

  <img src="https://latex.codecogs.com/png.latex?%20V_g%28x%29%20%3d%20g%20%5csum_%7bj%3d1%7d%5en%20m_j%20h_j%28x%29%20"/>
<p>This expresses the total gravitational energy in our system supposing 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?n"/>
</span>
 bodies with mass 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?m_j"/>
</span>
 and height 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?h_j"/>
</span>
 measured from an arbitrary system of coordinates.</p>
<p>Applying the same concepts as the elastic term we get:</p>

  <img src="https://latex.codecogs.com/png.latex?%20h%28x%29%5crvert_%7bx%3d0%7d%20%5capprox%20h%28x%29%5crvert_%7b0%7d%2b%5cfrac%7b%5cpartial%20h%7d%7b%5cpartial%20x%7d%5crvert_%7b0%7dx%2b%5cfrac%7b1%7d%7b2%7d%5cfrac%7b%5cpartial%5e2%20h%7d%7b%5cpartial%20x%5e2%7d%5crvert_%7b0%7d%20x%5e2%20%20"/>
<p>Let&rsquo;s focus on the lower order terms and we get:</p>

  <img src="https://latex.codecogs.com/png.latex?%20h%28x%29%5crvert_%7bx%3d0%7d%20%5capprox%20h_%7b0%7d%2b%5clambda_gx"/>
<p>In this context 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%5clambda_g"/>
</span>
 is the linearized displacement of the height at equilibrium.</p>

  <img src="https://latex.codecogs.com/png.latex?%20V_g%28x%29%20%3d%20g%20%5csum_%7bj%3d1%7d%5en%20m_j%20%28h_%7bj0%7d%2b%5clambda_%7bjg%7dx%29%20"/>
<p>Deriving it we get</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cfrac%7b%5cpartial%20V_g%28x%29%7d%7b%5cpartial%20x%7d%5crvert_%7bx%3d0%7d%3dg%20%5csum_%7bj%3d1%7d%5en%20m_j%20%5clambda_%7bjg%7d%20"/>
<p>Let&rsquo;s put everything in vector form</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%20%7bm_%7bph%7d%7d%20%3d%20%20%5cbegin%7bbmatrix%7d%0a%20%20%20m_1%20%5c%5c%20m_2%20%5c%5c%20%5cvdots%20%5c%5c%20m_n%0a%5cend%7bbmatrix%7d%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%20%5clambda_%7bg%7d%20%3d%0a%5cbegin%7bbmatrix%7d%0a%20%20%20%5clambda_%7b1g%7d%20%5c%5c%20%5clambda_%7b2g%7d%5c%5c%20%5cvdots%20%5c%5c%20%5clambda_%7bng%7d%0a%5cend%7bbmatrix%7d%20%0a%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20%20%5cfrac%7b%5cpartial%20V_g%28x%29%7d%7b%5cpartial%20x%7d%5crvert_%7bx%3d0%7d%20%3d%20g%20%5cvec%20%5clambda_%7bg%7d%5eT%20%5cvec%20%7bm_%7bph%7d%7d%20%20"/>
<h3 id="final-expression"><a class="anchor  mark-html" href="#final-expression">Final expression</a></h3>

  <img src="https://latex.codecogs.com/png.latex?%20%20%5cfrac%7b%5cpartial%20V_k%7d%7b%5cpartial%20x%7d%5crvert_%7bx_0%7d%2b%5cfrac%7b%5cpartial%20V_g%7d%7b%5cpartial%20x%7d%5crvert_%7bx_0%7d%3d0%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20%20%5cvec%20%5clambda_%7bk%7d%5eT%20%5bk_%7bph%7d%5d%20%5cvec%20%7b%5cDelta%20l_0%20%7d%20%2b%20g%20%5cvec%20%5clambda_%7bg%7d%5eT%20%5cvec%20%7bm_%7bph%7d%7d%20%3d%200%20"/>
<p>To find 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20%20%5cvec%20%7b%5cDelta%20l_0%20%7d%20"/>
</span>
 we just rearrange it as:</p>

  <img src="https://latex.codecogs.com/png.latex?%20%20%5cvec%20%7b%5cDelta%20l_0%20%7d%20%20%3d%20-g%28%5cvec%20%5clambda_%7bk%7d%5eT%20%5bk_%7bph%7d%5d%29%5e%7b-1%7d%20%5cvec%20%5clambda_%7bg%7d%5eT%20%5cvec%20%7bm_%7bph%7d%7d%20%3d%20%5bA%5d%5e%7b-1%7d%5cvec%20b%20"/>
<h2 id="n-dof-case"><a class="anchor  mark-html" href="#n-dof-case">N-DOF case</a></h2>
<p>We follow the same procedure but now we have additional dimensions for our 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%5cvec%20x"/>
</span>
:</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%20x%20%3d%0a%5cbegin%7bbmatrix%7d%0a%20%20%20x_1%20%5c%5c%20x_2%20%5c%5c%20%5cvdots%20%5c%5c%20x_N%0a%5cend%7bbmatrix%7d%20%0a%20"/>
<p>So we need to evaluate the gradient of our potential energy funcion for the equilibrium:</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cfrac%7b%5cpartial%20V%28%5cvec%20x%29%7d%7b%5cpartial%20%5cvec%20x%7d%5crvert_%7b%5cvec%20x%3d%20%5cvec%200%7d%20%3d%0a%5cbegin%7bbmatrix%7d%0a%20%20%20%5cfrac%7b%5cpartial%20V%28%5cvec%20x%29%7d%7b%5cpartial%20%20x_1%7d%20%5c%5c%0a%20%20%20%5cfrac%7b%5cpartial%20V%28%5cvec%20x%29%7d%7b%5cpartial%20%20x_2%7d%20%5c%5c%20%0a%20%20%20%5cvdots%20%5c%5c%20%0a%20%20%20%5cfrac%7b%5cpartial%20V%28%5cvec%20x%29%7d%7b%5cpartial%20%20x_N%7d%0a%5cend%7bbmatrix%7d%5crvert_%7b%5cvec%20x%3d%20%5cvec%200%7d%20%20%3d%5cvec%200"/>

  <img src="https://latex.codecogs.com/png.latex?%20%5cnabla%20V%28%5cvec%20x%29%5crvert_%7b%5cvec%20x%3d%20%5cvec%200%7d%20%3d%20%5cnabla%20V_k%28%5cvec%20x%29%5crvert_%7b%5cvec%20x%3d%20%5cvec%200%7d%20%2b%20%5cnabla%20V_g%28%5cvec%20x%29%5crvert_%7b%5cvec%20x%3d%20%5cvec%200%7d%20%3d%20%5cvec%200"/>
<h3 id="elastic-energy"><a class="anchor  mark-html" href="#elastic-energy">Elastic energy</a></h3>

  <img src="https://latex.codecogs.com/png.latex?%20V_k%20%28%5cvec%20x%29%3d%5cfrac%7b1%7d%7b2%7d%5csum_%7bi%3d1%7d%5e%7bs%7dk_i%5cDelta%20l_i%5e2%28%5cvec%20x%29%20%3d%0a%5cfrac%7b1%7d%7b2%7d%20%5cvec%7b%5cDelta%20l_0%7d%5eT%20%28%5cvec%20x%29%20k_%7bph%7d%20%5cvec%7b%5cDelta%20l_0%28%5cvec%20x%29%7d%0a"/>
<p>with</p>

  <img src="https://latex.codecogs.com/png.latex?%20k_%7bph%7d%3ddiag%28k1%2ck2%2c...%2cks%29"/>
<p>
</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%7b%5cDelta%20l_0%7d%28%5cvec%20x%29%20%3d%20%5cbegin%7bbmatrix%7d%0a%20%20%20%5cDelta%20l_%7b10%7d%28%5cvec%20x%29%20%5c%5c%0a%20%20%20%5cDelta%20l_%7b20%7d%28%5cvec%20x%29%20%5c%5c%20%0a%20%20%20%5cvdots%20%5c%5c%20%0a%20%20%20%5cDelta%20l_%7bN0%7d%28%5cvec%20x%29%0a%5cend%7bbmatrix%7d%0a%20"/>
<p>As usual we expand our 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%5cDelta%20l%28%5cvec%20x%29"/>
</span>
 near the equilibrium:</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%7b%5cDelta%20l%28%5cvec%20x%29%7d%20%5crvert_%7b%5cvec%20x%3d%5cvec%200%7d%20%5capprox%20%5cvec%20%7b%5cDelta%20l%28%5cvec%200%29%7d%20%2b%20%5cfrac%7b%5cpartial%20%5cDelta%20l%20%7d%7b%5cpartial%20%5cvec%20x%7d%5crvert_%7b%5cvec%20x%3d%20%5cvec%200%7d%20%5cvec%20x%20%2b%5cfrac%7b1%7d%7b2%7d%5cfrac%7b%5cpartial%5e2%20%5cDelta%20l%20%7d%7b%5cpartial%20x%5e2%7d%5crvert_%7b%5cvec%20x%3d%20%5cvec%200%7d%20%5cvec%20x%5e2%20%3d%20%5cvec%7b%5cDelta%20l_0%7d%20%2b%20%5b%5clambda_k%280%29%5d%5cvec%20x%20%2b%20%5cfrac%7b1%7d%7b2%7d%5cvec%20x%5eT%5b%5cnu_k%280%29%5d%5cvec%20x%20"/>
<p>and we simplify it as:
</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%7b%5cDelta%20l%28%5cvec%20x%29%7d%5crvert_%7b%5cvec%20x%3d%5cvec%200%7d%20%5capprox%20%5cvec%7b%5cDelta%20l_0%7d%20%2b%20%5b%5clambda_k%280%29%5d%20%5cvec%20x%20%3d%20%5cvec%7b%5cDelta%20l_0%7d%20%2b%20%5b%5clambda_%7bk0%7d%5d%20%5cvec%20x%20%20"/>
<p>Plugging it into the initial equation we get:</p>

  <img src="https://latex.codecogs.com/png.latex?%20V_k%20%28%5cvec%20x%29%20%5crvert_%7b%5cvec%20x%3d%5cvec%200%7d%20%20%5capprox%0a%5cfrac%7b1%7d%7b2%7d%20%28%5cvec%20%7b%5cDelta%20l_%7b0%7d%7d%20%2b%20%5b%5clambda_%7bk0%7d%5d%20%5cvec%20x%29%5eT%20%20%5bk_%7bph%7d%5d%20%28%5cvec%20%7b%5cDelta%20l_%7b0%7d%7d%20%2b%20%5b%5clambda_%7bk0%7d%5d%20%5cvec%20x%29%20%3d%20"/>
<p>
</p>

  <img src="https://latex.codecogs.com/png.latex?%20%3d%20%5cfrac%7b1%7d%7b2%7d%28%0a%5cvec%20x%5eT%5b%5clambda_%7bk0%7d%5d%5eT%20%20%5bk_%7bph%7d%5d%20%5b%5clambda_%7bk0%7d%5d%20%5cvec%20x%20%2b%0a%5cvec%20%7b%5cDelta%20l_%7b0%7d%7d%5eT%5bk_%7bph%7d%5d%20%5cvec%20%7b%5cDelta%20l_%7b0%7d%7d%20%2b%0a%5cvec%20%7b%5cDelta%20l_%7b0%7d%7d%5eT%5bk_%7bph%7d%5d%20%20%5b%5clambda_%7bk0%7d%5d%20%5cvec%20x%20%2b%20%0a%5cvec%20x%5eT%5b%5clambda_%7bk0%7d%5d%5eT%20%20%5bk_%7bph%7d%5d%20%5cvec%20%7b%5cDelta%20l_%7b0%7d%7d%20%29%0a"/>
<p>Like for our 1-DOF case the only terms that survive the gradient are the mixed ones:</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cnabla%20V_k%5crvert_%7b%5cvec%20x%3d%20%5cvec%200%7d%3d%20%20%5cfrac%7b%5cpartial%20V_k%7d%7b%5cpartial%20%5cvec%20x%7d%20%28%5cvec%20x%29%20%5crvert_%7b%5cvec%20x%3d%5cvec%200%7d%20%20%5capprox%0a%5cfrac%7b1%7d%7b2%7d%20%28%5cvec%20%7b%5cDelta%20l_%7b0%7d%7d%5eT%5bk_%7bph%7d%5d%20%20%5b%5clambda_%7bk0%7d%5d%20%2b%20%5b%5clambda_%7bk0%7d%5d%5eT%20%20%5bk_%7bph%7d%5d%20%5cvec%20%7b%5cDelta%20l_%7b0%7d%7d%20%29%20%3d%20%5b%5clambda_%7bk0%7d%5d%5eT%20%20%5bk_%7bph%7d%5d%20%5cvec%20%7b%5cDelta%20l_%7b0%7d%7d%0a"/>

  
  
    <blockquote class="alert alert-note">
      <p class="alert-heading">
        ℹ️
        Note
      </p>
      <p>For 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20x%2cy%20%5cin%20%5cmathbb%7bR%7d%5c_%7bn%2c1%7d%20"/>
</span>
  and 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20%20%5bS%5d%20%5cin%20%5cmathbb%7bR%7d_%7bn%2cn%7d%20"/>
</span>
.</p>
<p>Then 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%20x%5eT%5bS%5dy%20"/>
</span>
 is just a scalar. So:
</p>

  <img src="https://latex.codecogs.com/png.latex?%20%28x%5eT%5bS%5dy%29%5eT%3dx%5eT%5bS%5dy%20"/>
<p>If 
<span class="inlinemath">
  <img src="https://latex.codecogs.com/png.latex?%5bS%5d"/>
</span>
 is symmetric:
</p>

  <img src="https://latex.codecogs.com/png.latex?%20x%5eT%5bS%5dy%3d%28x%5eT%5bS%5dy%29%5eT%3dy%5eT%5bS%5d%5eTx%3dy%5eT%5bS%5dx%20%20"/>
    </blockquote>
  <h3 id="gravitational-energy"><a class="anchor  mark-html" href="#gravitational-energy">Gravitational Energy</a></h3>
<p>This must be straightforward now if you understood the past passages but for completeness let&rsquo;s write them down:</p>

  <img src="https://latex.codecogs.com/png.latex?%20V_g%28%5cvec%20x%29%20%3d%20g%20%20%20%5cvec%20h%28%5cvec%20x%29%5eT%20%5cvec%20%7bm_%7bph%7d%7d%20"/>
<p>with</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%20m_%7bph%7d%3d%20%20%5cbegin%7bbmatrix%7d%0a%20%20%20m_1%20%5c%5c%20m_2%20%5c%5c%20%5cvdots%20%5c%5c%20m_n%0a%5cend%7bbmatrix%7d%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%20h%28%5cvec%20x%29%20%3d%20%20%5cbegin%7bbmatrix%7d%0a%20%20%20h_1%28%5cvec%20x%29%20%5c%5c%20h_2%28%5cvec%20x%29%20%5c%5c%20%5cvdots%20%5c%5c%20h_n%28%5cvec%20x%29%0a%5cend%7bbmatrix%7d%20"/>
<p>Expanding the height we get:</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%20h%28%5cvec%20x%29%5crvert_%7b%5cvec%20x%3d%5cvec%200%7d%20%5capprox%20%5cvec%20h%28%5cvec%20x%29%5crvert_%7b%5cvec%200%7d%2b%5cfrac%7b%5cpartial%20%5cvec%20h%7d%7b%5cpartial%20%5cvec%20x%7d%5crvert_%7b%5cvec%200%7d%5cvec%20x%2b%5cfrac%7b1%7d%7b2%7d%5cfrac%7b%5cpartial%5e2%20h%7d%7b%5cpartial%20%5cvec%20x%20%5cpartial%20%5cvec%20x%7d%5crvert_%7b%5cvec%200%7d%20%5cvec%20x%5e2%20%20%3d%20%5cvec%20h_0%20%2b%20%5b%5clambda_k%280%29%5d%5cvec%20x%2b%20%5cfrac%7b1%7d%7b2%7d%5cvec%20x%5eT%5b%5cnu_k%280%29%5d%5cvec%20x"/>
<p>Picking just the linear and terms we get:</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%20h%28%5cvec%20x%29%5crvert_%7b%5cvec%20x%3d%5cvec%200%7d%20%5capprox%20%5cvec%20h_%7b0%7d%2b%5b%5clambda_g%5d%5cvec%20x"/>
<p>Transposing and putting it back in the original energy expression we get:</p>

  <img src="https://latex.codecogs.com/png.latex?%20V_g%28%5cvec%20x%29%5crvert_%7b%5cvec%200%7d%20%3d%20g%20%28%20%5cvec%20h_0%5eT%20%2b%20%5cvec%20x%5eT%20%5b%5clambda_g%5d%5eT%29%5cvec%20%7bm_%7bph%7d%7d%20"/>
<p>Deriving it we get</p>

  <img src="https://latex.codecogs.com/png.latex?%20%5cnabla%20V_g%5crvert_%7b%5cvec%20x%3d%20%5cvec%200%7d%20%3d%20%5cfrac%7b%5cpartial%20V_g%28%5cvec%20x%29%7d%7b%5cpartial%20%5cvec%20x%7d%5crvert_%7bx%3d0%7d%3dg%20%20%20%5b%5clambda_g%5d%5eT%20%5cvec%7bm_%7bph%7d%7d%20"/>
<h3 id="final-formula"><a class="anchor  mark-html" href="#final-formula">Final formula</a></h3>

  <img src="https://latex.codecogs.com/png.latex?%20%5cnabla%20V%5crvert_%7b%5cvec%20x%3d%20%5cvec%200%7d%20%20%3d%20%5cnabla%20V_k%5crvert_%7b%5cvec%20x%3d%20%5cvec%200%7d%20%2b%20%5cnabla%20V_g%5crvert_%7b%5cvec%20x%3d%20%5cvec%200%7d%20%3d%200%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20%5b%5clambda_%7bk0%7d%5d%5eT%20%20%5bk_%7bph%7d%5d%20%5cvec%20%7b%5cDelta%20l_%7b0%7d%7d%20%3d%20-g%20%20%20%5b%5clambda_g%5d%5eT%20%5cvec%7bm_%7bph%7d%7d%20%20%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20%5ctext%7blet%20%7d%20%20%5bA%5d%3d%5b%5clambda_%7bk0%7d%5d%5eT%20%20%5bk_%7bph%7d%5d%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20%5ctext%7blet%20%7d%20%20%5cvec%20b%20%3d%20-g%20%20%20%5b%5clambda_g%5d%5eT%20%5cvec%7bm_%7bph%7d%7d%20"/>

  <img src="https://latex.codecogs.com/png.latex?%20%5cvec%20%7b%5cDelta%20l_%7b0%7d%7d%20%3d%20%5bA%5d%5e%7b-1%7d%5cvec%20b%20"/>]]></content><preview>A simple method to calculate the static preload in a lumped body multi Degrees of Freedom system</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="dynamics-of-mechanical-systems" label="Dynamics of Mechanical Systems"/></entry><entry><title type="html">The unrequested GIF</title><link href="https://blog.icpmol.es/posts/gif-fallback/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/posts/gif-fallback/</id><section>Post</section><published>2021-10-05T15:41:17+02:00</published><updated>2021-10-05T15:41:17+02:00</updated><content type="html"><![CDATA[<p>While developing my GIF shortcode for Hugo I stumbled upon a weird behaviour from various browsers.</p>
<p>The story<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup><sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> goes like: If you want to use videos instead of GIFs to save on bandwith for your users you can just use something like:</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">html</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">video</span> <span class="na">autoplay</span> <span class="na">loop</span> <span class="na">muted</span> <span class="na">playsinline</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">source</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;cat.webm&#34;</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;video/webm&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">source</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;cat.mp4&#34;</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;video/mp4&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;cat.gif&#34;</span><span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">video</span><span class="p">&gt;</span></span></span></code></pre></div>
</details>

<p>The <code>&lt;img src=&quot;cat.gif&quot;/&gt;</code> will behave like a fallback for browsers not supporting the <code>video</code> element or the provided formats. Just use ffmpeg to convert GIFs to MP4 and/or webm and you will have a couple of decades of video encoders developement to show animated cats in the fastest way possible.</p>
<p>But no, even if your noble intents to show animated cats to your visitors while saving their bandwith seem completed there is a problem:</p>
<p>With the code showed above <mark>all the browsers will download the video file AND the gif file</mark>, throwing outside the window your bandwith saving intents and making it worse because you&rsquo;re forcing your visitors to download an additional file, no matter how small it is.</p>
<p><a href="https://www.w3schools.com/code/tryit.asp?filename=GV5OL2D67MVS">You can try it directly</a></p>
<img 
    src="https://blog.icpmol.es/posts/gif-fallback/devtools_hu_aa26caf9a5324920.jpg"  alt="Notice the programming.gif file being downloaded before the video file"loading="lazy"
    width="944" 
    height="1273"
    />
[]<p>As you see in the screen above the browser still downloads the &ldquo;fallback&rdquo; GIF.</p>
<p>This behaviour doesn&rsquo;t seem widely reported in the &ldquo;use videos instead of gifs&rdquo; guides, staying relegated to some StackOverflow discussions <sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup><sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>.</p>
<p>How should you resolve this?</p>
<ol>
<li>
<p>Don&rsquo;t provide an <code>&lt;img&gt;</code>, just link to the GIF and ask them to update the browser to something more &ldquo;modern&rdquo;.<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup></p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">html</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">video</span> <span class="na">autoplay</span> <span class="na">loop</span> <span class="na">muted</span> <span class="na">playsinline</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">source</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;cat.webm&#34;</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;video/webm&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">source</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;cat.mp4&#34;</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;video/mp4&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>In case you browser doesn&#39;t support video files open the <span class="p">&lt;</span><span class="nt">a</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;cat.gif&#34;</span><span class="p">&gt;</span>GIF<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> in another page<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">video</span><span class="p">&gt;</span> </span></span></code></pre></div>
</details>

</li>
<li>
<p>Fix stuff server side, check the UA and provide the <code>&lt;video&gt;</code> instead of the <code>&lt;img&gt;</code> or viceversa depending on it. If your content is statically rendered then it won&rsquo;t work.</p>
</li>
<li>
<p>The <code>&lt;!--[if lt IE 9]&gt;</code><sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">6</a></sup>. This will work because the only main browsers not supporting the <code>video</code> elements are the <a href="https://caniuse.com/video">Internet Explorer previous to the 9th and Opera Mini</a>. Your code will just be</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">html</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">video</span> <span class="na">autoplay</span> <span class="na">loop</span> <span class="na">muted</span> <span class="na">playsinline</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">source</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;cat.webm&#34;</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;video/webm&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">source</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;cat.mp4&#34;</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;video/mp4&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c">&lt;!--[if lt IE 9]&gt;&lt;img src=&#34;cat.gif&#34;/&gt;&lt;![endif]--&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">video</span><span class="p">&gt;</span> </span></span></code></pre></div>
</details>

</li>
<li>
<p>No GIF fallback. Really. At the time of writing those IE versions account for a 0,06% of the broswer share. Opera Mini is a bit more used (1,19%) but I think that CanIUse uses the UA to calculate the browser usage regardless of the type of data saving enabled, while for the tests it uses the aggressive server rendering option. In the worst case scenario the 1,25% of your visitors will have a degraded experience without the animated cats. Being more realistics I will say that even before the lack of animated cats those 1,25% will have a bad time in 2021 to reach your website between expired certificates, unsupported protocols, etc. (Try downloading an <a href="https://ftp.mozilla.org/pub/firefox/releases/">old Firefox</a> version to see it by yourself).</p>
</li>
</ol>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://www.smashingmagazine.com/2018/11/gif-to-video/">Improve Animated GIF Performance With HTML5 Video</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><a href="https://rigor.com/blog/optimizing-animated-gifs-with-html5-video/#:~:text=to%20use%20our%20new%20video%2C%20we%20need%20to%20replace%20that%20with%20this%3A">Optimizing Animated GIFs by Converting to HTML5 Video</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p><a href="https://stackoverflow.com/questions/26365401/html5-fallback-images-are-being-loaded-by-the-browser-even-though-html5-video-i">HTML5 fallback images are being loaded by the browser, even though HTML5 video is supported</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p><a href="https://stackoverflow.com/questions/63108518/best-practices-to-fall-back-to-gif-for-browsers-that-dont-support-html-5-video#:~:text=note%3A%20in%20my%20browser%20at%20least%2C%20the%20image%20inside%20is%20still%20fetched%20and%20loaded">&ldquo;Note: In my browser at least, the image inside is still fetched and loaded&rdquo;</a>&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p><a href="https://cloudinary.com/blog/reduce_size_of_animated_gifs_automatically_convert_to_webm_and_mp4#html5_video_tag_with_mp4_and_webm_sources">Reducing the Size of Animated GIFs and Converting Them to WebM or MP4 Through Automation</a>&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:6">
<p><a href="https://stackoverflow.com/a/49809226">Keenly on StackOverflow</a>&#160;<a href="#fnref:6" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>]]></content><preview>While developing my GIF shortcode for Hugo I stumbled upon a weird behaviour from various browsers.</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="gif" label="gif"/><category scheme="taxonomy:Tags" term="video" label="video"/><category scheme="taxonomy:Tags" term="html" label="html"/><category scheme="taxonomy:Tags" term="fallback" label="fallback"/></entry><entry><title type="html">Enable DoH when Chrome is managed</title><link href="https://blog.icpmol.es/posts/chrome-doh/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/posts/chrome-doh/</id><section>Post</section><published>2021-05-07T09:03:07+00:00</published><updated>2021-05-07T09:03:07+00:00</updated><content type="html"><![CDATA[<p>For whatever reason your browser is locked out from changing the <abbr title="DNS over HTTPS">DoH</abbr> settings? Here is how to change the settings if you have admin permissions.</p>
<p>It happened to me to buy a new laptop. This laptop comes with all the usual OEM stuff to manage security and updates. One of those software scans every downloaded file and marks its origin. To do that the software enables the <code>GroupPolicyUsers</code> and installs an extension.</p>
<p>Ok, cool but now whenever I want to change some Chrome (or even Firefox) settings I&rsquo;m greeted with this message:</p>
<img 
    src="https://blog.icpmol.es/posts/chrome-doh/admin_warning_hu_547022d5b5ffde30.jpg"loading="lazy"
    width="882" 
    height="172"
    />
[]<p>Since I wanted to use my NextDNS account I had to fix this.</p>
<p>First try was removing the User Policy by using a simble bash script found somewhere online</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">winbatch</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-winbatch" data-lang="winbatch"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">@</span><span class="k">echo</span> off
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">IF</span> <span class="k">NOT</span> <span class="k">EXIST</span> <span class="nv">%WINDIR%</span>\\System32\\GroupPolicy <span class="k">goto</span> <span class="nl">next</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">echo</span> Deleting GroupPolicy folder...
</span></span><span class="line"><span class="cl"><span class="k">RD</span> /S /Q <span class="s2">&#34;</span><span class="nv">%WINDIR%</span><span class="s2">\\System32\\GroupPolicy&#34;</span> <span class="p">||</span> <span class="k">goto</span> <span class="nl">error</span>
</span></span><span class="line"><span class="cl"><span class="k">echo</span>.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nl">next</span>
</span></span><span class="line"><span class="cl"><span class="k">IF</span> <span class="k">NOT</span> <span class="k">EXIST</span> <span class="nv">%WINDIR%</span>\\System32\\GroupPolicyUsers <span class="k">goto</span> <span class="nl">next2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">echo</span> Deleting GroupPolicyUsers folder...
</span></span><span class="line"><span class="cl"><span class="k">RD</span> /S /Q <span class="s2">&#34;</span><span class="nv">%WINDIR%</span><span class="s2">\\System32\\GroupPolicyUsers&#34;</span> <span class="p">||</span> <span class="k">goto</span> <span class="nl">error</span>
</span></span><span class="line"><span class="cl"><span class="k">echo</span>.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nl">next2</span>
</span></span><span class="line"><span class="cl">gpupdate /force
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">pause</span>
</span></span><span class="line"><span class="cl"><span class="k">exit</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nl">error</span>
</span></span><span class="line"><span class="cl"><span class="k">echo</span>.
</span></span><span class="line"><span class="cl"><span class="k">echo</span> An unexpected error has occurred. ¨Have opened the program as an administrator (right click, run as administrator)?
</span></span><span class="line"><span class="cl"><span class="k">echo</span>.
</span></span><span class="line"><span class="cl"><span class="k">pause</span>
</span></span><span class="line"><span class="cl">exit</span></span></code></pre></div>
</details>

<p>Look at all the delete folder commands so close to <code>System32</code>, that absolutely doesn&rsquo;t make nervous.</p>
<p>But this resetted at every boot. A more robust soultion was needed.</p>
<p>Removing the OEM security software? I was afraid of breaking some weird software integration with the fingerprint and boot security software. 😅</p>
<p>Now the final solution: If you can&rsquo;t remove the User Policy use it.</p>
<p>Looking up about the various admin policies on the <a href="https://cloud.google.com/docs/chrome-enterprise/policies/?policy=DnsOverHttpsMode">Google Chrome</a> website it&rsquo;s possibile to find the ones useful for us: <code>DnsOverHttpsMode</code> and <code>DnsOverHttpsTemplates</code>.</p>
<p>Just set <code>DnsOverHttpsMode</code> to <code>secure</code> or <code>automatic</code> depending if you want it to not have an insecure fallback.</p>
<p>Then <code>DnsOverHttpsTemplates</code> you need to fill your DoH provider.</p>
<p>The <a href="https://chromeenterprise.google/policies/#DnsOverHttpsTemplates">Chrome Policy</a> is a bit confusing but you just need to take the <code>https</code> URL and add <code>/dns-query{?dns}</code> after it (<a href="https://tools.ietf.org/html/rfc8484#section-4.1.1">better explaination</a>).</p>
<p>So if NextDNS provides you with <code>https://dns.nextdns.io/123abc</code> your URL to fill is <code>https://dns.nextdns.io/123abc/dns-query{?dns}</code></p>
<p>Here is a list of various DoH providers with everything already filled in:</p>
<table>
	<thead>
			<tr>
					<th>Provider</th>
					<th>Standard</th>
					<th>Family Protection</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>AdGuard</td>
					<td><code>https://dns.adguard.com/dns-query{?dns}</code></td>
					<td><code>https://dns-family.adguard.com/dns-query{?dns}</code></td>
			</tr>
			<tr>
					<td>Cloudflare</td>
					<td><code>https://cloudflare-dns.com/dns-query{?dns}</code></td>
					<td><code>https://family.cloudflare-dns.com/dns-query{?dns}</code></td>
			</tr>
			<tr>
					<td>Google</td>
					<td><code>https://dns.google/dns-query{?dns}</code></td>
					<td>NA</td>
			</tr>
			<tr>
					<td>OpenDNS</td>
					<td><code>https://doh.opendns.com/dns-query{?dns}</code></td>
					<td><code>https://doh.familyshield.opendns.com/dns-query{?dns}</code></td>
			</tr>
			<tr>
					<td>Quad9<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></td>
					<td><code>https://dns.quad9.net/dns-query{?dns}</code></td>
					<td>NA</td>
			</tr>
	</tbody>
</table>
<p>Bot how to enable it? You can edit manual through <code>regedit</code> or you can copy this code in a new file and save it with a <code>.reg</code> extension. You can directly insert your DNS of choice in place of the default Google one.</p>

<details class="codeblock"  open >
<summary class=" codelang">
    <span class="codeblock_file_type codeIcon">registry</span>
</summary>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-registry" data-lang="registry"><span class="line"><span class="cl">Windows Registry Editor Version 5.00
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">[</span><span class="nb">HKEY_LOCAL_MACHINE</span><span class="k">\SOFTWARE\Policies\Google\Chrome]</span>
</span></span><span class="line"><span class="cl"><span class="na">&#34;DnsOverHttpsTemplates&#34;</span><span class="o">=</span><span class="s">&#34;https://dns.google/dns-query{?dns}&#34;</span>
</span></span><span class="line"><span class="cl"><span class="na">&#34;DnsOverHttpsMode&#34;</span><span class="o">=</span><span class="s">&#34;automatic&#34;</span></span></span></code></pre></div>
</details>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Be aware that they provide different hostnames with different features like ECS etc. <a href="https://www.quad9.net/news/blog/doh-with-quad9-dns-servers/#:~:text=quad9%20supports%20three%20flavors%20of%20dns%20currently.">Quad9</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>]]></content><preview>For whatever reason your browser is locked out from changing the DoH settings? Here is how to change the settings if you have admin permissions.</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="dns-over-https" label="dns over https"/><category scheme="taxonomy:Tags" term="doh" label="doh"/><category scheme="taxonomy:Tags" term="chrome" label="chrome"/><category scheme="taxonomy:Tags" term="windows" label="windows"/></entry><entry><title type="html">Hugo rendering: Github Pages vs Netlify vs Cloudflare Pages</title><link href="https://blog.icpmol.es/posts/hosting-comparisons/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://blog.icpmol.es/posts/hosting-comparisons/</id><section>Post</section><published>2021-05-04T20:07:30+00:00</published><updated>2021-05-04T20:07:30+00:00</updated><content type="html"><![CDATA[<p>Given the various choices of hosting for your static files you may be unsure which one to pick.
These are the features and performances of the top three services with their free tier.</p>
<table>
	<thead>
			<tr>
					<th>Features</th>
					<th>Github Pages</th>
					<th>Cloudflare Pages</th>
					<th>Netflify</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Multiple subomains<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></td>
					<td>❌</td>
					<td>Max 10</td>
					<td>Infinite</td>
			</tr>
			<tr>
					<td>Custom subdomains</td>
					<td>Fixed to [github username].github.io</td>
					<td>Fixed to [github repo name].pages.dev</td>
					<td>*.netlify.app</td>
			</tr>
			<tr>
					<td>Ease of Setup</td>
					<td>Low</td>
					<td>High</td>
					<td>High</td>
			</tr>
			<tr>
					<td>SSLlabs score</td>
					<td>A</td>
					<td>B</td>
					<td>A</td>
			</tr>
			<tr>
					<td>Byte Serving for video</td>
					<td>✅</td>
					<td>❌ <sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></td>
					<td>✅</td>
			</tr>
			<tr>
					<td>Monthly Bandwith</td>
					<td>100GB</td>
					<td>n/a</td>
					<td>100GB</td>
			</tr>
			<tr>
					<td>Builds limits</td>
					<td>10 builds per hour</td>
					<td>500 times per month</td>
					<td>300 minutes per month</td>
			</tr>
			<tr>
					<td>Maximum file size</td>
					<td>100 MB</td>
					<td>25 MB</td>
					<td>n/a</td>
			</tr>
			<tr>
					<td>Storage Size</td>
					<td>5 GB</td>
					<td>n/a</td>
					<td>100 GB</td>
			</tr>
			<tr>
					<td>Build Previews</td>
					<td>❌</td>
					<td>✅</td>
					<td>✅</td>
			</tr>
			<tr>
					<td>Test Build: Hugo</td>
					<td>1597 ms</td>
					<td>1320 ms</td>
					<td>1852 ms</td>
			</tr>
			<tr>
					<td>Test Build: Total</td>
					<td>33s</td>
					<td>58s</td>
					<td>40s</td>
			</tr>
			<tr>
					<td>Download times: 4.252 Kb HTML <sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></td>
					<td>239 ms</td>
					<td>245ms</td>
					<td>492 ms</td>
			</tr>
	</tbody>
</table>
<p>As you can see from the table and from the graph, downloading the test file usually takes 200-250ms on Github Pages and Cloudflare, while on Netlify the times as 2 times longer with a more unreliable time for the latter.</p>
<iframe title="Time for each request" aria-label="Interactive line chart" id="datawrapper-chart-IlvdX" src="https://datawrapper.dwcdn.net/IlvdX/1/" scrolling="no" frameborder="0" style="width: 0; min-width: 100% !important; border: none;" height="400" loading="lazy"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(a){if(void 0!==a.data["datawrapper-height"])for(var e in a.data["datawrapper-height"]){var t=document.getElementById("datawrapper-chart-"+e)||document.querySelector("iframe[src*='"+e+"']");t&&(t.style.height=a.data["datawrapper-height"][e]+"px")}}))}();
</script>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>All three offer you to use your own domain name.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Probably they do it to avoid abuse and to not compete with the <a href="https://www.cloudflare.com/products/cloudflare-stream/">Cloudflare Stream</a> products.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Average of 200 tests with <a href="https://github.com/reorx/httpstat">httpstat</a> against a <a href="/lorem">test page</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>]]></content><preview>Given the various choices of hosting for your static files you may be unsure which one to pick. These are the features and performances of the top three services with their free tier.</preview><category scheme="taxonomy:Authors" term="iacopo-moles" label="Iacopo Moles"/><category scheme="taxonomy:Tags" term="hugo" label="hugo"/><category scheme="taxonomy:Tags" term="hosting" label="hosting"/><category scheme="taxonomy:Tags" term="rendering" label="rendering"/><category scheme="taxonomy:Tags" term="ci/cd" label="CI/CD"/><category scheme="taxonomy:Tags" term="github-pages" label="github pages"/><category scheme="taxonomy:Tags" term="netlify" label="netlify"/><category scheme="taxonomy:Tags" term="github" label="github"/><category scheme="taxonomy:Tags" term="cloudflare" label="cloudflare"/></entry></feed>