<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>~ on nobe4</title><link>https://nobe4.fr/</link><description>Recent content in ~ on nobe4</description><generator>Hugo</generator><language>en-us</language><copyright>Created with ❤️ - shared under &lt;a href="https://creativecommons.org/licenses/by-sa/4.0/"&gt; CC BY-SA&lt;/a&gt;</copyright><atom:link href="https://nobe4.fr/index.xml" rel="self" type="application/rss+xml"/><item><title>Nix RPi Bootstrapping</title><link>https://nobe4.fr/posts/nix-rpi-bootstrap/</link><pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/nix-rpi-bootstrap/</guid><description>&lt;p&gt;I can never remember how to set up a Raspberry Pi. Every time I flash an SD
card, I end up searching for the same wifi configuration, the same SSH setup,
the same boot options.&lt;/p&gt;
&lt;p&gt;During my recent exploration of Nix, this felt like an immediate candidate for
improvement: the whole configuration lives in code, and rebuilding is one
command.&lt;/p&gt;
&lt;p&gt;This post covers getting NixOS onto an RPi from scratch, and the problems I hit
while deploying updates to it. It is simplified for clarity and covers three
areas: building a minimal bootstrap image, handling secrets with agenix, and
deploying updates over SSH.&lt;/p&gt;</description></item><item><title>Nix bin alias</title><link>https://nobe4.fr/posts/nix-bin-alias/</link><pubDate>Wed, 18 Feb 2026 16:08:07 +0100</pubDate><guid>https://nobe4.fr/posts/nix-bin-alias/</guid><description>&lt;p&gt;In one of my &lt;a href="https://nobe4.fr/posts/nix-ln-the-wrong-ways/"&gt;previous post&lt;/a&gt;, I explored how to use &lt;code&gt;ln&lt;/code&gt; to link files across a
NixOS system. The two initial needs were to link configuration files, and create
a binary alias.&lt;/p&gt;
&lt;p&gt;I tend to install &lt;a href="https://github.com/itchyny/gojq?tab=readme-ov-file#difference-to-jq"&gt;&lt;code&gt;gojq&lt;/code&gt;&lt;/a&gt; and use it as &lt;a href="https://github.com/jqlang/jq"&gt;&lt;code&gt;jq&lt;/code&gt;&lt;/a&gt;, it makes more sense to me to
have a consistent experience between the CLI and library. I have not &lt;em&gt;yet&lt;/em&gt;
suffered from this choice, despite my intense &lt;a href="https://github.com/jqlang/jq"&gt;&lt;code&gt;jq&lt;/code&gt;&lt;/a&gt; usage.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;rsquo;ll use it to explore how to create a direct link to the &lt;code&gt;gojq&lt;/code&gt;
binary. The logic can be applied to any other binary of your choice.&lt;/p&gt;</description></item><item><title>Nix-Darwin shell override</title><link>https://nobe4.fr/posts/nix-darwin-shell-override/</link><pubDate>Sat, 14 Feb 2026 17:24:28 +0100</pubDate><guid>https://nobe4.fr/posts/nix-darwin-shell-override/</guid><description>&lt;p&gt;&lt;em&gt;All code snippets are simplified for clarity.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="moving-aliases-to-nix"&gt;Moving aliases to Nix&lt;/h2&gt;
&lt;p&gt;I recently decided to move my shell aliases, and ZSH options to Nix.&lt;/p&gt;
&lt;p&gt;There are predefined Nix options for this, all under &lt;a href="https://github.com/NixOS/nixpkgs/blob/nixos-25.11/nixos/modules/programs/zsh/zsh.nix"&gt;&lt;code&gt;programs.zsh&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/NixOS/nixpkgs/blob/nixos-25.11/nixos/modules/programs/bash/bash.n"&gt;&lt;code&gt;programs.bash&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And since I use the same aliases for &lt;code&gt;zsh&lt;/code&gt; and &lt;code&gt;bash&lt;/code&gt;, here&amp;rsquo;s the configuration
I came to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/nobe4/dotfiles/blob/0281789d26fa16b68a98c7e1a5f9b1ef915bbc11/nixos/packages/shell/aliases.nix"&gt;&lt;code&gt;packages/shell/aliases.nix&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;




	&lt;div class=" highlight-wrapper" data-lang="nix"&gt;
		&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nix" data-lang="nix"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ls&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ls --color=auto&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ll&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ls -la&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;optionalAttrs&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdenv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isDarwin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;kitty&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$HOME/Applications/kitty.app/Contents/MacOS/kitty&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
	&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/nobe4/dotfiles/blob/0281789d26fa16b68a98c7e1a5f9b1ef915bbc11/nixos/packages/shell/shell.nix"&gt;&lt;code&gt;packages/shell/shell.nix&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;




	&lt;div class=" highlight-wrapper" data-lang="nix"&gt;
		&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nix" data-lang="nix"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;shellAliases&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="sr"&gt;./aliases.nix&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;programs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zsh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;setOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ALWAYS_TO_END&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;shellAliases&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;shellAliases&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;programs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;shellAliases&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;shellAliases&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
	&lt;/div&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And I can import &lt;code&gt;shell.nix&lt;/code&gt; wherever needed, so far so good.&lt;/p&gt;</description></item><item><title>When ln is not idempotent</title><link>https://nobe4.fr/posts/when-ln-is-not-idempotent/</link><pubDate>Wed, 04 Feb 2026 18:02:56 +0100</pubDate><guid>https://nobe4.fr/posts/when-ln-is-not-idempotent/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;code&gt;ln -T&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I was refactoring more my Nix config, and specifically replacing my link farm
