<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on nobe4</title><link>https://nobe4.fr/posts/</link><description>Recent content in Posts on nobe4</description><generator>Hugo</generator><language>en</language><copyright>&lt;a href="https://creativecommons.org/licenses/by-sa/4.0/"&gt;CC BY-SA&lt;/a&gt;</copyright><lastBuildDate>Wed, 15 Jul 2026 09:19:45 +0200</lastBuildDate><atom:link href="https://nobe4.fr/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>LLM and credits</title><link>https://nobe4.fr/posts/llm-and-credits/</link><pubDate>Wed, 15 Jul 2026 09:00:00 +0200</pubDate><guid>https://nobe4.fr/posts/llm-and-credits/</guid><description>&lt;p&gt;As I&amp;rsquo;ve been blogging more, I&amp;rsquo;ve received the same comment many times:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It sounds like you&amp;rsquo;re writing it yourself, not with an LLM.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Yes, and thank you, I guess? Even if I did, I would not mention it.&lt;/p&gt;
&lt;p&gt;In my work and in OSS communities, LLMs are everywhere. It is a popular way for
people to write their code, tickets, and documents. Commit histories are full of
&lt;code&gt;Co-authored-by: LLM&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I think giving credits is important, but regardless of my usage of LLM, I do not
give it&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; credit.&lt;/p&gt;</description></item><item><title>Speeding Up My Shell</title><link>https://nobe4.fr/posts/speeding-up-my-shell/</link><pubDate>Fri, 03 Jul 2026 21:26:44 +0200</pubDate><guid>https://nobe4.fr/posts/speeding-up-my-shell/</guid><description>&lt;p&gt;I spend all my time in a terminal. So much so that I have a custom macOS
launcher (&lt;a href="https://github.com/nobe4/dotfiles/blob/de893018a5f8ab64559ad0f1e93fa582ca74b1f9/bin/sling"&gt;&lt;code&gt;sling&lt;/code&gt;&lt;/a&gt;) written around my terminal emulator, instead of using
Alfred, Raycast, or others.&lt;/p&gt;
&lt;p&gt;I always notice when something feels sticky. Even a couple milliseconds can
interrupt the flow.&lt;/p&gt;
&lt;p&gt;Recently, new sessions felt slow to start, and opening a terminal repeatedly
felt &lt;em&gt;terrible&lt;/em&gt;. This post walks through how I measured and fixed my setup.&lt;/p&gt;</description></item><item><title>Devenv as a Config Syncer</title><link>https://nobe4.fr/posts/devenv-as-a-config-syncer/</link><pubDate>Thu, 02 Jul 2026 20:34:25 +0200</pubDate><guid>https://nobe4.fr/posts/devenv-as-a-config-syncer/</guid><description>&lt;p&gt;I keep a &lt;a href="https://golangci-lint.run/"&gt;golangci-lint&lt;/a&gt; config that I share across
my Go projects. Sync&amp;rsquo;ing it around gets old fast: I have to remember which repos
use it and update them all.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devenv.sh/"&gt;Devenv&lt;/a&gt; already manages my dev shells. Turns out it can
also fetch and install config files automatically.&lt;/p&gt;
&lt;h2 id="the-idea"&gt;The idea&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;pkgs.fetchurl&lt;/code&gt; downloads a file at build time and pins it by hash.
Devenv &lt;a href="https://devenv.sh/tasks/"&gt;tasks&lt;/a&gt; can run before the shell starts.&lt;/p&gt;
&lt;p&gt;Combine the two: fetch a remote config, symlink it into the project.&lt;/p&gt;</description></item><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>When ln is not idempotent</title><link>https://nobe4.fr/posts/when-ln-is-not-idempotent/</link><pubDate>Wed, 04 Feb 2026 00:00:00 +0000</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="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;$ 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/aism/</link><pubDate>Wed, 11 Dec 2024 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/aism/</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="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>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-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>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/dev/random-relativity/</link><pubDate>Sat, 26 Nov 2016 00:00:00 +0000</pubDate><guid>https://nobe4.fr/posts/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/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>