<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tech on nobe4</title><link>https://nobe4.fr/tags/tech/</link><description>Recent content in Tech on nobe4</description><generator>Hugo</generator><language>en-us</language><copyright>&lt;a href="https://creativecommons.org/licenses/by-sa/4.0/"&gt;CC BY-SA&lt;/a&gt;</copyright><lastBuildDate>Sat, 27 Jun 2026 12:13:35 +0200</lastBuildDate><atom:link href="https://nobe4.fr/tags/tech/index.xml" rel="self" type="application/rss+xml"/><item><title>Slow git push from a worktree</title><link>https://nobe4.fr/posts/slow-git-push-from-a-worktree/</link><pubDate>Thu, 25 Jun 2026 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/slow-git-push-from-a-worktree/</guid><description>&lt;p&gt;I started using worktrees as part of &lt;a href="https://github.com/nobe4/dotfiles/commit/b06d149ab17a21e972dc2a5bf55b4859842a7254"&gt;my setup&lt;/a&gt;, and have been enjoying what it
has to offer.&lt;/p&gt;
&lt;p&gt;However, a &lt;code&gt;git push&lt;/code&gt; from a worktree burned ~30 seconds of local CPU before
sending a single byte. Which was not expected.&lt;/p&gt;
&lt;p&gt;As per usual, the following debug led up to a bunch of fun learnings.&lt;/p&gt;
&lt;h2 id="symptom"&gt;Symptom&lt;/h2&gt;
&lt;p&gt;I immediately started running my command with some extra debug setup:&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="nv"&gt;GIT_TRACE_PACKET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;GIT_TRACE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;GIT_SSH_COMMAND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssh -v&amp;#34;&lt;/span&gt; git push&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
	&lt;/div&gt;

&lt;p&gt;Appeared to hang ~30s right after:&lt;/p&gt;</description></item><item><title>Custom Kitty Tab Titles</title><link>https://nobe4.fr/posts/custom-kitty-tab-titles/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/custom-kitty-tab-titles/</guid><description>&lt;p&gt;I changed my Kitty tab bar to show a better context:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;owner/repo:branch process&lt;/code&gt; for git repos;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/d/n/dirname process&lt;/code&gt; (shortened path) otherwise.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For simplicity, it updates only when something changes (cd, command start,
prompt).&lt;/p&gt;
&lt;h2 id="osc-escape-sequences"&gt;OSC Escape Sequences&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/ANSI_escape_code"&gt;ANSI escape sequences&lt;/a&gt; are sequences starting with &lt;code&gt;ESC&lt;/code&gt; (&lt;code&gt;\e&lt;/code&gt;),
ending with &lt;code&gt;BEL&lt;/code&gt; (&lt;code&gt;\a&lt;/code&gt;) that control terminal behavior. They include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CSI&lt;/strong&gt; (Control Sequence Introducer, &lt;code&gt;ESC [&lt;/code&gt;): controls the text grid; cursor
movement, colors, scrolling, etc.&lt;/p&gt;</description></item><item><title>When Go user.Lookup fails</title><link>https://nobe4.fr/posts/when-go-user.lookup-fails/</link><pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/when-go-user.lookup-fails/</guid><description>&lt;p&gt;A Docker base image bump turned into a multi-day debug of Go&amp;rsquo;s &lt;code&gt;os/user&lt;/code&gt;
package, NSS, SSSD, LDAP and GLIBC ABI. Here is what happened and what I
learned.&lt;/p&gt;
&lt;p&gt;Throughout this post, &lt;code&gt;alice&lt;/code&gt; is an admin account with a hardcoded entry in
&lt;code&gt;/etc/passwd&lt;/code&gt;, and &lt;code&gt;bob&lt;/code&gt; is a regular user who only exists in the central LDAP
directory. All details of &lt;code&gt;/bin/client&lt;/code&gt; are fictitious for the purpose of this
post.&lt;/p&gt;
&lt;h2 id="how-it-started-glibc-errors"&gt;How it started: GLIBC errors&lt;/h2&gt;
&lt;p&gt;After deploying a routine docker update, users started seeing errors:&lt;/p&gt;</description></item><item><title>Shallow clone lies</title><link>https://nobe4.fr/posts/shallow-clone-lies/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/shallow-clone-lies/</guid><description>&lt;p&gt;A GitHub CI script at work checks who last edited a config file. If the author
isn&amp;rsquo;t the expected one, the build fails. Good guardrail, until it started lying.&lt;/p&gt;
&lt;p&gt;The script reported the wrong author: someone who never touched the file. The
check failed, even though the right person had made the last edit.&lt;/p&gt;
&lt;h2 id="the-setup"&gt;The setup&lt;/h2&gt;
&lt;p&gt;The CI workflow uses &lt;code&gt;actions/checkout&lt;/code&gt; with the default settings, then checks
who last edited a config file:&lt;/p&gt;</description></item><item><title>Deutsche Telekom Fiber with a MikroTik Router</title><link>https://nobe4.fr/posts/deutsche-telekom-fiber-with-a-mikrotik-router/</link><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/deutsche-telekom-fiber-with-a-mikrotik-router/</guid><description>&lt;p&gt;I switched to Deutsche Telekom Glasfaser (FTTH) and wanted to keep my MikroTik
router. No FritzBox, no rented hardware, just my own box talking to the ONT.&lt;/p&gt;
&lt;p&gt;It took a couple of hours to get it working, and the journey involved a fair
amount of trial and error. Here&amp;rsquo;s what I tried, what failed, and what finally
worked.&lt;/p&gt;
&lt;h2 id="the-setup"&gt;The setup&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Router&lt;/strong&gt;: MikroTik hAP ac&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ONT&lt;/strong&gt;: Deutsche Telekom Modem 2 fiber box, ethernet out&lt;/li&gt;
&lt;/ul&gt;




	&lt;div class="highlight-wrapper"&gt;
		&lt;div class="highlight"&gt;
			&lt;pre&gt;&lt;code class=""&gt;┌─────────┐ ┌─────┐ ┌──────────┐
│ Fiber │──fiber──│ ONT │──eth────▶│ MikroTik │
└─────────┘ └─────┘ │ ether1 │
 └──────────┘&lt;/code&gt;&lt;/pre&gt;
		&lt;/div&gt;
	&lt;/div&gt;

&lt;h2 id="what-i-tried-and-failed"&gt;What I tried (and failed)&lt;/h2&gt;
&lt;h3 id="attempt-0-swap-the-modem"&gt;Attempt 0: swap the modem&lt;/h3&gt;
&lt;p&gt;My old setup was straightforward: a DSL modem on ether1 (the WAN port), with the
MikroTik running a DHCP client to get an IP from it.&lt;/p&gt;</description></item><item><title>Nix RPi Bootstrapping</title><link>https://nobe4.fr/posts/nix-rpi-bootstrapping/</link><pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/nix-rpi-bootstrapping/</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 00:00:00 +0000</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 00:00:00 +0000</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>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>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>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>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="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;~/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="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;$ 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>Shellcode for/by a Newbie</title><link>https://nobe4.fr/posts/shellcode-for/by-a-newbie/</link><pubDate>Sat, 02 Sep 2017 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/shellcode-for/by-a-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>/dev/random: Pipe</title><link>https://nobe4.fr/posts/dev/random-pipe/</link><pubDate>Wed, 19 Oct 2016 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/dev/random-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-dragons-curve/</link><pubDate>Sun, 26 Jun 2016 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/golfed-dragons-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></channel></rss>