with nix as described in &lt;a href="https://nobe4.fr/posts/nix_ln_the_wrong_ways#using-useractivationscripts"&gt;my previous post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When I noticed that links were being created in the wrong places. I would run
&lt;code&gt;ln&lt;/code&gt; more than once and would get links in random locations:&lt;/p&gt;




	&lt;div class=" highlight-wrapper" data-lang="shell"&gt;
		&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ln -vfs &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DOTFILE_FOLDER&lt;/span&gt;&lt;span class="s2"&gt;/nvim/&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.config/nvim&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;/home/nobe4/.config/nvim&amp;#39;&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;&amp;#39;/home/nobe4/dev/nobe4/dotfiles/nvim&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -la &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.config/nvim&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lrwxrwxrwx &lt;span class="m"&gt;1&lt;/span&gt; nobe4 users &lt;span class="m"&gt;35&lt;/span&gt; Feb &lt;span class="m"&gt;4&lt;/span&gt; 20:12 /home/nobe4/.config/nvim -&amp;gt; /home/nobe4/dev/nobe4/dotfiles/nvim
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# all good!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# do some testing ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ln -vfs &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DOTFILE_FOLDER&lt;/span&gt;&lt;span class="s2"&gt;/nvim/&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.config/nvim&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;/home/nobe4/.config/nvim/nvim&amp;#39;&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;&amp;#39;/home/nobe4/dev/nobe4/dotfiles/nvim&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# uh, what now?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -la &lt;span class="nv"&gt;$DOTFILE_FOLDER&lt;/span&gt;/nvim/nvim
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lrwxrwxrwx &lt;span class="m"&gt;1&lt;/span&gt; nobe4 users &lt;span class="m"&gt;35&lt;/span&gt; Feb &lt;span class="m"&gt;4&lt;/span&gt; 20:12 /home/nobe4/dev/nobe4/dotfiles/nvim/nvim -&amp;gt; /home/nobe4/dev/nobe4/dotfiles/nvim
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# what the hell&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
	&lt;/div&gt;

