Yarmo - shortBlog of an Open Source developerZola2022-06-12T21:39:59+00:00https://yarmo.eu/tags/short/atom.xmlHow not to use a password manager2022-06-12T21:39:59+00:002022-06-12T21:39:59+00:00
Unknown
https://yarmo.eu/blog/how-not-to-use-password-manager/<p>I have just read Kev's latest blog post named <a href="https://kevq.uk/segregating-email-with-sub-domains/">Segregating Email With Subdomains</a> and it's a trick I am most definitely adopting. I enjoy using catch-all addresses over <code>+something</code> addresses as the latter are rejected by some services. But only one person per domain can enjoy this privilege. If each member of the server gets their own subdomain, they all get to enjoy a catch-all address. Simple yet clever.</p>
<p>But I feel an urge to quickly react to the post's premise and its stated "problem with the setup".</p>
<p>Both the author and a friend of theirs have found themselves in the predicament of not being able to reset their forgotten password because they also forgot the email address they used to sign up for the service in question.</p>
<p>At the risk of sounding like Captain Obvious, password managers are an all-or-nothing solution. There is nothing to be gained by "not putting the credentials to this one service in the password manager".</p>
<p>Every time you don't use a random password issued and tracked by your password manager, you are using a password you will need to remember and so will either be one you use more often, or is some derivative of the service you are signing up for. This opens your account up to a host of attack surfaces.</p>
<p>I take pride in not knowing any of my passwords anymore — except for the big one for the password manager. Yes, it takes a bit of time to get used to the system but once you have it, it just makes no sense not to use for every single service you sign up for.</p>
<p>And in my humble opinion, laziness is the worst reason not to register a password in the password manager. This is not the reason stated in the blog posts but I am adding this as a general statement.</p>
<blockquote>
<p>it’s easy to lose track of which address you have used where</p>
</blockquote>
<p>It doesn't have to be. Password managers are not password managers, they are identity managers. Therefore, we should extend the identity "randomness" also to the email addresses we use.</p>
<p>Up to a few weeks ago, I used a catch-all address combined with a random string generator, the result of which I stored in Keepass. Cumbersome, granted, but effective. If you don't have a catch-all address, a plus address works for those services that don't reject them.</p>
<p>But when <a href="https://bitwarden.com/blog/add-privacy-and-security-using-email-aliases-with-bitwarden/">Bitwarden recently announced support for email forwarding services</a>, I nearly immediately migrated to their service as this would streamline my process — and add a dash of anonimity as long as we trust our email forwarding service of choice.</p>
<blockquote>
<p>Yes, my password manager is supposed to remember the email used, but that’s not always reliable</p>
</blockquote>
<p>With all due respect, I can't imagine a single situation where my password manager's capacity to store the credentials I entered isn't <em>reliable</em>.</p>
<p>So, in short, we can (and should) discuss to great lengths how to properly use a password manager — it's a complicated matter. But skipping some accounts is for sure <strong>not</strong> how to use a password manager.</p>
A playerctl module for polybar2022-05-07T22:20:11+00:002022-05-07T22:20:11+00:00
Unknown
https://yarmo.eu/blog/playerctl-polybar/<h2 id="playerctl">playerctl</h2>
<p><a href="https://man.archlinux.org/man/community/playerctl/playerctl.1.en"><code>playerctl</code></a> is a simple and lightweight utility that can query and control MPRIS-enabled media players.</p>
<p>Running a simple <code>playerctl pause</code> in the terminal will pause the media player currently playing anything.</p>
<p>As effective as that is, I want something even better: a little button in my <a href="https://polybar.github.io/">polybar</a> that knows when media is playing and when pressed, pauses the player.</p>
<p>So, instead of using an existing functional script, let's write our own.</p>
<h2 id="The_polybar_module">The polybar module</h2>
<p>We need two things: the configuration of the polybar module, and a bash script that the module will call.</p>
<p>Here's the polybar configuration:</p>
<pre data-lang="ini" style="background-color:#212733;color:#ccc9c2;" class="language-ini "><code class="language-ini" data-lang="ini"><span style="color:#ffa759;">[module/playerctl]
</span><span style="color:#ffcc66;">type </span><span style="color:#f29e74;">= </span><span style="font-style:italic;color:#5ccfe6;">custom/script
</span><span style="color:#ffcc66;">exec </span><span style="color:#f29e74;">= /</span><span>home</span><span style="color:#f29e74;">/</span><span>user</span><span style="color:#f29e74;">/.</span><span>local</span><span style="color:#f29e74;">/</span><span>bin</span><span style="color:#f29e74;">/</span><span>polybar_scripts</span><span style="color:#f29e74;">/</span><span>playerctl</span><span style="color:#f29e74;">.</span><span>sh
</span><span style="color:#ffcc66;">interval </span><span style="color:#f29e74;">= </span><span style="color:#ffcc66;">0</span><span style="color:#f29e74;">.</span><span style="color:#ffcc66;">5
</span></code></pre>
<p>This module configuration simply calls the script at the defined path every 0.5 seconds.</p>
<p>Here's the bash script called by the module:</p>
<pre data-lang="bash" style="background-color:#212733;color:#ccc9c2;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="font-style:italic;color:#5c6773;">#!/usr/bin/env bash
</span><span>
</span><span>playerctlstatus</span><span style="color:#f29e74;">=</span><span style="color:#bae67e;">$</span><span>(</span><span style="color:#ffd580;">playerctl</span><span style="color:#bae67e;"> status </span><span style="color:#ffcc66;">2</span><span style="color:#f29e74;">></span><span style="color:#bae67e;"> /dev/null</span><span>)
</span><span>
</span><span style="color:#ffa759;">if </span><span style="color:#f28779;">[[ </span><span>$playerctlstatus </span><span style="color:#f29e74;">== </span><span style="color:#bae67e;">"" </span><span style="color:#f28779;">]]</span><span style="color:#f29e74;">; </span><span style="color:#ffa759;">then
</span><span> </span><span style="color:#f28779;">echo </span><span style="color:#bae67e;">""
</span><span style="color:#ffa759;">elif </span><span style="color:#f28779;">[[ </span><span>$playerctlstatus </span><span style="color:#f29e74;">=~ </span><span style="color:#bae67e;">"Playing" </span><span style="color:#f28779;">]]</span><span style="color:#f29e74;">; </span><span style="color:#ffa759;">then
</span><span> </span><span style="color:#f28779;">echo </span><span style="color:#bae67e;">"%{A1:playerctl pause:}⏸️%{A}"
</span><span style="color:#ffa759;">else
</span><span> </span><span style="color:#f28779;">echo </span><span style="color:#bae67e;">"%{A1:playerctl play:}▶️%{A}"
</span><span style="color:#ffa759;">fi
</span></code></pre>
<p>Yes, it's not a very nice script, I'm sure it can be improved in many ways but hey, it works.</p>
<p>In short, it first gets the current status of playerctl. If the status is an empty string i.e. there are no media players, return an empty string. This basically "hides" the module.</p>
<p>If the status is the string <code>Playing</code>, return the emoji of a pause button. <code>%{A1:playerctl pause:}</code> will make the button clickable and, when clicked, will run <code>playerctl pause</code>.</p>
<p>Finally, since we know there are media players but none are playing (i.e. the status is <code>Paused</code>), show the play button which does actually what one would expect.</p>
<p>So, is it safe to run this script every 0.5 seconds? Here are some numbers:</p>
<pre data-lang="bash" style="background-color:#212733;color:#ccc9c2;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffd580;">$</span><span> time /home/user/.local/bin/polybar_scripts/playerctl.sh
</span><span style="font-style:italic;color:#5c6773;"># real 0m0,037s
</span><span style="font-style:italic;color:#5c6773;"># user 0m0,016s
</span><span style="font-style:italic;color:#5c6773;"># sys 0m0,013s
</span></code></pre>
<p>So yes, it's quite fast even on this 2010 ThinkPad x201i, this script can easily run multiple times a second. That's handy because you want the play/pause button to update relative quick after pressing it.</p>
<h2 id="Closing_remarks">Closing remarks</h2>
<p>There you have it, my playerctl module for polybar. Okay, one little detail: I do not actually use the emoji symbols in my script but rather the corresponding glyphs included in the <a href="https://www.nerdfonts.com">Mononoki nerd font</a>.</p>
<p>You could easily expand the script to show what song is playing using the command explained in my <a href="/blog/playerctl">previous blog post</a>. I might do just that soon but for now, a simple button that only appears when music is either playing or paused is exactly what I was looking for.</p>
playerctl: get currently playing music2022-05-03T14:35:49+00:002022-05-03T14:35:49+00:00
Unknown
https://yarmo.eu/blog/playerctl/<h2 id="TLDR">TLDR</h2>
<p>To get information about music currently playing on the computer, run:</p>
<pre data-lang="bash" style="background-color:#212733;color:#ccc9c2;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffd580;">playerctl</span><span> metadata</span><span style="color:#ffcc66;"> --all-players --format </span><span style="color:#bae67e;">'{{ status }}: {{ artist }} - {{ title }}'
</span></code></pre>
<p>A wide variety of media players are MPRIS-enabled and can be queried using the above command, including media players running in the browser such as <a href="https://github.com/airsonic-advanced/airsonic-advanced">Airsonic</a>.</p>
<p><a href="https://man.archlinux.org/man/community/playerctl/playerctl.1.en">playerctl on man.archlinux.org</a></p>
<h2 id="Explanation">Explanation</h2>
<p>For a long time, I've been using <a href="https://github.com/airsonic-advanced/airsonic-advanced">Airsonic</a> as my media player, handy if you are into selfhosted services and despise streaming platforms with a passion.</p>
<p>Since I also do <a href="https://yarmo.live">live streaming</a> and like to play ambient music in the background, I attempted to build a little "Now playing" widget for on stream.</p>
<p>Sadly, no luck: Airsonic doesn't have an API.</p>
<p>After a lot of trying out different clients and hosting additional services, I settled on syncing my music collection from the NAS to my computer and then playing music through mopidy, as I could then query the currently playing music using MPD:</p>
<pre data-lang="bash" style="background-color:#212733;color:#ccc9c2;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="font-style:italic;color:#5c6773;"># Snippet will be added soon, currently away from computer
</span></code></pre>
<p>Not my favorite solution but it works.</p>
<p>In comes this guy <a href="https://deavid.wordpress.com/">DeavidSedice</a> and he tells me I can get that same information from most existing media players with a single line of bash:</p>
<pre data-lang="bash" style="background-color:#212733;color:#ccc9c2;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="font-style:italic;color:#5c6773;"># The command as he sent it to me
</span><span style="color:#ffd580;">playerctl</span><span> metadata</span><span style="color:#ffcc66;"> --all-players --format </span><span style="color:#bae67e;">'{{ status }}: {{ artist }} - {{ title }} ' </span><span style="color:#f29e74;">| </span><span style="color:#ffd580;">grep</span><span> Playing </span><span style="color:#f29e74;">| </span><span style="color:#ffd580;">tr </span><span style="color:#bae67e;">'\n' ' '
</span></code></pre>
<p>Why did I never hear about this before? A life changer! And it even works with Airsonic running in the browser.</p>
<p>This tool makes it quite trivial to write a bash script that loops the command, writes the output to a text file and have OBS display it on stream.</p>
GPG import public key from smartcard2022-05-03T09:00:12+00:002022-05-03T09:00:12+00:00
Unknown
https://yarmo.eu/blog/gpg-import-from-smartcard/<h2 id="TLDR">TLDR</h2>
<p>On a new computer, insert your USB OpenPGP smartcard and run:</p>
<pre data-lang="bash" style="background-color:#212733;color:#ccc9c2;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffd580;">gpg</span><span style="color:#ffcc66;"> --card-edit
</span><span style="color:#ffd580;">fetch
</span><span style="color:#ffd580;">quit
</span></code></pre>
<h2 id="Explanation">Explanation</h2>
<p>I have a <a href="https://www.yubico.com/products/yubikey-5-overview/">YubiKey 5</a> (still waiting on my <a href="https://www.indiegogo.com/projects/solo-v2-safety-net-against-phishing#/">Solo v2</a>) on which I store my OpenPGP secret key.</p>
<p>However, if I boot into a new system, insert my USB OpenPGP smartcard, import my public key from a keyserver:</p>
<pre data-lang="bash" style="background-color:#212733;color:#ccc9c2;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffd580;">gpg</span><span style="color:#ffcc66;"> --keyserver</span><span> hkps://keys.openpgp.org</span><span style="color:#ffcc66;"> --recv-keys</span><span> ABCD1234
</span></code></pre>
<p><a href="https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work">configure git</a>:</p>
<pre data-lang="bash" style="background-color:#212733;color:#ccc9c2;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffd580;">git</span><span> config</span><span style="color:#ffcc66;"> --global</span><span> user.signingkey ABCD1234
</span></code></pre>
<p>and attempt to sign a commit, I'll get an error message:</p>
<pre data-lang="bash" style="background-color:#212733;color:#ccc9c2;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffd580;">git</span><span> commit</span><span style="color:#ffcc66;"> -S -m </span><span style="color:#bae67e;">"Signed commit"
</span><span style="font-style:italic;color:#5c6773;"># error: gpg failed to sign the data
</span><span style="font-style:italic;color:#5c6773;"># fatal: failed to write commit object
</span></code></pre>
<p>GPG doesn't know yet it can interact with the private key stored on the USB OpenPGP smartcard!</p>
<p>So, instead of importing the public key from a keyserver, fetch it from the smartcard with the following commands:</p>
<pre data-lang="bash" style="background-color:#212733;color:#ccc9c2;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffd580;">gpg</span><span style="color:#ffcc66;"> --card-edit
</span><span style="color:#ffd580;">fetch
</span><span style="color:#ffd580;">quit
</span></code></pre>
My wtwitch setup2021-12-24T23:31:17+00:002021-12-24T23:31:17+00:00
Unknown
https://yarmo.eu/blog/wtwitch-setup/<h2 id="wtwitch">wtwitch</h2>
<p>wtwitch (<a href="https://github.com/krathalan/wtwitch">source repo</a>) is a neat terminal user interface for Twitch, allowing me to watch Twitch streamers without needing to ever use their website or any of their clients.</p>
<p>It manages subscriptions, has autocomplete and easily let's you start a stream in an mpv window or any player of your choosing.</p>
<p>I have a basic setup with the config file in the default place.</p>
<p><code>~/.config/wtwitch/config.json</code>:</p>
<pre data-lang="json" style="background-color:#212733;color:#ccc9c2;" class="language-json "><code class="language-json" data-lang="json"><span>{
</span><span> </span><span style="color:#bae67e;">"player"</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"mpv"</span><span style="color:#ccc9c2cc;">,
</span><span> </span><span style="color:#bae67e;">"quality"</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"best"</span><span style="color:#ccc9c2cc;">,
</span><span> </span><span style="color:#bae67e;">"colors"</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"false"</span><span style="color:#ccc9c2cc;">,
</span><span> </span><span style="color:#bae67e;">"printOfflineSubscriptions"</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"true"</span><span style="color:#ccc9c2cc;">,
</span><span> </span><span style="color:#bae67e;">"subscriptions"</span><span style="color:#ccc9c2cc;">: </span><span>[
</span><span> {
</span><span> </span><span style="color:#bae67e;">"streamer"</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"rossmanngroup"
</span><span> }</span><span style="color:#ccc9c2cc;">,
</span><span> </span><span style="font-style:italic;color:#5c6773;">// and many more
</span><span> ]</span><span style="color:#ccc9c2cc;">,
</span><span> </span><span style="color:#bae67e;">"apiToken"</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"..."</span><span style="color:#ccc9c2cc;">,
</span><span> </span><span style="color:#bae67e;">"apiTokenExpiry"</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"..."</span><span style="color:#ccc9c2cc;">,
</span><span> </span><span style="color:#bae67e;">"lastSubscriptionUpdate"</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"..."
</span><span>}
</span></code></pre>
<h2 id="wtwitch_and_rofi">wtwitch and rofi</h2>
<p>Where things get interesting is the integration with rofi (<a href="https://github.com/davatorium/rofi">source repo</a>), the application launcher and so much more.</p>
<p>All I need is a single executable file.</p>
<p><code>~/.local/bin/rofi_wtwitch.sh</code>:</p>
<pre data-lang="bash" style="background-color:#212733;color:#ccc9c2;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="font-style:italic;color:#5c6773;">#!/bin/bash
</span><span>
</span><span style="color:#ffa759;">if </span><span style="color:#f28779;">[[ </span><span>$1 </span><span style="color:#f28779;">]]</span><span style="color:#f29e74;">; </span><span style="color:#ffa759;">then
</span><span> name</span><span style="color:#f29e74;">=</span><span style="color:#bae67e;">$</span><span>(</span><span style="color:#f28779;">echo </span><span style="color:#bae67e;">$</span><span>1 </span><span style="color:#f29e74;">| </span><span style="color:#ffd580;">awk </span><span>{</span><span style="color:#bae67e;">'print $1'</span><span>} </span><span style="color:#f29e74;">| </span><span style="color:#ffd580;">sed </span><span style="color:#bae67e;">'s/\://'</span><span>)
</span><span> </span><span style="color:#ffd580;">wtwitch</span><span> w $name </span><span style="color:#f29e74;">></span><span> /dev/null
</span><span style="color:#ffa759;">else
</span><span> </span><span style="color:#ffd580;">wtwitch</span><span> check </span><span style="color:#f29e74;">| </span><span style="color:#ffd580;">sed</span><span style="color:#ffcc66;"> -n </span><span style="color:#bae67e;">'/Live/,/Offline/p' </span><span style="color:#f29e74;">| </span><span style="color:#ffd580;">sed </span><span style="color:#bae67e;">'/Live channels/d;/Offline/d' </span><span style="color:#f29e74;">| </span><span style="color:#ffd580;">sed </span><span style="color:#bae67e;">'s/\x1B\[[0-9;]\{1,\}[A-Za-z]//g;s/ //;'
</span><span style="color:#ffa759;">fi
</span></code></pre>
<h3 id="Running_straight_from_terminal">Running straight from terminal</h3>
<pre style="background-color:#212733;color:#ccc9c2;"><code><span>rofi -modi wtwitch:/home/yarmo/.local/bin/rofi_wtwitch.sh -show wtwitch
</span></code></pre>
<h3 id="For_bspwm/sxhkd_users">For bspwm/sxhkd users</h3>
<p><code>~/.config/sxhkd/sxhkdrc</code>:</p>
<pre style="background-color:#212733;color:#ccc9c2;"><code><span># Launch wtwitch in rofi
</span><span>super + shift + d
</span><span> rofi -modi wtwitch:/home/yarmo/.local/bin/rofi_wtwitch.sh -show wtwitch
</span></code></pre>
<p>Replace with your own keybinding.</p>
<h3 id="For_i3_users">For i3 users</h3>
<p><code>~/.config/i3/config</code>:</p>
<pre style="background-color:#212733;color:#ccc9c2;"><code><span># Launch wtwitch in rofi
</span><span>bindsym $mod+Shift+d exec --no-startup-id "rofi -modi wtwitch:/home/yarmo/.local/bin/rofi_wtwitch.sh -show wtwitch"
</span></code></pre>
<p>Replace with your own keybinding.</p>
The Post-MomentJS Era2020-09-15T09:46:54+00:002020-09-15T09:46:54+00:00
Unknown
https://yarmo.eu/blog/post-momentjs-era/<h2 id="The_Post-MomentJS_Era">The Post-MomentJS Era</h2>
<p>According to their <a href="https://momentjs.com/docs/#/-project-status/">own documentation</a>, new projects should no longer use <a href="https://momentjs.com">MomentJS</a>, mentioning its hefty size and its outdated architecture as the principal reasons behind this statement.</p>
<p>Although there are new libraries that they do recommend, we also have a different solution nowadays: no library.</p>
<p>Using ECMAScript <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl">Intl</a>, we can go a very long way formatting dates without dependencies.</p>
<pre data-lang="js" style="background-color:#212733;color:#ccc9c2;" class="language-js "><code class="language-js" data-lang="js"><span style="font-style:italic;color:#5ccfe6;">Intl</span><span style="color:#f29e74;">.</span><span style="color:#ffd580;">DateTimeFormat</span><span>(</span><span style="color:#bae67e;">"en"</span><span style="color:#ccc9c2cc;">, </span><span>{
</span><span> year</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"numeric"</span><span style="color:#ccc9c2cc;">,
</span><span> month</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"long"</span><span style="color:#ccc9c2cc;">,
</span><span> day</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"numeric"</span><span style="color:#ccc9c2cc;">,
</span><span> hour</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"numeric"</span><span style="color:#ccc9c2cc;">,
</span><span> minute</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"numeric"</span><span style="color:#ccc9c2cc;">,
</span><span> hour12</span><span style="color:#ccc9c2cc;">: </span><span style="color:#ffcc66;">false</span><span style="color:#ccc9c2cc;">,
</span><span> timeZone</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"CET"
</span><span>})</span><span style="color:#f29e74;">.</span><span style="color:#ffd580;">format</span><span>(</span><span style="color:#f29e74;">new </span><span style="color:#73d0ff;">Date</span><span>())</span><span style="color:#ccc9c2cc;">;
</span><span style="font-style:italic;color:#5c6773;">// -> September 15, 2020, 09:41
</span></code></pre>
<pre data-lang="js" style="background-color:#212733;color:#ccc9c2;" class="language-js "><code class="language-js" data-lang="js"><span style="font-style:italic;color:#5ccfe6;">Intl</span><span style="color:#f29e74;">.</span><span style="color:#ffd580;">DateTimeFormat</span><span>(navigator</span><span style="color:#f29e74;">.</span><span>language</span><span style="color:#ccc9c2cc;">, </span><span>{
</span><span> year</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"numeric"</span><span style="color:#ccc9c2cc;">,
</span><span> month</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"long"</span><span style="color:#ccc9c2cc;">,
</span><span> day</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"numeric"</span><span style="color:#ccc9c2cc;">,
</span><span> hour</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"numeric"</span><span style="color:#ccc9c2cc;">,
</span><span> minute</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"numeric"</span><span style="color:#ccc9c2cc;">,
</span><span> hour12</span><span style="color:#ccc9c2cc;">: </span><span style="color:#ffcc66;">false</span><span style="color:#ccc9c2cc;">,
</span><span> timeZone</span><span style="color:#ccc9c2cc;">: </span><span style="color:#bae67e;">"CET"
</span><span>})</span><span style="color:#f29e74;">.</span><span style="color:#ffd580;">format</span><span>(</span><span style="color:#f29e74;">new </span><span style="color:#73d0ff;">Date</span><span>())</span><span style="color:#ccc9c2cc;">;
</span><span style="font-style:italic;color:#5c6773;">// -> 15 september 2020 09:41
</span><span style="font-style:italic;color:#5c6773;">// In dutch!
</span></code></pre>
<p>ISO formatting with <code>Intl</code> is tricky. But we don't need it.</p>
<pre data-lang="js" style="background-color:#212733;color:#ccc9c2;" class="language-js "><code class="language-js" data-lang="js"><span style="color:#f29e74;">new </span><span style="color:#73d0ff;">Date</span><span>()</span><span style="color:#f29e74;">.</span><span style="color:#ffd580;">toISOString</span><span>()</span><span style="color:#ccc9c2cc;">;
</span><span style="font-style:italic;color:#5c6773;">// -> 2020-09-15T07:41:41.148Z
</span></code></pre>
<pre data-lang="js" style="background-color:#212733;color:#ccc9c2;" class="language-js "><code class="language-js" data-lang="js"><span style="color:#f29e74;">new </span><span style="color:#73d0ff;">Date</span><span>()</span><span style="color:#f29e74;">.</span><span style="color:#ffd580;">toISOString</span><span>()</span><span style="color:#f29e74;">.</span><span style="color:#f28779;">split</span><span>(</span><span style="color:#bae67e;">"T"</span><span>)[</span><span style="color:#ffcc66;">0</span><span>]</span><span style="color:#ccc9c2cc;">;
</span><span style="font-style:italic;color:#5c6773;">// -> 2020-09-15
</span></code></pre>
<p>Have a look at the <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl">MDN docs</a> for more information.</p>
<p>Even though <code>Intl</code> and <code>Date</code> are viable options, the MomentJS developers recommend a few libraries to help with some browser inconsistencies. Make sure to <a href="https://momentjs.com/docs/#/-project-status/">read the MomentJS post</a> for all the pros and cons.</p>
Flipper Zero and their "Limited" pledges2020-07-31T11:13:30+00:002020-07-31T11:13:30+00:00
Unknown
https://yarmo.eu/blog/flipper-zero-limited/<h2 id="The_Flipper_Zero_project">The Flipper Zero project</h2>
<p>I'm not going to lie, Flipper Zero sounds like a cool project for hackers. Here's a <a href="https://flipperzero.one/zero">link to their website</a> which will lead you to their Kickstarter page.</p>
<h2 id="What_is_going_on_on_Kickstarter?">What is going on on Kickstarter?</h2>
<p>Something extremely scummy is going on right now! Have a look:</p>
<p><img src="/img/blog/kickstarted_counter__1a.png" alt="Flipper Zero Kickstarter" /></p>
<p>Looking good, lot's of stuff to read, let's take our time.</p>
<p><img src="/img/blog/kickstarted_counter__1b.png" alt="Flipper Zero Kickstarter" /></p>
<p>My word, they're almost out of Early Birds! Please, for the love of god, if you want to save some money, pledge now, only 9 left and it clearly says "Limited"!</p>
<h3 id="One_minute_later">One minute later</h3>
<p><img src="/img/blog/kickstarted_counter__2.png" alt="Flipper Zero Kickstarter" /></p>
<p>A person has just pledged! Where's my credit card?</p>
<h3 id="Another_minute_later">Another minute later</h3>
<p><img src="/img/blog/kickstarted_counter__3.png" alt="Flipper Zero Kickstarter" /></p>
<p>Wait, 9 left? Someone bailed? Doesn't matter, I need this!</p>
<h3 id="Yet_another_minute_later">Yet another minute later</h3>
<p><img src="/img/blog/kickstarted_counter__4.png" alt="Flipper Zero Kickstarter" /></p>
<p>Wait, what?</p>
<h3 id="And_it_goes_on">And it goes on</h3>
<p><img src="/img/blog/kickstarted_counter__5.png" alt="Flipper Zero Kickstarter" /></p>
<h3 id="And_on">And on</h3>
<p><img src="/img/blog/kickstarted_counter__6.png" alt="Flipper Zero Kickstarter" /></p>
<h2 id="This_needs_to_stop">This needs to stop</h2>
<p>Well, you get the point. Flipper Zero is having some employee continuously adding more "Limited" pledges to perpetually give the impression they are almost out of "Early Bird" kits.</p>
<p>That's extremely deceptive and manipulative behavior and should not be tolerated. This needs to stop right now.</p>
Transcript of a strange call2020-07-01T16:14:40+00:002020-07-01T16:14:40+00:00
Unknown
https://yarmo.eu/blog/transcript-strange-call/<p><strong>Lady</strong><br />
"Hi, I'm calling you because you have shown interest in the financial market."</p>
<p><strong>Me</strong><br />
"What? No, I haven't."</p>
<p><strong>Lady</strong><br />
"You have in the past…"</p>
<p><strong>Me</strong><br />
"I think you might have the wrong person on the line."</p>
<p><strong>Lady</strong><br />
"Oh, what is your email address?"</p>
<p><strong>Me</strong><br />
"I'm not giving you my email address."</p>
<p><strong>Lady</strong><br />
"It's all right, I have it here, I just wanted to check. What is your full name?"</p>
<p><strong>Me</strong><br />
"No, I'm not… Wait… Why? I'm not interested in the financial market."</p>
<p><strong>Lady</strong><br />
"You were in the past…"</p>
<p><strong>Me</strong><br />
"Ok, bye."</p>
Webmentiond FTW2020-07-01T10:31:49+00:002020-07-01T10:31:49+00:00
Unknown
https://yarmo.eu/blog/webmentiond-ftw/<p>I just read <a href="https://www.garron.blog/posts/webmentiond-working.html">this post by Guillermo</a> which is a great general overview of <a href="https://indieweb.org/Webmention">webmentions</a> and in particular, the implemention by Horst Gutmann named <a href="https://zerokspot.com/weblog/2020/06/14/setting-up-webmentiond/">webmentiond</a>. An absolute delight to use! Glad you got it working, Guillermo, and happy to have been of help!</p>
Github is sinking2020-06-29T13:06:56+00:002020-06-29T13:06:56+00:00
Unknown
https://yarmo.eu/blog/github-sinking/<p><em>If you're looking for a more reasoned argumentation, see Update 3 at the bottom.</em></p>
<p>I rarely interact with <a href="https://github.com">Github</a> anymore. All my projects are either on my selfhosted <a href="https://gitea.io">Gitea</a> instance or on <a href="https://codeberg.org/">Codeberg.org</a>. That's why I missed the following on <a href="https://www.githubstatus.com/">Github Status</a>:</p>
<p><img src="/content/img/github_status.png" alt="Github status shows a lot of downtimes" /><br />
<em>Yikes</em></p>
<p>Yikes, indeed. How everyone handles this is up to them. Large projects will find it hard to move, no doubt.</p>
<p>My interpretation? The Microsoft Github ship is sinking and it's sinking faster every day. The beauty is: you don't need them. Instead of relying on Github, you could:</p>
<ul>
<li>selfhost your own <a href="https://gitea.io">Gitea</a> instance if you have the knowledge;</li>
<li>use <a href="https://codeberg.org/">Codeberg.org</a> which also uses <a href="https://gitea.io">Gitea</a>;</li>
<li>use <a href="https://sourcehut.org/">sourcehut.org</a> which takes a different but very solid approach to git hosting;</li>
<li>use any instance generously hosted by amazing people (think <a href="https://libreho.st/">libreho.st</a> and <a href="https://chatons.org/">Chatons</a>);</li>
<li>use <a href="https://gitlab.com/">gitlab.com</a> or selfhost an instance.</li>
</ul>
<p>There are so many better places to be for git hosting nowadays. For an easy performance comparison of different services, see <a href="https://forgeperf.org/">forgeperf.org</a>.</p>
<p>Abandon the corporate ship before or after it sinks, up to you.</p>
<hr />
<h2 id="Update_1">Update 1</h2>
<p>Added <a href="https://forgeperf.org/">forgeperf.org</a> link after suggestion by <a href="https://mstdn.io/@slow">@slow@mstdn.io</a>.</p>
<hr />
<h2 id="Update_2">Update 2</h2>
<p>Added <a href="https://sourcehut.org/">sourcehut.org</a> link after suggestion by <a href="https://social.privacytools.io/@freddyym">@freddyym@social.privacytools.io</a>.</p>
<hr />
<h2 id="Update_3">Update 3</h2>
<p>Don't publish on your website when you are feeling frustrated; that's what Twitter is for.</p>
<p>Let's inject some reason here. Github isn't dying anytime soon. Certainly not due to this number of outages. And all software breaks, so that's no measure; what matters is the response. And Github is on it. Like every single other time it was broken.</p>
<p>But that doesn't mean we can't change the status quo. Almost every defense of Github comes down to discoverability: if I put my project on Github, others will find it. If I put it elsewhere, other won't find it.</p>
<p>Do not forget: Github's discoverability comes from us, the userbase. We the developers make or break Github. If we all move, Github shuts its doors. This won't happen. But look at the landscape: so many alternative solutions exist, Github is no better than any other service and, in the eyes of some, me included, Github may actually provide a worse experience than most alternatives.</p>
<p>And about discoverability. Have you heard of social media? Blog posts? I discover a lot of new Github projects on a regular basis and almost none, I have discovered via Github itself. People talk about good projects and share them, plain and simple.</p>
<p>If you simply like Github and their network and their continuously "evolving" UI, have at it. To each their own.</p>
<p>If you don't like Github, do not stay. Be the change you want to see.</p>
Set default git branch to main2020-06-25T11:37:43+00:002020-06-25T11:37:43+00:00
Unknown
https://yarmo.eu/blog/git-main/<p>For a while, we've all been seeing the "switch git default branch from master to main" posts, the earliest I recall having been <a href="https://www.hanselman.com/blog/EasilyRenameYourGitDefaultBranchFromMasterToMain.aspx">written by Scott Hanselman</a>. I've been postponing the change for a bit, but it was <a href="https://www.thorlaksson.com/im-changing-the-default-branch-name-in-my-git-repositories-and-you-should-too/">the post by Kristófer Reykjalín</a> that gave the required motivation to go out and just do it.</p>
<p>For new repositories, <a href="https://gitea.io">Gitea</a> already has <a href="https://github.com/go-gitea/gitea/pull/10803">the option to set the default branch name</a>.</p>
<p>For exiting repositories, the <a href="https://www.hanselman.com/blog/EasilyRenameYourGitDefaultBranchFromMasterToMain.aspx">commands provided by Scott</a> work perfectly:</p>
<pre data-lang="bash" style="background-color:#212733;color:#ccc9c2;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffd580;">git</span><span> checkout master</span><span style="color:#f29e74;">; </span><span style="color:#ffd580;">git</span><span> branch</span><span style="color:#ffcc66;"> -m</span><span> master main</span><span style="color:#f29e74;">; </span><span style="color:#ffd580;">git</span><span> push</span><span style="color:#ffcc66;"> -u</span><span> origin main
</span></code></pre>
<p>Yes, a one-liner :) If you like to take things more slowly, here it goes:</p>
<pre data-lang="bash" style="background-color:#212733;color:#ccc9c2;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffd580;">git</span><span> checkout master </span><span style="font-style:italic;color:#5c6773;"># switch to master branch
</span><span style="color:#ffd580;">git</span><span> branch</span><span style="color:#ffcc66;"> -m</span><span> master main </span><span style="font-style:italic;color:#5c6773;"># move existing master branch to main (keeping history)
</span><span style="color:#ffd580;">git</span><span> push</span><span style="color:#ffcc66;"> -u</span><span> origin main </span><span style="font-style:italic;color:#5c6773;"># push the main branch to the server
</span></code></pre>
<p>If you use <a href="https://gitea.io">Gitea</a>, you should now go the repository's Settings > Branches and set the main branch as the default branch. Once done, you can now safely delete the obsolete master branch with the command below.</p>
<pre data-lang="bash" style="background-color:#212733;color:#ccc9c2;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffd580;">git</span><span> push</span><span style="color:#ffcc66;"> --delete</span><span> origin master </span><span style="font-style:italic;color:#5c6773;"># delete the master from the server
</span></code></pre>
<p>As for my website, here's the <a href="https://git.yarmo.eu/yarmo/yarmo.eu/commit/78e18c55c59c8e65e99013718cd42154ddb7ebd6">commit</a> that completed the transition, making sure my CI/CD solution knows what to listen to.</p>
<hr />
<h2 id="Update_1">Update 1</h2>
<p>Thanks to <a href="https://charlespence.net/">Charles Pence</a> for reminding me to add the <code>git push --delete origin master</code> line.</p>
<hr />
<h2 id="Update_2">Update 2</h2>
<p>Thanks to <a href="https://charlespence.net/">Charles Pence</a> for reminding me that a Gitea branch cannot be deleted as long as it's the default.</p>
Added /now, /feeds, /uses2020-06-21T00:54:10+00:002020-06-21T00:54:10+00:00
Unknown
https://yarmo.eu/blog/added-now-feeds-uses/<p>My website now has dedicated <a href="/now">/now</a>, <span class="line-through">/feeds and /uses pages</span>, inspired by several trends in blogging. A new <a href="/friends">/friends</a> (or something similar) will follow soon!</p>
Website is now open source!2020-06-11T16:09:40+00:002020-06-11T16:09:40+00:00
Unknown
https://yarmo.eu/blog/website-open-sourced/<p>It's finally here: the <a href="https://git.yarmo.eu/yarmo/yarmo.eu">source code of this website</a> on my selfhosted gitea instance. It was delayed because, even though the current codebase does not contain secret keys or passwords, this has been the case in the past and the git history is easily searchable. I have deleted the old git project and started afresh.</p>
<p>From now on, the source code and the <a href="https://drone.yarmo.eu/yarmo/yarmo.eu/">drone CI/CD pipelines</a> that go with the website are all open and available. This should make the content on the website more trustworthy as you can now review the code that generated the content. It is also my belief that the open-sourcing of this website is beneficial to all including myself: it gives you a chance to see the inner workings and perhaps pick up a trick or two, and if you see a blatant mistake, bad coding practices or other errors, I trust you will <a href="/contact">let me know</a>.</p>
<p>Enjoy and thanks for taking the time to be here :)</p>
Start of the Plausible experiment2020-06-11T12:01:57+00:002020-06-11T12:01:57+00:00
Unknown
https://yarmo.eu/blog/plausible-start/<p>During the roughly 6 months since I started this website, I have not been using any website statistics whatsoever. I did not see the point of it, this website was not designed to gather an audience in any fashion, it was primarily meant to be a permanently-updated online CV. Given that I am leaving academia which I have been preparing for during the last nine years, I figured I could use any means of getting my name out there.</p>
<p>Recently, I have taken an interest in blogging about selfhosting, online privacy and related technical subjects. In an attempt to understand if people see these articles or any other section of my website, I will start an experiment gathering statistics using the privacy-friendly <a href="https://plausible.io">Plausible</a>.</p>
<h2 id="The_Plausible_experiment">The Plausible experiment</h2>
<p>In a month or so, I will look back at the data gathered and see if anything of interest can be learned. The danger is that when the observation is made some articles perform better than others, the writing process is consequently changed to conform to what the statistics say performs best.</p>
<p>This is not my intention for the simple reason that this blog is not made to target a specific audience but rather to serve as an outlet for things I learn and interest me. If I notice my writing behavior change due to insights gained by statistics, the experiment is ended.</p>
<h2 id="A_comparative_experiment">A comparative experiment</h2>
<p>In the near-future, I will also compare what can be learned from a "client-side" statistics solution like <a href="https://plausible.io">Plausible</a> with what can be learned from a "server-side" statistics solution like <a href="https://goaccess.io">GoAccess</a>.</p>
<p>The reason I am not performing this comparative experiment right now is because both solutions above manage to not support a single common log format. It seems it was decided a month or so ago that <a href="https://github.com/allinurl/goaccess/issues/1768#issuecomment-629652452">GoAccess should conform to Caddy's format</a> (<a href="https://github.com/caddyserver/caddy/issues/3417#issuecomment-629836804">separate issue on Caddy's side</a>). Until that happens (or until I figure out a way to parse Caddy's log format in GoAccess), this comparative experiment will have to wait.</p>
<hr />
<h2 id="Update">Update</h2>
<p>The comparative experiment is back on! Thanks to <a href="https://fosstodon.org/@AlexMV12">@AlexMV12</a> and this <a href="https://alexmv12.xyz/blog/goaccess_caddy/">blog post</a> he wrote, I now have a working bash script to analyze Caddy's log file. See you in thirty days!</p>
About my avatar2020-06-10T22:18:19+00:002020-06-10T22:18:19+00:00
Unknown
https://yarmo.eu/blog/avatar/<p>Every so often, I get asked about the origin and make of my avatar, as seen on my <a href="/">website</a> and my <a href="https://fosstodon.org/@yarmo/">Fosstodon profile</a>. So, here it is.</p>
<p>Inspired by the avatars of <a href="https://fosstodon.org/@kev">Kev@fosstodon.org</a> and <a href="https://fosstodon.org/@mike">Mike@fosstodon.org</a>, both drawn by Kev, I decided to draw my own in a similar style. The keen-eyed among you will indeed spot a few differences in design.</p>
<p>I used <a href="https://inkscape.org/">Inkscape</a> to draw over a photo of mine, simple vectors only, no special brushes required.</p>
<p>Due to the similarity, I did ask Kev to confirm he had no objections to me using this avatar as my profile picture. Other than using their avatars as stylistic references, there are no other links between my avatars and theirs, their owners or the <a href="https://fosstodon.org">Fosstodon instance</a>.</p>
Friendly reminder to clean your NUC's fan2020-06-08T13:35:15+00:002020-06-08T13:35:15+00:00
Unknown
https://yarmo.eu/blog/nuc-fan-cleaning/<p><a href="https://www.intel.com/content/www/us/en/products/boards-kits/nuc.html">Intel NUCs</a> make for some great low-entry-barrier low-power-consumption servers and homelabs. I have three NUCs at home, two of which have played a server role. They span several generations: a 5i3, a 7i7 and a 8i5.</p>
<p>And they all have one thing in common: sooner or later, their fans clog up with dust, they heat up, they make more noise and perform worse.</p>
<p>If you haven't cleaned the fan in a while, your best bet is to open the NUC up and clean the fan and the exhaust.</p>
<p>To prevent having to open a NUC up too often, I bought a few cans of compressed air and regularly blow air through the device. I'm also looking into placing air filters near the air intake.</p>
<p><img src="/img/blog/nuc_temp_fan_cleaning.png" alt="NUC cools down when fan is cleaned" /><br />
<em>Can you tell when compressed air was applied to the NUC?</em></p>
Invidious2020-06-01T13:05:58+00:002020-06-01T13:05:58+00:00
Unknown
https://yarmo.eu/blog/invidious/<p>Small acts of resistance are all we need. Together, we make change.</p>
<h2 id="Compliance:_YouTube">Compliance: YouTube</h2>
<p>Everyone knows YouTube. It contains more than enough content to keep you entertained for a couple of lifetimes.</p>
<p>The thing is, it's owned by Google and has enough privacy-invading trackers and ads to follow and pester you during all of these lifetimes.</p>
<h2 id="Resistance:_Invidious">Resistance: Invidious</h2>
<p>Please consider using Invidious (<a href="https://github.com/omarroth/invidious">github repo</a>), a free and open source service that sits between you the user and the YouTube servers. It eliminates ads, does not use YouTube APIs and has many features YouTube should also always have had (audio-only mode? Yes please).</p>
<p>Several <a href="https://github.com/omarroth/invidious/wiki/Invidious-Instances">instances</a> are hosted around the world, make sure to visit the nearest to you for the best experience.</p>
<h2 id="Going_beyond">Going beyond</h2>
<p>But you can go further. When using Firefox, install the <a href="https://codeberg.org/Booteille/Invidition/issues">Invidition</a> addon to automagically redirect YouTube links to Invidious (again, make sure to select the closest instance). On Android, install <a href="https://www.f-droid.org/en/packages/app.fedilab.nitterizeme/">UntrackMe</a> to do the exact same thing, YouTube links will be opened in Invidious-compatible apps such as <a href="https://f-droid.org/en/packages/org.schabi.newpipe/">NewPipe</a>.</p>
<h2 id="Drawbacks">Drawbacks</h2>
<p>The main issue is that you are no longer supporting the content creators, which is a big issue. It's easy to say "they shouldn't be relying on YouTube and ad revenue" and I agree with that statement to some degree, but you'll still be sad when your favorite content creator quits.</p>
<p>Try and make contact with them, if they're small this might be feasible, if they're big then you probably don't have to worry about them quitting anyway. Ask them and push them towards accepting other methods of donation.</p>
<p>And then donate.</p>
Ending #100DaysToOffload2020-05-25T16:57:10+00:002020-05-25T16:57:10+00:00
Unknown
https://yarmo.eu/blog/ending-100-days-to-offload/<p><code>#100DaysToOffload >> 2020-05-25 >> 025/100</code></p>
<p>Today, I'm ending my participation in the #100DaysToOffload challenge at precisely a quarter of the way. I'm happy to have been part of it as it has given me much.</p>
<p>I only had a handful of blog posts when I started my personal website, scattered over a period of multiple months. I didn't write much, I didn't take the time for it and more importantly, I didn't see the point. It was an interesting experience, for sure, but what else? Was it just writing for writing sake?</p>
<p>Along came the #100DaysToOffload challenge. I joined the minute I saw the first toot by Kev and immediately wrote about, well, participating in the challenge.</p>
<h2 id="Benefits">Benefits</h2>
<p>Twenty-five posts later, I learned a great deal. Forcing myself to post something every day taught me writing doesn't have to be a long and tedious process. Quite the opposite, it forced my perfectionnist brain to settle for "good enough" content.</p>
<p>Posting links to my blog posts (and later, notes) on the fediverse has sparked on several occasions interesting debates involving interesting people with different interesting views. This must have been the most rewarding benefit of all.</p>
<p>I am grateful to have learned this and I will go forth on the path I am now walking, posting regularly about all things that interest me and having eye-opening conversations. I would also have continued the challenge, were it not for a few downsides.</p>
<h2 id="Drawbacks">Drawbacks</h2>
<p>First and foremost, the requirement to post every day. I know, I know, it didn't have to be every day. However, skipping every other day would drag this challenge to 200 days and also goes a bit against the whole idea behind it.</p>
<p>I am already mentally exhausted from my recent PhD experience. Although the experience of writing is freeing, there is definitely the possibility of having "too much of a good thing". Not writing every day also gives a feeling of failure as I'm letting myself down for not keeping up. And that is just something I could definitely do without right now.</p>
<p>Posting this much content also dilutes the pool of topics and results in slightly lower quality content. I've talked about this before and is somewhat the purpose of the challenge: just write and publish, quality comes with experience, not from delaying posts for weeks while endlessly fine-tuning every word.</p>
<p>The thing is, I also have this blog for a more serious reason, to showcase my capacity for reasoning and tech skills where my educational background is somewhat lacking. Sure, having done a PhD in Neuroscience is cool but that doesn't tell you (a future employer?) that I have experience with containers and networks and FOSS and… You get the point.</p>
<p>In an unpredictable turn of events, the challenge is now holding me back in a way: I feel guilty when not writing and when I do write, it's often a simpler topic just to get something out there, leaving me with less time to dig into the stuff I now really want to write about.</p>
<h2 id="In_the_end">In the end</h2>
<p>So there you have it. I would love to post every other day and I will. But with no obligations or reasoning. Just because I want to.</p>
<p>I will now dive deeper into the stuff I am passionate about and with more vigor and regularity. And that, I owe to the #100DaysToOffload challenge.</p>
A new Projects section2020-05-23T22:51:43+00:002020-05-23T22:51:43+00:00
Unknown
https://yarmo.eu/blog/projects-section/<p><code>#100DaysToOffload >> 2020-05-23 >> 024/100</code></p>
<p>I've added a new <a href="/projects">Projects</a> section to my personal website, the new home for projects I'm either still thinking of doing or actually developing, As these projects will be open-source, so will my preparation for them.</p>
<p>The benefit of doing this is that when you look around and see a project you like or have experience with, I would love for you to <a href="/contact">contact me</a> to work together.</p>
<p>As of today, there are only two projects listed, I have more in my head which I will write down over the coming days.</p>
LunaSea: FOSS FTW2020-05-22T19:47:38+00:002020-05-22T19:47:38+00:00
Unknown
https://yarmo.eu/blog/lunasea/<p><code>#100DaysToOffload >> 2020-05-22 >> 023/100</code></p>
<h2 id="Out_with_the_old">Out with the old</h2>
<p>A couple of weeks ago, I finally discovered a FOSS alternative for nzb360, a great app for managing Plex, Radarr, Sonarr, etc. I wish to have kept using nzb360, but unfortunately, the app relies too heavily on Google Services and though I have paid for it, I can no longer use it as my LineageOS phone can't process purchases made on official Google Android phones.</p>
<h2 id="In_with_the_new">In with the new</h2>
<p>Named <a href="https://www.lunasea.app">LunaSea</a>, it can do anything it should, (manage Sonarr, Radarr, Lidarr, NZB clients), it looks fantastic, it's available for both Google Android and iPhone and, of course, it's <a href="https://github.com/LunaSeaApp/LunaSea">FOSS</a>.</p>
<p>Only thing I'm missing is a donation button. And a fediverse account :)</p>
SMH2020-05-21T09:42:23+00:002020-05-21T09:42:23+00:00
Unknown
https://yarmo.eu/blog/smh/<p><code>#100DaysToOffload >> 2020-05-21 >> 022/100</code></p>
<p>SMH mean "shaking my head".</p>
<p>You probably already know this, but one of my idiosyncracies is that I just cannot remember the meaning of that acronym, no matter how hard I try.</p>
Battlefield 1 Revival2020-05-18T23:59:59+00:002020-05-18T23:59:59+00:00
Unknown
https://yarmo.eu/blog/bf1-revival/<p><code>#100DaysToOffload >> 2020-05-19 >> 021/100</code></p>
<p>Since it was announced that Battlefield V will stop receiving earlier than expected, the general feeling in the Battlefield community has been to play the older titles in the series. After all, the game is still not fun to play and knowing that will be no brighter future, why bother?</p>
<p>I've played Battlefield 1 a few times lately, but I have noticed only today that there was a "Back To Basics" game mode loaded on many servers. And it is a game changer, no pun intended.</p>
<p>Battlefield games are crazy. Massive amounts of infantry, vehicles, planes, all at the same time. But recently, I've been enjoying a more tactical approach to the game genre that are best represented by Post Scriptum and Hell Let Loose. No running around in those games, it's all about teamplay, intelligence and tactical movement.</p>
<p>The new (reintroduced?) "Back To Basics" game mode in Battlefield 1 completely changes the games and almost turns it into a tactical shooter. Vehicles cannot be used and all infantry use one and the same rifle that historically was used by their faction. Not only is this immersive, the lack of excessively powerful machine guns makes the game much more reliant on flanking and proper teamplay. It is hard for individuals to excel, they can't use their favorite weapon of choice optimised for clearing an entire room. You need your teammates now.</p>
<p>Only downside: the base game obviously wasn't designed for such a game mode and after playing a few rounds of Grand Operations, I've yet to see an attacking team win.</p>
<p>For some casual teambased shooting with a tactical twist, Battlefield 1 has become an excellent choice. Unlike Battlefield V, I just cannot see this game phase out of popularity anytime soon.</p>
A place for notes2020-05-12T22:57:59+00:002020-05-12T22:57:59+00:00
Unknown
https://yarmo.eu/blog/notes-section/<p><code>#100DaysToOffload >> 2020-05-12 >> 017/100</code></p>
<h2 id="The_#100DaysToOffload_challenge">The #100DaysToOffload challenge</h2>
<p>Participating in the #100DaysToOffload is fun and encourages to think less and do more when it comes to blogging. That last part both sounds good and bad.</p>
<p>It's good because more content is actually published, it discourages one to keep a post in a "draft" status for an indeterminate amount of time and, well you know how that goes, the post never gets published. It teaches you a habit of working in a permanent cycle of thinking, writing, posting and moving on to the next cycle.</p>
<p>But the drawback is two-fold. Content quality can be diminished. I have noticed I'm not always content with the phrasing of certain sentences. I also regularly get reminded that a post lacks certain disclaimers or counter-arguments to the main rationale.</p>
<p>The other issue I'm currently facing is flooding. I see my personal website as having a professional utility as well: I'd like to point potential employers to my blog so that they can get a real sense of how I think and what I am good at. Administering a homelab, keeping DNS records, thinking about social structures on the internet, etc. I'd like for that "long-form" content not to be drowned out by waves of "short-form" posts because of a challenge.</p>
<h2 id="The_solution">The solution</h2>
<p>I considered tags and though I definitely need them, they are not the solution. The default view would still contain all the posts. Also, I'm not looking forward to making a RSS feed based on (excluding) tags.</p>
<p>Inspired by <a href="https://fosstodon.org/@kev">Kev</a> and a discussion with <a href="https://fosstodon.org/@murtezayesil">Ali Murteza Yesil</a> (thanks again :D), I've decided to implement a <a href="/notes">notes</a> section meant to contain all the short-form posts. Random thoughts go in the <a href="/notes">notes</a>, elaborate thoughts go in the <a href="/blog">blog</a>. A separate RSS feed will be implemented very soon. A note could also be a link to a blog post.</p>
<h2 id="Continuing_the_challenge">Continuing the challenge</h2>
<p>I will continue the challenge with posts being either a blog post or a note. I will, however, refrain from posting every day. Some days are devoid of post-worthy thoughts, some days do not allow for proper writing time. I will not write notes in advance, that defeats the purpose of the challenge.</p>
<p>I'm already noticing benefits from participating: I take more time to write, I post more and that leads to me having more interesting discussions. I am thankful for its existence but will also adapt my participation to my lifestyle and schedule.</p>
<h2 id="Update_2022-05-03">Update 2022-05-03</h2>
<p>I'm removing the notes section in favor of the <a href="/tags/short">#short</a> tag. All posts short and long are available in the <a href="/blog">/blog</a> section.</p>
Time to #DeleteKeybase2020-05-08T11:54:54+00:002020-05-08T11:54:54+00:00
Unknown
https://yarmo.eu/blog/deletekeybase/<p><code>#100DaysToOffload >> 2020-05-08 >> 014/100</code></p>
<p>If you are reading this, there's a big chance you already heard the news: Zoom acquired Keybase. Whether you liked it from the beginning or not, I think most can agree that after the acquisition, there's no more reason to trust the platform and thus to use it. What happens to our keys now is anyone's guess.</p>
<p>Luckily, I had the precaution to never upload my private keys, so I all had to do was donate the remainder of my stellar coins to good causes (such as <a href="https://tails.boum.org/donate/">Tails</a>), press the <a href="https://keybase.io/account/delete_me">big red button</a> and remove any links to them from my website.</p>
My homelab crashed, time for a break?2020-05-07T19:53:23+00:002020-05-07T19:53:23+00:00
Unknown
https://yarmo.eu/blog/homelab-crashed/<p><code>#100DaysToOffload >> 2020-05-07 >> 013/100</code></p>
<p>It's not the first time my homelab has crashed and it won't be the last time. Something with the hard drives. I'll figure it out, no doubt. But despite needing it for various services throughout my daily routine, I have decided to let the homelab rest for a few days maybe.</p>
<p>It has been running almost non-stop since I started it about two years ago, I never made major changes, always gradually improved upon it. Now, the time may have come to take a hard look at what I started with, what I ended up with, learn a few valuable lessons and perhaps start over. My homelab could use a 2.0 moment.</p>
Search engine indexing: DDG vs Google2020-05-06T10:10:45+00:002020-05-06T10:10:45+00:00
Unknown
https://yarmo.eu/blog/search-engine-indexing/<p><code>#100DaysToOffload >> 2020-05-06 >> 012/100</code></p>
<p>Having my own website means I get to control what happens on a tiny tiny part of the internet; it's my space. More importantly, I want to have a bit of control about what people see when they decide to put my name in a search engine. This is an important reason to have a website in the first place: I don't believe anyone would want their Facebook page to be their first impression, or anything the search engine decides to put first.</p>
<p>Months ago, I did a little test, searched my name in both Google and DuckDuckGo, didn't see my website which I just started, didn't think too much of it and went on with my life. Yesterday, I checked again. Let's compare the experiences.</p>
<p>Without any of my input, DuckDuckGo had found my website and it's the first thing anyone sees when searching for my name: mission accomplished. On Google, my website was not on the first page. Or the second. Or the third. After looking around in their "Webmaster Tools", I found out they had never figured out my website existed. I had to manually request the indexing which they say will be done at some point. Couldn't request an indexing without a good ol' game of finding crosswalks in a never-ending series of small images presented in a 3x3 grid.</p>
<p>In your opinion, what is the better experience?</p>
Varken: Plex monitoring solution2020-05-05T21:49:58+00:002020-05-05T21:49:58+00:00
Unknown
https://yarmo.eu/blog/varken/<p><code>#100DaysToOffload >> 2020-05-05 >> 011/100</code></p>
<p>Today, I discovered <a href="https://github.com/Boerderij/Varken">Varken</a>, a neat solution to monitor your Plex ecosystem (including Sonarr, Radarr, etc.) and store the data in your InfluxDB instance. This solution is a great addition as I can now make Grafana or Chronograf dashboardz encompassing both server metrics and Plex metrics. The reason this is important is that I have a relatively low-power server (NUC) and a single stream on Plex can have a noticeable impact on the CPU usage.</p>
<p>Varken requires a <a href="https://tautulli.com/">Tautulli</a> instance to collect the data from as well as a <a href="https://www.maxmind.com">MaxMind</a> API key which unfortunately isn't optional. I run all software mentioned in this post in separate docker containers.</p>
<p>Also, 11th post for #100DaysToOffload today and 11 is my lucky number :)</p>
Taking a break from raid2020-05-04T18:43:31+00:002020-05-04T18:43:31+00:00
Unknown
https://yarmo.eu/blog/break-from-raid/<p><code>#100DaysToOffload >> 2020-05-04 >> 010/100</code></p>
<p>I have three main hard drives in a <a href="http://www.snapraid.it/">snapraid</a> setup in my NAS and a few extra drives for backup. All drives are connected to the server (NUC) via a JBOD USB drive case. I love snapraid, it has served me well and most certainly will in the future.</p>
<p>But now, I need the drive space more than I need a solution for my data to continue to being served while a drive has died. As we all know, raid is not a backup, it's a solution to ensure the data is available while one or more drives are not. Perfect for critical applications, but let's be honest, my homelab is not, especially with me sitting 24/7 next to it.</p>
<p>Thus soon, when I have saved a bit more, I will expand my homelab to a larger array of drives, all connected directly through SATA and all raided using snapraid with ample backup capacity. That time is unfortunately not now. So out goes snapraid and in goes the full capacity of my third drive.</p>
<p>They are WD Red 6TBs. Yes, I have checked, they are CMR. And yes, these are the last drives I'll ever buy from WD.</p>
A response to ICANN's refusal to sell .ORG2020-05-01T09:33:40+00:002020-05-01T09:33:40+00:00
Unknown
https://yarmo.eu/blog/icann-rejects-sale-org/<p><code>#100DaysToOffload >> 2020-05-01 >> 007/100</code></p>
<p>A response to <a href="https://www.icann.org/news/blog/icann-board-withholds-consent-for-a-change-of-control-of-the-public-interest-registry-pir">ICANN's refusal to sell .ORG</a> in 3 movements.</p>
<p>My first reaction was sarcastic when I saw the cheer on social media: "look at us celebrating like there's no tomorrow because a non-profit organisation chose to NOT sell a TLD made for non-profit organisations to a for-profit corporation".</p>
<p>But they indeed chose not to. They really chose not to. They didn't do it. The people spoke and the people won. The powers that be got greedy, misread the room and adjusted their path because and only because of the people. A great, great thanks to all who wrote letters to the California Attorney General and made their voices heard online. This is a victory for all.</p>
<p>Today, we celebrate. Unfortunately, tomorrow, we need to think about what happens next. The internet is still under threat. A group of people have full power over what the internet looks like and they have shown us to be untrustworthy. For each domain we buy, we pay an ICANN fee, yet ICANN has made it clear that they do not have our interests at heart. Stay safe outside and vigilant on the web.</p>
<p>If within your possibilities and beliefs, please support the <a href="https://www.opennic.org/">OpenNIC project</a> (no affiliation, just a fan), a "user-owned and -controlled DNS root offering an alternative to ICANN and the traditional TLD registries".</p>
Typography · Ellipsis2020-04-29T21:21:43+00:002020-04-29T21:21:43+00:00
Unknown
https://yarmo.eu/blog/typography-ellipsis/<p><code>#100DaysToOffload >> 2020-04-29 >> 005/100</code></p>
<p>I like typography and exploring the stories behind special characters. Today, I'd like to talk about one that many use frequently, myself included, but often not in the "digitally correct" way (IMHO).</p>
<p>Yes, I'm talking about the ellipsis. Symbolised by three consecutive dots, it signals that a sentence was cut short and the reader can finish it in his or her head by knowing the context. Surrounded by brackets, it is used to signal a passage was ommitted but the meaning of the remaining sentence is unaltered by that omission. Messaging apps use it to signal the other person is writing.</p>
<p>You may or may not know this, but both on our computers and on our phones, the ellipsis is actually a special characters which can be used instead of writing three separate dots. On a phone, it's accessible under one of the keys by long-pressing on it. On the computer, I usually just copy-paste it, but on Ubuntu, it's inserted by pressing <code>ctrl+shift+u</code>, then typing <code>2026</code> followed by an <code>enter</code>. On Windows, it's inserted by pressing <code>alt + 0 1 3 3</code> on the numpad. In both HTML and markdown, it's inserted by writing <code>&hellip;</code>.</p>
<p><a href="https://en.wikipedia.org/wiki/Ellipsis">Wikipedia</a></p>
Missed a day2020-04-29T09:02:57+00:002020-04-29T09:02:57+00:00
Unknown
https://yarmo.eu/blog/missed-a-day/<p><code>#100DaysToOffload >> 2020-04-29 >> 004/100</code></p>
<p>Well, that was fast. I missed my first day in the #100DaysToOffload challenge. I am not one to make up excuses and reasons why this has happened.</p>
<p>Though I am not planning to share the layout of my entire day yesterday in this blog post, I will write a little bit about an issue I have been facing lately: memory problems. After talking with experts, this is apparently a common issue people face after prolonged exposure to stressful situations. As a reference, I never had problems remembering things before the PhD, sure my memory was not the best out there, but it served me well. Nowadays, I do tend to forget some things on a daily basis unless I write them down immediately. Well, I will still forget them but at least I'll have an indelible reminder. I remembered at multiple occasions yesterday to write a blog post, but I kept forgetting it a bit later and I didn't make a note of it, so…</p>
<p>I cannot wait for this to be over. Until then, I will try something new to help me specifically with #100DaysToOffload: I will leave a fully charged Thinkpad by my bedside in the evening, and first thing in the morning, I will write my blog post for that day.</p>
<p>Let's try that :)</p>
Building my first PC2020-04-27T13:56:18+00:002020-04-27T13:56:18+00:00
Unknown
https://yarmo.eu/blog/pc-build/<p><code>#100DaysToOffload >> 2020-04-27 >> 003/100</code></p>
<p>While working in the lab for my PhD, I needed a good computer. It didn't need to be exceptional and though I did lots of biological and physics computation, I knew that GPU acceleration wasn't needed so that eliminated the need for complicated builds. I went with a NUC.</p>
<p>Two years ago, I started my homelab. All I needed was a relatively simple PC that I wouldn't mind leaving turned on permanently. I opted for a NUC.</p>
<p>Then I needed a PC I could use at home, either to do some more work or play some game. Not expecting great gaming results, I still chose a NUC.</p>
<p>Those "not great gaming results", I got! The 7i7 has a built-in GPU and games can definitely be played on it, but it struggled with reliability for competitive gaming. This year, that's all changing. I have built my own PC for the first time, not only allowing me to play games in a more comfortable way, this will also be my new work-at-home computer as well as being extremely performant for video editing and music mixing (thank you, foam-padded case!).</p>
<p>I opted for a <a href="https://www.amd.com/en/products/cpu/amd-ryzen-5-3600">AMD Ryzen 5 3600</a> on a <a href="https://www.asus.com/Motherboards/PRIME-B450M-A/">Asus PRIME B450M-A</a> motherboard paired with a <a href="https://www.amd.com/en/products/graphics/radeon-rx-580">AMD RX580</a> GPU. OS and software goes on an NVMe m.2 drive, games on a SATA SSD, data on a 2TB HDD. 16GB of DIMM DDR4 RAM.</p>
<p>My <a href="https://www.userbenchmark.com/UserRun/27232925">userbenchmark</a>:</p>
<ul>
<li>UserBenchmarks: Game 67%, Desk 123%, Work 96%</li>
<li>CPU: AMD Ryzen 5 3600 - 92.5%</li>
<li>GPU: AMD RX 580 - 60.8%</li>
<li>SSD: Kingston SA2000M8250G 250GB - 241.9%</li>
<li>SSD: WD Green 240GB (2018) - 56.7%</li>
<li>SSD: WD Green 240GB (2018) - 51.5%</li>
<li>HDD: Seagate Barracuda 2TB (2018) - 101.7%</li>
<li>RAM: Corsair Vengeance LPX DDR4 3200 C16 2x8GB - 83.4%</li>
<li>MBD: Asus PRIME B450M-A</li>
</ul>
<p>Man, I love team red.</p>
Gaming to relax2020-04-26T16:20:27+00:002020-04-26T16:20:27+00:00
Unknown
https://yarmo.eu/blog/gaming/<p><code>#100DaysToOffload >> 2020-04-26 >> 002/100</code></p>
<p>Today hasn't been the smoothest of days and though I got ideas for a few more blog posts, I do not currently have the mental energy to work on any of them.</p>
<p>So instead, allow me to list a few games which tend to me help me relax a bit, one of which I'll start up right after writing this post:</p>
<ul>
<li>Rocket League (great for both casual and competitive, usually I play with my two brothers)</li>
<li>Post Scriptum (great for "relaxation through immersion")</li>
<li>Deadside (great for "relaxation through immersion")</li>
</ul>
<p>I play others as well, though these are nowadays my go-to's. If you happen to play any of these, <a href="/contact">contact me</a> and let's play together, that always enchances the experience!</p>
#100DaysToOffload2020-04-25T11:14:33+00:002020-04-25T11:14:33+00:00
Unknown
https://yarmo.eu/blog/100-days-to-offload/<p><code>#100DaysToOffload >> 2020-04-25 >> 001/100</code></p>
<p>On <a href="https://fosstodon.org">Fosstodon</a>, <a href="https://fosstodon.org/@kev">@kev</a> wrote a <a href="https://fosstodon.org/web/statuses/104053977554016690">toot</a> which started <a href="https://fosstodon.org/tags/100DaysToOffload">#100DaysToOffload</a>, a challenge to blog for 100 days about anything. Enthusiastic about this idea, I'm starting today and decided to make a continuously updated list about the other blogs participating in the challenge.</p>
<p><a href="https://write.privacytools.io/darylsun/">Beyond the Garden Walls</a><br />
<a href="https://blog.marcg.pizza/marcg/">G's Blog</a><br />
<a href="https://write.privacytools.io/freddy/">Freddy's Blog</a><br />
<a href="https://write.as/write-as-roscoes-notebook/">Roscoe's Notebook</a><br />
<a href="https://degruchy.org/">Nathan's Musings on the Web</a><br />
<a href="https://gregoryhammond.ca/blog/">Gregory Hammond</a><br />
<a href="https://www.garron.me/en/blog/">Garron</a><br />
<a href="https://secluded.site/">Secluded Site</a></p>
<p>Want to find even more participating blogs and links to every post? Search for the <code>#100DaysToOffload</code> hashtag on the fediverse (<a href="https://fosstodon.org/tags/100DaysToOffload">Fosstodon link</a>).</p>