&lt;p&gt;In a simplified form:&lt;/p&gt;</description></item><item><title>Nix ln, the wrong ways</title><link>https://nobe4.fr/posts/nix-ln-the-wrong-ways/</link><pubDate>Sun, 25 Jan 2026 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/nix-ln-the-wrong-ways/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: don&amp;rsquo;t do this, everyone suggests using &lt;code&gt;home-manager&lt;/code&gt;, or a non-Nix
solution.&lt;/p&gt;
&lt;p&gt;In the exploration of porting my configuration to Nix, the next step was to
manage all the links. This article shows a couple of wrong ways to do it, they
are still good learning paths, hence this writing.&lt;/p&gt;
&lt;p&gt;Unless otherwise specified, all code examples are simplified for clarity.&lt;/p&gt;
&lt;h2 id="current-configuration"&gt;Current configuration&lt;/h2&gt;
&lt;p&gt;Whenever I need to link a new file, I add a line in:&lt;/p&gt;</description></item><item><title>Nix packaging</title><link>https://nobe4.fr/posts/nix-packaging/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/nix-packaging/</guid><description>&lt;p&gt;I have been using Nix for a couple of month, from a purely &lt;em&gt;consumer&lt;/em&gt;
perspective. In all tools that I wanted to master, &lt;em&gt;producing&lt;/em&gt; is a great
teaching tool, sometimes more than &lt;em&gt;consuming&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In that effect, I wanted to see how I could install &lt;code&gt;bat&lt;/code&gt;, without using the
predefined package.&lt;/p&gt;
&lt;h2 id="the-plan"&gt;The plan&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download the source code&lt;/p&gt;
&lt;p&gt;This is achieved with &lt;code&gt;fetchFromGitHub&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Compile the rust binary&lt;/p&gt;
&lt;p&gt;This is achieved with &lt;code&gt;buildRustPackage&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Great Flag Unification</title><link>https://nobe4.fr/posts/great-flag-unification/</link><pubDate>Wed, 26 Nov 2025 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/great-flag-unification/</guid><description>&lt;p&gt;If there&amp;rsquo;s something I like, it&amp;rsquo;s simplicity. If there&amp;rsquo;s something that&amp;rsquo;s not
simple, it&amp;rsquo;s the flags of the world. In this post I try to redesign flags in a
simplified way, using only 4 basic shapes: rectangles, circles,
half-circles, and triangles.&lt;/p&gt;
&lt;p&gt;Each flag operates on a 12 ×12 grid, which works surprisingly well for most
flags.&lt;/p&gt;
&lt;p&gt;The idea is to create a simpler, more consistent sets of flags. Any symbolic
shapes (e.g. stars, words, etc) are removed. Consistency of shapes is favored
over individuality of each flag, for instance, most circles are only one of 2
sizes.&lt;/p&gt;</description></item><item><title>Typing Accents</title><link>https://nobe4.fr/posts/typing-accents/</link><pubDate>Fri, 25 Jul 2025 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/typing-accents/</guid><description>&lt;p&gt;Typing accents requires a whole lot of processing that seems counter-intuitive
at first glance. For a user, &amp;ldquo;tapping the key é&amp;rdquo; and &amp;ldquo;seeing é on the screen&amp;rdquo; is
so common, that one rarely tries to understand what is going on.&lt;/p&gt;
&lt;p&gt;I am by no mean an expert in this domain, but I learned a lot and wants to share
my understanding.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: whenever possible, simplified views of various output is given. Some
of the tools used are &lt;em&gt;very&lt;/em&gt; verbose.&lt;/p&gt;</description></item><item><title>Keyboard</title><link>https://nobe4.fr/posts/keyboard/</link><pubDate>Tue, 27 May 2025 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/keyboard/</guid><description>&lt;style&gt;
pre code {
 font-size: large;
}
&lt;/style&gt;
&lt;p&gt;This keyboard layout is the latest &lt;em&gt;and smallest&lt;/em&gt; iteration in my keyboard
journey. I&amp;rsquo;ve managed to fit everything into 34 keys, while removing anything
superfluous.&lt;/p&gt;
&lt;p&gt;Letting the classical QWERTY layout go in favor of one that made &lt;em&gt;sense to me&lt;/em&gt;
really helped shaping a more personal and simple layout.&lt;/p&gt;
&lt;p&gt;See the code at &lt;a href="https://github.com/nobe4/keyboards/blob/main/ferris/keymap.c"&gt;https://github.com/nobe4/keyboards/blob/main/ferris/keymap.c&lt;/a&gt;&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Glossary&lt;/summary&gt;
&lt;ul&gt;
&lt;li&gt;&lt;kbd&gt;[ ]&lt;/kbd&gt;: space key&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;GUI&lt;/kbd&gt;: &amp;ldquo;command&amp;rdquo;, &amp;ldquo;super&amp;rdquo;, or &amp;ldquo;windows&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;OS&lt;/kbd&gt;: OS layer&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;SY&lt;/kbd&gt;: Symbol layer&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h1 id="default-layer"&gt;Default layer&lt;/h1&gt;




	&lt;div class="highlight-wrapper"&gt;
		&lt;div class="highlight"&gt;
			&lt;pre&gt;&lt;code class=""&gt;q w f p g j l u y &amp;#39;
a r s t d h n e i o
z x c v b k m , . ↵
 ⇑ [ ] CTRL SY&lt;/code&gt;&lt;/pre&gt;
		&lt;/div&gt;
	&lt;/div&gt;

&lt;h1 id="-held-shift-layer"&gt;&lt;kbd&gt;⇑&lt;/kbd&gt; held: Shift layer&lt;/h1&gt;




	&lt;div class="highlight-wrapper"&gt;
		&lt;div class="highlight"&gt;
			&lt;pre&gt;&lt;code class=""&gt;Q W F P G J L U Y &amp;#34;
A R S T D H N E I O
Z X C V B K M ; : ↵
 ⇑ [ ] CTRL SY&lt;/code&gt;&lt;/pre&gt;
		&lt;/div&gt;
	&lt;/div&gt;

&lt;p&gt;Changing the defaults to have more logical shifted characters: &lt;code&gt;'&amp;quot;&lt;/code&gt;, &lt;code&gt;,;&lt;/code&gt;,
&lt;code&gt;.:&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>nobe4</title><link>https://nobe4.fr/posts/nobe4/</link><pubDate>Fri, 31 Jan 2025 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/nobe4/</guid><description>&lt;p&gt;What&amp;rsquo;s a &lt;code&gt;nobe4&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the alias I have used for as long as I could.&lt;/p&gt;
&lt;p&gt;I like the tabula rasa reference, that it &lt;em&gt;can&lt;/em&gt; mean that I try to live with no
preconception and with an open mind.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s pronounced:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;no before&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;ˈnoʊ bɪˈfɔr&lt;/p&gt;&lt;/blockquote&gt;</description></item><item><title>Stars</title><link>https://nobe4.fr/posts/stars/</link><pubDate>Thu, 23 Jan 2025 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/stars/</guid><description>&lt;p&gt;Being idealistic is hard for me to brush off. I overly enjoy perfection and the
feeling of having created something &lt;em&gt;just right&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Having guidelines, or rules matters only if consistently applied. Code fits
greatly to this via linter, type checkers, formatters, etc.&lt;/p&gt;
&lt;p&gt;For other things, I find it useful to have guiding principles, less as strong
rules and more as &lt;em&gt;unreachable states&lt;/em&gt;. Aiming, if never reaching, for something
&lt;strong&gt;perfectly great&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>A*ism</title><link>https://nobe4.fr/posts/a-ism/</link><pubDate>Wed, 11 Dec 2024 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/a-ism/</guid><description>&lt;p&gt;Agnosticism and Atheism are often used interchangeably.&lt;/p&gt;
&lt;p&gt;However they mean different things, and ought to be used precisely.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Atheism: absence of belief&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implicit Atheism absence of belief without conscious rejection&lt;/li&gt;
&lt;li&gt;Explicit Atheism: absence of belief with conscious rejection&lt;/li&gt;
&lt;li&gt;Negative Atheism: absence of belief without assertion of absence&lt;/li&gt;
&lt;li&gt;Positive Atheism: absence of belief with possibility of absence&lt;/li&gt;
&lt;li&gt;Explicit Positive Atheism: absence of belief with assertion of absence&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Agnosticism: absence of knowledge&lt;/p&gt;</description></item><item><title>Determinism</title><link>https://nobe4.fr/posts/determinism/</link><pubDate>Sat, 07 Dec 2024 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/determinism/</guid><description>&lt;h2 id="if-causality-has-gaps"&gt;If causality has gaps&lt;/h2&gt;
&lt;p&gt;It means that some effects are not the products of what came before. They
emerged outside of the physical laws, in a non-physical space.&lt;/p&gt;
&lt;p&gt;Gaps are not &lt;em&gt;unexplainability&lt;/em&gt;: electricity was not explained a thousand year
ago. Moreover, future research could explain phenomena we don&amp;rsquo;t yet
understand.&lt;/p&gt;
&lt;p&gt;Gaps are not &lt;em&gt;unpredictability&lt;/em&gt;: the weather is unpredictable because of its
complexness, yet it respects known laws of atmospheric dynamics and physics.&lt;/p&gt;</description></item><item><title>Code organization</title><link>https://nobe4.fr/posts/code-organization/</link><pubDate>Tue, 26 Nov 2024 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/code-organization/</guid><description>&lt;p&gt;Here&amp;rsquo;s a pattern I use to organize all my development work.&lt;/p&gt;




	&lt;div class=" highlight-wrapper" data-lang="shell"&gt;
		&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/dev/&lt;span class="o"&gt;{&lt;/span&gt;owner&lt;span class="o"&gt;}&lt;/span&gt;/&lt;span class="o"&gt;{&lt;/span&gt;repo&lt;span class="o"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
	&lt;/div&gt;

&lt;p&gt;This makes understanding &lt;em&gt;where&lt;/em&gt; a repository is much easier than having a flat
structure.&lt;/p&gt;
&lt;p&gt;It becomes easy to switch context using a function
&lt;a href="https://github.com/nobe4/dotfiles/blob/main/functions/z"&gt;like &lt;code&gt;z&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;




	&lt;div class=" highlight-wrapper" data-lang="bash"&gt;
		&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	fd . &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/dev&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt;		--type d &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt;		--color never &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt;		--max-depth &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt;		&lt;span class="p"&gt;|&lt;/span&gt; fzf --select-1 --query &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; exit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
	&lt;/div&gt;

&lt;p&gt;E.g.&lt;/p&gt;




	&lt;div class=" highlight-wrapper" data-lang="shell"&gt;
		&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ z
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /Users/nobe4/dev/nobe4/cli/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /Users/nobe4/dev/cli/go-gh/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /Users/nobe4/dev/cli/cli/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;▌ /Users/nobe4/dev/cli/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 4/117 ────────────────────
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; cli&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
	&lt;/div&gt;

&lt;p&gt;Using this pattern in mind, I wrote
&lt;a href="https://github.com/nobe4/projector.sh"&gt;&lt;code&gt;projector.sh&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Lazy Lazy Loading</title><link>https://nobe4.fr/posts/lazy-lazy-loading/</link><pubDate>Sun, 21 Jul 2024 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/lazy-lazy-loading/</guid><description>&lt;p&gt;In this blog post, I showcase how I maintain my &lt;a href="https://cats.nobe4.fr"&gt;cat website&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="past"&gt;Past&lt;/h1&gt;
&lt;p&gt;I used to maintain a piece of code that roughly did the following:&lt;/p&gt;




	&lt;div class=" highlight-wrapper" data-lang="python"&gt;
		&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;body&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;picture&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./pictures&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;picture&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;/body&amp;gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
	&lt;/div&gt;

&lt;p&gt;Which generated an HTML file I could then deploy:&lt;/p&gt;




	&lt;div class=" highlight-wrapper" data-lang="html"&gt;
		&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pictures/0.jpeg&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pictures/1.jpeg&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pictures/2.jpeg&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
	&lt;/div&gt;

&lt;p&gt;That meant that for any new picture, the build script would have to run again. I
removed the build step by doing something much worse.&lt;/p&gt;</description></item><item><title>Pure Data Sequencer</title><link>https://nobe4.fr/posts/pure-data-sequencer/</link><pubDate>Thu, 26 Oct 2017 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/pure-data-sequencer/</guid><description>&lt;p&gt;In this post I&amp;rsquo;d like to present a patch I made for Pure Data, namely a sequencer.&lt;/p&gt;
&lt;h1 id="pure-what"&gt;Pure What?&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Pure Data (Pd) is a visual programming language developed by Miller Puckette
in the 1990s for creating interactive computer music and multimedia works. -
&lt;a href="https://en.wikipedia.org/wiki/Pure_Data"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Coming from a text-based programming experience, it&amp;rsquo;s a &lt;em&gt;connect box with
lines&lt;/em&gt; type of programming game. Although I am relatively new to this
technology, I can already tell that it&amp;rsquo;s a lot of fun to play with!&lt;/p&gt;</description></item><item><title>Cube</title><link>https://nobe4.fr/posts/cube/</link><pubDate>Mon, 16 Oct 2017 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/cube/</guid><description>&lt;p&gt;This blog post presents the little toy I made while exploring the HTML5&amp;rsquo;s
canvas and a cube&amp;rsquo;s visualisation with changing perspectives.&lt;/p&gt;
&lt;p&gt;You can see the result here: &lt;a href="https://nobe4.fr/cube/"&gt;Cube&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="preparing-the-canvas-and-brushes"&gt;Preparing the canvas and brushes&lt;/h1&gt;
&lt;p&gt;Let start with the canvas wrapper, the non-cube side of the project.&lt;/p&gt;
&lt;p&gt;After getting the canvas and its context, we set fixed sizes for various
elements of the page:&lt;/p&gt;




	&lt;div class=" highlight-wrapper" data-lang="javascript"&gt;
		&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;canvas&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2d&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;HEIGHT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;WIDTH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pointSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;debug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
	&lt;/div&gt;

&lt;p&gt;Next, a few different functions to clear/display stuff on the canvas:&lt;/p&gt;</description></item><item><title>LAMP CTF4</title><link>https://nobe4.fr/posts/lamp-ctf4/</link><pubDate>Wed, 20 Sep 2017 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/lamp-ctf4/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Source: &lt;a href="https://www.vulnhub.com/entry/lampsecurity-ctf4,83/"&gt;https://www.vulnhub.com/entry/lampsecurity-ctf4,83/&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This LAMP challenge is most likely to be focused around casual Linux-Apache-MySQL-PHP vulnerabilities. Let&amp;rsquo;s check the &lt;code&gt;robots.txt&lt;/code&gt; file first:&lt;/p&gt;




	&lt;div class="highlight-wrapper"&gt;
		&lt;div class="highlight"&gt;
			&lt;pre&gt;&lt;code class=""&gt;User-agent: *
Disallow: /mail/
Disallow: /restricted/
Disallow: /conf/
Disallow: /sql/
Disallow: /admin/&lt;/code&gt;&lt;/pre&gt;
		&lt;/div&gt;
	&lt;/div&gt;

&lt;h2 id="mail"&gt;/mail/&lt;/h2&gt;
&lt;p&gt;Looks like a webmail service, we can&amp;rsquo;t login for now, moving on.&lt;/p&gt;
&lt;h2 id="restricted"&gt;/restricted/&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s another service here, protected by a &lt;code&gt;.htaccess&lt;/code&gt; file login, but we don&amp;rsquo;t have any access, moving on.&lt;/p&gt;
&lt;h2 id="conf"&gt;/conf/&lt;/h2&gt;
&lt;p&gt;This page crashes with a 500 error that gives two interesting pieces of information:&lt;/p&gt;</description></item><item><title>Shellcode for/by a Newbie</title><link>https://nobe4.fr/posts/shellcode-for-by-newbie/</link><pubDate>Sat, 02 Sep 2017 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/shellcode-for-by-newbie/</guid><description>&lt;p&gt;I wrote this blog post with a simple goal in mind: I never took the time to understand fully how a shellcode worked. I know about it, I know that it works, but I don&amp;rsquo;t know &lt;em&gt;how&lt;/em&gt;. So I made myself write this in order to finally grasp its logic. Ready? Let&amp;rsquo;s dig in!&lt;/p&gt;
&lt;p&gt;For this article I&amp;rsquo;m using a Ubuntu Trusty 32bits (with &lt;a href="https://www.vagrantup.com/"&gt;Vagrant&lt;/a&gt;).&lt;/p&gt;
&lt;h1 id="the-wrapper"&gt;The wrapper&lt;/h1&gt;
&lt;p&gt;In order to execute a shellcode, we&amp;rsquo;re going to use a simple wrapper, written in &lt;code&gt;C&lt;/code&gt;. Later in the blog post, I&amp;rsquo;ll assume that only &lt;code&gt;shellcode&lt;/code&gt; changes, so I&amp;rsquo;ll only reference it.&lt;/p&gt;</description></item><item><title>Vim As An Anti-Keylogger</title><link>https://nobe4.fr/posts/vim-as-an-anti-keylogger/</link><pubDate>Thu, 22 Jun 2017 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/vim-as-an-anti-keylogger/</guid><description>&lt;p&gt;OK, this is a fictional title made just to sound cool, a more accurate title would be:&lt;/p&gt;
&lt;h1 id="how-debugging-a-vim-plugin-made-me-discover-a-keylogger"&gt;How debugging a Vim plugin made me discover a keylogger&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Once upon a shell&amp;hellip;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://nobe4.fr/images/posts/vim-anti-keylogger/cat.gif" alt="Cat"&gt;&lt;/p&gt;
&lt;p&gt;Quick note about &lt;a href="https://github.com/tpope/vim-fugitive"&gt;fugitive&lt;/a&gt;. I&amp;rsquo;m using this Vim plugin &lt;em&gt;a lot&lt;/em&gt;, it&amp;rsquo;s one of the few I couldn&amp;rsquo;t live without. I highly recommend it!&lt;/p&gt;
&lt;p&gt;You can commit, show the status, add, revert, blame, directly from Vim It&amp;rsquo;s a delight.&lt;/p&gt;</description></item><item><title>/dev/random: Relativity</title><link>https://nobe4.fr/posts/root-me-dev-random-relativity/</link><pubDate>Sat, 26 Nov 2016 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/root-me-dev-random-relativity/</guid><description>&lt;p&gt;Writeup by &lt;a href="https://github.com/npny"&gt;npny&lt;/a&gt; and &lt;a href="https://github.com/nobe4"&gt;nobe4&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nmap&lt;/code&gt; reveals the following open ports: &lt;code&gt;21&lt;/code&gt;,&lt;code&gt;22&lt;/code&gt;, &lt;code&gt;80&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;HTTP&lt;/code&gt; does not reveal anything special, static &lt;code&gt;HTML&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On the ports &lt;code&gt;21&lt;/code&gt; and &lt;code&gt;22&lt;/code&gt; the default/basic username don&amp;rsquo;t work.&lt;/p&gt;
&lt;p&gt;We can see the &lt;code&gt;FTP&lt;/code&gt; on port &lt;code&gt;21&lt;/code&gt; is an old &lt;code&gt;ftpd&lt;/code&gt; version with the &lt;code&gt;mod_sql&lt;/code&gt; activated.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://phrack.org/issues/67/7.html"&gt;From&lt;/a&gt; &lt;a href="https://www.exploit-db.com/exploits/43/"&gt;various&lt;/a&gt; &lt;a href="https://www.exploit-db.com/exploits/32798/"&gt;links&lt;/a&gt; we understand that there is a &lt;code&gt;SQL&lt;/code&gt; injection on this plugin that allow a user to login without valid credentials.&lt;/p&gt;
&lt;p&gt;Using the code on &lt;a href="http://www.securityfocus.com/bid/33722/exploit"&gt;this exploit&lt;/a&gt; doesn&amp;rsquo;t work but changing the &lt;code&gt;--&lt;/code&gt; with &lt;code&gt;#&lt;/code&gt; (another comment symbol) works, the payload is:&lt;/p&gt;</description></item><item><title>/dev/random: Pipe</title><link>https://nobe4.fr/posts/root-me-random-dev-pipe/</link><pubDate>Wed, 19 Oct 2016 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/root-me-random-dev-pipe/</guid><description>&lt;p&gt;Writeup by &lt;a href="https://github.com/npny"&gt;npny&lt;/a&gt; and &lt;a href="https://github.com/nobe4"&gt;nobe4&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Firstly, we run &lt;code&gt;nmap&lt;/code&gt; against the website, to discover that (among others), the ports 80 and 22 are open.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SSH&lt;/code&gt; doesn&amp;rsquo;t yield any results, and we try, without luck, a possible exploit against the used version.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;HTTP&lt;/code&gt; is a lot more interesting:&lt;/p&gt;
&lt;p&gt;An HTTP password is asked when trying to access the main page. After a few random try on the different &lt;a href="https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods"&gt;&lt;code&gt;HTTP&lt;/code&gt; verbs&lt;/a&gt; we try to access the default &lt;code&gt;index.php&lt;/code&gt; file, which seems to have the same security. But, making a &lt;code&gt;POST&lt;/code&gt; request on the file returned a valid &lt;code&gt;HTML&lt;/code&gt; page. Nice!&lt;/p&gt;</description></item><item><title>Golfed Dragon's Curve</title><link>https://nobe4.fr/posts/golfed-dragon-curve/</link><pubDate>Sun, 26 Jun 2016 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/golfed-dragon-curve/</guid><description>&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Dragon_curve"&gt;Little dragon&amp;rsquo;s curve.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I got bored on a rainy Sunday and I thought I would try to mix mathematic and JavaScript.&lt;/p&gt;
&lt;p&gt;I love fractals and I saw neat golfed examples of what you can do with the canvas (e.g. &lt;a href="http://www.p01.org/128b_dragon_punch/"&gt;this 128 bytes dragon&amp;rsquo;s curve&lt;/a&gt;), so I tried to create a simple dragon&amp;rsquo;s curve generation visualisation.&lt;/p&gt;
&lt;p&gt;My attempt displays splittings of the initial segment as it gradually turns into a curve.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Here is the full code. To make it work, you need a fixed-size canvas whose id is &lt;code&gt;a&lt;/code&gt; (demo at the end).&lt;/p&gt;</description></item><item><title>Vim Gitignore view</title><link>https://nobe4.fr/posts/vim-gitignore-view/</link><pubDate>Sun, 06 Mar 2016 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/vim-gitignore-view/</guid><description>&lt;h1 id="introduction"&gt;Introduction&lt;/h1&gt;
&lt;p&gt;One workflow I came across a lot during my programing days is the following:&lt;/p&gt;




	&lt;div class=" highlight-wrapper" data-lang="bash"&gt;
		&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vi .gitignore
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# [Edition ...]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vi .gitignore
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# [Edition ...]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
	&lt;/div&gt;

&lt;p&gt;I don&amp;rsquo;t usually create the best gitignore pattern on the first time, so I need to test multiple times for correctness.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Wait, that seems to be a lot of repetition ! Let&amp;rsquo;s create a vim plugin !&lt;/p&gt;</description></item><item><title>Vim Syntax Generator</title><link>https://nobe4.fr/posts/vim-syntax-generator/</link><pubDate>Sat, 10 Oct 2015 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/vim-syntax-generator/</guid><description>&lt;blockquote&gt;
&lt;p&gt;When you feel like knowing all this syntax stuff, perhaps write a blog post ;) - &lt;a href="https://vi.stackexchange.com/questions/4856/syntax-concealends-not-applied#comment7415_4857"&gt;VanLaser&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I may not know everything about the syntax mechanisms in Vim, but at least I&amp;rsquo;ll
share what I understood building a syntax file generator.&lt;/p&gt;
&lt;h1 id="tldr"&gt;TL;DR&lt;/h1&gt;
&lt;p&gt;How I created a syntax file generator for displaying StackExchange API values.&lt;/p&gt;
&lt;p&gt;I have some data:&lt;/p&gt;




	&lt;div class=" highlight-wrapper" data-lang="json"&gt;
		&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;has_more&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;items&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;answer_count&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;creation_date&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1441047662&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;is_answered&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;last_activity_date&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1441047900&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;link&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
	&lt;/div&gt;

&lt;p&gt;And I define a formatting style:&lt;/p&gt;</description></item><item><title>208 Energy</title><link>https://nobe4.fr/posts/208-energy/</link><pubDate>Tue, 30 Jun 2015 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/208-energy/</guid><description>&lt;p&gt;Scroll all the way down !&lt;/p&gt;
&lt;p&gt;For the release of the new Peugeot 208, we developed at &lt;a href="http://cogitstudio.com"&gt;Cogit
Studio&lt;/a&gt; a single scrolling webpage to beautifully
present the car.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.208energy.com"&gt;Feel the energy&lt;/a&gt; (website down)&lt;/p&gt;</description></item><item><title>308 Experience</title><link>https://nobe4.fr/posts/308-experience/</link><pubDate>Sun, 22 Mar 2015 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/308-experience/</guid><description>&lt;p&gt;Scroll all the way down !&lt;/p&gt;
&lt;p&gt;For the release of the new Peugeot 308, we developed at &lt;a href="http://cogitstudio.com"&gt;Cogit
Studio&lt;/a&gt; a single scrolling webpage to beautifully
present the car.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.308experience.com/"&gt;Live the Experience&lt;/a&gt; (website down)&lt;/p&gt;</description></item><item><title>The Ad Filter</title><link>https://nobe4.fr/posts/the-ad-filter/</link><pubDate>Sun, 15 Mar 2015 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/the-ad-filter/</guid><description>&lt;p&gt;The &lt;a href="http://www.dandad.org/en/d-ad-browser-ad-filter/"&gt;Ad Filter&lt;/a&gt; is a Chrome
and Firefox extension that only shows the &amp;ldquo;best&amp;rdquo; ads.&lt;/p&gt;
&lt;iframe width="100%" height="432" src="https://www.youtube.com/embed/T4jniN89mnQ" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;This work was done with &lt;a href="http://cogitstudio.com"&gt;Cogit Studio&lt;/a&gt; and
&lt;a href="https://www.dandad.org/"&gt;D&amp;amp;AD&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.adweek.com/adfreak/browser-extension-replaces-boring-old-preroll-worlds-best-ads-165008"&gt;D&amp;amp;AD and BETC&amp;rsquo;s new Ad
Filter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thenextweb.com/media/2015/05/27/bad-ads/"&gt;The most hypocritical ad blocker ever replaces ‘bad’ clips with award
winning ones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thedrum.com/news/2015/05/30/dad-s-bad-ad-blocker-timely-reminder-importance-online-creativity"&gt;D&amp;amp;AD’s &amp;lsquo;bad ad&amp;rsquo; blocker a timely reminder of the importance of online
creativity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/pulse/why-dad-wrong-create-its-ad-blocker-chris-barraclough"&gt;Why D&amp;amp;AD is wrong to create its ad
blocker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>About</title><link>https://nobe4.fr/pages/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nobe4.fr/pages/about/</guid><description>&lt;p&gt;I am nobe4, a french developer, constant learner, and music listener.&lt;/p&gt;
&lt;p&gt;I am seeking enlightenment through &lt;a href="https://github.com/nobe4/"&gt;coding&lt;/a&gt; and
&lt;a href="https://soundcloud.com/nobe4"&gt;music&lt;/a&gt;
&lt;a href="https://www.youtube.com/@UnintendedMusic"&gt;making&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>CV</title><link>https://nobe4.fr/pages/cv/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nobe4.fr/pages/cv/</guid><description>&lt;h2 id="experience"&gt;Experience&lt;/h2&gt;
&lt;h3 id="github"&gt;&lt;a href="https://github.com"&gt;GitHub&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;2023 Sep - Present&lt;br&gt;
Berlin, DE&lt;br&gt;
Senior Security Engineer&lt;/p&gt;
&lt;p&gt;2021 May - 2023 Sep&lt;br&gt;
Berlin, DE&lt;br&gt;
Security Engineer&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TBD, still breaking things over there&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id="n26"&gt;&lt;a href="https://n26.com/"&gt;N26&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;2019 Sep - 2021 April&lt;br&gt;
Berlin, DE&lt;br&gt;
Security Engineer&lt;/p&gt;
&lt;p&gt;2018 May - 2019 Sep&lt;br&gt;
Berlin, DE&lt;br&gt;
Junior Security Engineer&lt;/p&gt;
&lt;p&gt;Joined the original security team. Did all things security: education, auditing,
pentest, incident response, built and managed a SIEM.&lt;/p&gt;
&lt;p&gt;Technologies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elasticsearch&lt;/li&gt;
&lt;li&gt;Python/Ruby/Bash&lt;/li&gt;
&lt;li&gt;Datadog&lt;/li&gt;
&lt;li&gt;Saltstack&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Hashicorp/*&lt;/li&gt;
&lt;li&gt;AWS&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="meetreel"&gt;&lt;a href="https://www.f6s.com/company/meetreel"&gt;Meetreel&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;2017 Aug - 2018 Feb&lt;br&gt;
Paris, FR&lt;br&gt;
Co-founder, CTO&lt;/p&gt;</description></item><item><title>N-Back</title><link>https://nobe4.fr/pages/memory/n-back/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nobe4.fr/pages/memory/n-back/</guid><description>&lt;label for="x_back_count"&gt;
	X-Back
	&lt;input
		type="number"
		id="x_back_count"
		value="3"
		min="2"
		max="100"
		step="1"
		onchange="gen();"
	/&gt;
&lt;/label&gt;

&lt;label for="value_count"&gt;
	Count
	&lt;input
		type="number"
		id="value_count"
		value="20"
		min="10"
		max="100"
		step="1"
		onchange="gen();"
	/&gt;
&lt;/label&gt;

&lt;div id="board"&gt;&lt;/div&gt;

&lt;p id="controls"&gt;
	&lt;span id="counter"&gt;&lt;/span&gt;
	&lt;button onclick="click_button(true);"&gt;Seen&lt;/button&gt;
	&lt;button onclick="click_button(false);"&gt;Not seen&lt;/button&gt;
	&lt;span id="result"&gt;&lt;/span&gt;
&lt;/p&gt;</description></item><item><title>Pairs</title><link>https://nobe4.fr/pages/memory/pairs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nobe4.fr/pages/memory/pairs/</guid><description>&lt;label for="value_count"&gt;
	Value count
	&lt;input
		type="number"
		id="value_count"
		value="13"
		min="2"
		max="100"
		step="1"
		onchange="gen();"
	/&gt;
&lt;/label&gt;

&lt;label for="letter_count"&gt;
	Letter count
	&lt;input
		type="number"
		id="letter_count"
		value="2"
		min="2"
		max="10"
		step="1"
		onchange="gen();"
	/&gt;
&lt;/label&gt;

&lt;span id="total"&gt;&lt;/span&gt;

&lt;div id="board"&gt;&lt;/div&gt;</description></item><item><title>Plants</title><link>https://nobe4.fr/pages/plants/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nobe4.fr/pages/plants/</guid><description>&lt;p&gt;Terms&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Growing season: Spring + Summer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All plants&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;want lukewarm water&lt;/li&gt;
&lt;li&gt;are potentially toxic to pets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;research repotting&lt;/li&gt;
&lt;li&gt;research prunning&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Privacy policy</title><link>https://nobe4.fr/pages/privacy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nobe4.fr/pages/privacy/</guid><description>&lt;p&gt;This privacy policy covers how data is collected and processed on nobe4.fr.&lt;/p&gt;
&lt;h2 id="data-collected"&gt;Data collected&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://goatcounter.com"&gt;GoatCounter&lt;/a&gt; is used to perform analytics without collecting
personal information.&lt;/p&gt;
&lt;p&gt;It is configured to collect the following information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visited page address&lt;/li&gt;
&lt;li&gt;Referrer&lt;/li&gt;
&lt;li&gt;User-Agent&lt;/li&gt;
&lt;li&gt;Screen size&lt;/li&gt;
&lt;li&gt;Country and Region&lt;/li&gt;
&lt;li&gt;Language&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is processed to understand site usage.&lt;/p&gt;
&lt;p&gt;GoatCounter doesn&amp;rsquo;t use cookies.&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://nobe4.goatcounter.com/help/privacy"&gt;GoatCounter privacy policy&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="disclosure-of-information"&gt;Disclosure of information&lt;/h2&gt;
&lt;p&gt;No information is shared with third parties.&lt;/p&gt;</description></item></channel></rss>