<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Raphi Rambles</title><link href="https://www.rgaz.fr/" rel="alternate"/><link href="https://www.rgaz.fr/feeds/en.atom.xml" rel="self"/><id>https://www.rgaz.fr/</id><updated>2026-06-25T13:00:00+02:00</updated><entry><title>Hello World</title><link href="https://www.rgaz.fr/blog/hello-world/" rel="alternate"/><published>2025-05-16T11:30:00+02:00</published><updated>2025-05-16T11:30:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-05-16:/blog/hello-world/</id><summary type="html">&lt;p&gt;1, 2, Testing...&lt;/p&gt;</summary><content type="html">&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[]){&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;108&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;108&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;114&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;108&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;So here we go.&lt;/p&gt;
&lt;p&gt;After years of putting it off, I finally bit the bullet and bought a personal
domain name. My main intention was to get out of gmail and avoid trapping
myself with whoever I end up going with for hosting my mail.&lt;/p&gt;
&lt;p&gt;Now, as long as that domain is paid for, why not build a website ?&lt;/p&gt;
&lt;p&gt;As a long time critic of social media and advocate for re-decentralizing the web,
I figure it's time to put my money where my mouth is. Whether or not I end up
using this space for anything interesting remains to be seen, but let's take this
one step at a time, shall we ?&lt;/p&gt;
&lt;p&gt;I had heard of &lt;a href="https://getpelican.com" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Pelican&lt;/a&gt; for a while already and decided
to give it a try. The new kid on the block, &lt;a href="https://gohugo.io" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Hugo&lt;/a&gt;, seems to
be more popular these days, and maybe I'll give it a try, but being used to
python I figured it would make things easier.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;A couple of days hacking up a theme (CSS and I are not the best of friends...)
and here we are. This won't win any beauty contest, but I like the minimalist
vibe of it all so far.&lt;/p&gt;
&lt;a href="#so-whats-this-thing-gonna-be"&gt;&lt;h2 id="so-whats-this-thing-gonna-be"&gt;So what's this thing gonna be ?&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;I'm not sure yet. I'm feeling an itch to start writing again and figure I'll
just get started on that and see where it goes.&lt;/p&gt;
&lt;p&gt;The question of who I'm writing &lt;em&gt;for&lt;/em&gt; can't really be avoided, though. No sense
in writing anything if you're not addressing &lt;em&gt;someone&lt;/em&gt;. And while the void of the
interwebs is good enough for now, at some point I'll have to decide on a language
to use (an actual human language, that is).&lt;/p&gt;
&lt;p&gt;I've always loved English and tend to naturally use it whenever it's surrounding
me (like when I'm coding or reading tech documentation, which is what I've been
doing for the last 2 days), so obviously it didn't even occur to me to translate
the theme I was putting it together and now using another language would only feel
weird.&lt;/p&gt;
&lt;p&gt;But I do know that if this blog ever attracts some readers, those will almost
certainly be french people&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;, at least in the begining.&lt;/p&gt;
&lt;p&gt;So what do I do ? Switch the whole site to french ? Aim for an international
audience right from the begining ? Internationalizing the site should be easy
enough, but do I feel like translating everything I post on here ? Hell, who's
really gonna care if I just switch language randomly, consistency be damned.&lt;/p&gt;
&lt;p&gt;As with about everything else, I guess the answer is "who knows, let's just see
what happens".&lt;/p&gt;
&lt;p&gt;Enough rambling for now. Time to go mess with Nginx and get this show started.&lt;/p&gt;
&lt;p&gt;See ya, interwebs!&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;I am somewhat interested in Go, kind of in a hacking mood these days and
  I do have some time on my hands, so we'll see what happens...&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;And no one hates English more than a frenchie. It's in our genes. Which is
  probably why I like this language so much.&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="general"/></entry><entry><title>Tooltip Odissey</title><link href="https://www.rgaz.fr/blog/tooltip-odissey/" rel="alternate"/><published>2025-05-19T20:00:00+02:00</published><updated>2025-05-19T20:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-05-19:/blog/tooltip-odissey/</id><summary type="html">&lt;p&gt;Or how a quick afternoon hack led to paying tribute to one of my heroes.
And also to some lessons in UX design, I guess.&lt;/p&gt;</summary><content type="html">&lt;p&gt;If asked to name a blogger whose work I've enjoyed, the first one that would pop into
my head would the the great (and sadly, late) &lt;a href="https://www.shamusyoung.com/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Shamus Young&lt;/a&gt;. If you're
into geeky stuff like video games, programming popularization and obsessive
nitpicking about storytelling, then I can't recommend this blog enough.&lt;/p&gt;
&lt;p&gt;That guy was a huge influence on the way I still think about a lot of stuff, and
the itch to start writing myself might not have gotten to me if not for him.&lt;/p&gt;
&lt;p&gt;But the funny thing is, I didn't think of him (at least not consciously) when I
started building this website. That only came when, catching up on the markdown
syntax, I stumbled upon the footnotes feature.&lt;/p&gt;
&lt;p&gt;Open the link above and skim a few posts. Look for the citation links&lt;sup id="fnref:citation-links"&gt;&lt;a class="footnote-ref" href="#fn:citation-links"&gt;1&lt;/a&gt;&lt;/sup&gt;
peperred across the pages and click on one of them.&lt;/p&gt;
&lt;p&gt;It's not much, but it's one of the small touches that gave this blog its vibe.
And to this day, I always have a thought for the ol' twentysided whenever I see
one of those (and also get slightly annoyed when sites stick to the default browser
behaviour.&lt;sup id="fnref:default-behaviour"&gt;&lt;a class="footnote-ref" href="#fn:default-behaviour"&gt;2&lt;/a&gt;&lt;/sup&gt; Maybe it's just a habit I picked up, but I find
reading the footnote in place much more convenient).&lt;/p&gt;
&lt;p&gt;So since I had way more urgent things to do, I decided to go ahead and spend an
afternoon hacking on my own take on the idea.&lt;/p&gt;
&lt;p&gt;I haven't looked into his implementation. I might check it out later, but I
figured it would be funnier to come up with my own version, especially on a
trivial thing like this.&lt;/p&gt;
&lt;p&gt;The first thing I realized is that since the footnotes' markup is generated from
the article's markdown, I can't easily fool around with it (I guess it's possible,
but this is going to require writing a pelican plugin, which is not what I'm
interested in at the moment. Also, I'm not sure how straightforward it is to
alter only part of the generated output.&lt;sup id="fnref:html-regex"&gt;&lt;a class="footnote-ref" href="#fn:html-regex"&gt;3&lt;/a&gt;&lt;/sup&gt; Again, my goal here is just
to hack together a small feature, not to become a markdown expert).&lt;/p&gt;
&lt;p&gt;So, since I can't directly alter the page's HTML, I guess I'll have to use
Javacript.&lt;sup id="fnref:javascript"&gt;&lt;a class="footnote-ref" href="#fn:javascript"&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;a href="#simple-start"&gt;&lt;h2 id="simple-start"&gt;Simpler is always better...&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;My first thought was pretty elementary. Grab all the footnotes gathered at the
bottom of the article, clone their children, and add the clones right beside the
link that points to them. The actual tooltip hide/show logic shall be handled via
CSS.&lt;/p&gt;
&lt;p&gt;I got started doing that, and along the way realized that I probably could avoid
messing with the DOM by simply extracting the footnote's text and sticking it
on the link as an attribute. If CSS could then access this attribute, that would
vastly reduce the amount of JS code. I found a &lt;a href="https://codepen.io/reiinii1/pen/aPGXEa" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;codepen&lt;/a&gt; online
that did just that, pasted it in my template, and lo and behold, it worked!&lt;/p&gt;
&lt;p&gt;Here's the script I ended up with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SYToolFoot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Loop over the footnote links&lt;/span&gt;
&lt;span class="w"&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;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a.footnote-ref&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;footlink&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;footnoteId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;footlink&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// Grab the corresponding footnote&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;footnote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&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="nx"&gt;footnoteId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// And stick its text in a custom attriibute&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;footlink&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-tooltip&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;footnote&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now ain't that a beauty!&lt;sup&gt;&lt;a class="bad-footnote-ref" href="#bad-footnote-1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Barely 5 lines of js and it looks and feels great. Since the actual showing and
hiding is handled via CSS (that's where the real magic happens, and I shamelessly
stole that part), I had to trigger it on mouseover instead of requiring a click.
But honestly, it feels sleeker that way.&lt;/p&gt;
&lt;p&gt;So good job, well done, now let's go grab a beer and reflect on the virtues of
simplicity and how much of a better place the world would be if only people would
wise up and join us in the perpetual battle against complexity. Right ?&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://www.rgaz.fr/img/sytooltip/corporate_happiness.jpg"
       title="Good job everyone!"
       alt="Stock photo. People celebrating in an office."
  &lt;figcaption&gt;
    Stock, sappy corporate pictures as illustrations. Another Shamus hallmark. In
    fact, I recognized a few photos he used while searching for this one.
    Source: &lt;a href="https://www.pexels.com/photo/men-doing-high-five-at-the-office-7794041/"
               target="_blank"&gt;pexels.com&lt;/a&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;a href="#not-so-simple"&gt;&lt;h2 id="not-so-simple"&gt;... Except when it's not.&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Hmm. The default behaviour (click &amp;amp; scroll to the bottom) is preserved.&lt;sup id="fnref:default-preserved"&gt;&lt;a class="footnote-ref" href="#fn:default-preserved"&gt;5&lt;/a&gt;&lt;/sup&gt;
That's great, as it means the basic functionality will be unafected if javascript
is disabled. But it's also confusing. Someone might click on the link out of habit
(that's what links are for, right ?) and get confused by the glimpse of the tooltip
appearing as the page starts scrolling down.&lt;/p&gt;
&lt;p&gt;That's pretty much what &lt;a href="https://en.wikipedia.org/wiki/Academic_writing" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Wikipedia&lt;/a&gt; does, and while it works well on
their page, here it just feels wrong and annoying. Feels like we need to tune
the numbers just right on the animation delays and whatnot, which sounds like
the polar opposite of fun.&lt;/p&gt;
&lt;p&gt;Well. The intent behind these tooltips is mostly to add some jokes or slight
digressions. I don't expect to write the kind of stuff that warrants a more
disciplined approach to citations or bibliography. So I could just hide the bottom
list and only keep the funny tooltips. Also, I said earlier that I wasn't a fan of the
usual, back and forth behaviour. So let's just get rid of the list, and problem
solved, right ? We end up with just what Shamus had, only slightly nicer as I
don't have to click the mouse anymore to see the silly bits.&lt;/p&gt;
&lt;p&gt;So that's what I did. Clean up the code, slap a quick &lt;code&gt;preventDefault()&lt;/code&gt; on the
click event, and we're done. Nice and quick, still felt pretty good about it all.&lt;/p&gt;
&lt;p&gt;That's about when I decided to document this whole process and turn this thing
into an article. Obviously, I started playing with the tooltips immediately. And
as I got to the second or third one I tried to include a link and...&lt;/p&gt;
&lt;p&gt;Wait.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Kid facepalming" class="half-width float-left" loading="lazy" src="https://www.rgaz.fr/img/sytooltip/facepalm.gif"&gt;&lt;/p&gt;
&lt;p&gt;This&lt;sup&gt;&lt;a class="bad-footnote-ref" href="#bad-footnote-2"&gt;2&lt;/a&gt;&lt;/sup&gt; is what
it looked like. Go ahead, try and click the link.&lt;/p&gt;
&lt;p&gt;This is hell, right ? And the worst part is, even if you &lt;em&gt;could&lt;/em&gt; get to the damn
thing, it wouldn't work anyway.&lt;/p&gt;
&lt;p&gt;I'm copying the footnote's &lt;em&gt;text&lt;/em&gt; into an element attribute. All the actual html
markup is stripped out. You can't even &lt;em&gt;see&lt;/em&gt; the link, because, well, there &lt;em&gt;is&lt;/em&gt;
no link.&lt;/p&gt;
&lt;p&gt;Now, I could just accept this limitation and keep things as they are. Art lives
on constraint and all that. And honestly, as long as you stick to plain text,
the quick and dirty solution is fine.&lt;sup id="fnref:quick-and-dirty"&gt;&lt;a class="footnote-ref" href="#fn:quick-and-dirty"&gt;6&lt;/a&gt;&lt;/sup&gt; But now that I thought
of stuffing links in those tooltips, I just can't let go of the idea. Without
them, the whole feature is just a cute trick. But with them, it becomes actually
useful, and can be a great way to add some precisions without cluttering the main
point.&lt;/p&gt;
&lt;p&gt;Also, I realize only now than the hover event won't be available on mobile, which
sucks, I guess. If you were wondering why my exemples didn't work, now you know
why.&lt;/p&gt;
&lt;p&gt;Oh well, it's not like my initial approach was hugely complicated anyway. So
let's get to it.&lt;/p&gt;
&lt;a href="#lesson-learned"&gt;&lt;h2 id="lesson-learned"&gt;Lessons learned (?)&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;About 30 minutes later I got the DOM shuffling version working. The first pass
was about 30 lines of pretty straightforward code. It's barely more complex than
what I had before and it does what I want. Problem solved, for real this time.&lt;/p&gt;
&lt;p&gt;So, is there even a point to this whole thing, or did I just decide to waste
your time like I wasted mine ?&lt;/p&gt;
&lt;p&gt;This story hopefully illustrates a few classic blunders. Beginners' mistakes,
really, but those things have a tendency to keep happening even when you'd like
to think you know better.&lt;/p&gt;
&lt;h3 id="rabbit-hole"&gt;Diving in a rabbit hole&lt;/h3&gt;
&lt;p&gt;&lt;img alt="Rabbit staring down a hole in the ground." class="half-width float-right" loading="lazy" src="https://www.rgaz.fr/img/sytooltip/rabbit_hole.jpg" title="This is the internet. Cute animal pictures are mandatory."&gt;&lt;/p&gt;
&lt;p&gt;When I found out I couldn't hover the tooltip themselves, my first impulse was to
double down. Keep things as they are and add some logic to handle the corner
cases. Which often leads to discovering &lt;em&gt;more&lt;/em&gt; corner cases.&lt;/p&gt;
&lt;p&gt;Sometimes there's just no way around it. But it always pays to stop as soon as you
notice this pattern and think about whether or not the first steps you took were
heading in the right direction.&lt;/p&gt;
&lt;p&gt;I'm not a frontend guy. I'm bad at UI and I know it. I don't think this particular
case would have gotten too bad, but that's just an assumption. The truth is that
I haven't done a lot of integration work before, and most of it relied on third
party libraries to handle that kind of things. Here in vanilla land, I don't have
a good hunch to try and predict potential pitfalls before falling into them. I can't
know how long the path is before I walk it.&lt;/p&gt;
&lt;p&gt;Luckily I saw that one coming before embarking on a wild goose chase, but that's
only because I've been burned before.&lt;sup id="fnref:burned"&gt;&lt;a class="footnote-ref" href="#fn:burned"&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h3 id="simple-is-not-easy"&gt;Simple != Easy&lt;/h3&gt;
&lt;p&gt;I'm more and more convinced of the importance of the &lt;abbr title="Keep It Simple, Stupid"&gt;KISS&lt;/abbr&gt; principle, and I try
to apply it whenever I can, even though I still fail to resist the urge of
overdoing things pretty often.&lt;sup id="fnref:overengineering"&gt;&lt;a class="footnote-ref" href="#fn:overengineering"&gt;8&lt;/a&gt;&lt;/sup&gt; But I think my mistake here was
to confuse simple and easy.&lt;/p&gt;
&lt;p&gt;Sure, manipulating the DOM is a bit more cumbersome than simply setting an
attribute. I'll have to catch up on the API, read some docs, maybe re-learn a few
javascript quirks. But is it that much more complex than the naive approach ? Not
really. And since the elements are copied as is, unforeseen situations where they
stop behaving like they should are much less likely. No special UI shenanigans to
worry about. The code is dumb and only cares about the one thing it's supposed to
do. This is &lt;em&gt;always&lt;/em&gt; better than trying to be clever.&lt;/p&gt;
&lt;p&gt;By trying to cut corners, I was giving up all of this and would have quickly
ended up with a ball of mud, ie &lt;em&gt;more&lt;/em&gt; complexity.&lt;/p&gt;
&lt;p&gt;I'm sure someone more used to building interfaces would have spotted the problem
right away. That's what domain experience is all about. But sadly, experience
doesn't always transfer well across domains, even when those look similar. Whenever
you try your hand at something you're not that familiar with, chances are you'll
hit that kind of wall.&lt;sup id="fnref:hit-wall"&gt;&lt;a class="footnote-ref" href="#fn:hit-wall"&gt;9&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h3 id="" usable-is-not-sexy&gt;Usable != Sexy&lt;/h3&gt;
&lt;p&gt;&lt;img alt="Wooden saw lying on a wooden surface" class="half-width float-left" loading="lazy" src="https://www.rgaz.fr/img/sytooltip/wooden_saw.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I'm no designer, but I've been using the web long enough to develop an eye for
stupid UI trends, and find myself ranting about those more and more.&lt;sup id="fnref:ui-rants"&gt;&lt;a class="footnote-ref" href="#fn:ui-rants"&gt;10&lt;/a&gt;&lt;/sup&gt;
It usually boils down to something along the lines of:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"Congratulations for being such a shiny turd. Too bad you're still turd."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And yet, I still fell for the sexyness of on-hover tooltips.&lt;/p&gt;
&lt;p&gt;There's nothing wrong with some cheap flash now and then. But doing it right is
extra work, the kind of which I can only enjoy for so long before going postal and
sending death threats to &lt;a href="https://en.wikipedia.org/wiki/Brendan_Eich" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Brendan Eich&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/H%C3%A5kon_Wium_Lie" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Håkon Wium Lie&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And half-assing it is even worse. Trigger on hover feels nicer at first
thougth (why waste &lt;em&gt;two&lt;/em&gt; mouse clicks just to read some side comments ?), but
it comes with a bunch of downsides. My naive implementation&lt;sup&gt;&lt;a class="bad-footnote-ref" href="#bad-footnote-4"&gt;4&lt;/a&gt;&lt;/sup&gt;
forces you to keep your mouse in just the right spot to keep reading the damn
thing. If you &lt;code&gt;Alt-Tab&lt;/code&gt; to quickly check on something else and come back, the
tooltip animation plays again, which feels like some kid waving for attention.
And that's assuming you haven't moved the mouse in the meantime (if you did, then the
tooltip is gone, so you have to find it back and re-hover it if you weren't done
reading it). They're also prone to trigger when you're just reaching for something
else. What felt sleek and modern on first impression ends up being a royal
pain in the butt.&lt;/p&gt;
&lt;p&gt;Thinking back on the Wikipedia example, I realize how good of a job they
did. Their tooltips are timed just right and get out of the way seamlessly (I
don't remember ever getting pissed at them. And I get pissed at crappy widgets
on a daily basis). And their perfect positioning lets you interact with their
contents without having to think about it. The only flaw I can find is the
&lt;code&gt;Alt-Tab&lt;/code&gt; one.&lt;/p&gt;
&lt;p&gt;"Sexy" might not be the first word that comes to mind when thinking about
Wikipedia's UI, but the best interfaces are the ones you don't even notice.
Whoever did that knew what he was doing.&lt;sup id="fnref:great-ui"&gt;&lt;a class="footnote-ref" href="#fn:great-ui"&gt;11&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Trying to replicate it could be a worhtwhile learning project. Could even be fun.
But that would still take time and require me to care more that I currently can
(I already spent way too much time just trying to make the stupid popups look
not-quite-atrocious. Also, this was supposed to be a quick hack, remember ? It's
been 3 days already. Granted, most of that was spent writing this article, but
still).&lt;/p&gt;
&lt;p&gt;I go back to Shamus' site and fiddle with his take on tooltips. His clunky,
archaic take that requires &lt;em&gt;pressing buttons&lt;/em&gt; and doesn't even try to be fancy.
And I realize how right he got it.&lt;/p&gt;
&lt;p&gt;Context is everything. This isn't wikipedia. Their implementation might be pretty
cool, but it's overkill for this site. But I still want to focus on writing, and
going for flash without putting in the work to do it right would just be distracting.&lt;/p&gt;
&lt;p&gt;Sometimes the dumb and boring way is the best one.&lt;sup id="fnref:dumb-and-boring"&gt;&lt;a class="footnote-ref" href="#fn:dumb-and-boring"&gt;12&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;a href="#are-we-done"&gt;&lt;h2 id="are-we-done"&gt;Are we done yet ?&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;I swear I didn't plan for this. This started as a simple excuse to just write
something and justify getting this blog online. And as the brain got rolling it
kept getting caught on details and tidbits it found interesting.&lt;/p&gt;
&lt;p&gt;This whole tooltip thing is definitely not worth so many words by itself. No
one is gonna learn anything of technical value here. But I hope this report helps
demonstrate how simplicity is a tricky thing.&lt;/p&gt;
&lt;p&gt;Even the most trivial tasks desserve some attention put into them, and following
the trains of thought it produces can lead to some interesting insights. This ain't
no grand revelation, but my understanding of what good UI truly is (and my conviction
that it's &lt;em&gt;not&lt;/em&gt; about making stuff bright and shiny) just grew a teeny little bit
better.&lt;/p&gt;
&lt;p&gt;I hope the bad Shamus Young impersonation wasn't too cringy. Some of it was
intentional and meant as a small tip of the hat, but I didn't plan to rip him off
so much. Guess I wasn't kidding when I said he was such an influence on me.
Again, if you don't know his blog, &lt;a href="https://www.shamusyoung.com/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;go and give it a glance&lt;/a&gt;.
If you're interested in coding (even from a distance, those posts are meant for
non-tech people), I recommend his &lt;a href="https://www.shamusyoung.com/twentysidedtale/?p=2940" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;programming series&lt;/a&gt;.
If you're more into story and worldbuilding analysis, then read one of his
&lt;a href="https://www.shamusyoung.com/twentysidedtale/?p=27085" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;videogame retrospectives&lt;/a&gt;. Oh, and if you're a fan of DnD and/or the
lord of the rings, then you can't miss his &lt;a href="https://www.shamusyoung.com/twentysidedtale/?p=612" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;DM of the Rings&lt;/a&gt;
comics series (they're currently being re-posted in &lt;a href="https://www.shamusyoung.com/twentysidedtale/?p=55070" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;higher quality&lt;/a&gt;
by his family, if you'd rather follow along weekly than binge-read it all) (Oh,
and apparently there's a &lt;a href="https://dmoftheringsfr.blogspot.com/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;french version&lt;/a&gt; too. Nice!).&lt;/p&gt;
&lt;p&gt;Whatever your jam is, this site desserves some traffic. It's one of those places
that made the web such a magical place.&lt;/p&gt;
&lt;p&gt;Allright, I'm done. See ya interwebs!&lt;sup&gt;&lt;a class="bad-footnote-ref" href="#bad-footnote-5"&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p id="bad-footnote-1"&gt;Tadaa!
Wait... Why does *this* tooltip look different ?&lt;/p&gt;
&lt;p id="bad-footnote-2"&gt;Some link to &lt;a href="https://www.youtube.com/watch?v=XfELJU1mRMg"&gt;the best thing you'll ever see&lt;/a&gt;&lt;/p&gt;
&lt;p id="bad-footnote-3"&gt;Filler content&lt;/p&gt;
&lt;p id="bad-footnote-4"&gt;Here it is again, just as a reminder. Feel free to experiment with it and marvel at how cursed it really is.&lt;/p&gt;
&lt;p id="bad-footnote-5"&gt;One more for the road.
I promise i'll try not to overuse those so much in the future. So long!&lt;/p&gt;

&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:citation-links"&gt;
&lt;p&gt;They look kinda like this one&amp;#160;&lt;a class="footnote-backref" href="#fnref:citation-links" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:default-behaviour"&gt;
&lt;p&gt;Check out &lt;a href="https://www.rgaz.fr/blog/hello-world/" rel="noopener" target="_blank"&gt;my first article&lt;/a&gt; if you're not
sure what said default behaviour is.&amp;#160;&lt;a class="footnote-backref" href="#fnref:default-behaviour" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:html-regex"&gt;
&lt;p&gt;Did someone say &lt;a href="https://stackoverflow.com/a/1732454" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;regex&lt;/a&gt; ?&amp;#160;&lt;a class="footnote-backref" href="#fnref:html-regex" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:javascript"&gt;
&lt;p&gt;And here goes the pride and joy of owning a 100% js free website... Oh well.
It was good while it lasted.&amp;#160;&lt;a class="footnote-backref" href="#fnref:javascript" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:default-preserved"&gt;
&lt;p&gt;Not on this page, though. As you probably guessed already,
I'm reimplementing what I had to demonstrate how it worked. I'm not going to
redo &lt;em&gt;everything&lt;/em&gt; just as it was, though. Sorry if this makes things confusing.&amp;#160;&lt;a class="footnote-backref" href="#fnref:default-preserved" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:quick-and-dirty"&gt;
&lt;p&gt;Although the version I posted and kept for this article is
slightly naive. You need to clean up the &lt;code&gt;textContent&lt;/code&gt; to remove the footnote's
backlink and the extraneaous white space that messes up the formatting. No
big deal, but thought I'd mention it in case someone wants to use the posted
code (Pro-Tip: use a regex, it'll be cleaner than chaining &lt;code&gt;trim&lt;/code&gt; calls as I
did. Don't worry. It's not HTML anymore).&amp;#160;&lt;a class="footnote-backref" href="#fnref:quick-and-dirty" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:burned"&gt;
&lt;p&gt;and likely will again&amp;#160;&lt;a class="footnote-backref" href="#fnref:burned" title="Jump back to footnote 7 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:overengineering"&gt;
&lt;p&gt;As soon as I got the cleaner script working, I went ahead and
added a bunch of options to customize the behaviour, knowing full well this
code is probably never gonna leave this site. Sigh.&amp;#160;&lt;a class="footnote-backref" href="#fnref:overengineering" title="Jump back to footnote 8 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:hit-wall"&gt;
&lt;p&gt;Keep that in mind next time you feel like poking fun at some job
because it looks easy.&amp;#160;&lt;a class="footnote-backref" href="#fnref:hit-wall" title="Jump back to footnote 9 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:ui-rants"&gt;
&lt;p&gt;Hell, I'm even thinking about a dedicated category for those rants.
For now, I'll just link to &lt;a href="https://idlewords.com/talks/website_obesity.htm#sprawl" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;this&lt;/a&gt;for an appetizer.&amp;#160;&lt;a class="footnote-backref" href="#fnref:ui-rants" title="Jump back to footnote 10 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:great-ui"&gt;
&lt;p&gt;I didn't even mention the settings link that lets you tune the whole behaviour
to your liking. Man, what a class act.&amp;#160;&lt;a class="footnote-backref" href="#fnref:great-ui" title="Jump back to footnote 11 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:dumb-and-boring"&gt;
&lt;p&gt;This article would have been a lot shorter if I had just gone
with my first idea. I'm not sure whether this would have been a good or a bad
thing.&amp;#160;&lt;a class="footnote-backref" href="#fnref:dumb-and-boring" title="Jump back to footnote 12 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="bits"/></entry><entry><title>So You Wanna Get Into Bluegrass Lead Guitar</title><link href="https://www.rgaz.fr/blog/so-you-wanna-get-into-bluegrass-lead-guitar/" rel="alternate"/><published>2025-05-26T13:00:00+02:00</published><updated>2025-05-26T13:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-05-26:/blog/so-you-wanna-get-into-bluegrass-lead-guitar/</id><summary type="html">&lt;p&gt;A handful of tips to make getting started on the road to country / bluegrass
soloing (hopefully) less scary.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Bluegrass music can get pretty flashy, and while you don't need to aim for those
levels of virtuosity, this can make getting into lead playing (an already scary
task in and of itself) all the more intimidating. And as often, the most difficult
thing can be knowing where to begin.&lt;/p&gt;
&lt;p&gt;Well, here's a few suggestions on how to get started. We won't dive too much into
anything specific and rather point out some techniques and general concepts that
may not be too obvious and should provide a good introduction to the style while
remaining useful as you get further.&lt;/p&gt;
&lt;p&gt;Whether you're still afraid of the very idea of playing melodies or you're already
accomplished in other genres (possibly coming from the electric guitar), I hope
those tips will get you on the right track.&lt;/p&gt;
&lt;a href="#back-to-basics"&gt;&lt;h2 id="back-to-basics"&gt;Back to basics&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;&lt;img alt="Molly Tuttle and Billy Strings standing together on an open-air stage." class="half-width float-left" loading="lazy" src="https://www.rgaz.fr/img/bg_lead_guitar/tuttle_and_strings.jpg"&gt;&lt;/p&gt;
&lt;p&gt;You might have discovered Bluegrass via current players like &lt;a href="https://www.youtube.com/watch?v=gdHiflsFM44" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Molly Tuttle&lt;/a&gt;
or &lt;a href="https://www.youtube.com/watch?v=wkUGDYjYgMs" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Billy Strings&lt;/a&gt;. Or maybe you fell in love with &lt;a href="https://www.youtube.com/watch?v=rVl1ibykWZU" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Tony Rice&lt;/a&gt;.
That's great, and there's a lot to learn from them all. But I would advise
starting with earlier stuff. Much, much earlier.&lt;/p&gt;
&lt;p&gt;Not only because it will give you a better understanding of the genre and how it
evolved over time (although it will defnitely do that), but mostly because the
earlier you go, the simpler things get.&lt;/p&gt;
&lt;p&gt;Art is built on what came before. And as each generation expands on the tradition,
the fundational set of techniques and vocabulary that define the form gets that
much thicker. Just like learning how to walk before you run, you'll have a much
easier time figuring out what the modern greats are doing if you understand what
influenced them. Trust me, Billy Strings' playing seems a lot less crazy when
you're already familiar with Doc Watson.&lt;sup id="fnref:not-a-billy-dis"&gt;&lt;a class="footnote-ref" href="#fn:not-a-billy-dis"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;You don't have to spend all your time on the older stuff if that's not quite your
jam. But if you struggle with something, figuring out where that thing comes from
and working on the earlier and likely simpler version can only help.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flatpick.com/category_s/2212.htm" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;This article&lt;/a&gt; goes into much more depth on this idea of
chronological learning and is full of great references. If you do like the
old-fashioned, pre-actual-bluegrass sound, then simply listening to the names
listed there can keep you occupied for quite a while =)&lt;/p&gt;
&lt;a href="#carter-style"&gt;&lt;h2 id="carter-style"&gt;Carter Style&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;&lt;img alt="Promotinal photo of the Carter family." class="half-width float-right" loading="lazy" src="https://www.rgaz.fr/img/bg_lead_guitar/carter_family.jpg"&gt;&lt;/p&gt;
&lt;p&gt;As far as country lead guitar in general is concerned, you can't really go much
further back than &lt;a href="https://www.youtube.com/watch?v=fUbaqzTzy6E" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Maybelle Carter&lt;/a&gt;. Sometimes called the "carter
scratch", the style she developped is often cited as the first use of guitar as
a lead instrument.&lt;sup id="fnref:first-lead-guitar"&gt;&lt;a class="footnote-ref" href="#fn:first-lead-guitar"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;She played with a thumb pick, but the technique is easy to emulate with a straight
one. The basic idea is to play a stripped down version of the melody on the bass
strings and to interject a light chord strum or two at every pause to keep the
rhythm going.&lt;/p&gt;
&lt;p&gt;Notice how little her left hand moves ? That's because most of the melody notes
are part of the underlying chord, which mean you don't have to reach for them.
Fretting the passing notes while keeping the chord ringing can feel tricky in the
begining. Just take it slow and don't worry if it sounds mechanical at first.
Focus on hitting the right strings and give your hands some time to get in sync.&lt;/p&gt;
&lt;p&gt;Once you get the basics down, go ahead and explore what you have. Pick a few simple
vocal tunes and try and figure out their melody. Again, most of it will fall on
frets you're already holding, so this gives you a nice point of reference to
guide your ears. Try to stick to the keys of C or G, as those positions lend
themselves ideally to this technique.&lt;/p&gt;
&lt;p&gt;Once you get into playing more single note lines, having spent some time with this
style will help a lot, as you'll be used to visualising the chord shapes and how
they relate to the scale or melody you're playing. This will make identifying
your chord tones and learning how to outline the harmony much easier.&lt;/p&gt;
&lt;p&gt;And one last bonus: if you decide to get into crosspicking&lt;sup id="fnref:crosspicking"&gt;&lt;a class="footnote-ref" href="#fn:crosspicking"&gt;3&lt;/a&gt;&lt;/sup&gt; later
on, the overall concept is pretty much the same, so you'll be able to simply focus
on refining the right hand without having to think about the left one.&lt;/p&gt;
&lt;p&gt;Don't think of it as just a stepping stone to the fancier stuff, though. Having this
tool on your belt should remain pretty useful, especially when you're playing
by yourself or in a small ensemble. Even in its most basic form, some songs won't
need anything more. And if you &lt;em&gt;do&lt;/em&gt; want to dress it up, adding just a few slurs
and some syncopation can go a pretty long way.
&lt;a href="https://www.youtube.com/watch?v=UEkVkJax2Co" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Norman Blake&lt;/a&gt; is a master at this.&lt;/p&gt;
&lt;p&gt;For a more detailed breakdown of the technique, here's a pretty good
&lt;a href="https://www.youtube.com/playlist?list=PLvPXnuB6OESNDOyb9sIp8XwtBHucN1GLN" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;two&lt;/a&gt; &lt;a href="https://www.youtube.com/playlist?list=PLvPXnuB6OESNyVKgcYM-hzzTaL3znNSNM" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;parts&lt;/a&gt; video series dedicated to it.&lt;/p&gt;
&lt;a href="#stick-to-major"&gt;&lt;h2 id="stick-to-major"&gt;Brush up on those major scales&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Like just about any american genre, you'll find some blues in Bluegrass.&lt;sup id="fnref:blueSgrass"&gt;&lt;a class="footnote-ref" href="#fn:blueSgrass"&gt;4&lt;/a&gt;&lt;/sup&gt;
And harmonically, the defining aspect of the blues is an ambivalence between
major and minor tonalities. This is why beginers are often advised to start with
the minor pentatonic scale, as it will sound just fine over actual minor tunes, and
clash in a really nice way in situations where it's not the theoretically "proper"
scale to use.&lt;/p&gt;
&lt;p&gt;While this works great in the rock world, historically country music tends to be
a lot more subtle about this, so I would recommend starting with the &lt;em&gt;major&lt;/em&gt;
pentatonic. Most melodies will fall within that scale, and learning to follow the
changes should be much easier.&lt;/p&gt;
&lt;p&gt;Learning how to use this scale will probably take a little while. There are plenty
of ressources across the web on this topic, though, so I'll let you explore on your
own.&lt;/p&gt;
&lt;h3 id="dirty-3rds"&gt;Get dirty&lt;/h3&gt;
&lt;p&gt;Sticking to major doesn't mean you should entirely avoid the blue notes&lt;sup id="fnref:blue-noteS"&gt;&lt;a class="footnote-ref" href="#fn:blue-noteS"&gt;5&lt;/a&gt;&lt;/sup&gt;,
though. As I said above, the blues &lt;em&gt;is&lt;/em&gt; part of Bluegrass. Once you get those major
scales under your fingers, single out the third note from one of them and lower it
by a half-step (ie, down one fret). Play it over some backing track.&lt;/p&gt;
&lt;p&gt;Sounds pretty nasty by itself, right ? Well, now go back to your regular third
and listen as the tension resolves.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This&lt;/em&gt; is the blues. Whether or not you understand the theory behind it, this is
the one harmonic concept you'll have to get in your ears if you ever want to sound
like you know what you're doing.&lt;/p&gt;
&lt;p&gt;There are millions of ways to handle that minor to major move. The simplest
one is to just throw that dirty third anywhere you feel and simply resolve it
immediately, or to use it as a passing tone. Throw in a hammer-on for effect.
In fact, if you know your basic G run, you're already doing it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;e &lt;/span&gt;&lt;span class="nb"&gt;------------------&lt;/span&gt;
&lt;span class="c"&gt;B &lt;/span&gt;&lt;span class="nb"&gt;------------------&lt;/span&gt;
&lt;span class="c"&gt;G &lt;/span&gt;&lt;span class="nb"&gt;---------------&lt;/span&gt;&lt;span class="c"&gt;0&lt;/span&gt;&lt;span class="nb"&gt;--&lt;/span&gt;
&lt;span class="c"&gt;D &lt;/span&gt;&lt;span class="nb"&gt;----------&lt;/span&gt;&lt;span class="c"&gt;0&lt;/span&gt;&lt;span class="nb"&gt;-&lt;/span&gt;&lt;span class="c"&gt;2&lt;/span&gt;&lt;span class="nb"&gt;-----&lt;/span&gt;
&lt;span class="c"&gt;A &lt;/span&gt;&lt;span class="nb"&gt;---&lt;/span&gt;&lt;span class="c"&gt;0&lt;/span&gt;&lt;span class="nb"&gt;-&lt;/span&gt;&lt;span class="c"&gt;1^2&lt;/span&gt;&lt;span class="nb"&gt;----------&lt;/span&gt;
&lt;span class="c"&gt;E &lt;/span&gt;&lt;span class="nb"&gt;-&lt;/span&gt;&lt;span class="c"&gt;3&lt;/span&gt;&lt;span class="nb"&gt;----------------&lt;/span&gt;
&lt;span class="c"&gt;       ^ Here it is!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Another cool trick is to find spots where the two thirds lie on adjacent strings
and rock back and forth between them. In C, this can get you this classic Doc lick:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;   v Nice!&lt;/span&gt;
&lt;span class="c"&gt;e &lt;/span&gt;&lt;span class="nb"&gt;---&lt;/span&gt;&lt;span class="c"&gt;0&lt;/span&gt;&lt;span class="nb"&gt;---&lt;/span&gt;&lt;span class="c"&gt;0&lt;/span&gt;&lt;span class="nb"&gt;--------------------&lt;/span&gt;
&lt;span class="c"&gt;G &lt;/span&gt;&lt;span class="nb"&gt;-&lt;/span&gt;&lt;span class="c"&gt;4&lt;/span&gt;&lt;span class="nb"&gt;---&lt;/span&gt;&lt;span class="c"&gt;4&lt;/span&gt;&lt;span class="nb"&gt;---&lt;/span&gt;&lt;span class="c"&gt;1&lt;/span&gt;&lt;span class="nb"&gt;-----&lt;/span&gt;&lt;span class="c"&gt;1&lt;/span&gt;&lt;span class="nb"&gt;------------&lt;/span&gt;
&lt;span class="c"&gt;B &lt;/span&gt;&lt;span class="nb"&gt;-----------&lt;/span&gt;&lt;span class="c"&gt;2&lt;/span&gt;&lt;span class="nb"&gt;-&lt;/span&gt;&lt;span class="c"&gt;0&lt;/span&gt;&lt;span class="nb"&gt;---&lt;/span&gt;&lt;span class="c"&gt;2&lt;/span&gt;&lt;span class="nb"&gt;-&lt;/span&gt;&lt;span class="c"&gt;0&lt;/span&gt;&lt;span class="nb"&gt;--------&lt;/span&gt;
&lt;span class="c"&gt;D &lt;/span&gt;&lt;span class="nb"&gt;---------------------&lt;/span&gt;&lt;span class="c"&gt;1^0&lt;/span&gt;&lt;span class="nb"&gt;----&lt;/span&gt;
&lt;span class="c"&gt;A &lt;/span&gt;&lt;span class="nb"&gt;-------------------------&lt;/span&gt;&lt;span class="c"&gt;3&lt;/span&gt;&lt;span class="nb"&gt;--&lt;/span&gt;
&lt;span class="c"&gt;E &lt;/span&gt;&lt;span class="nb"&gt;----------------------------&lt;/span&gt;
&lt;span class="c"&gt;                       ^ Another dirty third&lt;/span&gt;&lt;span class="nt"&gt;,&lt;/span&gt;&lt;span class="c"&gt; this time resolving to the second&lt;/span&gt;&lt;span class="nt"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Add a seventh to the mix, and things can get pretty nasty =)&lt;/p&gt;
&lt;p&gt;You may want to apply some restraint depending on the mood you're going for
(some songs really don't like that level of tension), but when it's appropriate,
feel free to go crazy. You'll hear that motif over and over in many classic
recordings. Train your ears to spot it, it's pretty distinctive so it shouldn't
take too long and will help your transcribing quite a bit.&lt;/p&gt;
&lt;h3 id="tony-rice"&gt;That's not how Tony did it&lt;/h3&gt;
&lt;p&gt;&lt;img alt="Tony Rice playing his martin guitar" class="half-width float-right" loading="lazy" src="https://www.rgaz.fr/img/bg_lead_guitar/tony-rice.jpeg" title="Is that a barre chord ? Tony was such a trailblazer"&gt;&lt;/p&gt;
&lt;p&gt;For a long time, Country musicians remained pretty shy about those dissonances,
and you'll find them only sparingly in the earlier recordings. But starting
around the 60's, guitarists started to embrace basing their solos around the
minor pentatonic, like a bluesman would.&lt;/p&gt;
&lt;p&gt;Tony Rice is the one who brought this approach to Bluegrass, and it sounds
great. If you want to get mean and crank up the attitude, that's the way to go.&lt;/p&gt;
&lt;p&gt;It won't work on every tune, though, and that may just be me, but I find it
trickier to get right, especially if you don't want to sound too much like a
Tony wannabe.&lt;sup id="fnref:tony-wannabe"&gt;&lt;a class="footnote-ref" href="#fn:tony-wannabe"&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Now if you like that sound, by all means go for it. But I do think that learning
to think in major and jazz it up as needed will leave you wth a better understanding
of it all. It's easier to start from the harmonically "correct" approach and spot
where and how you can stray from the rules, than figuring out how to straighten
things up after having broken them.&lt;/p&gt;
&lt;a href="#rest-stroke"&gt;&lt;h2 id="rest-stroke"&gt;The mighty Rest Stroke&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Back to technique. That one, while fairly common, doesn't seem to be mentionned
as often as I think it should.&lt;/p&gt;
&lt;p&gt;It's deceptively simple: as you push your pick through one string, make sure it
lands and comes to "rest" against the one below it.&lt;/p&gt;
&lt;figure style="width:fit-content;"&gt;
  &lt;img src="https://www.rgaz.fr/img/bg_lead_guitar/rest_stroke.gif"
       alt="Animated GIF showing the pick pushing through one string to land on the next one."
       loading="lazy"&gt;
  &lt;figcaption&gt;
    Should look like this.&lt;br/&gt;
    Watch &lt;a href="https://www.youtube.com/watch?v=5GjNWnvpn6U"
       target="_blank"&gt;the original video&lt;/a&gt; for a fuller demonstration.
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;It's trickier than it looks and tends to mess with your timing, so pay extra
attention to that. Also, be careful not to apply too much force, as it can
easily overwhelm your guitar's top and get it to buzz.&lt;/p&gt;
&lt;p&gt;Most people use it only sparingly, and I would advise doing the same, at least
until you get really confident with it. But whenever you need a note to really
pop, the rest stroke is the way to go.&lt;/p&gt;
&lt;p&gt;The one obvious place for it is at the end of a G run. Try it with and without
resting and tell me which one sounds &lt;em&gt;right&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It's also a great way to emphasise your bass runs. Or your regular bass notes,
if you find yourself playing without a bass player and need to fill in that role.&lt;/p&gt;
&lt;p&gt;Playing a slow blues and wanting to get a real rootsy and aggressive tone ?
Ditch the alternate picking and use rest strokes on every note.&lt;/p&gt;
&lt;p&gt;This technique was developed to get the volume needed to be heard in purely
accoustic setting, and is an essential component of Gipsy Jazz right hand
technique.&lt;sup id="fnref:gipsy-jazz"&gt;&lt;a class="footnote-ref" href="#fn:gipsy-jazz"&gt;7&lt;/a&gt;&lt;/sup&gt; I assume it faded out of fashion as amplification solved
the volume issue, but I would still consider it an essential skill for any
accoustic genre, plugged in or not.&lt;/p&gt;
&lt;p&gt;(Some old guys still &lt;a href="https://www.youtube.com/watch?v=n8fyb9vpIc0" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;played that way on electric&lt;/a&gt;, and it's a
pretty cool tone too.)&lt;/p&gt;
&lt;p&gt;Again, it's not that easy to execute cleanly, and it can be fairly hard to incorporate
into whatever else you're doing (I'm still struggling with the bass player impersonation
exemple I gave above). Also, it's definitely not appropriate in all situations.
You'll need to develop a feel for when and when not to use it.&lt;/p&gt;
&lt;p&gt;The nice thing is that you don't have to try and master it right away. As far as
the right hand goes, there's already plenty to keep it busy with regular alternate
picking.&lt;sup id="fnref:alternate-picking"&gt;&lt;a class="footnote-ref" href="#fn:alternate-picking"&gt;8&lt;/a&gt;&lt;/sup&gt; Just be aware that it's available and work out how to
fit it in when needed. Even if you only ever use it on G runs, that will stll make
a difference.&lt;/p&gt;
&lt;a href="#thicken-up"&gt;&lt;h2 id="thicken-up"&gt;Thicken up&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;&lt;img alt="Lots of guitar picks in a pile" class="half-width float-right" loading="lazy" src="https://www.rgaz.fr/img/bg_lead_guitar/picks.jpg" title="If you think that's a lot of picks, then clearly you haven't been playing for long."&gt;&lt;/p&gt;
&lt;p&gt;If you're used to thinner picks, then I'd strongly advise moving up a gauge or
two. You don't have to go for the thickest thing you can get, but I would avoid
anything under 1 millimetter. I personally don't care too much about the actual
thickness anymore, but focus on having as little flex as possible (and ideally,
none at all).&lt;/p&gt;
&lt;p&gt;This will give you much better control and precision, which will become more
and more crucial as the tempo speeds up. Using something meatier will also make
it much easier to pull some tone out of your instrument.&lt;/p&gt;
&lt;p&gt;It's probably gonna sound harsh at first. The fix is to loosen up your wrist
and lighten your grip. I know this is (a lot) easier said than done, but being
forced to work on eliminating tension can only benefit you in the long run,
even if you decide to go back to something thinner.&lt;/p&gt;
&lt;p&gt;Of course, this is not a hard rule that you &lt;em&gt;have&lt;/em&gt; to follow. Use whatever suits
you best. But do give heavier gauges a fair try before deciding, and don't rule
them out simply because they feel harder to use.&lt;/p&gt;
&lt;a href="#get-rhythm"&gt;&lt;h2 id="get-rhythm"&gt;Get Rhythm&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;This should probably be at the top of the list, but do not neglect rhythm.
You can play the coolest line ever and execute it perfectly, it's gonna fall flat
if your timing is even slightly off. So dust off that metronome and make sure
everything's tight.&lt;/p&gt;
&lt;p&gt;Pay attention to which notes get accented, and by how much. Keep that pulse going.
Listeners should be able to still feel the groove even if you're playing by yourself.
Fiddle players tend to be prety good at this, because the whole style evolved from
dance music, and it wasn't uncommon for old time fiddlers to be the only musician
at the ball. &lt;a href="https://www.youtube.com/watch?v=RI4-DYm9Xno" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Give them a listen&lt;/a&gt; and try to emulate that feel.&lt;/p&gt;
&lt;p&gt;Keep working on playing backup, too. Don't treat it as what you do between the
fun parts&lt;sup id="fnref:backup-is-funnier"&gt;&lt;a class="footnote-ref" href="#fn:backup-is-funnier"&gt;9&lt;/a&gt;&lt;/sup&gt;. Even if you stick to the simple boom-chuck, pay
attention to your tone and dynamics, be mindful of how much space you're taking,
and always ask yourself how you can best serve the song and support whoever is
in the lead.&lt;/p&gt;
&lt;a href="#keep-it-simple"&gt;&lt;h2 id="keep-it-simple"&gt;Keep it simple&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Bluegrass is a simple genre. Technically challenging, sure, but harmonically
there's usually not a whole lot going on. It can be tempting to try and enrich
those plain chord progressions, and sometimes it can make for a nice ear twister.
But it has to be done tastefully, so as often, better to err on the side of caution.&lt;/p&gt;
&lt;p&gt;Likewise, don't feel like you have to aim for a deluge of sixteenth notes.
Stick to the melody. Repeat yourself. Focus on sounding good, and try to apply
the things you already know in a clever way instead of constantly reaching for new
licks. You don't even &lt;em&gt;have&lt;/em&gt; to improvise. Write out your solos in advance. This
will give you time to fool around and think about what you want to do. If the
end result sounds halfway decent, nobody is gonna care that it didn't came up
on the spot.&lt;/p&gt;
&lt;p&gt;Don't be afraid of sounding cliché. Clichés are the backbone of any genre. Embrace
them, study them, try to understand why they became clichés in the first place.
Learn the language first, and only then figure out what you want to say with it.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Allright, that's all I have for now. I hope that wasn't too confusing. My goal
here was to suggest an easier and gentler way to get started and to try and
demistify the process, but that's hard to do without knowing what a potential
reader may or may not already know.&lt;/p&gt;
&lt;p&gt;I guess my final advice is to take it easy. Don't rush, play around and let things
develop as you go. Don't get too bogged down in what you should or should not do.
Make mistakes, have fun, keep picking and enjoy the ride!&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:not-a-billy-dis"&gt;
&lt;p&gt;This is &lt;em&gt;not&lt;/em&gt; a dis at Billy. I love how he proudly wears that influence on
his sleeve and soaks it with attitude. And it illustrates my point perfectly:
He may break conventions, but there's no way you could accuse him of not
knowing his classics.&amp;#160;&lt;a class="footnote-backref" href="#fnref:not-a-billy-dis" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:first-lead-guitar"&gt;
&lt;p&gt;Which is, as always when the word "first" is involved, probably bullshit. But
the point is that it had a huge impact and is a great place to start.&amp;#160;&lt;a class="footnote-backref" href="#fnref:first-lead-guitar" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:crosspicking"&gt;
&lt;p&gt;in which you arpegiate the chords instead of strumming them. I wouldn't go
there if your right hand isn't already pretty solid.&amp;#160;&lt;a class="footnote-backref" href="#fnref:crosspicking" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:blueSgrass"&gt;
&lt;p&gt;And no, the name "Bluegrass" has
&lt;a href="https://en.wikipedia.org/wiki/Bluegrass_music#Origin_of_name" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;nothing to do&lt;/a&gt;
with that fact.
Also, French people: there's no "s" in there. Please stop calling it BlueZgrass.
It's embarassing.&amp;#160;&lt;a class="footnote-backref" href="#fnref:blueSgrass" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:blue-noteS"&gt;
&lt;p&gt;Note the plural. I could write a whole rant about how there's not &lt;em&gt;one&lt;/em&gt; single
blue note, and why the one that's usually gets that name isn't even the most
interesting one.&amp;#160;&lt;a class="footnote-backref" href="#fnref:blue-noteS" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:tony-wannabe"&gt;
&lt;p&gt;Nothing wrong with stealing from Tony. He's a stapple of the genre, after all.
But such a distinctive style can get tiresome when you hear it imitated too
often.&amp;#160;&lt;a class="footnote-backref" href="#fnref:tony-wannabe" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:gipsy-jazz"&gt;
&lt;p&gt;Whether or not you enjoy Gipsy Jazz, you can't argue that those guys don't
know how to get crazy volume out of an accoustic guitar.&amp;#160;&lt;a class="footnote-backref" href="#fnref:gipsy-jazz" title="Jump back to footnote 7 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:alternate-picking"&gt;
&lt;p&gt;If you're still struggling with it, then forget about rest strokes and focus
on &lt;em&gt;that&lt;/em&gt;. Straight ups and downs is what you want 99% of the time. Don't
get fancy until you have the basics down cold.&amp;#160;&lt;a class="footnote-backref" href="#fnref:alternate-picking" title="Jump back to footnote 8 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:backup-is-funnier"&gt;
&lt;p&gt;Once I got into the right mindset, I found out that I actually tended to
enjoy playing rhythm more and more. I almost regret taking up singing, as
I wish I could spend more time focusing on &lt;em&gt;just&lt;/em&gt; backup.&amp;#160;&lt;a class="footnote-backref" href="#fnref:backup-is-funnier" title="Jump back to footnote 9 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="music"/></entry><entry><title>Let's Build a Thing</title><link href="https://www.rgaz.fr/blog/lets-build-a-thing/" rel="alternate"/><published>2025-06-02T21:20:00+02:00</published><updated>2025-06-02T21:20:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-06-02:/blog/lets-build-a-thing/</id><summary type="html">&lt;p&gt;Feeling like playing around with RSS feeds, which seems like a good
excuse for some quick old-tech evangelizing.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Getting this blog started reminded me about RSS feeds.&lt;/p&gt;
&lt;p&gt;I started subscribing to a few, and at some point thought it would be cool
to share the stuff I follow on here. You know, try and make the web an actual
web again.&lt;/p&gt;
&lt;p&gt;I'm sure there's already a bunch of tools to do just that, but one of the selling
points of RSS is that it's &lt;em&gt;simple&lt;/em&gt;. So let's build this thing ourselves and have
some fun, shall we ?&lt;/p&gt;
&lt;p&gt;I haven't written a single line yet, and just started thinking about how to
proceed. So that's what today's rambling is gonna be about. Maybe hacking on it
will give me more article ideas, but I suspect it won't. There's not a lot to say
about parsing some dumb XML.&lt;/p&gt;
&lt;a href="#what-is-rss"&gt;&lt;h2 id="what-is-rss"&gt;What's this RSS thing ?&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;If you don't know what RSS is, it's really not hard to understand:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A website owner sets up a page that's really nothing more than a list of all
  published articles, formatted in a markup language that dumb computers can make
  sense of. If he's feeling fancy, he might setup several of those feeds for
  different categories or comments threads. &lt;a href="/feeds/rss.xml" rel="noopener" target="_blank"&gt;Have a look&lt;/a&gt; at this
  site's feed.  I know It's ugly, but figuring out what this mess is about really
  isn't rocket science, is it ?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;People interested in what this guy has to say copy the feed's link into some
  RSS reader application. That program's job is to simply go and check whatever
  it's subscribed to at regular intervals (you can configure it to update once
  a day, or every 10 minutes, or whatever suits you). Optionally trigger a desktop
  notification when something gets added to one of the lists, and you're done.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's it. You can add some bells and whistles if you feel like it, but the basics
are that simple. Automating the feed's generation is easy to begin with, and
any decent web tool will probably handle it for you anyway. Implementing a basic
reader is a fun beginner's project.&lt;sup id="fnref:never-that-easy"&gt;&lt;a class="footnote-ref" href="#fn:never-that-easy"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;This is much cleaner than relying on some social media platform to keep you up
to date via push notifications (which they'll gladly do, as it is a wonderful way
to build up your addiction).&lt;/p&gt;
&lt;p&gt;While the end result might look pretty similar, with RSS, all that happens is
that &lt;em&gt;your&lt;/em&gt; machine periodically goes and checks whatever people have been doing.
Technically, it's exactly the same than manually going to each individual site to
see if they posted anything new. It's just automated, and handled by a program
you can configure or uninstall if you decide you don't like it. You remain in
control. Since you're getting the data straight from the source, there's no
need to trust anyone but the site you're checking out. No one has to stand in the
way and monitor your activity or fill your feed with targeted trash.&lt;/p&gt;
&lt;p&gt;The protocol's simplicity also means that anyone who cares can implement his own
tools to handle it. This doesn't prevent bad actors to try and get people to use
their own, shittier tools, but at least competing with them is technically much
easier than if we were dealing with operating systems or web browsers.&lt;/p&gt;
&lt;p&gt;RSS is old tech. It's not flashy, but it does its job and has been around for a
long time.&lt;sup id="fnref:rss-birth"&gt;&lt;a class="footnote-ref" href="#fn:rss-birth"&gt;2&lt;/a&gt;&lt;/sup&gt; The tech giants would love to &lt;a href="https://www.theregister.com/2023/03/14/requiem_for_google_reader/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;kill it&lt;/a&gt;,
but no one's stopping you from using it again. Keeping up to date with whatever's
happening is the main reason I hear from people to still use social media. Turns
out we never needed them for that.&lt;/p&gt;
&lt;a href="#technical-choices"&gt;&lt;h2 id="technical-choices"&gt;Technical choices&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;So, before diving in, let's take a minute and figure out what we're trying to
do.&lt;/p&gt;
&lt;p&gt;This site is statically generated, which is at odds with the fundamentally dynamic
content I'll be dealing with. The page listing the feeds needs to update on its own,
so I need to be able to periodically regenerate it. The most straightforward way
to do that is to simply set up a &lt;a href="https://www.hostinger.com/tutorials/cron-job" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;cron&lt;/a&gt; job.&lt;/p&gt;
&lt;p&gt;I don't really see a reason to tie the page generation to pelican or some other
specific framework. A standalone script seems like the most flexible solution.
If I keep the link gathering logic and the html production separate, then the
API should be easier to adapt for different situations (like skipping the html
output and simply passing the list to a Django template). I'll keep that in mind
while hacking up the first draft.&lt;/p&gt;
&lt;p&gt;I'm tempted to fool around with some new language, but the one I can rely on
being installed on just about any server is Python.&lt;sup id="fnref:bash"&gt;&lt;a class="footnote-ref" href="#fn:bash"&gt;3&lt;/a&gt;&lt;/sup&gt; Since it's just a simple
script, it won't have to interface with anything, so there's no need to deal
with &lt;a href="https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;WSGI&lt;/a&gt; or anything like that for deployment. Seems like the perfect
tool for the job.&lt;/p&gt;
&lt;p&gt;I'll need to store the urls I'm watching somewhere. And maybe some other
optional things. This means having a config file. For the sake of &lt;abbr title="Keep It Simple, Stupid"&gt;KISS&lt;/abbr&gt;, let's
dump all that in a simple python file, Django style.&lt;/p&gt;
&lt;p&gt;Now for the presentation. I want to organize the feeds in multiple categories.
I'm picturing it as a grid of boxes each containing the links for one cateogry.
Should be simple enough.&lt;/p&gt;
&lt;p&gt;For some reason I want to play with some &lt;a href="https://htmx.org/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;htmx&lt;/a&gt; but is that even needed ?
The whole page is gonna get rebuilt everytime it needs to update, so there's
really no use for it. I dunno. Maybe I'll find a way to shoehorn it in. We'll
see when we get there.&lt;/p&gt;
&lt;p&gt;If I want to get fancy, maybe I'll allow the user to rearrange the boxes, minimize
them, or whatever. This could make for some nice UI practice. But again, that
stuff can be dealt with later, so let's keep the first version basic.&lt;/p&gt;
&lt;p&gt;Allright, I guess this is my spec. Now let's forget all about it and fool around.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:never-that-easy"&gt;
&lt;p&gt;Of course, turning it into something practical is where the real work begins,
especially if you want non tech-savy people to use it. But that's interface
work, really. The base logic is still child's play.&amp;#160;&lt;a class="footnote-backref" href="#fnref:never-that-easy" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:rss-birth"&gt;
&lt;p&gt;The first official spec came out in 1999.&amp;#160;&lt;a class="footnote-backref" href="#fnref:rss-birth" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:bash"&gt;
&lt;p&gt;I guess there's also Bash. This could actually be a good occasion to get
more familiar with the classic unix tools. But this will take me longer and
possibly require more dependencies. Also, I hate Bash syntax.&amp;#160;&lt;a class="footnote-backref" href="#fnref:bash" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="bits"/></entry><entry><title>I Made A Thing</title><link href="https://www.rgaz.fr/blog/i-made-a-thing/" rel="alternate"/><published>2025-06-03T21:00:00+02:00</published><updated>2025-06-03T21:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-06-03:/blog/i-made-a-thing/</id><summary type="html">&lt;p&gt;Post mortem on a trivial script and a quick rant about Python's type
hints.&lt;/p&gt;</summary><content type="html">&lt;p&gt;So, the (very) &lt;a href="https://github.com/raphigaziano/feedboard" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;rough draft&lt;/a&gt; of my &lt;a href="https://www.rgaz.fr/blog/lets-build-a-thing/" rel="noopener" target="_blank"&gt;RSS aggregator&lt;/a&gt;
is up and running.&lt;/p&gt;
&lt;p&gt;There's still &lt;strong&gt;a lot&lt;/strong&gt; of room for improvement (easier configuration, caching
the feeds to avoid redownloading them each time the command runs&lt;sup id="fnref:edit-note"&gt;&lt;a class="footnote-ref" href="#fn:edit-note"&gt;1&lt;/a&gt;&lt;/sup&gt;, processing them
asynchronously instead of one after the other like a dummy...) but it works.&lt;/p&gt;
&lt;p&gt;Handling the feeds was about as straightforward as I expected (with a small
caveat: the spec is quite loose regarding which field should be mandatory or not,
which can cause some shenanigans if you're expecting to find some data that's
not included. One feed I used for testing had a modification date, but not a
publication one, for instance. No big deal for a toy script, but I can see how
this could become a pain in the butt&lt;sup id="fnref:atom-variant"&gt;&lt;a class="footnote-ref" href="#fn:atom-variant"&gt;2&lt;/a&gt;&lt;/sup&gt;).&lt;/p&gt;
&lt;p&gt;Outputting the html turned out a bit tricker though. I planned to use Jinja's
inheritance to integrate the markup into the global site layout, like I do with
pretty much every other page, only to realize that this was supposed to run &lt;em&gt;on
the server&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Pelican runs on my local machine, which is where all the templates are. Only the
generated output gets uploaded to production. So there's no base template to
inherit from.&lt;/p&gt;
&lt;p&gt;Well, Duh. I just dumped a document fragment  and include it in the main page
via javascript. Not great, but hey, it works. I could see it becoming useful if
the feed grow large enough, though.&lt;sup id="fnref:no-htmx"&gt;&lt;a class="footnote-ref" href="#fn:no-htmx"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;As often, the only real hurdle was due to one pretty stupid oversight. I planned
to organize the various feeds into several categories, and display each category
in its own box, like so:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of this site's feed page, work in progress" loading="lazy" src="https://www.rgaz.fr/img/rss_doing/boxed-feeds.png" title="Ship it. Also, don't ask me why Cory Doctorow's posts are in the &amp;quot;Cats&amp;quot; category"&gt;&lt;/p&gt;
&lt;p&gt;I stole the idea from the old aggregator &lt;a href="https://sametmax2.com" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Sam &amp;amp; Max&lt;/a&gt;&lt;sup id="fnref:sametmax"&gt;&lt;a class="footnote-ref" href="#fn:sametmax"&gt;4&lt;/a&gt;&lt;/sup&gt; used to
run. Sadly, it's not online anymore, so this is from memory. And no, I don't see
what's wrong with the design.&lt;/p&gt;
&lt;p&gt;No matter where I got the idea, the rub is that I'm currently subscribed to a
grand total of 4 feeds. Two of which strike me as interesting to share here. So
while the idea of having different categories is cute, I just don't see how this
is useful right now.&lt;/p&gt;
&lt;p&gt;Oh well. I'll keep the idea in mind and wait and see if it makes sense one day.
Until then, I'll just stuff everything in a single category and call it a day.&lt;/p&gt;
&lt;p&gt;It's probably gonna be a little while before this page gets interesting, but the
plumbing is in place, so adding sources to it should be easy.&lt;/p&gt;
&lt;h3 id="python-type-hints"&gt;Unrelated: I hate Python type hints&lt;/h3&gt;
&lt;p&gt;The python community have been pretty keen on adopting &lt;a href="https://docs.python.org/3/library/typing.html" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;type hints&lt;/a&gt;
over the last few years. I've tried to use them a couple of times now and got
rid of them after 10 minutes.&lt;/p&gt;
&lt;p&gt;I get the appeal of static typing, and I even enjoy it when I'm fooling around in
C or some other, stricter language. The general consensus seems to be that dynamic
languages didn't turn out so great, and the compromise of optionally declaring
your types seems to be getting popular&lt;sup id="fnref:type-inference"&gt;&lt;a class="footnote-ref" href="#fn:type-inference"&gt;5&lt;/a&gt;&lt;/sup&gt;. That's fine.&lt;/p&gt;
&lt;p&gt;But Python's implementation just feels &lt;em&gt;wrong&lt;/em&gt; to me. Maybe Its just old habits
clouding my judgment. And I'm sure I could get the hang of it after some practice.&lt;/p&gt;
&lt;p&gt;It starts out nice enough, but pretty soon you're having to import a dozen names
to handle &lt;em&gt;builtin&lt;/em&gt; types like lists or dictionnaries. Function signatures become
a mess.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Exemple lifted from https://www.geeksforgeeks.org/type-hints-in-python/&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Tuple&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;User&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_name_and_age&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Abc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Sure, there's a lot of information packed in there. But I can't parse any of
this from a casual glance. The same code used to look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;User&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_name_and_age&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Abc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I don't know about you, but if I were to check out a language praised for its
readability, I'd sure expect something closer to the second exemple (although
to be fair, the first one is pretty mild, but things can get much hairier. Also,
the &lt;code&gt;sum&lt;/code&gt; function shadows the builtin one and triggers an infinite recursion.&lt;sup id="fnref:stack-overflow"&gt;&lt;a class="footnote-ref" href="#fn:stack-overflow"&gt;6&lt;/a&gt;&lt;/sup&gt;
This has nothing to do with type hints, though (then again... it &lt;em&gt;was&lt;/em&gt; easier
to spot in the distraction free version...)).&lt;/p&gt;
&lt;p&gt;Also, I ran into this case:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Feed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;some_stuff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;StuffType&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stuff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;some_stuff&lt;/span&gt;

    &lt;span class="nd"&gt;@classmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;from_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Feed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;stuff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_stuff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stuff&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Which is simple enough, but blows up with a &lt;code&gt;NameError&lt;/code&gt;. Since the class is built
dynamically, the name &lt;code&gt;Feed&lt;/code&gt; is not defined yet when it's used as &lt;code&gt;from_url&lt;/code&gt;'s
return value.&lt;/p&gt;
&lt;p&gt;Python 3.13 fixed this, and you can get it to work on earlier versions with a
&lt;code&gt;__future__&lt;/code&gt; import.&lt;sup id="fnref:old-days"&gt;&lt;a class="footnote-ref" href="#fn:old-days"&gt;7&lt;/a&gt;&lt;/sup&gt; I'm far from being a language expert, but I do know
that evolving syntax is &lt;em&gt;hard&lt;/em&gt;, and this tells me the devs have to modify the
parser to handle corner cases that feel like they should be obvious, which confirms
my overall impression that this whole thing is being duct-taped on top of something
that was not designed for it.&lt;/p&gt;
&lt;p&gt;&lt;img alt="A giant inflatable duck floating in front of an old nazi submarine base. I'm not making that up, I swear" loading="lazy" src="https://www.rgaz.fr/img/rubber-ducky.png" title="Maybe this whole rant was just an excuse to use that picture. Which was taken in my hometown, by the way. I saw that thing in person, shortly before someone decided to pop it :(" width="100%"&gt;&lt;/p&gt;
&lt;p&gt;Again, I may just be an old fart yelling at the clouds here. People way smarter
than me are endorsing this, and my pythoning has been pretty anecdotic since 2019,
so I'm not really in a position to argue with anyone who deals with it on a daily
basis. Also, I'm not defending dynamic typing at all cost here. I'm just worried
than this evolution is just not as straightforward as it seems. It's been 10 years
since the syntax was first introduced and cases like the one I ran into are only
now being handled.&lt;sup id="fnref:not-a-dis"&gt;&lt;a class="footnote-ref" href="#fn:not-a-dis"&gt;8&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;I keep telling myself I'll give it a fair try sometime, but I just can't be bothered
for the quick and dirty stuff I tend to do these days.&lt;/p&gt;
&lt;p&gt;Okay, rant over. See ya and long live duck typing.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:edit-note"&gt;
&lt;p&gt;Editing note: wait what ? Why would I do that ? Refreshing the data is the
  &lt;em&gt;whole point&lt;/em&gt; of this script. Funny how stupid half-assed thoughts can make
  you feel when you stumble back upon them later on.&amp;#160;&lt;a class="footnote-backref" href="#fnref:edit-note" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:atom-variant"&gt;
&lt;p&gt;This is why people are pushing to move to &lt;a href="https://en.wikipedia.org/wiki/Atom_(web_standard)" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Atom&lt;/a&gt;,
which is a stricter specification for syndication. I tend to call them both
"RSS" out of habit.&amp;#160;&lt;a class="footnote-backref" href="#fnref:atom-variant" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:no-htmx"&gt;
&lt;p&gt;I resisted including htmx just for that and wrote the plain js version.
Hurray for discipline.&amp;#160;&lt;a class="footnote-backref" href="#fnref:no-htmx" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:sametmax"&gt;
&lt;p&gt;Content Warning: this is a french blog. Also, &lt;abbr title="Not Safe For Work. Usually means porn."&gt;NSFW&lt;/abbr&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:sametmax" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:type-inference"&gt;
&lt;p&gt;The new hot thing seems to be &lt;a href="https://gencmurat.com/en/posts/zig-type-inference-and-explicit-typing/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;type inference&lt;/a&gt;,
in which the language is statically typed but can infer those types when
its obvious (typically when declaring variables). I haven't played much with
it, but I like it. Also, Zig code can get pretty ugly, but for some reason
its signatures don't bother me one bit. It feels like a natural part of the
syntax.&amp;#160;&lt;a class="footnote-backref" href="#fnref:type-inference" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:stack-overflow"&gt;
&lt;p&gt;AKA &lt;a href="https://stackoverflow.com/questions/26158/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;stack overflow&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:stack-overflow" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:old-days"&gt;
&lt;p&gt;This brings back memories of supporting both Python 2 et 3.&amp;#160;&lt;a class="footnote-backref" href="#fnref:old-days" title="Jump back to footnote 7 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:not-a-dis"&gt;
&lt;p&gt;I'm &lt;em&gt;not&lt;/em&gt; trying to imply that the python devs are doing a bad job here. Far
from it. I vaguely understand why it happened, and I know that changing the
fundamentals of a language is a long and thankless job. I just wonder if the
end result is worth so much hard work.&amp;#160;&lt;a class="footnote-backref" href="#fnref:not-a-dis" title="Jump back to footnote 8 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="bits"/></entry><entry><title>I Don't Care About Star Wars Anymore</title><link href="https://www.rgaz.fr/blog/i-dont-care-about-star-wars-anymore/" rel="alternate"/><published>2025-06-09T21:00:00+02:00</published><updated>2025-06-09T21:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-06-09:/blog/i-dont-care-about-star-wars-anymore/</id><summary type="html">&lt;p&gt;Is Star Wars trending these days ? If not, then it's probably time to
chime in.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Really. I don't. Maybe I've finally grown up. Or maybe I'm just too bitter and
need to get out to stop the pain. But while I'll still cherish the memories, I'm
truly done caring about whatever happens to this franchise.&lt;/p&gt;
&lt;p&gt;So let's waste your time and mine whining about it, shall we ?&lt;/p&gt;
&lt;p&gt;The purpose of this blog is to get back into the habit of writing stuff down.
Indulging in some nerdy nitpicking seems like a fun way to do that. Naturally,
most of the topics ideas I'm getting are things I've been mulling over for a
while already. And apparently quite a few of those still revolve around Star Wars.
Some of those takes are not things I commonly see whenever my web roaming brings
me back to this old galaxy. Maybe that makes them interesting, or maybe
I'm just that annoying guy that always needs to have an opinion different from
everyone else's.&lt;/p&gt;
&lt;p&gt;I don't know if I'll get around to those rants or not, but if I do, one of the
annoying things about this series is that it can mean so many different things
to different people that it's impossible to say anything meaningful about it
without first stating what the franchise even &lt;em&gt;is&lt;/em&gt; to you, as this will affect
any point you try to make.&lt;/p&gt;
&lt;p&gt;So let's do that. This way I'll have something to link to if I ever decide to
touch the subject again.&lt;/p&gt;
&lt;a href="#a-long-time-ago"&gt;&lt;h2 id="a-long-time-ago"&gt;A long time ago...&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;&lt;img alt="Luke Skywalker walking towards the twin sunset of desert planet Tatooine." class="full-width" loading="lazy" src="https://www.rgaz.fr/img/dont_care_about_sw/tatooine.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;I first saw Star Wars&lt;sup id="fnref:a-new-hope"&gt;&lt;a class="footnote-ref" href="#fn:a-new-hope"&gt;1&lt;/a&gt;&lt;/sup&gt; on VHS at about 7 or 8 years old. I remember
liking it quite a bit, but for some reason the bug didn't quite bite. I thought
"yeah, okay, that was pretty cool" and moved on with whatever else I was infatuated
with at the time.&lt;/p&gt;
&lt;p&gt;Then a few years later my mom took me and my cousin to see it again as the
special editions&lt;sup id="fnref:special-editions"&gt;&lt;a class="footnote-ref" href="#fn:special-editions"&gt;2&lt;/a&gt;&lt;/sup&gt; hit the theaters (According to their release
date, I was ten by then). And  this time lightning struck. We had to go see
&lt;cite&gt;The Empire Strikes Back&lt;/cite&gt; on the very next day, and then had to wait
&lt;em&gt;two whole weeks&lt;/em&gt; before we could finally see the saga's conclusion. I had seen
the light. From then on, Star Wars was my religion.&lt;/p&gt;
&lt;p&gt;Being an obsessive kid, I dove head first into it. I read all the books I could
get my hands on, even going so far as trying to read one I found in English.&lt;sup id="fnref:english-reading"&gt;&lt;a class="footnote-ref" href="#fn:english-reading"&gt;3&lt;/a&gt;&lt;/sup&gt;
I wrote awful stories about my own version of &lt;a href="https://bittersweetfountain.blogspot.com/2013/07/corran-horn-rogue-9-jedi-and-mary-sue.html" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Corran Horn&lt;/a&gt;.
I didn't play video games, I played &lt;em&gt;Star Wars&lt;/em&gt; video games. At some point I got
into role playing games via, you guessed it, &lt;a href="https://en.wikipedia.org/wiki/Star_Wars:_The_Roleplaying_Game" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;that old D6 edition&lt;/a&gt;.
I wanted to know everything about this galaxy far, far away and quickly connected
with a couple of guys my age that seemed to love that stuff as much as I did. I
still consider those guys my best friends 30 years later.&lt;/p&gt;
&lt;p&gt;So when it comes to the &lt;abbr title="Original Trilogy"&gt;OT&lt;/abbr&gt;, I may suffer from some slight nostalgia bias.&lt;/p&gt;
&lt;p&gt;That being said, after mulling over those for quite a while now, I like to think
my appreciation for it is not &lt;em&gt;all&lt;/em&gt; rose-tinted glasses.&lt;/p&gt;
&lt;p&gt;The older I get, the more convinced I am of the importance
of storytelling. The tales we share define us, both as individuals and as a
culture. And what made that original trilogy tick wasn't so much its
groundbreaking visuals or its weird mashup of pulp influences (although those
definitely helped). It was that it got its plot fundamentally &lt;em&gt;right&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Lucas' first draft was a tangled mess of ideas that no one could make sense of,
but after rewriting it several times, he ended up with a clumsy&lt;sup id="fnref:bad-dialog"&gt;&lt;a class="footnote-ref" href="#fn:bad-dialog"&gt;4&lt;/a&gt;&lt;/sup&gt;
and simplistic script that dutifully checked all the marks from Joseph Campbell's
&lt;a href="https://en.wikipedia.org/wiki/Hero%27s_journey" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Hero's Journey&lt;/a&gt;. While structurally sound, it was pretty blunt,
which turned out to be its main strength.&lt;/p&gt;
&lt;p&gt;The archetypal characters and lucas's general lack of direction allowed the
enthusiastic cast to nail their parts, while its retread of classic tropes
made it easy for audiences to grasp as they got introduced to this brand new
setting while being bombarded with all the spectacle.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Tyrion Lannister from Game of Thrones complains about havins troubles with dad. Luke Skywalker calls him cute." class="half-width float-right" loading="lazy" src="https://www.rgaz.fr/img/dont_care_about_sw/star-wars-dad-meme.jpg" title="I never watched Game of Thrones, so I don't know how funny this really is. Made me giggle though, which I guess is good enough."&gt;&lt;/p&gt;
&lt;p&gt;The sequels took this diamond in the rough and polished it. Lucas wisely (and
perhaps reluctantly) delegated writing and directing to people who knew what
they were doing, and it paid off. &lt;cite&gt;The Empire Strikes Back&lt;/cite&gt; added much
needed depth to the story while staying laser-focused on its themes, and
&lt;cite&gt;Return of the Jedi&lt;/cite&gt; managed to bring it to a satisfying conclusion,
despite being the weakest of the three&lt;sup id="fnref:leia-sister"&gt;&lt;a class="footnote-ref" href="#fn:leia-sister"&gt;5&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;As a kid, I certainly didn't give much actual thought to those movies and kept
to the escpapist fantasy. But looking back, it's obvious that the coming-of-age
story deeply resonated with me. Star Wars is far from the only one of those, but
it's the one that grabbed me and as such, it's part of whoever I became.&lt;/p&gt;
&lt;a href="#dont-want-to-grow-up"&gt;&lt;h2 id="dont-want-to-grow-up"&gt;I Don't Want to Grow Up&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Two years after I became a believer, &lt;cite&gt;The Phantom Menace&lt;/cite&gt; came out.
Needless to say, I was all over it. It was freaking Star Wars, so how could it
&lt;em&gt;not&lt;/em&gt; be the best thing ever ?&lt;/p&gt;
&lt;p&gt;But by the time we got to &lt;cite&gt;Revenge of the Sith&lt;/cite&gt;, I was pushing eighteen
and in my final year of high school. Having developped some basic critical skills
in the meantime, I was definitely not impressed with that new trilogy.&lt;/p&gt;
&lt;p&gt;It had many flaws, but its biggest one was by far the writing (which, again, had
always been Lucas' weak point). This went far beyond the cringy love scenes and
terrible lines about sand. A lot of people complained about the acting, but that
was a symptom of how awfully dull the characters were to begin with.&lt;/p&gt;
&lt;p&gt;Years later, I'll begrudgingly admit that delving into the politics behind the
fall of the Republic and depicting the ineptitude of the late Jedi order were
interesting ideas, which I dismissed back then out of a misguided notion of
what Star Wars &lt;em&gt;should&lt;/em&gt; be about. But ideas are worth nothing if executed poorly,
and sadly the story was so badly told that there's no way I can care enough to
reconsider them.&lt;/p&gt;
&lt;p&gt;Some people like to point out that supposedely everyone loved the first episode
when it got released and hating on it only became trendy later on, completely
disregarding the fact that the hype around these movies was &lt;em&gt;huge&lt;/em&gt;. Yes, people
tend to get caught up in the excitement when things are new, and it takes some
time to revise one's initial judgment. Dismissing opinions you don't agree with
as blindly following the herd can work both ways.&lt;sup id="fnref:hating-as-a-trend"&gt;&lt;a class="footnote-ref" href="#fn:hating-as-a-trend"&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;But those people do have a point: Hating on the prequels did get pretty trendy.&lt;/p&gt;
&lt;h3 id="ruined-childhood"&gt;George Lucas ruined my childhood&lt;/h3&gt;
&lt;p&gt;RedLetterMedia's &lt;a href="https://www.youtube.com/playlist?list=PL5919C8DE6F720A2D" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;epic&lt;/a&gt; &lt;a href="https://www.youtube.com/playlist?list=PL56E3EB1DFD4B64A2" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;sized&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=bYWAHuFbLoc" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;reviews&lt;/a&gt; of
the (by then) new trilogy started a new kind of web entertainment, which mostly
consisted in trashing some notorious piece of media while playing up the outrage
for comedy. This formula got pretty popular, to the point of getting quite tiresome
more than a decade later.&lt;sup id="fnref:can-be-done-well"&gt;&lt;a class="footnote-ref" href="#fn:can-be-done-well"&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="South Parj animated scene in which George Lucas molesting a stormtrooper while Steven Spielberg watches." class="half-width float-right" loading="lazy" src="https://www.rgaz.fr/img/dont_care_about_sw/sp-lucas-trooper.jpeg" title="I can't blame South Park for this. This is barely exagerated from what you could read online back then."&gt;&lt;/p&gt;
&lt;p&gt;The conversation quickly focused almost exclusively on Lucas himself, and soon
devolved into memes about him turning to the dark side and willfully setting
out to sully everyone's childhood memories. Clearly the man was a fraud who didn't
understand his previous creations. It was a textbook fall from grace. People felt
betrayed, and this being the internet, the whole world had to know about it.&lt;/p&gt;
&lt;p&gt;Looking back, it's embarassing how far some of us took it, and how petty and
entitled the whole thing could get.&lt;sup id="fnref:toxicity"&gt;&lt;a class="footnote-ref" href="#fn:toxicity"&gt;8&lt;/a&gt;&lt;/sup&gt; But back then I was fully on board.
Luckily, there was some valid criticism among all the nitpicking and Lucas bashing,
and this whole period got me to think a lot about storytelling and the creative
process. I learned to move on from listing plot-holes and focus more on bigger
picture elements like tone, theme or characterization.&lt;/p&gt;
&lt;p&gt;I slowly started to understand how foolish putting individuals up on pedestals is.
Lucas' story was a perfect exemple on just how harmful the &lt;a href="https://chasejarvis.com/blog/the-myth-of-the-lone-genius/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;myth of genius&lt;/a&gt;
can get. He'd never been the god-like visionary some had made him out to be. He
wasn't an evil hack only concerned about business either. He was just a regular
guy with some good ideas and a drive to make cool stuff, and the real tragedy of
the prequels was that no one dared to help turn these ideas into something coherent.&lt;sup id="fnref:lucas-megalo"&gt;&lt;a class="footnote-ref" href="#fn:lucas-megalo"&gt;9&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;As bad as I still think those movies were, they helped me to understand why I
had to kill my idols. A recurring meme back then joked about how Lucas had turned
into Darth Vader. Sadly I didn't see any follow-up about how maybe it was time
for us nerds to confront and atone with our collective father.&lt;/p&gt;
&lt;p&gt;At some point in the early 2010's I was done grieving, and forgave George for
his sins. I would still glance at whatever was going on in the &lt;abbr title="Extended Universe"&gt;EU&lt;/abbr&gt;, but was content
knowing that the main saga was basically done. Surely we could now all move on
and hopefully learn a thing or two from past mistakes. Everything was going to
be allright.&lt;/p&gt;
&lt;a href="#here-we-go-again"&gt;&lt;h2 id="here-we-go-again"&gt;Here we go again&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;&lt;img alt="A horific, zombie version of Mickey Mouse standing on the roof of some building." loading="lazy" src="https://www.rgaz.fr/img/dont_care_about_sw/zombie-mickey.jpg" title="From the 'Runaway Brain' short. I haven't seen it. I kind of want to."&gt;&lt;/p&gt;
&lt;h3 id="bad-feeling"&gt;I've got a bad feeling about this...&lt;/h3&gt;
&lt;p&gt;Disney buying the licence felt like someone about to resurect the corpse of an
old friend. I didn't want more Star Wars, and only wished for it to rest in peace.
But sadly billion dollars media companies don't seem to care about what I want,
and the rest of the world seemed pretty excited. And hey, Lucas was out, so surely
this couldn't be as bad as the prequels, right ?&lt;/p&gt;
&lt;p&gt;"I'm just happy we'll get to see some new Star Wars" was a pretty common phrase
to hear. My answer to this was that I'd rather get more &lt;a href="https://en.wikipedia.org/wiki/Firefly_(TV_series)" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Firefly&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There's nothing wrong with wanting more of something you love, and I'm not &lt;em&gt;against&lt;/em&gt;
the idea of telling new stories in a pre-existing setting. But the tale should
come before the brand. Keeping a series going just for the sake of producing ever
more content was already a long tradition, and we all knew from experience that
digging up old and beloved franchises to do so was &lt;a href="https://www.imdb.com/fr/title/tt0367882/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;fraught&lt;/a&gt; with
&lt;a href="https://www.imdb.com/title/tt1446714/?ref_=ls_t_41" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;peril&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Star Wars being such a cultural touchstone with an already divided fan base, Disney
had a &lt;em&gt;tough&lt;/em&gt; job on their hands. It wasn't hard to predict it couldn't please
everyone, and we already knew how mad the internet could get over those things.
&lt;em&gt;Some&lt;/em&gt; kind of backlash was inevitable, no matter how good or bad the new movies
would turn out.&lt;/p&gt;
&lt;p&gt;As much as I pretended not to care, I was still emotionally attached to this
universe and I dreaded reliving the prequels bullshit all over again.&lt;/p&gt;
&lt;h3 id="dull-awakening"&gt;A dull awakening&lt;/h3&gt;
&lt;p&gt;&lt;img alt="Han Solo and Chewbacca getting aboard the Millenium Falcon and calling it home." class="half-width float-right" loading="lazy" src="https://www.rgaz.fr/img/dont_care_about_sw/home.png" title="This shot from the trailer was heart warming indeed. It also pissed me off when I noticed the manipulation."&gt;&lt;/p&gt;
&lt;p&gt;As much as I didn't want to like it, I still tried to approach &lt;cite&gt;The Force
Awakens&lt;/cite&gt; with a fair and open mind.&lt;/p&gt;
&lt;p&gt;As an exercise in mimicking the orginals, it was pretty good. But as far as
substance, there wasn't a lot to chew on. Playing it safe with the first movie was
understandable, but did it really need to repeat so much from &lt;cite&gt;A New Hope&lt;/cite&gt; ?&lt;/p&gt;
&lt;p&gt;The marketting made a lot of noise about how much respect was being paid to the
&lt;abbr title="Original Trilogy"&gt;OT&lt;/abbr&gt;, but that respect largely showed at the surface level. Most of it boiled
down to cheap appeals to nostalgia (I hated the &lt;cite&gt;Millenium Falcon&lt;/cite&gt;
reveal&lt;sup id="fnref:falcon-reveal"&gt;&lt;a class="footnote-ref" href="#fn:falcon-reveal"&gt;10&lt;/a&gt;&lt;/sup&gt;) and some (admitedly stunning) shots exalting the old
iconography. The new cast felt like kids playing make believe in the Star Wars
universe, which was cute and endearing, but failed to make up for the uninspired
script.&lt;/p&gt;
&lt;p&gt;The few themes and ideas it introduced remained under-developped and I didn't
care for the story hooks it left for its successors (I never understood why
everyone seems to think star wars &lt;em&gt;has&lt;/em&gt; to involve mysterious lineages, but that's
a topic for another time). I guess it did its job of getting a plot started, but
between the characters' lack of growth beyond their basic concepts and the movie's
refusal to give &lt;em&gt;some&lt;/em&gt; kind of context to what was going on, I was struggling to
see much of interest in there.&lt;/p&gt;
&lt;h3 id="subverting-expectations"&gt;Are your expectations subverted enough ?&lt;/h3&gt;
&lt;p&gt;&lt;img alt="An annoying plush toy called a porg steals the frame and supposedly looks cute." class="half-width float-right" loading="lazy" src="https://www.rgaz.fr/img/dont_care_about_sw/porg.jpeg" title="Some people defended the porgs by claiming there were no worse than the Ewoks from EP VI. I'm sorry, but at least the ewoks had a freaking role in that story. Also, I'd like to nominate this shot for the Most Annoying Attention Grab Ever Award."&gt;&lt;/p&gt;
&lt;p&gt;I'll give this to &lt;cite&gt;The Last Jedi&lt;/cite&gt;: it surprised me.&lt;/p&gt;
&lt;p&gt;I genuinely laughed at Ryan Johnson's methodical dismantling of &lt;em&gt;every single
plot point&lt;/em&gt; Abrams had left him. It felt like a middle finger to how bland and
uninteresting these ideas were, which I almost wanted to applaud.&lt;/p&gt;
&lt;p&gt;I'm just not sure demolishing the ongoing plot so thoroughly right in the middle
of a three acts story was such a good idea. Dropping a few threads and taking some
things in a new and unexpected direction would have been fine, but by the end,
I was struggling to see how anyone could possibly follow up on this mess. I saw
some people hoping the next episode could fix this, but there was nothing left
to fix.&lt;/p&gt;
&lt;p&gt;Assigning each film to a different director wasn't a bad idea, but one would expect
those three to agree on &lt;em&gt;some&lt;/em&gt; kind of general outline before getting to work. I
still can't understand how such an oversight from Disney was even possible.&lt;/p&gt;
&lt;p&gt;Johnson also set out to deconstruct the rusty tropes Star Wars has been saddled
with for ages, which is a perfectly valid goal&lt;sup id="fnref:kotor-II"&gt;&lt;a class="footnote-ref" href="#fn:kotor-II"&gt;11&lt;/a&gt;&lt;/sup&gt;, and something I would
agree was badly needed. The trouble is that he didn't get much further than pointing
these tropes out, and didn't bother to dig much into them. A more subtle approach
and a better script could have made it work, but as it was, the whole thing felt
petty and &lt;a href="https://www.youtube.com/watch?v=5S4Ss5bK-ws" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;not nearly as clever as it thought it was&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While having radically opposed intentions, both &lt;abbr title="The Force Awakens"&gt;TFA&lt;/abbr&gt; and &lt;abbr title="The Last Jedi"&gt;TLJ&lt;/abbr&gt; ultimately suffered
from the same fundamental problem: they had nothing to actually say. As bad as I
still think Lucas failed with his prequel trilogy, I could now see that he was
at least &lt;em&gt;trying&lt;/em&gt; to bring something new to the table.&lt;/p&gt;
&lt;h3 id="calling-it-quits"&gt;Calling it quits&lt;/h3&gt;
&lt;p&gt;By that point I had truly lost all interest. I didn't watch Episode 9, and while
I did feel some vindication at how badly it was received, I didn't care enough
to gloat.&lt;/p&gt;
&lt;p&gt;Disney's handling of the franchise boiled down to an awfull lot of noise about
nothing. The sinking state of online discussion and the ongoing culture wars only
made it more frustrating to try and reason about. Plans for more theatrical
releases seem to be abandoned for now, and the future seems focused on TV shows,
which thankfully don't get as much media coverage. I'm told some of them are decent,
which I have no reason to doubt. Smaller productions aren't expected to generate
as much profit as summer blockbusters, so there's more room for them to try new
things.&lt;sup id="fnref:rogue-one"&gt;&lt;a class="footnote-ref" href="#fn:rogue-one"&gt;12&lt;/a&gt;&lt;/sup&gt; I just can't be bothered to pay attention anymore.&lt;/p&gt;
&lt;a href="#epilogue"&gt;&lt;h2 id="epilogue"&gt;Epilogue&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;&lt;img alt="Luke Skaywalker's silhouette agains the flames consuming the corpse of Darth Vader" class="full-width" loading="lazy" src="https://www.rgaz.fr/img/dont_care_about_sw/vaders-funeral.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Stories matter. Whether it's the bible or your childhood's comic books, we all
have a few stories that shaped us into who we are.&lt;/p&gt;
&lt;p&gt;That's why it hurts to see them die. The nerd outrage can get pretty childish,
but there's a reason we get so emotional in the first place. Treating these stories
like mere content to be consumed and wondering why anyone would care so much about
silly space wizards is missing the point. Lashing out and abusing blasphemers is
just as misguided. Nothing of value will grow from that battlefield.&lt;/p&gt;
&lt;p&gt;We should remain critical of what gets produced, and it's okay to nerd out and
bicker about it. Let's just stop turning this stuff into holy wars. Stories matter,
but that doesn't make them sacred. Ditch the dogma, and focus on looking for some
bit of meaning. If you can't find any, just walk away. Rant about it if that makes
you feel better, but don't forget to move on, and please don't feed the troll
factory. This way lies only madness.&lt;/p&gt;
&lt;p&gt;And maybe start writing your own stories.&lt;/p&gt;
&lt;p&gt;I guess this is what Star Wars taught me. I know this sounds corny, but it took
me 20+ years to begin to get it. Maybe someday I'll learn to get to the point.
Anyone knows of a good story about that ?&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you're not sick of Star Wars yet and are hungry for more,
&lt;a href="https://www.youtube.com/@sfdebris" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;sfdebris&lt;/a&gt; has a fascinating &lt;a href="https://www.youtube.com/watch?v=z-kYQ77kRg0&amp;amp;list=PLP7v2GoLok346dluOMqDXxkIiBqY42WCL&amp;amp;index=1" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;three&lt;/a&gt;
&lt;a href="https://www.youtube.com/watch?v=YDZR1S5dZSA&amp;amp;list=PLP7v2GoLok34LUKvz1LL2cl-gNKFYg77n&amp;amp;index=1" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;parts&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=dKx63cYl7k4&amp;amp;list=PLP7v2GoLok34IPYPPHA9sLZymDSSS4vvf" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;series&lt;/a&gt; on Lucas' evolution
and the making of both his trilogies, up to the sale to Disney. Good stuff.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:a-new-hope"&gt;
&lt;p&gt;It had already been renamed and labeled as the fourth episode, but I didn't
care or notice. The guy who'd lent me the tape called it "Star Wars", so "Star
Wars" it was.&amp;#160;&lt;a class="footnote-backref" href="#fnref:a-new-hope" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:special-editions"&gt;
&lt;p&gt;Which is why, while I can agree with most of the criticism those versions got,
I still can't be too bothered about it. Those were &lt;em&gt;my&lt;/em&gt; originals, so whatever
fault they may have can't be &lt;em&gt;that&lt;/em&gt; bad.&amp;#160;&lt;a class="footnote-backref" href="#fnref:special-editions" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:english-reading"&gt;
&lt;p&gt;I gave up after one chapter, but still, that was pretty ambitious.&amp;#160;&lt;a class="footnote-backref" href="#fnref:english-reading" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:bad-dialog"&gt;
&lt;p&gt;Mark Hamill loved mocking lucas's dialog and did so in
&lt;a href="https://www.youtube.com/watch?v=rihbi2U7tNg" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;many interviews&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:bad-dialog" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:leia-sister"&gt;
&lt;p&gt;Want an idiosyncratic (and maybe controversial) take ? Making Leia Luke's
sister was a dumb decision and the first step in making the whole galaxy feel
like it revolved entirely around a handful of people.&amp;#160;&lt;a class="footnote-backref" href="#fnref:leia-sister" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:hating-as-a-trend"&gt;
&lt;p&gt;I saw the same argument about Disney's Episode VII. Since I was already a
cynical asshole when that one came out, I can proudly say that this time my
opinion never changed one bit.&amp;#160;&lt;a class="footnote-backref" href="#fnref:hating-as-a-trend" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:can-be-done-well"&gt;
&lt;p&gt;When done well, it can be fun and raise interesting points. Sadly not everyone
does it well.&amp;#160;&lt;a class="footnote-backref" href="#fnref:can-be-done-well" title="Jump back to footnote 7 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:toxicity"&gt;
&lt;p&gt;&lt;a href="https://fr.wikipedia.org/wiki/Jake_Lloyd" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Jake Lloyd&lt;/a&gt; didn't deserve any of
this shit. I don't think we realized just how toxic internet discourse could
get, and sadly it's only gotten worse since then.&amp;#160;&lt;a class="footnote-backref" href="#fnref:toxicity" title="Jump back to footnote 8 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:lucas-megalo"&gt;
&lt;p&gt;Watching some behind the scene footage, you really get the impression that
people are afraid to question anything George says. Maybe he wouldn't listen
anyway, but I can't help to wonder if his "mad genius" aura makes those people
assume he just can't be wrong.&amp;#160;&lt;a class="footnote-backref" href="#fnref:lucas-megalo" title="Jump back to footnote 9 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:falcon-reveal"&gt;
&lt;p&gt;That camera pan was the cinematic equivalent of an obnoxious kid tapping
on your shoulder while yelling "LOOK! LOOK AT THAT THING YOU LIKE!"&amp;#160;&lt;a class="footnote-backref" href="#fnref:falcon-reveal" title="Jump back to footnote 10 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:kotor-II"&gt;
&lt;p&gt;&lt;a href="https://www.michigandaily.com/arts/b-side/knights-of-the-old-republic-ii-and-how-to-complicate-a-series/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;KOTOR II&lt;/a&gt;
tried to do just that and mostly succeeded. Too bad it suffered the Obsidian
curse of lacking an ending.&amp;#160;&lt;a class="footnote-backref" href="#fnref:kotor-II" title="Jump back to footnote 11 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:rogue-one"&gt;
&lt;p&gt;I didn't cover &lt;cite&gt;Rogue One&lt;/cite&gt; here to try and keep this from becoming
a freaking novel, but it was a pleasant surprise.&amp;#160;&lt;a class="footnote-backref" href="#fnref:rogue-one" title="Jump back to footnote 12 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="general"/></entry><entry><title>Learning Touch Typing</title><link href="https://www.rgaz.fr/blog/learning-touch-typing/" rel="alternate"/><published>2025-06-12T15:00:00+02:00</published><updated>2025-06-12T15:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-06-12:/blog/learning-touch-typing/</id><summary type="html">&lt;p&gt;Do pianists make for better hackers ? I suck at those keyboards too, so
I wouldn't know.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I stumbled on &lt;a href="https://steve-yegge.blogspot.com/2008/09/programmings-dirtiest-little-secret.html" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;this article&lt;/a&gt; the other day. It's about learning to
touch type, and the author compares the process to musical practice. While the
"Fast, Slow, Medium" routine he describes is debatable&lt;sup id="fnref:fast-slow-medium"&gt;&lt;a class="footnote-ref" href="#fn:fast-slow-medium"&gt;1&lt;/a&gt;&lt;/sup&gt;,
the basic idea makes a lot of sense. After all, both activities involve building
up mechanical skills and developing muscle memory, so it makes sense to find some
overlap between the two methodologies.&lt;/p&gt;
&lt;p&gt;I've been trying to finally get decent at typing myself for the last few weeks,
and I'm noticing more similarities with working on instrumental technique, as
well as a tendency to fall into the same kind of traps.&lt;/p&gt;
&lt;p&gt;I don't really expect any of this to be useful to anyone, and just felt like
pointing out those observations. I don't know why, but I've alway enjoyed finding
parallels between seemingly completely unrelated things. So here goes.&lt;/p&gt;
&lt;a href="#where-im-coming-from"&gt;&lt;h2 id="where-im-coming-from"&gt;Where I'm coming from&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;I somehow got comfortable using a keyboard casually as a teenager without ever
giving it a thought. I did use more than two fingers, but beyond that I had no
idea what I was doing. Somehow that felt good enough for a while.&lt;/p&gt;
&lt;p&gt;Only when I got into programming did it start to bother me. In part because I was
too slow to feel like a proper hacker, but mostly because I was making three typos
per line.&lt;/p&gt;
&lt;p&gt;Typos aren't too bad when you're just writing casual stuff or chatting with friends,
but code is not as forgiving. Fixing stupid goofs one after the other gets infuriating
pretty fast, especially when you're trying to understand what in the hell your
program is even doing. I knew I should do something about it, but somehow I just
kept going and endured the frustration.&lt;/p&gt;
&lt;p&gt;At some point I quit my job and didn't get to use a keyboard for anything serious
for a while. I would get the coding itch back now and then, and couldn't stand
the constant mess ups. I felt downright impotent.&lt;/p&gt;
&lt;p&gt;I started doing drills on &lt;a href="https://www.typingclub.com/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Typing Club&lt;/a&gt; about a year ago, but didn't
keep at it for long. Starting this blog got me to type quite a bit, though, both
code and prose, so it seemed like a good opportunity to finally get serious about
it.&lt;/p&gt;
&lt;p&gt;It's slowly getting better. I'm about as fast as a stoned turtle, but I'm making
less mistakes and can mostly keep my eyes on the screen. Numbers are still giving
me cold sweats, though.&lt;/p&gt;
&lt;a href="#building-technique"&gt;&lt;h2 id="building-technique"&gt;Building technique&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;&lt;img src="https://www.rgaz.fr/img/touch-typing/busy-screen.jpeg"
     loading="lazy"
     class="full-width"
     alt="A computer screen split into many small panels, each displaying random compurery nonsense."
     title="The great thing about this job is how easy it is to make it look like you're really busy. The cmatrix pane might be overdoing it though."/&gt;&lt;/p&gt;
&lt;p&gt;When chatting about music, I often run into that guy whose main contribution is
to lecture people about how technique doesn't matter, because it's all about, like,
the feel, man.&lt;/p&gt;
&lt;p&gt;This is like saying you don't have to learn how to drive your car as long as you
know where you're going. I can agree with the idea that it's better to focus on
your destination than to fuss over technicalities, but I'm not sure how far you'll
get if you don't know how to start your engine.&lt;/p&gt;
&lt;p&gt;Technique is nothing more than knowing how to use your tools. Good technique is
not about being a virtuoso, it's about internalizing the mechanics deeply enough
that you don't have to think about them anymore. You know the saying that your
instrument should become an extension of your body, so that the music is free to
flow directly from your mind to the ears of the listener ? &lt;em&gt;This&lt;/em&gt; is what good
technique is.&lt;/p&gt;
&lt;p&gt;If you're writing stuff on a computer, then the keyboard is your instrument, and
the same logic applies.&lt;/p&gt;
&lt;a href="#old-habits"&gt;&lt;h2 id="old-habits"&gt;Old habits die hard&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Around 2012 I got into Bluegrass and quickly realized just how terrible my right
hand was. I had been playing for more than 10 years already and had never paid
that much attention to it. I knew it wasn't great, but just like my keyboard
skills, I figured it was good enough for what I was doing.&lt;/p&gt;
&lt;p&gt;It wasn't, and trying to pick out fiddle tunes on the accoustic guitar made that
abundantly clear.&lt;/p&gt;
&lt;p&gt;I set out to pretty much re-learn my technique from the ground up. It took me
about 8 years to finally get it back in a state I was reasonably pleased with.&lt;/p&gt;
&lt;p&gt;A lot of that time was spent figuring out how to even start fixing it, and I
didn't have the time to truly work on it for a couple of those years&lt;sup id="fnref:full-time-job"&gt;&lt;a class="footnote-ref" href="#fn:full-time-job"&gt;2&lt;/a&gt;&lt;/sup&gt;.
Still, it took a while. Hopefully touch typing won't take &lt;em&gt;that&lt;/em&gt; long.&lt;/p&gt;
&lt;p&gt;Along the way I ended up in that weird place where the old muscle memory still
kicked in and interfered with the new habits I was trying to settle, which only
made things worse. This is pretty much what typing feels like now. It all
straightened out in the end though, and luckily I'm not typing on a stage and
don't really have deadlines to worry about, so now is the best possible time to
deal with the transition.&lt;/p&gt;
&lt;a href="#start-from-begining"&gt;&lt;h2 id="start-from-begining"&gt;Start at the begining&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;When starting out, you may want to learn &lt;cite&gt;Mary had a little lamb&lt;/cite&gt; before
tackling &lt;a href="https://www.youtube.com/watch?v=X14kC-sEH0I" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;&lt;cite&gt;Flight of the bumblebee&lt;/cite&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Start from the basics, and &lt;em&gt;then&lt;/em&gt; build on those fundations. Typing drills are
just like scale practice. There'll come a time when your fingers will have figured
out what they're supposed to do, and by that point you'll be able to just let them
run on their own as you switch your attention to what you want to say in the first
place.&lt;sup id="fnref:tommy-emmanuel"&gt;&lt;a class="footnote-ref" href="#fn:tommy-emmanuel"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;At my first dev job  I got into &lt;a href="https://carlosbecker.com/posts/ed/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;vim&lt;/a&gt;, and while I soon reached the point
where I wasn't feeling crippled anymore, I never noticed the huge boost in
efficiency the evangelists were raving about.&lt;/p&gt;
&lt;p&gt;That was simply because I was constantly hitting the wrong keys, which would often
mess things up in hilariously random ways (which prompted me to memorize the &lt;code&gt;undo&lt;/code&gt;
binding &lt;em&gt;quickly&lt;/em&gt;). Learning the commands wasn't hard, but my fat fingers were too
inept to apply that knowledge properly, so most of the benefits went to waste.&lt;/p&gt;
&lt;p&gt;This is the point where I really should have bitten the bullet and start getting
comfortable with the home row.&lt;sup id="fnref:hjkl"&gt;&lt;a class="footnote-ref" href="#fn:hjkl"&gt;4&lt;/a&gt;&lt;/sup&gt; Learning vim without fixing my typing first
was like trying to run before I could walk.&lt;sup id="fnref:vim-usage"&gt;&lt;a class="footnote-ref" href="#fn:vim-usage"&gt;5&lt;/a&gt;&lt;/sup&gt; In retrospect, It's frankly
embarassing that I didn't get on it then.&lt;/p&gt;
&lt;a href="#working-sucks"&gt;&lt;h2 id="working-sucks"&gt;Working sucks&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;&lt;img src="https://www.rgaz.fr/img/touch-typing/play.jpg"
     loading="lazy"
     class="full-width"
     alt="Sheet music, with an indication to play 'without bitching about the key'" /&gt;&lt;/p&gt;
&lt;p&gt;Drills are work, and not the rewarding kind. They are a meaningless chore.&lt;/p&gt;
&lt;p&gt;I'm lazy, and I don't like doing chores. Like many, I'm terrible at just pushing
through and tend to skip to the fun parts.&lt;/p&gt;
&lt;p&gt;I also resent being told what to do. I don't ignore &lt;em&gt;all&lt;/em&gt; advice, but I usually
decide to try things my way anyway and see if I get burned. This wastes time in
the long run, but the few lessons I end up learning tend to stick better.&lt;/p&gt;
&lt;p&gt;The key for me is to understand why I should bother in the first place. Become
aware of the actual problems I need to solve. "Yeah, I guess I'd get better if I
did this" or "That's what the greats do" is not enough. I have to feel the pain
before I try to soothe it.&lt;/p&gt;
&lt;p&gt;Once I decide to get started, the next hurdle is to commit to it. I'll struggle
to get a routine started, but once it's going, it helps a lot. I also need to find
ways to make it enjoyable. I'm not a huge fan of gamification, but it seems like
a good fit here.&lt;/p&gt;
&lt;p&gt;The whole process is frustrating, especially when progress is slow. I might get
fed up and bounce off at some point, but I know there's no way around it. The way
to &lt;a href="https://knowyourmeme.com/memes/git-gud" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;git gud&lt;/a&gt; is to struggle.&lt;/p&gt;
&lt;h3 id="slowing-down"&gt;Slow the hell down&lt;/h3&gt;
&lt;p&gt;This one should be obvious, even more so in my case. The reason I decided to start
working on this in the first place was the astronomic amount of typos I was making,
so aiming for accuracy rather than speed is my real goal to begin with.&lt;/p&gt;
&lt;p&gt;And still, I found myself hammering away at my regular speed (if not faster)
and wondering why things weren't improving. That blunder was easy to spot, but
as I forced myself to take it slower, I noticed something I already experienced
on the guitar: I was making even &lt;em&gt;more&lt;/em&gt; mistakes.&lt;/p&gt;
&lt;p&gt;My guess is that this is due to the existing muscle memory getting confused. When
going at a speed I'm used to, the fingers happily jump in the general direction
they're supposed to, but slowing down reveals how imprecise they really are.&lt;/p&gt;
&lt;p&gt;My solution is to double down. I stop before each and every character and describe
to myself the movement I have to execute before typing it.&lt;/p&gt;
&lt;p&gt;Reach for the right shift key while pressing the left hand's fourth finger down.&lt;br&gt;
Click.&lt;br&gt;
Move the right hand's third finger up one row.&lt;br&gt;
Click.&lt;br&gt;
Get the third finger back to its home position while moving the first one down,
extending it to the left by one key.&lt;br&gt;
Click.&lt;br&gt;
Bring the first finger back, while moving the left hand's first up and to the
right.&lt;br&gt;
Click.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Congratulations. You just spent thirty seconds typing "Font".&lt;/p&gt;
&lt;p&gt;Going that slow feels like torture. It brings back memories from dusting off the
metronome after ignoring it for so long. And I remember that when I got on &lt;em&gt;that&lt;/em&gt;,
I was amazed at how quickly it stopped feeling painful. After a while it even
became kind of pleasant.&lt;/p&gt;
&lt;p&gt;I don't expect deliberately typing at 5 &lt;abbr title="Words Per Minute"&gt;WPM&lt;/abbr&gt; will ever become fun, but I'm sure
getting into the right mindset can make it at least tolerable.&lt;/p&gt;
&lt;a href="#eyes-up"&gt;&lt;h2 id="eyes-up"&gt;Keep your eyes up there&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;&lt;img src="https://www.rgaz.fr/img/touch-typing/dad-dog.webp"
     loading="lazy"
     class="full-width"
     alt="A dog wearing glasses sitting at a computer keyboard, staring at the screen attentively."
     title="Woof."/&gt;&lt;/p&gt;
&lt;p&gt;I've often heard folks express amazement at how some blind people could get so
good at their instruments. The reason why always felt obvious to me: being deprived
of one sense forces you to develop the other ones even more to compensate.&lt;sup id="fnref:blind-people-disclaimer"&gt;&lt;a class="footnote-ref" href="#fn:blind-people-disclaimer"&gt;6&lt;/a&gt;&lt;/sup&gt;
Hearing is the most obvious one, but I would argue touch is just as important, if
not more.&lt;/p&gt;
&lt;p&gt;Again, the where and how to play anything gets ingrained in your muscle memory.
Once it's internalized, you don't need to look at what your fingers are doing
anymore.&lt;/p&gt;
&lt;p&gt;I made a point of deliberately &lt;em&gt;not&lt;/em&gt; looking at my left hand when I play. I find
it helps me switch my attention away from what I'm doing and towards what's going
on around me. It pushes me to think with my ears instead of following scale patterns.
And I start to physically &lt;em&gt;feel&lt;/em&gt; what I'm playing, rather than watch it.&lt;/p&gt;
&lt;p&gt;If you've been playing for a while, try it. Close your eyes, turn off the light
or just stare at the wall in front of you, and play something. I'm willing to bet
it won't be as hard as you think.&lt;/p&gt;
&lt;p&gt;Blind musicians have to develop that physical relationship to their instrument
because they simply can't rely on their eyes to help them figure things out.&lt;sup id="fnref:sight-is-useful"&gt;&lt;a class="footnote-ref" href="#fn:sight-is-useful"&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Typing is much less abstract, and the benefits of keeping your attention on the
screen are much more obvious, so it makes sense that your very first goal should
be to stop looking down at the keyboard. That's what the "touch" in touch typing
stands for, after all.&lt;/p&gt;
&lt;a href="#context-is-everything"&gt;&lt;h2 id="context-is-everything"&gt;Context is everything&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;One last annoying part of this process is how big of an impact context can have
on your performance.&lt;/p&gt;
&lt;p&gt;I might be doing well in some typing app, and then switch to editing some code
and everything comes crashing down. As soon as I start having to actually think
about what I'm writing, the fingers seem to get lost again.&lt;sup id="fnref:prose-easier"&gt;&lt;a class="footnote-ref" href="#fn:prose-easier"&gt;8&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Again, this reminds me of how different everything feels when playing in a new
setting (alone or with a group, on stage or at a casual jam...). Every situation
comes with its own unique set of details to pay attention to, which can really
play a number on your technique.&lt;/p&gt;
&lt;p&gt;I also tend to be quite sensitive to slight changes in the gear I'm using. A pick
or a string gauge I'm not quite used to can really trip me up. This makes me
wonder how I'll handle having to type on a different keyboard.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Allright, that's all I have.&lt;/p&gt;
&lt;p&gt;I'll end this by quoting a comment from the article I opened with (note that it's
from 2008):&lt;/p&gt;
&lt;blockquote&gt;
    Not trying to offend anyone here, but I've never encountered a person
    (programmer or otherwise) under 30 that can't touch type. Could this be an
    age thing?
&lt;/blockquote&gt;

&lt;p&gt;I'm not even sure touch screens existed in 2008, let alone smartphones. The
assumption that of course young people would pick up touch typing on the go
wasn't &lt;em&gt;that&lt;/em&gt; far fetched back then (although I'm proof that many didn't care
enough), but it's a bit depressing how ridiculous it sounds 15 years later.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:fast-slow-medium"&gt;
&lt;p&gt;While a few occasional, stupidly fast bursts of speed can be fun, I wouldn't
make it part of the routine, and I certainly wouldn't &lt;em&gt;start&lt;/em&gt; with it.&amp;#160;&lt;a class="footnote-backref" href="#fnref:fast-slow-medium" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:full-time-job"&gt;
&lt;p&gt;Turns out playing in four bands while keeping a full time job isn't such a
   great idea. Everytime a rehearsal got cancelled, I figured I'd use the
   time to work on that damned right hand, only to spend the night loafing
   around on the couch. Working when your mind is drained is no use.&amp;#160;&lt;a class="footnote-backref" href="#fnref:full-time-job" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:tommy-emmanuel"&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Xm2ODiNUhac&amp;amp;t=613s" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Tommy Emmanuel&lt;/a&gt;
has a line I quite like about this:&lt;/p&gt;
&lt;p&gt;"It's not music yet. This is learning skill. When you practice the skill
enough, it turns to music, but you can't have the music without the skill."&amp;#160;&lt;a class="footnote-backref" href="#fnref:tommy-emmanuel" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:hjkl"&gt;
&lt;p&gt;If the use of &lt;a href="https://vld.bg/articles/hjkl/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;hjkl for movement&lt;/a&gt; is still baffling to you,
now you know why it makes sense.&amp;#160;&lt;a class="footnote-backref" href="#fnref:hjkl" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:vim-usage"&gt;
&lt;p&gt;I kept using vim, though. Modal editing made sense to me and was handy even
if it didn't speed me up that much. The mistakes I kept doing were quick enough
to fix, and as I got used to it I started to really miss most of the basic
bindings when I couldn't use them. vim didn't make me more efficient, it made
me suck even more at the other editors instead.:w&amp;#160;&lt;a class="footnote-backref" href="#fnref:vim-usage" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:blind-people-disclaimer"&gt;
&lt;p&gt;To be clear: I'm not claiming that all blind people are musically gifted,
and I don't want to diminish the hardship of handicap. I'm simply pointing
out that the phenomenon, when it does occur, is not as surprising as it seems.&amp;#160;&lt;a class="footnote-backref" href="#fnref:blind-people-disclaimer" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:sight-is-useful"&gt;
&lt;p&gt;Again, I'm not suggesting they have it easy. Sight &lt;em&gt;is&lt;/em&gt; immensely useful when
learning. Without it, say bye-bye to most learning resources. Sheet music.
Chord / scale diagrams. Hell, you don't even get to look at what other people
are doing. You'd be a fool not to take advantage of it. But at some point,
it might be worthwhile to ditch that dependency.&amp;#160;&lt;a class="footnote-backref" href="#fnref:sight-is-useful" title="Jump back to footnote 7 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:prose-easier"&gt;
&lt;p&gt;Prose doens't seem to trip me up as much, and since I'm not looking for
immediate feedback, slowing down and fixing mistakes as I make them is not as
annoying. So, good thing I'm spending so much time on these articles, I guess
=)&amp;#160;&lt;a class="footnote-backref" href="#fnref:prose-easier" title="Jump back to footnote 8 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="music"/></entry><entry><title>Implementing Dark Mode</title><link href="https://www.rgaz.fr/blog/implementing-dark-mode/" rel="alternate"/><published>2025-06-17T18:30:00+02:00</published><updated>2025-06-17T18:30:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-06-17:/blog/implementing-dark-mode/</id><summary type="html">&lt;p&gt;Minor site update.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Allright, here's a dark mode switch. Because it's cool and I was bored.&lt;/p&gt;
&lt;p&gt;I learned only a few months ago that &lt;a href="https://www.w3schools.com/css/css3_variables.asp" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;variables&lt;/a&gt; and
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_nesting/Using_CSS_nesting" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;nesting&lt;/a&gt; had both made their way into the CSS standard. And apparently
it's been long enough that most major browsers should support it.&lt;/p&gt;
&lt;p&gt;That's sweet. Those were the only two features I actually used in &lt;a href="https://lesscss.org/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;LESS&lt;/a&gt;,
so I ditched it.&lt;/p&gt;
&lt;p&gt;Using those variables, here's the entirety of the dark-mode specific code I needed:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;theme-dark&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;--background-color-main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;#1c1b22&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;--background-color-scrolltop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;grey&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;--background-color-tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;#312f3b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;/* main background lightened by 10 % */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;--txt-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;--txt-color-light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;darkgrey&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;--txt-color-tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;--link-color-hover&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;orange&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;theme-dark&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;brightness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.95&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;contrast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(And apparently, pygment&lt;sup id="fnref:pygment"&gt;&lt;a class="footnote-ref" href="#fn:pygment"&gt;1&lt;/a&gt;&lt;/sup&gt; can't handle css nesting. Oh well.)&lt;/p&gt;
&lt;p&gt;Of course I had to actually use the new variables in the rest of the stylesheet,
but that's not too bad, and it should make it easier to change things around
down the road.&lt;/p&gt;
&lt;p&gt;I hope you'll find it pretty. If you don't, consider that I seriously entertained
going with this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="A screenshot of this page in an alternate version of dark mode with bright yellow text." class="full-width" loading="lazy" src="https://www.rgaz.fr/img/dark-mode/yellow.png" title="Giving nightmares to graphic designers is one of the small pleasures in life."&gt;&lt;/p&gt;
&lt;p&gt;I honestly kind of like it. It's brash and amateurish, but I happen to like that
vibe. Maybe I &lt;em&gt;will&lt;/em&gt; switch back to it just to piss people off.&lt;/p&gt;
&lt;p&gt;Also, it reminds me of the posters my dad used to make.&lt;sup id="fnref:dad-posters"&gt;&lt;a class="footnote-ref" href="#fn:dad-posters"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Oh, by the way, I'm storing your chosen theme in your browser's &lt;code&gt;localStorage&lt;/code&gt;,
so I guess I'm technically kind of tracking your activity. Let's hope the &lt;abbr title="General Data Protection Regulation"&gt;GDPR&lt;/abbr&gt;
won't get me for this.&lt;/p&gt;
&lt;p&gt;On a completely unrelated note, it's been a month since this site launched. Looks
like I'm still having fun with it. So, that's cool I guess.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:pygment"&gt;
&lt;p&gt;The python library I'm using to highlight the code snippets.&amp;#160;&lt;a class="footnote-backref" href="#fnref:pygment" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:dad-posters"&gt;
&lt;p&gt;Those only had a few lines of text, so obviously it wasn't as overwhelming.
But the yellow on black titles made them stand out and was pretty distinctive.&amp;#160;&lt;a class="footnote-backref" href="#fnref:dad-posters" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="bits"/></entry><entry><title>Dark Mode: Followup</title><link href="https://www.rgaz.fr/blog/dark-mode-followup/" rel="alternate"/><published>2025-06-21T15:00:00+02:00</published><updated>2025-06-21T15:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-06-21:/blog/dark-mode-followup/</id><summary type="html">&lt;p&gt;Warning: This article contains way too much Javascript.&lt;/p&gt;</summary><content type="html">&lt;p&gt;So, I started fooling around with a django app since the last time, and noticed
the &lt;a href="https://github.com/django-commons/django-debug-toolbar" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;debug toolbar&lt;/a&gt;&lt;sup id="fnref:djdbt"&gt;&lt;a class="footnote-ref" href="#fn:djdbt"&gt;1&lt;/a&gt;&lt;/sup&gt; had added a theme switcher
(this may be old news. It's been a while since I started a django project).&lt;/p&gt;
&lt;p&gt;Since I had just fooled around with it myself only a couple days before, I took
a look at their implementation.&lt;/p&gt;
&lt;p&gt;It's very similar to what I had done (which I scraped together from various
examples), but slightly shorter and a bit more elegant.&lt;sup id="fnref:elegant"&gt;&lt;a class="footnote-ref" href="#fn:elegant"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;So obviously I started fooling around with it and began adapting it to what I
wanted. Along the way I fell into the overengineering trap and turned it into
some kind of library.&lt;/p&gt;
&lt;p&gt;Here's what I ended up with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// Lifted and adapted from django-debug-toolbar:&lt;/span&gt;
&lt;span class="c1"&gt;// https://github.com/django-commons/django-debug-toolbar/blob/c217334010fa54a8726640519ca29cb77fffda58/debug_toolbar/static/debug_toolbar/js/toolbar.js#L215&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;themeToggler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;defaultOpts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;switcherElementSelector&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a#theme-switcher&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;rootElementSelector&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;localStorageVarName&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;user-theme&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;dataThemeAttrName&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;data-theme&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;lightThemeName&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;light&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;darkThemeName&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;dark&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;autoThemeName&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;auto&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;prefersDark&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;matchMedia&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;(prefers-color-scheme: dark)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Those will be set from opts in the init function and therefore can&amp;#39;t be&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// const.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;themeList&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rootElement&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;userTheme&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;setTheme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;rootElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataThemeAttrName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;autoThemeName&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prefersDark&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;darkThemeName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lightThemeName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;init&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;defaultOpts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;_opts&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;themeList&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;prefersDark&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lightThemeName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;darkThemeName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;darkThemeName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lightThemeName&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;rootElement&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rootElementSelector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;userTheme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;localStorageVarName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;autoThemeName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;switcherElementSelector&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;click&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;themeList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userTheme&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="nx"&gt;userTheme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;themeList&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;themeList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;localStorageVarName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;userTheme&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="nx"&gt;setTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;setTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I followed what I'm half remembering from the best practices of the 2010's&lt;sup id="fnref:outdated-best-practices"&gt;&lt;a class="footnote-ref" href="#fn:outdated-best-practices"&gt;3&lt;/a&gt;&lt;/sup&gt;,
and it looks like an old jQuery plugin as a result.&lt;/p&gt;
&lt;p&gt;I completely stopped following whatever was going on in the Javascript world about
ten years ago. Hell, even the arrow function syntax feels new to me. So I have
no idea how actually usable this is in the current ecosystem.&lt;/p&gt;
&lt;p&gt;I don't care, though. For what I do, copying and pasting scripts is more than
enough, so this will do for now. Maybe I'll have a look at web components and
see if it makes sense to turn this into one, though.&lt;/p&gt;
&lt;p&gt;I don't feel too bad about going overboard with the parameterization. The actual
logic is still pretty simple, and dark mode is a nice usability feature, so having
some drop in snippet to use in a future project could come in handy&lt;sup id="fnref:docs"&gt;&lt;a class="footnote-ref" href="#fn:docs"&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;For comparison, here's what I'm currently using on this site:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;getTheme&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;theme&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;matchMedia&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;(prefers-color-scheme: dark)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;matches&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;dark&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;light&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;theme&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;stylesheetLight&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&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="s1"&gt;&amp;#39;syntax-style-light&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;stylesheetDark&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&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="s1"&gt;&amp;#39;syntax-style-dark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;switchTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&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;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;body&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;dark&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;theme-dark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;stylesheetLight&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;not all&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;stylesheetDark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;screen, projection&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;theme-dark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;stylesheetLight&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;screen, projection&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;stylesheetDark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;not all&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;theme&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;getTheme&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;switchTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;themeSelector&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&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;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;button#theme-switcher&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;themeSelector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;click&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;switchTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dark&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;light&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It's shorter and more to the point, but also coupled to this particular site's
markup, which means it'll need some editing to be useful elsewhere.&lt;/p&gt;
&lt;p&gt;It's also taking care of some specialized logic (switching the styles for syntax
highlighting) which many sites probably won't need, which is what prompted me
to add a callback option to the reusable version.&lt;/p&gt;
&lt;p&gt;Adding an option to switch between setting a class or an attribute could be nice,
but hey. Maybe I'll do that at some point, but that's good enough for now.&lt;/p&gt;
&lt;a href="#not-a-bug"&gt;&lt;h2 id="not-a-bug"&gt;The bug that wasn't a bug&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;As I dug into the debug toolbar code, I spotted what I took to be a minor bug,
and dilligently opened an issue about it. Turns out it's
&lt;a href="https://github.com/django-commons/django-debug-toolbar/issues/2147" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;not a bug&lt;/a&gt;,
and I learned something in the process. Sweet!&lt;/p&gt;
&lt;p&gt;In short, they're offering &lt;em&gt;three&lt;/em&gt; options: light, dark, and auto, the last one
being mapped to the user's system's preferences, which can change between two
visits.&lt;/p&gt;
&lt;p&gt;The issue is that toggle buttons with more than two states feel weird to use, and
in this case you end up with one out of three clicks effectively doing nothing.&lt;/p&gt;
&lt;p&gt;Having the third option is the right thing to do from an usability standpoint,
but the UI for it should probably be a dropdown list (or a simple bunch of dumb
links I guess). This can be harder to integrate within a broader design, though.&lt;/p&gt;
&lt;p&gt;If you read my code, you'll have noticed that I kept only two states. This barely
changes the logic (adding a third one would only involve modifying a couple of
lines), but I don't want to bother implementing a nice dropdown. I think ignoring
the user's potential changes in preferences isn't too bad for a simple
website, so I'll keep things nice and simple.&lt;/p&gt;
&lt;p&gt;Still, I'll have to at least think about this on future projects, and my snippet
might turn out not so great for the ones that &lt;em&gt;should&lt;/em&gt; include the "System Settings"
option. If I ever write a doc for it, it will need to start with this disclaimer.&lt;/p&gt;
&lt;p&gt;My &lt;a href="https://www.rgaz.fr/blog/hello-world/" rel="noopener" target="_blank"&gt;first real article&lt;/a&gt; was an attempt at demonstrating
how designing a good interface requires a lot more thought than simply going for
maximum bling. This whole thing is a nice reminder of this.&lt;/p&gt;
&lt;a href="#javascript-apocalypse"&gt;&lt;h2 id="javascript-apocalypse"&gt;Javascript Apocalypse&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;For a self proclaimed back-end dev, I seem to be posting a lot of javascript on
here. Part of the reason why is that this site being static, I don't &lt;em&gt;have&lt;/em&gt; a
backend when I'm fooling around with it.&lt;/p&gt;
&lt;p&gt;I have this weird love / hate relationship with javascript. The language's quirks
often drives me crazy and I'm appalled at how it seems to have conquered the
whole world&lt;sup id="fnref:js-ai"&gt;&lt;a class="footnote-ref" href="#fn:js-ai"&gt;5&lt;/a&gt;&lt;/sup&gt;, but somehow working with it tends to feels &lt;em&gt;nice&lt;/em&gt;. I don't
know why, but I just enjoy it. I'm strangely fascinated by prototypal inheritance,
even though I've barely  used it, and I love the language's
&lt;a href="https://www.ample.co/blog/javascript-history" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;history&lt;/a&gt;, too. Even its &lt;em&gt;name&lt;/em&gt; doesn't make
sense.&lt;sup id="fnref:marketting"&gt;&lt;a class="footnote-ref" href="#fn:marketting"&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Also, you can do shit like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;switcher&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&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;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;button#theme-switcher&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// I tried a few different values and chose that one for maximum annoyance.&lt;/span&gt;
&lt;span class="c1"&gt;// Don&amp;#39;t ever tell me I don&amp;#39;t suffer for my art.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;delay&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;150&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;epilectic_jamboree&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;switcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;epilectic_jamboree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;epilectic_jamboree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I almost put a prank link to activate this on this page. Oh, you know what would
be even worse ? Choosing a random link on each page load and pointing it to this
abomination. Now &lt;em&gt;that&lt;/em&gt; would be pure evil. Pray that I never get bored or pissed
enough to do it.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Allright, so between getting sidetracked with this whole js thing, reading
up on UX and writing this article, all I have to show for yesterday's work is a
mostly blank html page. Which can switch colors, I guess.&lt;/p&gt;
&lt;p&gt;I hope my boss won't mind.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:djdbt"&gt;
&lt;p&gt;One of the first things I install whenever I start anything with django. I
barely ever look at it but it's invaluable to have it set up when &lt;em&gt;something&lt;/em&gt;
inevitably goes wrong.&amp;#160;&lt;a class="footnote-backref" href="#fnref:djdbt" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:elegant"&gt;
&lt;p&gt;Using modulo to cycle through list indices
(ie: &lt;code&gt;themeList[(index + 1) % themeList.length]&lt;/code&gt;) is one of those simple
tricks I wish I thought about more often.&amp;#160;&lt;a class="footnote-backref" href="#fnref:elegant" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:outdated-best-practices"&gt;
&lt;p&gt;&lt;a href="https://blog.mgechev.com/2012/08/29/self-invoking-functions-in-javascript-or-immediately-invoked-function-expression/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Self-calling anonymous functions&lt;/a&gt;,
yay \o/ I remember how weird those felt when I first saw them.&amp;#160;&lt;a class="footnote-backref" href="#fnref:outdated-best-practices" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:docs"&gt;
&lt;p&gt;I guess adding &lt;em&gt;some&lt;/em&gt; docs would still be a good idea, tho.&amp;#160;&lt;a class="footnote-backref" href="#fnref:docs" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:js-ai"&gt;
&lt;p&gt;If some general AI ever takes over the world, chances are it will run on
javascript. This fact is both reassuring and terrifying.&amp;#160;&lt;a class="footnote-backref" href="#fnref:js-ai" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:marketting"&gt;
&lt;p&gt;As usual, marketting ruins everything.&amp;#160;&lt;a class="footnote-backref" href="#fnref:marketting" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="bits"/></entry><entry><title>Happy Pony</title><link href="https://www.rgaz.fr/blog/happy-pony/" rel="alternate"/><published>2025-07-15T20:00:00+02:00</published><updated>2025-07-15T20:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-07-15:/blog/happy-pony/</id><summary type="html">&lt;p&gt;My two cents on the django web framework, which just celebrated its
20th birthday.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Apparently, &lt;a href="https://www.djangoproject.com/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Django&lt;/a&gt; turned 20 &lt;a href="https://www.djangoproject.com/weblog/2025/jul/13/happy-20th-birthday-django/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;two days ago&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I've worked with the framework professionally for about five years&lt;sup id="fnref:5-years"&gt;&lt;a class="footnote-ref" href="#fn:5-years"&gt;1&lt;/a&gt;&lt;/sup&gt;,
and kept using it occasionally since I quit my job. Two weeks ago, I started
fooling again with it on something slightly less trivial&lt;sup id="fnref:nothing-fancy"&gt;&lt;a class="footnote-ref" href="#fn:nothing-fancy"&gt;2&lt;/a&gt;&lt;/sup&gt; than
the minimalist sites or tools I've been hacking on for the last few years.&lt;/p&gt;
&lt;p&gt;Being busy with this side project and a few other things, I stopped posting
on here, so in order not to lose the writing habit I've been trying to build,
I figure joining in the celebration is as good a topic as any.&lt;/p&gt;
&lt;p&gt;Long story short: it's still awesome.&lt;/p&gt;
&lt;h1 id="catching-up-with-an-old-friend"&gt;Catching up with an old friend&lt;/h1&gt;
&lt;p&gt;As I just said, I didn't really use the framework seriously for a little over
5 years. And I was amazed at how little the general experience has changed.&lt;/p&gt;
&lt;p&gt;I expected to spend way more time re-learning things I had forgotten, and while
I did have to look up a bunch of things, those were mostly minor details like
import paths or parameter names, which were trivial to check&lt;sup id="fnref:docs"&gt;&lt;a class="footnote-ref" href="#fn:docs"&gt;3&lt;/a&gt;&lt;/sup&gt;. The overall
structure felt just as intuitive as it did when I spent my days with it.&lt;/p&gt;
&lt;p&gt;It's hard to tell how much of this comes from ingrained habits, but I think it
does speak to the quality of the &lt;abbr title="Application Programming Interface"&gt;API&lt;/abbr&gt;. Just like UI, a good &lt;abbr title="Application Programming Interface"&gt;API&lt;/abbr&gt; should stay out
your way. You might need to spend some time to learn it, but once you know it,
you barely notice it anymore.&lt;/p&gt;
&lt;p&gt;Also, no matter how good the docs are, sometimes it's quicker to just check
the source, which I did a few times over the last weeks. I've had to dig into
some library code to understand what was going on many times, and django's source
is easily one of the cleanest codebases I ever explored&lt;sup id="fnref:python-readability"&gt;&lt;a class="footnote-ref" href="#fn:python-readability"&gt;4&lt;/a&gt;&lt;/sup&gt;.
I learned a lot from it back in the day, and it's still a joy to read.&lt;/p&gt;
&lt;h1 id="right-tool-for-the-job"&gt;The right tool for the job&lt;/h1&gt;
&lt;p&gt;While I wouldn't call it bloated, django can feel overkill for some things. I've
been meaning to adopt a more minimal approach for most of my computing, which
is why this blog runs on pelican.&lt;/p&gt;
&lt;p&gt;But if I have to deal with a database, then fuck it. Knowing I can generate an
admin interface with a couple lines of configuration has spoiled me. Hell, I'll
throw together a few models and run the admin locally rather than use a
spreadsheet. People call me crazy when I tell them this, and they're probably
right. But I haven't used a spreadsheet since high school and doing things this
way is actually &lt;em&gt;less&lt;/em&gt; work than learning how those work again. With a nicer
interface to boot.&lt;/p&gt;
&lt;p&gt;I'm still half looking for an excuse to use some intermediate framework like
&lt;a href="https://github.com/pallets/flask/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;flask&lt;/a&gt; or &lt;a href="https://github.com/bottlepy/bottle" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;bottle&lt;/a&gt;. But for the tool I'm building, I knew right
away django was the perfect fit.&lt;sup id="fnref:frontend"&gt;&lt;a class="footnote-ref" href="#fn:frontend"&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h1 id="the-long-road"&gt;The long road&lt;/h1&gt;
&lt;p&gt;In the world of web dev, 20 years ago is prehistory.&lt;/p&gt;
&lt;p&gt;Django was already stable and had been for a while when I first learned it back
in 2013. You know, back when code was written on clay tablets and the cloud belonged
to pterodactyls.&lt;/p&gt;
&lt;p&gt;In an industry so obsessed with chasing the latest trends, the fact that it is
still relevant is frankly refreshing. I don't follow the news much anymore, but
from what I've gathered, the framework is still popular, but seems to stay out
of the hype cycle. It's old tech by now, just as reliable as it's always been,
quietly evolving without making a fuss about it.&lt;/p&gt;
&lt;p&gt;I'll take this over shiny new crap any day. Here's to hoping this old workhorse
will still be around in 2045.&lt;/p&gt;
&lt;h1 id="shoud-you-use-django"&gt;Should you use Django ?&lt;/h1&gt;
&lt;p&gt;I dunno. Use what you want. I don't care.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The django (sadly) unoficial logo, which is a pony" loading="lazy" src="https://www.rgaz.fr/img/happy_pony/django-pony.png"&gt;&lt;/p&gt;
&lt;p&gt;But if you do, you'll get a pony.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:5-years"&gt;
&lt;p&gt;From early 2014 to late 2019.&amp;#160;&lt;a class="footnote-backref" href="#fnref:5-years" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:nothing-fancy"&gt;
&lt;p&gt;It's just a pretty simple &lt;a href="https://en.wikipedia.org/wiki/Create,_read,_update_and_delete" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;CRUD&lt;/a&gt;
  app, nothing fancy or complex, but it's still closer to a "real" website than
  a quasi-static site with a single db table.&amp;#160;&lt;a class="footnote-backref" href="#fnref:nothing-fancy" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:docs"&gt;
&lt;p&gt;I remembered the documentation being pretty good. It still is.&amp;#160;&lt;a class="footnote-backref" href="#fnref:docs" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:python-readability"&gt;
&lt;p&gt;Python helps a lot with this, and definitely deserves some of the credits. But
  still. Most of the python code I've read was pretty clean, but not as clean as
  this.&amp;#160;&lt;a class="footnote-backref" href="#fnref:python-readability" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:frontend"&gt;
&lt;p&gt;In fact, it could have been another quick admin job and finished in a day. I
  decided to build a nicer frontend for it and use this as an excuse to learn
  more about &lt;a href="https://htmx.org/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;htmx&lt;/a&gt;. And got distracted fooling with fun stuff
  I don't really need along the way.&amp;#160;&lt;a class="footnote-backref" href="#fnref:frontend" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="tech"/></entry><entry><title>Markdown + Lilypond = ?</title><link href="https://www.rgaz.fr/blog/markdown-lilypond/" rel="alternate"/><published>2025-07-22T22:00:00+02:00</published><updated>2025-07-22T22:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-07-22:/blog/markdown-lilypond/</id><summary type="html">&lt;p&gt;Spending an afternoon building a simple tool that may or may not prove
useful in the near or far future.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've heard of &lt;a href="https://lilypond.org/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;lilypond&lt;/a&gt;&lt;sup id="fnref:hi-flo"&gt;&lt;a class="footnote-ref" href="#fn:hi-flo"&gt;1&lt;/a&gt;&lt;/sup&gt; for a while now and never gave it
much more than a passing look. It seemed pretty cool, but I just never really had
a need for it (I barely interact with sheet music, much less publish any).&lt;/p&gt;
&lt;p&gt;Thinking it could get handy if I ever write &lt;a href="https://www.rgaz.fr/blog/so-you-wanna-get-into-bluegrass-lead-guitar/" rel="noopener" target="_blank"&gt;another&lt;/a&gt; music article
which involve writing down some tab&lt;sup id="fnref:code-blocks"&gt;&lt;a class="footnote-ref" href="#fn:code-blocks"&gt;2&lt;/a&gt;&lt;/sup&gt;, I started to think now might
be the time to finally look into it.&lt;/p&gt;
&lt;p&gt;A reasonable workflow would be to simply use lilypond to generate the tablature /
sheet music I want as an image and include that in the article, but I'd rather
be able to type the source right in my markdown post and have it generate the
image on the fly. I'm lazy, and switching gears annoys me fast (I'm slowly getting
used to taking the time to resize regular images before I publish something, but
I still loathe it). I don't want to add another step to my workflow, especially
not for something I might want to edit as I go.&lt;/p&gt;
&lt;p&gt;I started to look for a markdown extension that could let me integrate it with
pelican, and was suprised to find very little&lt;sup id="fnref:awful-search"&gt;&lt;a class="footnote-ref" href="#fn:awful-search"&gt;3&lt;/a&gt;&lt;/sup&gt;. I found some stuff
to &lt;em&gt;highlight&lt;/em&gt; lilypond code, which is not what I want (although ironically it
would be handy for this very post), and found &lt;a href="https://pianomanfrazier.com/post/lilypond-in-markdown/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;an article&lt;/a&gt; about doing
something similar, but with different tools.&lt;/p&gt;
&lt;p&gt;So I thought, how hard can it be to just write this myself ?&lt;/p&gt;
&lt;p&gt;So here we go. I can type this (most of it is straight from the lilypond
&lt;a href="https://lilypond.org/doc/v2.25/Documentation/notation/default-tablatures" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;docs&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;!!!
\paper {
    page-breaking = #ly:one-page-breaking
    make-footer=##f
}

upper = \relative c&amp;#39; {
  \time 12/8
  \key e \minor
  \voiceOne
  r4. r8 e, fis g16 b g e e&amp;#39; b c b a g fis e
}

lower = \relative c {
  \key e \minor
  \voiceTwo
  r16 e d c b a g4 fis8 e fis g a b c
}

\score {
  &amp;lt;&amp;lt;
    \new StaffGroup = &amp;quot;tab with traditional&amp;quot; &amp;lt;&amp;lt;
      \new Staff = &amp;quot;guitar traditional&amp;quot; &amp;lt;&amp;lt;
        \clef &amp;quot;treble_8&amp;quot;
        \new Voice = &amp;quot;upper&amp;quot; \upper
        \new Voice = &amp;quot;lower&amp;quot; \lower
      &amp;gt;&amp;gt;
      \new TabStaff = &amp;quot;guitar tab&amp;quot; &amp;lt;&amp;lt;
        \new TabVoice = &amp;quot;upper&amp;quot; \upper
        \new TabVoice = &amp;quot;lower&amp;quot; \lower
      &amp;gt;&amp;gt;
    &amp;gt;&amp;gt;
  &amp;gt;&amp;gt;
}
!!!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And get this on the generated page:&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/markypond_demo/demo1.svg" /&gt;&lt;/p&gt;
&lt;p&gt;So hurray, it works.&lt;/p&gt;
&lt;p&gt;It's far from done, though. I'll probably throw the code on github when it is, but
right now it's an awful mess, so I'll keep it to myself until I clean things up.&lt;/p&gt;
&lt;a href="#shenanigans"&gt;&lt;h2 id="shenanigans"&gt;Shenanigans&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;The overall process was pretty straightforwerd, but I got some troubles with
python's &lt;code&gt;ElementTree&lt;/code&gt; library (which I use to parse the generated svg code
and insert it in the page html) which made a mess because of the way it handles
XML namespaces.&lt;/p&gt;
&lt;p&gt;I barely know anything about those, and was &lt;em&gt;not&lt;/em&gt; interested in the slightest
in learning more about them. I wasted a couple hours on this, and came up with
several solutions (including skipping messing with the XML tree altogether and
just spit out the raw source), but I'm still not sure which one I actually want.&lt;/p&gt;
&lt;p&gt;This pissed me off enough to stop here for today, though, so I'll look into that
later.&lt;/p&gt;
&lt;p&gt;Integrating with lilypond was dead easy, though.&lt;sup id="fnref:integrating"&gt;&lt;a class="footnote-ref" href="#fn:integrating"&gt;4&lt;/a&gt;&lt;/sup&gt; I kinda wish it
could write its output to stdout, which mould save me from writing a temporary
file, but hey, that's not too bad.&lt;/p&gt;
&lt;a href="#roadmap-to-01"&gt;&lt;h2 id="roadmap-to-01"&gt;Roadmap to 0.1&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;As I said, there's quite a bit left to do for this to be more than a quick hack
and turn into something potentially useful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cleanup the code and decide how I want to handle the xml shenanigans I mentioned
  above.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Decide on a sane syntax for the markdown blocks that will contain the lilypond
  source. &lt;br&gt;
  I've used simple &lt;code&gt;!!!&lt;/code&gt; delimiters from the markdown docs exemple, but this is
  bound to conflict with something else. This shouldn't be too hard, but better
  to think a bit and be reasonably certain I don't pick something that might already
  be taken by something else.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Which output format should I use ?&lt;br&gt;
  Right now I'm generating svg, but png could be just as nice. I don't know.
  Making this a config option seems easy enough, but I can already see some of
  the complexity handling several formats will cause. And whatever I can see
  right now is probably just the tip of the iceberg.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What to do with the generated file ?&lt;br&gt;
  Due to the way lilypond works, I have to dump its output in a temporary file
  which I then read to stick its content straigth in an &lt;code&gt;img&lt;/code&gt; tag's source
  attribute. I could see keeping the file around being handy though, especially
  if switching to png. But then, how do I know what to name the generated file
  and where to save it ? What if I'm using this several times on one page ? This
  will probably require some way to pass options right from the markdown block,
  and involve parsing those.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lilypond (or maybe this is just the regular svg format ? I barely know anything
  about that one either) seems to include some color information, which is nice,
  but breaks when I switch the color theme. I added a quick css hack to handle
  this for now, but I'll have to see if we can get rid of this information (png
  file should not have this problem, though).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Right now I'm having to include a directive to tell lilypond not to output
  a full page&lt;sup id="fnref:paper-directive"&gt;&lt;a class="footnote-ref" href="#fn:paper-directive"&gt;5&lt;/a&gt;&lt;/sup&gt;, which it does by default. This is annoying, as
  I'm probably gonna use this for short snippets and I'm likely to forget the syntax,
  so I'm tempted to insert this directive automatically. This may not be what a
  potential user expects, though, so do I add another option for this ? And if
  I do, how do I handle cases were several pages are generated ?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I'm already noticing pelican is being slower at generating the blog. I should
  cache the output and avoid regenerating the whole thing when the source hasn't
  changed since the last time. &lt;br&gt;
  This seems like the easiest issue to handle right now, so that's probably the
  first one I'll do.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most of those points aren't really technical, but rather part of the overall
tool's design. Designing a good &lt;abbr title="Application Programming Interface"&gt;API&lt;/abbr&gt; is hard enough to begin with, but it's even
worse when dealing with stuff I'm not really used to, and &lt;em&gt;even more&lt;/em&gt; when I'm not
even sure what I want yet. This is making me lean quite hard on the "keep things as
simple as possible" approach. So this extension is probably &lt;em&gt;not&lt;/em&gt; gonna be very
configurable for a while.&lt;/p&gt;
&lt;a href="#first-impressions-on-lilypond"&gt;&lt;h2 id="first-impressions-on-lilypond"&gt;First impressions on Lilypond&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Honestly ? I don't know. I barely looked at the source I used to test the code.
My thinking is to make sure the general idea works, and learn to use it later.&lt;/p&gt;
&lt;p&gt;It seems pretty complete, though. Maybe too complete for what I need. But hey,
I figure learning the basics can't hurt. I can always ditch it if I find some
simpler tool.&lt;/p&gt;
&lt;a href="#a-quick-digression-about-markdown-extensions"&gt;&lt;h2 id="a-quick-digression-about-markdown-extensions"&gt;A quick digression about Markdown extensions&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;For some reason I've been enjoying writing markdown extensions quite a bit
over the last two weeks. So far I did:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;An extension to generate a link to a django model, using its &lt;code&gt;get_absolute_url&lt;/code&gt;.
  It's cute and was fun to do, but I predict I won't have any real use for it.
  Oh well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another one to generate an &lt;code&gt;hx-ref&lt;/code&gt; attribute on all links. Dead simple and
  useful if dealing with htmx.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yet another one to automatically add some atributes to HTML elements. This one
  is on &lt;a href="https://github.com/raphigaziano/markdown-auto-attrs" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;github&lt;/a&gt;, and I'm using it on this blog to autoamtically
  add a &lt;code&gt;loading="true"&lt;/code&gt; attribute to all images.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I'm thinking of another one to auto generate a slugified title for headings.
  Addding those manually is exactly the kind of tedious crap I'd rather avoid.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And now this lilypond thing.&lt;/p&gt;
&lt;p&gt;I don't know why, but something about parsing fascinates me. I barely get to
insert some code in the middle of the general tree processing here, but I dunno,
this feels nice to do. It's easy, but it makes me feel like I understand &lt;em&gt;something&lt;/em&gt;
about how languages work.&lt;/p&gt;
&lt;p&gt;The python-markdown's &lt;abbr title="Application Programming Interface"&gt;API&lt;/abbr&gt; to write extensions is pretty simple, too, so that's
nice.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Alright, off to go grab a drink now. I'll make an effort to clean up the code
tomorow, but after that I'll probably try and use the damn thing and learn more
about lilypond before I get any further. I'll post another article if this thing
gets nice enough to share.&lt;/p&gt;
&lt;p&gt;So long, interwebs!&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/markypond_demo/demo2.svg" /&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:hi-flo"&gt;
&lt;p&gt;Hi, Flo!&amp;#160;&lt;a class="footnote-backref" href="#fnref:hi-flo" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:code-blocks"&gt;
&lt;p&gt;I got away in that one with using simple code blocks and writing the tabs in
  raw ASCII, but this could get unwieldy and hard to read for anything more
  complex.&amp;#160;&lt;a class="footnote-backref" href="#fnref:code-blocks" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:awful-search"&gt;
&lt;p&gt;This might be due to just how awful search engines have become... I'll spare
  you the rant about trying to find &lt;em&gt;some&lt;/em&gt; technical info on pretty basic problems,
  which I run into every other day.&amp;#160;&lt;a class="footnote-backref" href="#fnref:awful-search" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:integrating"&gt;
&lt;p&gt;"Integrating" is kind of a big word here. I'm just calling the &lt;abbr title="Command Line Interface"&gt;CLI&lt;/abbr&gt; tool as a
  subprocess with the right options.&amp;#160;&lt;a class="footnote-backref" href="#fnref:integrating" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:paper-directive"&gt;
&lt;p&gt;The &lt;code&gt;\paper&lt;/code&gt; lines in the exemple source above.&amp;#160;&lt;a class="footnote-backref" href="#fnref:paper-directive" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="bits"/></entry><entry><title>MarkyPond out on Github</title><link href="https://www.rgaz.fr/blog/markypond-out-on-github/" rel="alternate"/><published>2025-07-24T19:30:00+02:00</published><updated>2025-07-24T19:30:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-07-24:/blog/markypond-out-on-github/</id><summary type="html">&lt;p&gt;MarkyPond extension is now on Github.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kept hacking on my &lt;a href="https://www.rgaz.fr/blog/markdown-lilypond/" rel="noopener" target="_blank"&gt;lilypond markdown extension&lt;/a&gt; which is now out
on &lt;a href="https://github.com/raphigaziano/markypond" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I called it MarkyPond, as it sounds kinda cool, doesn't seem to be already taken,
and evokes both markdown and Marky Ramones.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Marky Ramones sitting at his drumkit" loading="lazy" src="https://www.rgaz.fr/img/markypond-on/marky-ramones.jpeg" title="Marky pounds. Get it ?"&gt;&lt;/p&gt;
&lt;p&gt;It wasn't &lt;em&gt;hard&lt;/em&gt;, but boy was it tedious.&lt;/p&gt;
&lt;p&gt;Lots of string juggling, which python is pretty good at, but complicated by the
Lilypond command line tool&lt;sup id="fnref:lily-extensions"&gt;&lt;a class="footnote-ref" href="#fn:lily-extensions"&gt;1&lt;/a&gt;&lt;/sup&gt;. Painful refactoring due to a brittle
test suite (because of a mix of me trying to be too clever and mocking being such
a &lt;abbr title="Pain In The Butt"&gt;PITB&lt;/abbr&gt;).&lt;/p&gt;
&lt;p&gt;I'm not too happy with the code quality, but hey, it's done, and it does what I
want it to.&lt;/p&gt;
&lt;p&gt;It now supports outputting png:&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/release_demo/ex.png" /&gt;&lt;/p&gt;
&lt;p&gt;svg (as before):&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/release_demo/ex.svg" /&gt;&lt;/p&gt;
&lt;p&gt;And pdf:&lt;/p&gt;
&lt;p&gt;&lt;a class="lilypond-link" href="/img/lilypond/release_demo/ex.pdf"&gt;I may need to re-think the html integration on that one.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hmm. I can already see I'll probably need to copy some information in each block,
which will become a pain quickly. Glancing at the lilypond docs, I saw things that
looked like you can include other files, so I'll probably have to add some option
to handle this.&lt;/p&gt;
&lt;p&gt;But not now. I need to use the damn thing before I start adding stuff that tries
to be helpful but creates more of a mess.&lt;/p&gt;
&lt;p&gt;Along the same idea, I won't bother supporting more output formats for now. I
don't even remember which ones lilypond handles. Some of them might be easy enough
to add, but again, if I start messing with it before knowing more about the way
it all actually works I'll just end up with chaos.&lt;/p&gt;
&lt;a href="#fun-with-caching"&gt;&lt;h2 id="fun-with-caching"&gt;Fun with caching&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;I mentionned in the &lt;a href="https://www.rgaz.fr/blog/markdown-lilypond/" rel="noopener" target="_blank"&gt;previous article&lt;/a&gt; that the processing was too
slow. I solved that by generating a &lt;a href="https://en.wikipedia.org/wiki/MD5" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;MD5&lt;/a&gt; hash of the lilypond source&lt;sup id="fnref:md5"&gt;&lt;a class="footnote-ref" href="#fn:md5"&gt;2&lt;/a&gt;&lt;/sup&gt;,
which I then use as the generated file name. Then, it's a simple matter of checking
if that file already exists before generating a new one.&lt;/p&gt;
&lt;p&gt;With this, the time pelican takes to regenerate the whole site went from almost
2 seconds (for only two, one bar long each exemples!) back to about 0.3 second.&lt;/p&gt;
&lt;p&gt;I end up with ugly file names like &lt;code&gt;502a317d29de43443f02f6372e4dd430.png&lt;/code&gt;, but
I don't care, as I'm only using the file for a link. I can see how it could not
fit some other use case, but again, I'd rather keep this suited to my immediate
needs for now and I'll need to know more before I try to solve problems I don't
have yet, so I was quite ready to just call it a day.&lt;/p&gt;
&lt;p&gt;But then I realized that this would lead to a proliferation of unused files as I
keep editing the lilypond source of an article. With each change, the hash changes
as well, and a new file is created, with no simple way to know the previous name
(so I can't just automagically delete it).&lt;/p&gt;
&lt;p&gt;So after a dozen edits, you end up with eleven useless files and have to check
the final name to know which ones you have to delete. And also be careful not
to delete any file that was used for another article. Great.&lt;/p&gt;
&lt;p&gt;This won't do. I need to find a way to name those files in a sane way.&lt;/p&gt;
&lt;a href="#whats-my-name"&gt;&lt;h2 id="whats-my-name"&gt;What's my name ?&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;The trouble with naming the files is that I can't automate it. I could think of
some
scheme to generate a default name for each one, but once I'm called by the
markdown parser, I get exactly &lt;em&gt;zero&lt;/em&gt; information about the current file being
processed&lt;sup id="fnref:pelican-metadata"&gt;&lt;a class="footnote-ref" href="#fn:pelican-metadata"&gt;3&lt;/a&gt;&lt;/sup&gt;. I couldn't even find information about the html
document. The only thing I get access to is the node that will contain the
block I'm generating (which doesn't seem to provide access to its parents).&lt;/p&gt;
&lt;p&gt;Maybe I'm missing something, but for now, I'm kinda screwed.&lt;/p&gt;
&lt;p&gt;So no way around it, I have to add a way to pass arguments to the markdown block
itself.&lt;/p&gt;
&lt;p&gt;Again, this is not really hard to do, but it's pretty tedious and requires more
testing. And hey, now that I had to do it anyway, might as well go ahead and
add a few more arguments to override the extensions's basic configuration.&lt;/p&gt;
&lt;p&gt;So that's what I did. And now the syntax looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;{markypond output_file=&amp;#39;/subfolder/lol.pdf&amp;#39; output_fmt=&amp;#39;pdf&amp;#39;}
mynotes = {
  g,2 g\4 | des1
}

&amp;lt;&amp;lt;
  \new Staff {
    \clef &amp;quot;G_8&amp;quot;
    \omit StringNumber
    \mynotes
  }
  \new TabStaff {
    \mynotes
  }
&amp;gt;&amp;gt;
{/markydown}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;So. That's done, I guess.&lt;/p&gt;
&lt;p&gt;This was an enjoyable hacking mini project, but tidying things up, writing tests
and documenting the whole thing&lt;sup id="fnref:docs"&gt;&lt;a class="footnote-ref" href="#fn:docs"&gt;4&lt;/a&gt;&lt;/sup&gt; took a while and sucked most of the fun
out of it, and I'm getting a bit sick of coding right now.&lt;/p&gt;
&lt;p&gt;Which is good, as it means the next article won't be yet another piece of tech
wank. I'll try and use the damn thing a few times and we'll see if I come back
to it when I know what I'm doing.&lt;/p&gt;
&lt;p&gt;See ya!&lt;/p&gt;
&lt;a href="#post-scriptum"&gt;&lt;h2 id="post-scriptum"&gt;Post Scriptum:&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;So I wanted to add a subtle tip of the hat to &lt;a href="https://news.sky.com/story/ozzy-osbourne-dies-just-weeks-after-farewell-show-13400248" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Ozzy Osbourne&lt;/a&gt; by adding
titles to the generated images. Which doens't work. Great. One more thing to
debug.&lt;/p&gt;
&lt;p&gt;So here's a funny picture instead, subtility be damned.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The late Ozzy Osbourne, smoking and drinking while sitting on a toilet. With his pants down, od course." loading="lazy" src="https://www.rgaz.fr/img/markypond-on/ozzy.webp"&gt;&lt;/p&gt;
&lt;p&gt;RIP Ozzy.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:lily-extensions"&gt;
&lt;p&gt;The tool "helpfully" adds the extensions to the files it spits out. So I had
  to remove it from the argument I get before calling it and add it back
  afterwards. Nothing crazy, but annoying all the same.&amp;#160;&lt;a class="footnote-backref" href="#fnref:lily-extensions" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:md5"&gt;
&lt;p&gt;I saw it done in an &lt;a href="https://pianomanfrazier.com/post/lilypond-in-markdown/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;article&lt;/a&gt;
  I read when researching the initial idea, so it felt obvious once it became
  needed. Not sure if I would had thought of it otherwise.&amp;#160;&lt;a class="footnote-backref" href="#fnref:md5" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:pelican-metadata"&gt;
&lt;p&gt;Pelican does pass the article metadata to the parser, so I could use that. But
  then this extension would &lt;em&gt;only&lt;/em&gt; work with Pelican.&amp;#160;&lt;a class="footnote-backref" href="#fnref:pelican-metadata" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:docs"&gt;
&lt;p&gt;The doc is pretty terrible right now, but hey, at least the info's out there.&amp;#160;&lt;a class="footnote-backref" href="#fnref:docs" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="bits"/></entry><entry><title>Don't post when you're pissed</title><link href="https://www.rgaz.fr/blog/dont-post-when-youre-pissed/" rel="alternate"/><published>2025-07-25T23:00:00+02:00</published><updated>2025-07-25T23:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-07-25:/blog/dont-post-when-youre-pissed/</id><summary type="html">&lt;p&gt;AKA know when it's time to stop everything and go get a drink.&lt;/p&gt;</summary><content type="html">&lt;p&gt;So yesterday I published an article about &lt;a href="https://github.com/raphigaziano/markyond#" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;a markdown extension&lt;/a&gt; I'm
fooling with.&lt;/p&gt;
&lt;p&gt;I mentionned how tedious tidying things up was, and I was honestly getting sick
of the whole thing.&lt;/p&gt;
&lt;p&gt;Coding is solving problem after problem. About half of those problems turn out
to be pretty fun.&lt;sup id="fnref:fun"&gt;&lt;a class="footnote-ref" href="#fn:fun"&gt;1&lt;/a&gt;&lt;/sup&gt; Some of them might drive you crazy for a while, but the
feeling you get when you finally get it makes you look back on the whole ordeal
with a sense of understanding and accomplishment that I truly enjoy.&lt;/p&gt;
&lt;p&gt;The other half consist of tedious and annoying crap you don't care about mixed
with random things that break because everything is a mess and computers are so
dumb.&lt;/p&gt;
&lt;p&gt;What I'm getting at is that there's a point when you should just stop for the
day if you don't want to turn postal.&lt;/p&gt;
&lt;p&gt;I didn't though. The thing was so close to done, and I feared letting it get out
of my head. If I stop now, I'll have forgotten half of what I still have to do
by tomorow and finishing this will be even more of a pain, I thought.&lt;/p&gt;
&lt;p&gt;So I pushed through. Publishing a first, half decent draft on github and writing
an article about it would feel like a milestone, and would allow me to move on
to something else, clear my mind, while still feeling like I had done &lt;em&gt;something&lt;/em&gt;
of the last few days.&lt;/p&gt;
&lt;p&gt;As I got started on the article, I had to deal with a whole new bunch of tedious
little things. Looking for images, resizing / compressing them, getting the
source for various links, proofreading... Nothing too bad, but I was already
fried for the day, and I was getting more and more pissed as I took care of
them.&lt;/p&gt;
&lt;p&gt;And then as I was almost done, I tried to add a title to one of the generated
images, thinking it should just work. It didn't, and the whole thing broke down.&lt;/p&gt;
&lt;p&gt;I took a quick glance at the code and saw that I wasn't gonna be able to fix it
right away, so I changed my plans and pushed the whole thing out, and immediatly
went out for a couple of pints.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Woke up this morning and after getting annoyed at Microsoft&lt;sup id="fnref:fuck-you-microsoft"&gt;&lt;a class="footnote-ref" href="#fn:fuck-you-microsoft"&gt;2&lt;/a&gt;&lt;/sup&gt;,
I took a quick look at what was broken, and saw what was causing the problem.
No idea about how to fix it, though. I had some things to do that morning, so I
went out and did them.&lt;/p&gt;
&lt;p&gt;When I got back home I looked at the code again, re-read some docs and realized I
had misunderstood a concept from the markdown library and used the wrong tool for
what I wanted to do. I dreaded refactoring the whole thing, but got started
tweaking a few things to see what would happen.&lt;/p&gt;
&lt;p&gt;A couple of hours later it was all done. The test suite that was driving me
insane the day before caught every little error I forgot to check. The new
structure was simpler and cleaner, which allowed me to spot things I could
further simplify, so I did that.&lt;/p&gt;
&lt;p&gt;I tried the title thing I wanted to do on the previous article. It worked
seamlessly.&lt;/p&gt;
&lt;p&gt;That milestone thing I described above wasn't necessarily a bad idea, but man.
Had I waited a single more day, both the code I pushed and the article I wrote
would have ended up so much better.&lt;/p&gt;
&lt;p&gt;I've known how pointless it is to push through something when you're too pissed
or tired to focus anymore for a while now. I've experienced it with coding, music,
and pretty much anything I ever took seriously enough to care. I like to think
I'm able to see it coming and I often manage to catch myself and stop when I
reach that point.&lt;/p&gt;
&lt;p&gt;But then a bad day comes, some random frustrations accumulate enough and I fall
for it like an overzealous rookie. Guess I still need a few lessons to truly get
it.&lt;/p&gt;
&lt;p&gt;Well. Live and learn.&lt;/p&gt;
&lt;p&gt;I'm still gonna avoid writing about overly technical things for a while though.
Those can be fun and interesting, but I'd like to focus on some other things. I
have a few ideas in mind, but I also feel like allowing myself a few random,
casual posts like this one now and then. You know, like on a blog or something.&lt;/p&gt;
&lt;p&gt;Those still get the job done as far as working out the writing muscles, and it's
a nice way to reflect on stuff. Which is the whole point of blogging, right ?&lt;/p&gt;
&lt;p&gt;So long interwebs. Don't post when you're pissed, and touch some grass, as the
younglings say.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:fun"&gt;
&lt;p&gt;It's a special, slightly masochistic version of "fun". But still.&amp;#160;&lt;a class="footnote-backref" href="#fnref:fun" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:fuck-you-microsoft"&gt;
&lt;p&gt;That's another story, though. And no, I'm not running windows.&amp;#160;&lt;a class="footnote-backref" href="#fnref:fuck-you-microsoft" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="general"/></entry><entry><title>Microsoft is stealing my vimrc</title><link href="https://www.rgaz.fr/blog/microsoft-is-stealing-my-vimrc/" rel="alternate"/><published>2025-07-28T22:20:00+02:00</published><updated>2025-07-28T22:20:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-07-28:/blog/microsoft-is-stealing-my-vimrc/</id><summary type="html">&lt;p&gt;Yet another rant about AI crawlers and how they're ruining the web.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;abbr title="Too Long, Didn't Read"&gt;TLDR&lt;/abbr&gt;: Backlash against the AIfication of all the things is good. Legislation
around those issues is sorely needed. But we should be careful not to simply shift
the balance of power among the already powerful. Whoever wins that war won't care
any more about the commons that its predecessor.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;A week or so ago I set up a &lt;a href="https://forgejo.org/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;forgejo&lt;/a&gt;&lt;sup id="fnref:forgejo"&gt;&lt;a class="footnote-ref" href="#fn:forgejo"&gt;1&lt;/a&gt;&lt;/sup&gt; instance to host my git
repositories.&lt;/p&gt;
&lt;p&gt;The main idea was to use it for the few private repos I have and ditch the old
bitbucket account I've been using for those.&lt;sup id="fnref:bitbucket"&gt;&lt;a class="footnote-ref" href="#fn:bitbucket"&gt;2&lt;/a&gt;&lt;/sup&gt; I pondered the idea
of moving all my stuff there and leave Github behind too, but that's trickier.&lt;/p&gt;
&lt;p&gt;It's like social media. &lt;em&gt;Everyone&lt;/em&gt; is on Github, so it's hard to go elsewhere
for code you intend to be public. None of the stuff I have on there is of much
interest, but still, what if someone stumbles upon it and feels like suggesting
a fix or report an issue ? I don't want to open registration and manage random
users on my private instance (nor to force people to create yet another account
if they feel like contributing). But if I'm gonna pass up on the chance to get
  feedback, why even bother opening my source ?&lt;/p&gt;
&lt;p&gt;I know there are cleaner, non-profit, &lt;abbr title="Free and Open Source Software"&gt;FOSS&lt;/abbr&gt; and what-have-you &lt;a href="https://codeberg.org/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;alternatives&lt;/a&gt;
for this. I'll explore them, but in the meantime, I figured I'd just leave the public
things on Github. I can still change my mind about this later on.&lt;/p&gt;
&lt;p&gt;Still, I moved my dotfile&lt;sup id="fnref:dotfiles"&gt;&lt;a class="footnote-ref" href="#fn:dotfiles"&gt;3&lt;/a&gt;&lt;/sup&gt; repo to my new forge because why the hell
not.&lt;/p&gt;
&lt;a href="#spot-the-bot"&gt;&lt;h2 id="spot-the-bot"&gt;Spot the Bot&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;I woke up friday morning, grabbed a cup of coffee and sat at the computer. I had
published my last article on the previous evening, so, wondering if it had gotten
some traffic, I glanced at my logs&lt;sup id="fnref:analytics"&gt;&lt;a class="footnote-ref" href="#fn:analytics"&gt;4&lt;/a&gt;&lt;/sup&gt; and was greeted with this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Server logs, showing an uninterrupted flow of request from the same IP address." loading="lazy" src="https://www.rgaz.fr/img/microsoft-stealing-my-code/logs.png"&gt;&lt;/p&gt;
&lt;p&gt;Some bot was crawling my config files as I watched. I could see each new request
pop up, one every second. I could almost hear it go "Tick, Tick, Tick".&lt;/p&gt;
&lt;p&gt;It was apparently going through the list of issues and pull requests for the
repository... Of which there are none whatsoever. I guess the spider expects a
different arborescence and got stuck in a loop.&lt;/p&gt;
&lt;p&gt;Who the hell would care about this crap ? I looked up the IP and found it was
owned by Microsoft.&lt;/p&gt;
&lt;p&gt;So.&lt;/p&gt;
&lt;p&gt;Microsoft owns Github, which gives them access to most of the open source code
out there, which they use to feed their Copilot AI. Apparently that's not enough
for them, so they go and crawl random forges hosted elsewhere. Sigh.&lt;/p&gt;
&lt;p&gt;I banned the IP and moved on.&lt;sup id="fnref:firewall-docs"&gt;&lt;a class="footnote-ref" href="#fn:firewall-docs"&gt;5&lt;/a&gt;&lt;/sup&gt; Later during the day, I spotted
the bot again, using a different IP (this one was trying to access some
non-public pages and kept being redirected to the login page). I banned it too.&lt;/p&gt;
&lt;p&gt;I'll give this to them: resources wise, one request a second is nothing. I read
about &lt;a href="https://drewdevault.com/2025/03/17/2025-03-17-Stop-externalizing-your-costs-on-me.html" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;LLM crawlers DDoSing small servers&lt;/a&gt;, which is not what's happening
here. So at least they're not burning down this house as they steal the furniture.
I haven't set up a robots.txt for the forgejo site, and I half wonder whether they'd
respect it or not. Given that the IP has been &lt;a href="https://www.abuseipdb.com/check/20.171.207.169" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;reported as abusive&lt;/a&gt;,
I have my doubts. And even if this bot does, many others don't.&lt;/p&gt;
&lt;p&gt;This is a bit depressing.&lt;sup id="fnref:ridiculous"&gt;&lt;a class="footnote-ref" href="#fn:ridiculous"&gt;6&lt;/a&gt;&lt;/sup&gt; These crawlers are the reason why you
can't access any site without having to demonstrate you're not a bot these days.
On top of the adds and cookie banners, it's yet one more of those constant
interuptions that make navigating the web infuriating.&lt;/p&gt;
&lt;p&gt;I'll look into solutions to try and detect those bots and ban them automatically,
but it pisses me off to even have to think about this for such a small website.&lt;/p&gt;
&lt;p&gt;We're not talking about script kiddies or villainous hackers here. Those are
perfectly legal and legitimate businesses that, non-content with having ruined
everything they could on their own land, are now treating the rest of the web as
their data mine. If you enjoyed &lt;a href="https://simple.wikipedia.org/wiki/Technofeudalism" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;technofeodalism&lt;/a&gt;, you'll love
colonization 2.0.&lt;/p&gt;
&lt;a href="#impact-on-self-hosting"&gt;&lt;h2 id="impact-on-self-hosting"&gt;Impact on self hosting&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;My ideal web is one where everyone would self host their stuff, and while I
realize this is probably still unrealistic, real progress is being made on
&lt;a href="https://yunohost.org/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;tools&lt;/a&gt; to allow less-technical people to manage it.&lt;/p&gt;
&lt;p&gt;Dealing with misbehaving crawlers is yet another hurdle that many won't be able
or want to deal with. And automated tools are bound to consume more resources.&lt;/p&gt;
&lt;p&gt;Today, an old machine with 2Gb of RAM is more than enough to host a simple static
site like this one (assuming you're not aiming for millions of daily views, of
course). If everyone suddenly needs to protect themselves from unwanted bot traffic,
the machines will need to get beefier, and recycling your ten years old laptop or
getting a cheap Raspberry PI might not suffice anymore.&lt;/p&gt;
&lt;p&gt;Infrastructure provider Cloudflare is now blocking those crawlers by default and
proposing a &lt;a href="https://www.theverge.com/news/695501/cloudflare-block-ai-crawlers-default" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;pay-per-crawl&lt;/a&gt; fee to remunerate the scraped
sites (assuming you use their service, of course). It sounds like a good idea
on paper, but all I'm seeing is a giant red flag.&lt;/p&gt;
&lt;p&gt;I don't really know anything about Cloudflare, but their &lt;a href="https://en.wikipedia.org/wiki/Cloudflare" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;wikipedia page&lt;/a&gt;
claims they're fronting almost 20% of all websites already. Which is enormous.
Whether or not the current direction can be trusted not to mess with things doesn't
matter at this point: letting one company take up such a central position can
only be bad news.&lt;/p&gt;
&lt;p&gt;They have everything to gain from standing up against the AI bots, and the small
web has everything to lose from relying (ie depending) on them for protection.&lt;/p&gt;
&lt;p&gt;This leaves us self hosters to roll up our own protection, which, again, is an
additional cost and barrier to entry (both monetary and technical). So that sucks.&lt;/p&gt;
&lt;p&gt;I'm no sys admin, so I don't really know what's available. I'll investigates
&lt;abbr title="Web Application Firewall"&gt;WAFs&lt;/abbr&gt; and see if something interesting comes up. &lt;a href="https://anubis.techaro.lol/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Anubis&lt;/a&gt; seems to be
popular and efficient, but I'd really like to avoid anything that affects regular
readers.&lt;sup id="fnref:no-captcha"&gt;&lt;a class="footnote-ref" href="#fn:no-captcha"&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;a href="#copyright-wont-save-us"&gt;&lt;h2 id="copyright-wont-save-us"&gt;Copyright won't save us&lt;/h2&gt;
&lt;/a&gt;&lt;figure&gt;
  &lt;img src="https://www.rgaz.fr/img/microsoft-stealing-my-code/CensorshipVsCopyright1-640x199.png"
       alt="Webcomic. Censorship is silencing you because I don't like what you're saying. Copyright is silencing you because I can make more money that way."
       loading="lazy"&gt;
  &lt;figcaption&gt;
    Source: &lt;a href="https://mimiandeunice.com/2011/06/07/censorship-vs-copyright/"
               target="_blank"&gt;Mimi &amp; Eunice&lt;/a&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;A lot has already been said about the problems those AI crawlers pose regarding
intellectual property. I happen to think that the current copyright system is
an abomination that should be revised from the ground up, and I have little hope
the conversation will even entertain the idea of actually fixing it, so I'm wary
of this line of defense.&lt;/p&gt;
&lt;p&gt;About a month ago, &lt;a href="https://time.com/7293362/disney-universal-midjourney-lawsuit-ai/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Disney and Universal sued Midjourney&lt;/a&gt; over this.
I haven't followed the reactions, but I don't think we should cheer them on.
I certainly don't mind if Midjourney gets knocked down a peg, but seeing those
giant leeches cry over their IP when they already own everything makes me sick.&lt;/p&gt;
&lt;p&gt;They're not out to champion the cause of the smaller creators who actually suffer
from this situation. They're only in it to maximize their own profit, and should
some legislation come out of this, it will only reinforce their own power. Independant
artists might benefit in the short term, but the best they can hope for is
maintaining the status-quo.&lt;/p&gt;
&lt;p&gt;The AI companies' argument that their unsolicited use of material to feed their
machines falls under &lt;a href="https://en.wikipedia.org/wiki/Fair_use" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Fair Use&lt;/a&gt; is bullshit. But Fair Use is still an
important aspect of copyright law, that right owners happily disregard when it
suits them, usually with complete impunity. Weakening it further can't be good
in the long run.&lt;/p&gt;
&lt;p&gt;It's tough. There's no good guy in this story. Even though the system sucks, it
may help prevent or slow down the pillaging of actual, valuable work. But this
system is already used by the bigger players to &lt;a href="https://www.eff.org/deeplinks/2018/01/copyright-first-wave-internet-censorship" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;shut down criticism and enforce censorship&lt;/a&gt;.
As we drift ever closer to an authoritarian dystopia, I'm not sure we stand to
gain from strenghtening property rights even further.&lt;/p&gt;
&lt;p&gt;In the end, it's a battle between giant corporations. Whoever wins will just
take all the spoils. Our interest might align somewhat with Disney's right now,
but let's not fool ourselves into thinking they're fighting on our behalf, and
let them get away with new ways to control ever more media.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Allright. This started as a quick little rant and grew some legs as it went on.
A lot of what I said is based on gut feeling and pre-existing opinions. I don't
think anything's blatantly false, but I haven't truly researched most of my points
and some of them may be a bit hazy. I'd better stop here and keep to first impressions
rather than try to go more in depth and risk making a fool of myself.&lt;/p&gt;
&lt;p&gt;Also, talking about business models, policy and all that grown up crap in English
is definitely not my forte. I hope I managed to get my points accross without
sounding too simplistic.&lt;/p&gt;
&lt;p&gt;At any rate, I found this &lt;a href="https://www.eff.org/deeplinks/2025/06/keeping-web-under-weight-ai-crawlers" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;EFF article&lt;/a&gt; while looking for links that sums
up the whole AI crawlers situation much better than I could.&lt;/p&gt;
&lt;p&gt;So long. I promise the next article won't be about tech.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:forgejo"&gt;
&lt;p&gt;A fork of &lt;a href="https://about.gitea.com/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;gitea&lt;/a&gt; that claims to be
  &lt;a href="https://forgejo.org/compare-to-gitea/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;"more free"&lt;/a&gt; than its upstream.&amp;#160;&lt;a class="footnote-backref" href="#fnref:forgejo" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:bitbucket"&gt;
&lt;p&gt;Private repos used to be a paying feature on Github. Bitbucket had a different
pricing strategy, so I went there for those.&lt;/p&gt;
&lt;p&gt;Ten years later I just get annoyed at managing two different accounts and
I'd rather keep that code to myself anyway.&amp;#160;&lt;a class="footnote-backref" href="#fnref:bitbucket" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:dotfiles"&gt;
&lt;p&gt;Linux systems config files tend to be simple hidden files scattered in your
home directory. Under Unix, hidden files are indicated by a dot prefix to the
file name, like &lt;code&gt;.bashrc&lt;/code&gt;. Hence the "dotfiles" nickname.&lt;/p&gt;
&lt;p&gt;It's common practice to store those in a Git repo so that it's easy to retrieve
when you set up a new machine and keep a log of your changes (useful when you
can't remember why in hell you changed some random bit years after the fact).&amp;#160;&lt;a class="footnote-backref" href="#fnref:dotfiles" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:analytics"&gt;
&lt;p&gt;I haven't setup analytics for this site. Still looking for a simple enough and
self hosted solution, but that's pretty low on my todo list.
So for now, I just look at the server logs when the itch to see what's going
on start scratching.&amp;#160;&lt;a class="footnote-backref" href="#fnref:analytics" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:firewall-docs"&gt;
&lt;p&gt;Ain't no better way to start the day than reading firewall docs.&amp;#160;&lt;a class="footnote-backref" href="#fnref:firewall-docs" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:ridiculous"&gt;
&lt;p&gt;And ridiculous, too. My dotfiles repo is still on Github, so they're scraping
code they already have. Also, it's freaking config. Personal tweaks tailored to
the way I like to use my tools. This has to be the least interesting thing to
feed an LLM with.&amp;#160;&lt;a class="footnote-backref" href="#fnref:ridiculous" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:no-captcha"&gt;
&lt;p&gt;It's much better than a regular CAPTCHA, but still. The small delay it incurs
is exacly the kind of small annoyances that add up fast and end up ruining the
whole experience of surfing the web for me.&amp;#160;&lt;a class="footnote-backref" href="#fnref:no-captcha" title="Jump back to footnote 7 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="tech"/></entry><entry><title>Getting started on the mandolin</title><link href="https://www.rgaz.fr/blog/getting-started-on-the-mandolin/" rel="alternate"/><published>2025-08-01T15:30:00+02:00</published><updated>2025-08-01T15:30:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-08-01:/blog/getting-started-on-the-mandolin/</id><summary type="html">&lt;p&gt;Applying concepts from Harmony 101 to explore a new instrument.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A few months ago a friend of mine lent me a mandolin.&lt;/p&gt;
&lt;p&gt;I had been meaning to try my hand at the instrument for a while now, and even
bought an old &lt;a href="https://en.wikipedia.org/wiki/Silvertone_(brand)" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;silvertone&lt;/a&gt; for cheap which, while pretty, showed up
with an action so high it was almost unplayabale. So predictably, I didn't stick
with it and it's now gathering dust alongside the couch.&lt;sup id="fnref:setup"&gt;&lt;a class="footnote-ref" href="#fn:setup"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;My friend's is only slightly less pretty, and most importantly, it plays like
butter and stays in tune pretty well, so this time I've been much more diligent.&lt;/p&gt;
&lt;p&gt;Since it wasn't that long ago, I remember the process I went through during the
first few hours I spent with it, which got me to improvise simple things after
less than a day's work, and I thought it could be interesting to describe it
here.&lt;/p&gt;
&lt;p&gt;I'm not trying to show off or even pretend I'm halfway competent yet. Honestly,
I still suck at it. My intention is merely to demonstrate how applying a few basic
harmonic concepts can speed you up when getting to know a new instrument.&lt;/p&gt;
&lt;p&gt;Also, keep in mind that even though I was new to &lt;em&gt;this&lt;/em&gt; instrument, I've been
playing guitar for more than twenty years, which obviously helps tremendously
with the mechanics. I've also had almost as long to internalize the theory I'll
mention below. It took me a while to understand and memorize those concepts, and
even longer to learn to hear them. My hope here is merely to show you how useful
knowing that stuff can be.&lt;/p&gt;
&lt;a href="#so-ive-learned-the-major-scale-now-what"&gt;&lt;h2 id="so-ive-learned-the-major-scale-now-what"&gt;So I've learned the major scale, now what ?&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;On the few occasions I had had to fool around with a mandolin before, I had
deciphered and memorized the G major scale.&lt;/p&gt;
&lt;p&gt;Learning a scale is an important step, but once you're done memorizing the pattern,
it's not obvious what to do with it beyond running it up and down, which stops
being fun after about two minutes. Figuring out how to turn that scale into music
takes a while, and experimenting is not that easy if you have no idea where to
start.&lt;/p&gt;
&lt;p&gt;So my first impulse was to spot my arpeggios&lt;sup id="fnref:whats-an-arpeggio"&gt;&lt;a class="footnote-ref" href="#fn:whats-an-arpeggio"&gt;2&lt;/a&gt;&lt;/sup&gt;. I started with
the one chord (ie G Major) and stuck to the lower two strings to get started.&lt;/p&gt;
&lt;p&gt;Without delving too deep into theory, the way to find those is to simply count
the notes as you play your scale, and isolate the first, third and fifth notes
from the pattern. Once you found those, keep running the scale until you hit the
root again (in this case, G) and add that note to the three you just singled out
to round things up:&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/mandolin-start/g-major-scale.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/mandolin-start/g-major-arpeggio.png" /&gt;&lt;/p&gt;
&lt;p&gt;As a guitar player, finding the major third was a no brainer. Frets work the
same way, so I didn't have to think to know it lied 4 frets (2 whole steps) up
from the root (here, the open G string). Having the fifth on the next open
string didn't feel so natural&lt;sup id="fnref:thats-the-sixth"&gt;&lt;a class="footnote-ref" href="#fn:thats-the-sixth"&gt;3&lt;/a&gt;&lt;/sup&gt;, though, so I spent a few minutes
playing the arpeggio up and down, alternating with the full scale for reference.&lt;/p&gt;
&lt;p&gt;Once I got it under my fingers, I could play simple lines like this:&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/mandolin-start/g-melody.png" /&gt;
&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/starting-mandolin/g-melody.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;I'm fancying it up slightly with hammer-ons and pull-offs, but really all I'm
doing is emphasizing the notes from the argeggio, using notes from the scale
as passing tones and reaching for the root when I want things to resolve.&lt;/p&gt;
&lt;a href="#bluesin-it-up"&gt;&lt;h2 id="bluesin-it-up"&gt;Bluesin it up&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;As a bluegrasser, I immediately wanted to dirty things up. Luckily, I already
knew how to do just that.&lt;/p&gt;
&lt;p&gt;Since I had already located my major third&lt;sup id="fnref:major-third"&gt;&lt;a class="footnote-ref" href="#fn:major-third"&gt;4&lt;/a&gt;&lt;/sup&gt;, I only had to lower
it by one half-step to switch to minor and get that sweet, bluesy feel. Resolve
it back up to the regular third or down to the second, and I'm good to go.&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/mandolin-start/bluesy-lick-3rd.png" /&gt;
&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/starting-mandolin/g-blues-3rd.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;In the same vein, lowering the root note by one full step will land me on the
minor seventh. A nice trick is to get there chromatically, which tends to sound
pretty cool. Check it out:&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/mandolin-start/bluesy-lick-7th.png" /&gt;
&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/starting-mandolin/g-blues-7th.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;a href="#switching-chords"&gt;&lt;h2 id="switching-chords"&gt;Switching chords&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;So, now that I'm on the seventh, my ear really wants to go to the IV chord (C
in this case). I also know from experience that going down one more half step
will yield the third of that new chord (you can hear me hang on it in the
last exemple).&lt;sup id="fnref:accumulated-knowledge"&gt;&lt;a class="footnote-ref" href="#fn:accumulated-knowledge"&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;But what then ? I have &lt;em&gt;no&lt;/em&gt; idea where the C chord tones are on this new neck.&lt;/p&gt;
&lt;p&gt;So I just stopped, went back to the full scale and took the time to spell it
out, as I did for the G chord. which gave me this new pattern:&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/mandolin-start/c-arpeggio.png" /&gt;&lt;/p&gt;
&lt;p&gt;Again, I played it slowly a few times over, making mental notes on where the new
root was&lt;sup id="fnref:c-root"&gt;&lt;a class="footnote-ref" href="#fn:c-root"&gt;6&lt;/a&gt;&lt;/sup&gt;, and also the third in case I want to mess with it as I did on
the G. And then I went back to fooling around.&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/mandolin-start/full-grid.png" /&gt;
&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/starting-mandolin/g-blues-full-grid.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;Apart from my lousy timing, you might notice that I went ahead and played over
the D chord as well. Since I had already spotted the scale's fifth note and noticed
it was an open string, I simply moved the G arppeggio up one string and played
around that. It could have gotten me into trouble had I tried to add more notes
to it, but sticking to the chord tones was pretty safe (I still added a sixth
in there because sixth are sweet).&lt;/p&gt;
&lt;a href="#so-am-i-a-mandolinist-yet"&gt;&lt;h2 id="so-am-i-a-mandolinist-yet"&gt;So am I a mandolinist yet ?&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Hell no. Far from it.&lt;/p&gt;
&lt;p&gt;I've kept with the process I just described and included the two missing strings,
and I can fake my way for a few bars on simple 3 chord songs, as long as they're
in the key of G or D. If the song doesn't stick to a I IV V harmony, then I might
get by if it's still diatonic, but forget about outlining the progression.&lt;/p&gt;
&lt;p&gt;And that's about it.&lt;/p&gt;
&lt;p&gt;The C arpeggio is still giving me trouble, as its shape is different enough from
what I'm used to to trip me up. I've looked at closed position scales, and while
I "get it" on a surface level, they feel foreign and I get lost at the first
chord change.&lt;/p&gt;
&lt;p&gt;There's still a long way to go, is what I'm getting at.&lt;/p&gt;
&lt;p&gt;But it's nice to know what I don't know. It'll take a while before I actually know
what I'm doing, but with the help of those basic harmonic notions, I can at least
pinpoint what I need to work on.&lt;sup id="fnref:technique"&gt;&lt;a class="footnote-ref" href="#fn:technique"&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;If all that number talk sounded like giberrish to you, sorry. If you learn how to
&lt;a href="https://www.guitarorb.com/forming-chords-from-scales/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;build chords from the major scale&lt;/a&gt;, then it should all start to
make sense. Juggling with those numbers and getting used to thinking with them
takes some practice, but it's one of the first things you'll tackle if you ever
decide to study harmony.&lt;/p&gt;
&lt;p&gt;This is of course not the only or even &lt;em&gt;right&lt;/em&gt; way to go about it, but it's mine.
Some people are able to figure that stuff out entirely by ear. Not me, though.
I needed to be able to put a name on things before I could make sense of them.&lt;/p&gt;
&lt;p&gt;I barely use anything more advanced in my day to day, so hopefully I've shown how
far a little understanding can get you.&lt;/p&gt;
&lt;a href="#time-to-get-rhythm"&gt;&lt;h2 id="time-to-get-rhythm"&gt;Time to get rhythm&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;As I said, I went through that process a couple months ago, and I haven't delved
much further as far as melody goes.&lt;/p&gt;
&lt;p&gt;I switched my attention to chords and playing backup. Being able to contribute to
the general groove is more important and that's what you should focus on when
starting out.&lt;/p&gt;
&lt;p&gt;Having joined a polish folk band in the meantime definitely helped make this a
priority.&lt;sup id="fnref:polish"&gt;&lt;a class="footnote-ref" href="#fn:polish"&gt;8&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;It's slowly coming together. Again, I'm keeping things simple and focusing on
simple triads, trying to memorize and make sense of the various inversions and
fiddling around until I stumble on something that sounds decent.&lt;/p&gt;
&lt;p&gt;Again, knowing how chords are built and what an inversion even &lt;a href="https://www.musictheoryacademy.com/understanding-music/chord-inversions/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;is&lt;/a&gt;
helps &lt;em&gt;a lot&lt;/em&gt;. I still have to get the shapes under my fingers and develop an
understanding of how they're all laid out on the fretboard, but at least the
tidbits I stumble upon make sense.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Allright, time to stop and go woodshed a bit. Rather than a thinking up a
coherent conclusion, I'll just throw a crappy picture of this article's main cast
instead.&lt;/p&gt;
&lt;p&gt;On the left is the old silvertone that I can't play. The one you heard in the
sound samples is on the right.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Two mandolins side by side." class="full-width" loading="lazy" src="https://www.rgaz.fr/img/starting-mandolin/mandolins.jpg"&gt;&lt;/p&gt;
&lt;p&gt;See ya, and happy picking!&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:setup"&gt;
&lt;p&gt;I'm sure a good setup can help, but I have my doubts it can do wonders. Old
instruments don't always age well and sometimes there's just not a lot you
can do to bring it back up in shape, short of rebuilding the whole top or
some other huge operation which would cost more than the original indtrument..&lt;/p&gt;
&lt;p&gt;I'll still look into it, but I'm putting it off for now.&amp;#160;&lt;a class="footnote-backref" href="#fnref:setup" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:whats-an-arpeggio"&gt;
&lt;p&gt;The notes that make up each chord. Those come from the scale you just learned,
but each chord will be made up of a subset of those seven notes.&amp;#160;&lt;a class="footnote-backref" href="#fnref:whats-an-arpeggio" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:thats-the-sixth"&gt;
&lt;p&gt;Although my guitar reflexes tended to land me on the sixth, which I love to
overuse. So as long as I know how to resolve it, that mistake can actually
sound pretty good.&amp;#160;&lt;a class="footnote-backref" href="#fnref:thats-the-sixth" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:major-third"&gt;
&lt;p&gt;Fourth fret, fourth string, in case you forgot.&amp;#160;&lt;a class="footnote-backref" href="#fnref:major-third" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:accumulated-knowledge"&gt;
&lt;p&gt;Again, those are just classic moves I picked up and internalized over the
years and that I'm blindly applying to this new tuning.&amp;#160;&lt;a class="footnote-backref" href="#fnref:accumulated-knowledge" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:c-root"&gt;
&lt;p&gt;Fifth fret, fourth string.&amp;#160;&lt;a class="footnote-backref" href="#fnref:c-root" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:technique"&gt;
&lt;p&gt;And that's just knowing my way around the fretboard. Being able to transpose
my pre-exising guitar technique is a huge boost to get started, but I can
feel the wood's not reacting as I expect it to. There's still about a billion
things I'll need to adjust to make it sound right.&amp;#160;&lt;a class="footnote-backref" href="#fnref:technique" title="Jump back to footnote 7 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:polish"&gt;
&lt;p&gt;I showed up at the first rehearsal barely able to play the &lt;a href="https://www.youtube.com/watch?v=FAWiueOsr0s" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;basic bluegrass
chop chords&lt;/a&gt;. The fiddle player
had to show me how to play minor chords, as the chop version of those was too
much of a stretch.&lt;/p&gt;
&lt;p&gt;I was clearly the beginner in the room, which honestly felt pretty fun. I've
struggled quite a bit (still do), but it forced me to take things more seriously,
and what little progress I made since then feels all the more gratifying.&amp;#160;&lt;a class="footnote-backref" href="#fnref:polish" title="Jump back to footnote 8 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="music"/></entry><entry><title>Half-assed banjo tuning</title><link href="https://www.rgaz.fr/blog/half-assed-banjo-tuning/" rel="alternate"/><published>2025-08-29T21:45:00+02:00</published><updated>2025-08-29T21:45:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-08-29:/blog/half-assed-banjo-tuning/</id><summary type="html">&lt;p&gt;How to jazz up a blues tune out of sheer lazyness.&lt;/p&gt;</summary><content type="html">&lt;p&gt;About a year ago, I started using a banjo on a few tunes with a duo I'm currently
playing in. We're both guitar players, and I was really missing &lt;em&gt;some&lt;/em&gt; timber
variety after our first few gigs, so I figured some simple clawhammer could make
for a nice change.&lt;sup id="fnref:texture"&gt;&lt;a class="footnote-ref" href="#fn:texture"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Now banjo often requires the use of a capo, which in turn requires adjusting that
damn 5th string. Nothing like an out of tune drone to ruin everything.&lt;/p&gt;
&lt;p&gt;Up until now, all the songs I use it on have been in keys that allowed me to
simply ignore the problem and leave the drone as it was, but yesterday we started
working on a tune in A, and that constant ringing G was just awful. And since my
friend plays the song on a diatonic accordion&lt;sup id="fnref:accordion"&gt;&lt;a class="footnote-ref" href="#fn:accordion"&gt;2&lt;/a&gt;&lt;/sup&gt;, we can't simply switch
it to C or G.&lt;/p&gt;
&lt;p&gt;I know many people would simply tune the string up to A. It's only one step,
so it should be fine, but not being that familiar with the instrument, I'm still
wary of messing with the tuning directly. I tried it anyway, and found out the
string didn't hold its pitch. It would sound fine for few bars and quickly drop
down to some random note between G and A, which was even worse than simply leaving
it untouched.&lt;sup id="fnref:detuning"&gt;&lt;a class="footnote-ref" href="#fn:detuning"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;I got away by tuning the drone &lt;em&gt;down&lt;/em&gt; to an E. It worked, but the drone got lost
in the overall mix, which kind of defeats its purpose.&lt;/p&gt;
&lt;p&gt;I got home and cut up a &lt;a href="http://www.frets.com/FretsPages/Musician/Banjo/PenCapCapo/pencapcapo.html" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;pen cap&lt;/a&gt; to turn it into a fifth string
capo. It's not great, but it does the job for now.&lt;sup id="fnref:bridge-pins"&gt;&lt;a class="footnote-ref" href="#fn:bridge-pins"&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;a href="#unexpected-harmonies"&gt;&lt;h2 id="unexpected-harmonies"&gt;Unexpected harmonies&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;This reminded me of something interesting that happened when I first started
incorporating the banjo into the set.&lt;/p&gt;
&lt;p&gt;Out of the five tunes I already (try to) frail on, 3 of them are in good old G, so
no problem here. Another one is in D minor, which I play with a capo on the
seventh fret,&lt;sup id="fnref:alternate-tuning"&gt;&lt;a class="footnote-ref" href="#fn:alternate-tuning"&gt;5&lt;/a&gt;&lt;/sup&gt; so I can simply grab the fifth string along and
not worry about it any further.&lt;/p&gt;
&lt;p&gt;The last one is in E flat, though. It's a cover of Mississippi John Hurt's
&lt;a href="https://www.youtube.com/watch?v=qC18_XEAe2o" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Pallet on your floor&lt;/a&gt;, and the key was chosen to fit my voice. I already
played it on guitar out of C with a capo on the third fret. As I got started trying
it on the banjo, I fully expected that drone to sound awful.&lt;/p&gt;
&lt;p&gt;But it didn't.&lt;/p&gt;
&lt;p&gt;Turns out the G is the third of the scale, which sounds less neutral that the
tonic or the fifth but is still part of the chord and opens up the overall sound.
I don't think it would fit any tune, but here it works just fine.&lt;/p&gt;
&lt;p&gt;The real magic happens on the IV chord, though. I think of it as an F, but it's
actually a A flat. Which means the G drone is now the major seventh of the current
chord.&lt;/p&gt;
&lt;p&gt;I have a kind of love/hate relationship with major senventh chords. They can be
&lt;a href="https://www.youtube.com/watch?v=eMnxjdGTK4w" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;beautiful&lt;/a&gt;, but they can also make for the cheesiest sounds I can think
of.&lt;/p&gt;
&lt;p&gt;I read some introduction to jazz years ago that basically recommended turning
&lt;em&gt;every&lt;/em&gt; major chord into a 7th,&lt;sup id="fnref:seventh"&gt;&lt;a class="footnote-ref" href="#fn:seventh"&gt;6&lt;/a&gt;&lt;/sup&gt; which horrified me. If the mood you're
aiming for is easy-listening soup, I guess that's a good way to go, but otherwise,
this approach make me want to puke rainbows.&lt;/p&gt;
&lt;p&gt;I had noticed a while ago that I tended to like them better when they fell on
IV chords, though, which is exactly what's happening here.&lt;/p&gt;
&lt;p&gt;Have a listen. Here's a version of the melody using my makeshift, pen cap capo
to raise the drone to a B flat (ie the fifth of the scale) (sorry for the dead
strings tone. Getting a fresh set is high on my to-do list, but it ain't here
yet):&lt;/p&gt;
&lt;p&gt;&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/banjo_capo/pallet-drone-fifth.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;Hear what I meant when I said this version sounded kind of neutral ? That's not
a bad thing. It sounds fine, really, and there wouldn't be anything wrong with
choosing to play the song that way.&lt;/p&gt;
&lt;p&gt;Now here it is without the capo. I tried to emphasize the drone to make it a bit
more obvious and sang a chorus to hear the harmony in context.&lt;/p&gt;
&lt;p&gt;&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/banjo_capo/pallet-drone-third.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;I just love the color the tune takes with the second version, which happens to
perfectly fit the John Hurt mood. The first one almost sounds bland in comparison.&lt;/p&gt;
&lt;p&gt;(Also, note the sixth on the V chord at the end. That's another harmonic color
I love (and probably tend to overuse, to be honest)).&lt;/p&gt;
&lt;a href="#embracing-mistakes"&gt;&lt;h2 id="embracing-mistakes"&gt;Embracing mistakes&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;The reason I like this arrangement so much and felt like writing about it is that
it happened entirely by accident. Remember: I just slapped on the capo, noticed
the fifth string wasn't tuned "properly" and went for it anyway, despite being
convinced it was going to sound terrible. None of the harmony shenanigans I described
above were planned. They were just the result of what was technically a mistake,
and I only started to figure them out &lt;em&gt;after&lt;/em&gt; noticing I liked what I was hearing.&lt;/p&gt;
&lt;p&gt;Had I had a decent way to deal with the drone handy, I might have just set it up
"the right way" and would never have thought of fancying things up.&lt;/p&gt;
&lt;p&gt;It is often said that many great ideas are born out of mistakes, and I'm still
amazed at how true that saying is. Most, if not all, of the lines I'm proud of
came out of me messing something up. Landing on a note ouf the key. Playing the
wrong chords. Hitting an unwanted string that "should" have ruined a lick but
didn't.&lt;sup id="fnref:bad-rhythm"&gt;&lt;a class="footnote-ref" href="#fn:bad-rhythm"&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The more it happens to you, the more you realize how pointless it is to worry
about screwing up. Sadly, building up the confidence to truly get rid of that
fear is still a long way ahead. But each new fumble hopefully gets me a little
closer to that goal.&lt;/p&gt;
&lt;p&gt;That's what they mean when they say there are no wrong notes. So if there's one
thing to learn from this story, here it is: mess around, try random things and
embrace falling flat on your face. I know that's easier said than done, but this
is how you'll grow.&lt;/p&gt;
&lt;p&gt;Learn to notice when something cool turns up among the noise and enjoy the ride
in the meantime.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;While looking up the name of the sawmill banjo tuning, I stumbled upon &lt;a href="https://banjr.com/fred.htm" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;this&lt;/a&gt;
website. If you thought Jimi Hendrix playing with his teeth was impressive, wait
until you meet Fred. I wish this had been captured on video.&lt;/p&gt;
&lt;p&gt;Oh, and one more link while I'm at it. Mentionning and playing pallet on your floor
made me want to hear it again, and I found &lt;a href="https://www.youtube.com/watch?v=IO58HvfeZK0" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;this version&lt;/a&gt;. I forget why,
but my initial reaction was a pretty strong "meh". 20 seconds later I was in love.
I'll definitely check those guys out.&lt;/p&gt;
&lt;p&gt;See y'all, keep picking, and enjoy every mistake you make !&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:texture"&gt;
&lt;p&gt;The nice thing about banjo, especially clawhammer, is that you really don't
have to do much to get a nice texture. A dead simple bum-ditty rhythm can be
enough to add a whole new dimension to a tune.&amp;#160;&lt;a class="footnote-backref" href="#fnref:texture" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:accordion"&gt;
&lt;p&gt;Yay! Instant Cajun! Now &lt;em&gt;that&lt;/em&gt; will stand out from the rest of the set!&amp;#160;&lt;a class="footnote-backref" href="#fnref:accordion" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:detuning"&gt;
&lt;p&gt;Maybe the string is just too old, or installed incorrectly. I'm sure it's a
simple fix, but right now, the only thing I know for sure is that I can't depend
on it.&amp;#160;&lt;a class="footnote-backref" href="#fnref:detuning" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:bridge-pins"&gt;
&lt;p&gt;I read &lt;a href="https://www.banjohangout.org/archive/312980" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;online&lt;/a&gt; about doing the same thing with guitar bridge
pins:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Banjo capo made out of a guitar bridge pin" loading="lazy" src="https://www.rgaz.fr/img/banjo_capo/bridge-pin-capo.jpg"&gt;&lt;/p&gt;
&lt;p&gt;This sounds like it should stay in place a little better, and you can buy cheap
ones for about 3 bucks a six-pack. I'll order a few and try it out.&amp;#160;&lt;a class="footnote-backref" href="#fnref:bridge-pins" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:alternate-tuning"&gt;
&lt;p&gt;I do retune for that one and raise the B string up to a C to get that
appalachian modal feel. That's called sawmill tuning, and it's a pretty sweet
sound.&amp;#160;&lt;a class="footnote-backref" href="#fnref:alternate-tuning" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:seventh"&gt;
&lt;p&gt;Keep in mind I'm talking about the &lt;em&gt;major&lt;/em&gt; seventh here. Blues players do
stick a seventh everywhere too, but they go for the minor / dominant one, which
is a &lt;em&gt;very&lt;/em&gt; different sound.&amp;#160;&lt;a class="footnote-backref" href="#fnref:seventh" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:bad-rhythm"&gt;
&lt;p&gt;I vaguely remember turning a waltz into 4/4 simply because I hadn't noticed
the signature. The band went along and the song is still &lt;a href="https://catfishfever.bandcamp.com/track/old-shoes-picture-postcards" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;my favourite from
that set&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Can't say anyhing else ever came out of my awful sense of timing, though.
Sigh.&amp;#160;&lt;a class="footnote-backref" href="#fnref:bad-rhythm" title="Jump back to footnote 7 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="music"/></entry><entry><title>Where the hell is Patrick Costello ?</title><link href="https://www.rgaz.fr/blog/where-the-hell-is-patrick-costello/" rel="alternate"/><published>2025-08-30T17:00:00+02:00</published><updated>2025-08-30T17:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-08-30:/blog/where-the-hell-is-patrick-costello/</id><summary type="html">&lt;p&gt;A quick tip of the hat that grew into its own post because the internet
sucks.&lt;/p&gt;</summary><content type="html">&lt;p&gt;While writing yesterday's article, I was bound to remember the days I first got
interested in clawhammer banjo, a little more than ten years ago.&lt;/p&gt;
&lt;p&gt;A friend had told me about a youtube channel that did a good job explaining how
that whole thing worked, so I checked it out. The channel was Patrick Costello's,
and I instantly liked the guy.&lt;/p&gt;
&lt;p&gt;I liked his playing and tone, simple and to the point. I liked his overall
demeanor and friendly attitude. I liked his philosophy and approach to music. And
I loved how straightforward his teaching was. He had a real knack for demistifying
whatever he was demonstrating, emphasizing the importance of mastering the basics
while making it all look like you'll get it with just a bit of practice.&lt;/p&gt;
&lt;p&gt;This was still old school youtube. No lighting or fancy editing, just a nice and
down to earth guy with a cheap camera and a genuine drive to share what he loved.&lt;/p&gt;
&lt;p&gt;Everything I know about the banjo came from Patrick, and he taught me a few deeper
lessons about music as well.&lt;/p&gt;
&lt;p&gt;Talking about him in the past tense makes this all sound like an eulogy. Thankfully
it's not. At least not as far as I know.&lt;/p&gt;
&lt;p&gt;I wanted to link to his lessons in my last article. But I couldn't find his old
channel. I dug around a little, and found out he had deleted it. His old website
is down, too.&lt;/p&gt;
&lt;p&gt;Apparently he was quite a controversial character in the online old-time music
community. I remember he would often mention the "purists" crowd in his video.
I don't remember him making much of a fuss about it, but it was obvious he'd seen
a few flamewars.&lt;/p&gt;
&lt;p&gt;I didn't really pay it any mind. This was the internet. Of course an opiniated
guy would get dragged into a nerd fight now and then, and we already knew how silly
and blown out of proportions those could get.&lt;/p&gt;
&lt;p&gt;From what little I gathered yesterday, members of various communitites seem to
have a different story. They paint him as a man craving for attention and
constantly starting fights over the slightest bit of criticism. To the point
of getting banned repeatedly from several forums.&lt;/p&gt;
&lt;p&gt;I honestly don't care who's right and who's wrong here. I tend to stay away from
internet drama and it's way too late to pick sides anyway.&lt;/p&gt;
&lt;p&gt;The forum members do recognize the man had some serious health issues, which I
remember him mentioning. Some suspect mental health problems as well. Again, I'm
in no place to judge.&lt;/p&gt;
&lt;p&gt;Well, to end that rambling story, the man apparently had a string of setbacks
which culminated with his house burning down a few years ago. He announced shortly
after the fire that he was "done" and deleted most, if not all of his published
material.&lt;/p&gt;
&lt;p&gt;Again, I'm not trying to pick sides, but this doesn't paint the picture of someone
who's doing well.&lt;/p&gt;
&lt;p&gt;It's apparently not the first time this happens.&lt;sup id="fnref:not-the-first-time"&gt;&lt;a class="footnote-ref" href="#fn:not-the-first-time"&gt;1&lt;/a&gt;&lt;/sup&gt; I haven't
looked very hard, but it's been three years already and I didn't find anything
more recent from him. Maybe he'll be back, maybe he won't.&lt;/p&gt;
&lt;p&gt;I won't blame him if he just stops dealing with online feuds and retires from
teaching. Nothing wrong with that, and that's for him to decide anyway. But
deleting everything he put out is, well, sad.&lt;/p&gt;
&lt;p&gt;The internets can be a cruel place, but when you stumble on a gem it's nothing
short of magical. The fact that some random guy, no matter what flaws he might
have had otherwise, was able to reach so many people is the magic. Everything
else is just banter and window dressing.&lt;/p&gt;
&lt;p&gt;This isn't the first time I find out some thing I've liked a while ago just
isn't there anymore. Sometimes it's just a silly joke or a cat picture. Sometimes
it's a deep discussion about some niche topic that spanned a dozen pages on a
forum thread that's no longer hosted. It always stings. And it always seems like
I'm the only one who cares.&lt;/p&gt;
&lt;p&gt;In a world where stuff from 2 days ago is already considered old news, that's not
really surprising. But so much is lost in the process. We figured out long ago
why archiving things was essential, but somehow this doesn't apply to the web.
This is bound to bite us in the butt one of these days.&lt;/p&gt;
&lt;p&gt;This is why places like the Internet Archive are so important.&lt;sup id="fnref:fuck-copyright"&gt;&lt;a class="footnote-ref" href="#fn:fuck-copyright"&gt;2&lt;/a&gt;&lt;/sup&gt;
Whch is where I found some of the &lt;a href="https://archive.org/details/PatrickCostello/A%20Book%20of%20Five%20Strings%20%281%29/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;books he published&lt;/a&gt; (under a creative
common licence, another nice touch). I read one of them ages ago. I don't
remember it that well but from the few pages I've skimmed, I'm confident there's
some good information in there. So go read those if you want to get into frailing
banjo. In the meanttime, I'll save them somewhere in case they disapear.&lt;/p&gt;
&lt;p&gt;There's also this &lt;a href="https://www.youtube.com/@thereverendjosephpatrickpi8646" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;weirdly named youtube channel&lt;/a&gt; that's uploaded
some of the ealier stuff he did with his dad, so there's that. I'm not sure who's
behind it. I don't know if more stuff will end up on there. Wait and see, I guess.&lt;/p&gt;
&lt;p&gt;I'm not sure what my point is with this post. I just felt like throwing a message
in a bottle. I hope Patrick is doing okay and I want to thank him for the work
he's done and the influence he had on me. Anything else is beyond me.&lt;/p&gt;
&lt;p&gt;So long, interwebs. Please get your act together and try to preserve the good
stuff rather than focusing on all the bullshit.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:not-the-first-time"&gt;
&lt;p&gt;Him disapearing from the web for a while, that is. Thankfully the fires were
less common.&amp;#160;&lt;a class="footnote-backref" href="#fnref:not-the-first-time" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:fuck-copyright"&gt;
&lt;p&gt;Not as important as &lt;a href="https://time.com/6266147/internet-archive-copyright-infringement-books-lawsuit/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;fucking copyright&lt;/a&gt;, though. Sigh.&amp;#160;&lt;a class="footnote-backref" href="#fnref:fuck-copyright" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="general"/></entry><entry><title>Why Do The Bad Songs Always Last So Long</title><link href="https://www.rgaz.fr/blog/why-do-the-bad-songs-always-last-so-long/" rel="alternate"/><published>2025-10-08T14:00:00+02:00</published><updated>2025-10-08T14:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-10-08:/blog/why-do-the-bad-songs-always-last-so-long/</id><summary type="html">&lt;p&gt;Stumbled on a song I wrote some years ago and figured I'd share it on
here.&lt;/p&gt;</summary><content type="html">&lt;p&gt;According to the file's metadata, I wrote this in August 2019.&lt;/p&gt;
&lt;p&gt;I was listening to some album or compilation (I don't remember what it was) and
one tune which I didn't like dragged on long enough for me to get annoyed, which
prompted the title. Thought it had a nice ring to it, and set out to turn it
into something.&lt;/p&gt;
&lt;p&gt;It really felt more like an exercise than anything else, and while I liked what
I ended up with, it didn't really fit the mood of any band I was in at the time,
so I recorded a quick take,  archived it and soon forgot about it.&lt;/p&gt;
&lt;p&gt;Stumbled back upon it while looking for something else and figured I might as
well post it on here, as I don't really plan on doing much with it.&lt;/p&gt;
&lt;p&gt;So here it is:&lt;/p&gt;
&lt;p&gt;&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/bad-songs/why-do-the-bad-songs-always-last-so-long.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;The take is quite rough and the guitar is slightly out of tune, but hey. Still
like the song. The melody feels like a weird mix of French singer Eddy Mitchell
and John Hartford's &lt;a href="https://www.youtube.com/watch?v=DbZHIoaapmE" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;gentle on my mind&lt;/a&gt;, the second of which
I'd been listening to a few days before. I remember I had to tweak the melody a
bit as some part was bordering on ripping it off.&lt;sup id="fnref:rip-off"&gt;&lt;a class="footnote-ref" href="#fn:rip-off"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Here are the lyrics in case you can't make them out through my mumbling:&lt;/p&gt;
&lt;p&gt;Listen to an old jukebox or a busted radio&lt;br&gt;
In a crowded Honky-Tonk or at an empty talent show&lt;br&gt;
Why do the bad songs always last so long ?&lt;br&gt;
I'll listen to your tale, might even sing along&lt;br&gt;
But please keep to the point, don't ramble on and on&lt;br&gt;
Why do the bad songs always last so long ?&lt;br&gt;&lt;/p&gt;
&lt;p&gt;I must admit sometimes it hits and wakes a memory&lt;br&gt;
Some old never-ending story that failed to make see&lt;br&gt;
Why do the bad songs always last so long ?&lt;br&gt;
I reckon I've heard this tune a few dozen times before&lt;br&gt;
Don't let this groove drag on for a single minute more&lt;br&gt;
Why do the bad songs always last so long ?&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Hope someone likes it. In the meantime, that'll do for a low effort update to
this blog.&lt;/p&gt;
&lt;p&gt;See ya interwebs. Don't suffer through the bad stuff for longer than you have
to.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:rip-off"&gt;
&lt;p&gt;Everytime I write something I can always spot bits from something I've been
  hearing not too long ago. Sometimes it's subtle, sometimes not so much. I'm
  usually fine with it, as long as I feel it still tells its own thing.&amp;#160;&lt;a class="footnote-backref" href="#fnref:rip-off" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="music"/></entry><entry><title>Unsung Heroes</title><link href="https://www.rgaz.fr/blog/unsung-heroes/" rel="alternate"/><published>2025-10-18T10:30:00+02:00</published><updated>2025-10-18T10:30:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-10-18:/blog/unsung-heroes/</id><summary type="html">&lt;p&gt;A bitter, 14 years late eulogy leads to asking who we should pay
attention to and why.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Dennis Ritchie passed away on October 12, 2011. In a sane universe, people who
knew who he was would have paid their respects, the news would have been relayed
by the specialized press, and people who didn't particularly care about computing
or its history would have never heard of it. After a week or two, everyone would
have moved on with their lives.&lt;/p&gt;
&lt;p&gt;Which is exactly what happened.&lt;/p&gt;
&lt;p&gt;But at the time, the rest of the world was in mourning for another guy who had
died about a week earlier. Celebrations went on and on for the god like figure
whose gift had blessed us all with amazing technology that was nothing short of
magical.&lt;/p&gt;
&lt;p&gt;That other guy was Steve Jobs. And the whole situation pissed me off.&lt;/p&gt;
&lt;p&gt;I'd never been a fan of apple or Jobs, but this isn't my point here. No matter
what merits the man might have had, I couldn't stand the way he was constantly
praised as a genius inventor&lt;sup id="fnref:genius"&gt;&lt;a class="footnote-ref" href="#fn:genius"&gt;1&lt;/a&gt;&lt;/sup&gt;, when it was obvious his real accomplishments
had much more to do with marketting than engineering.&lt;/p&gt;
&lt;p&gt;And then &lt;a href="https://en.wikipedia.org/wiki/Dennis_Ritchie" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;the man who designed the C language in order to build Unix&lt;/a&gt;,
two staples of computing that are still widely used 50-ish years later and / or
shaped digital history as a whole, died and what little recognition he got was
lost next to the ongoing canonization of someone who'd figured out how to turn
pixels into luxury goods.&lt;/p&gt;
&lt;a href="#kill-your-idols"&gt;&lt;h2 id="kill-your-idols"&gt;Kill your idols&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;A classic take among techies is that &lt;a href="https://en.wikipedia.org/wiki/Steve_Wozniak" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Steve Wozniak&lt;/a&gt; should be the
famous one, as he did all the real work. Praise the nerds rather than the suits.
I don't agree with this.&lt;/p&gt;
&lt;p&gt;The point I'm trying to make here is that both should get public recognition for
what they actually did, and no more. Giving credit to work we find useful doesn't
mean we have to turn its authors into rock stars.&lt;/p&gt;
&lt;p&gt;I wasn't pissed because I thought the roles should have been reversed. I'm not
arguing that  Wozniak and Ritchie should have been the ones under the spotlight
(I'm sure they are/were perfectly happy with their relative lack of public
exposure).&lt;/p&gt;
&lt;p&gt;I just wish the media would stop indulging the ones who do seek the attention.&lt;/p&gt;
&lt;p&gt;This isn't a new problem. The focus on individuals is as old, if not older than
mass media and has been discussed and criticized for longer than I've been alive.
This happen in just about every domain. Art is full of this crap, too. And it's
always more infuriating when it comes to something you think you know someting
about.&lt;/p&gt;
&lt;p&gt;Ritchie was a researcher who simply did his job. No more, no less. He built on
what came before, and neither C nor Unix were magical masterpieces than no one
else could have conceived of. They just happened to solve the right problems at
the right time, and went on to leave a truly profund mark on the global evolution
of technology.&lt;/p&gt;
&lt;p&gt;Their creators then simply went on with their work. Those who care about that
stuff recognized that work, and that was enough. No need to hype them up for
the masses.&lt;/p&gt;
&lt;a href="#the-rule-of-marketting"&gt;&lt;h2 id="the-rule-of-marketting"&gt;The rule of marketting&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;But marketting doens't work that way. Marketting only cares about selling an
image, and thrives on the figure of the brillant entrepreneur.&lt;/p&gt;
&lt;p&gt;And that would be fine, if marketting kept to its place. But sadly, its reach
extends much beyond designing dumb ads to sell us dumb crap. In more and more
fields, advertisers get to decide what gets made and how, and their word weighs
more than the advice of those who actually know what they're doing. This is why
Hollywood can't seem to produce anything beyond focus-group-approved, rehashed
franchises designed for mass-appeal, and this is what allows the tech industry
to sell us bullshit upon bullshit. Even politicians end up caring more about their
brands than policies.&lt;/p&gt;
&lt;p&gt;To the point that collectively chanting the current buzzword passes for innovation.&lt;/p&gt;
&lt;p&gt;Apply that logic to misunderstood (and barely taught) topics like technology,
and you get the current nonsense around AI. I'm not talking about whether the
tools can be useful for certain things here, but about the way business owners,
ie people that tend to at least worry about their investments, happily bet
everything they own on what the current flock of self proclaimed experts sold
them as The Future™.&lt;/p&gt;
&lt;a href="#we-live-in-a-sausage"&gt;&lt;h2 id="we-live-in-a-sausage"&gt;We live in a sausage&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;None of this is surprising in a system that values short-term profit over
everything else. Not much of a scoop, I know.&lt;/p&gt;
&lt;p&gt;It still depresses me to think that Zuckerberg's metaverse delusions got more
attention than anything &lt;a href="https://en.wikipedia.org/wiki/Tim_Berners-Lee" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Tim Berners-Lee&lt;/a&gt; might have to say
about the state of the web. This makes about as much sense as putting Elon Musk
in charge of a country's budget.&lt;/p&gt;
&lt;p&gt;Trying to reason about complex things ain't easy, and it can be pretty hard to
figure out who we should trust, especially when the media doesn't understand or
care about the truth any more than the average CEO. My rule of thumb is to stay
away from any corporate actor, and to be extra-vigilant about anything that gets
hyped. It ain't perfect, but it's a start.&lt;/p&gt;
&lt;p&gt;Asking yourself where whoever's speaking comes from helps, too. Most of the real,
meaningfull progress in computing was publicly funded&lt;sup id="fnref:bell-labs"&gt;&lt;a class="footnote-ref" href="#fn:bell-labs"&gt;2&lt;/a&gt;&lt;/sup&gt;, most notably
the internet and the web. The private sector mostly figured out how to make a buck
out of it before convincing everyone else that they were the ones responsible for
the whole thing and should therefore shape all future evolutions.&lt;/p&gt;
&lt;p&gt;We need to stop believing in that lie. And one small part of that comes from
learning to differentiate the actual pioneers from the frauds&lt;sup id="fnref:pioneers"&gt;&lt;a class="footnote-ref" href="#fn:pioneers"&gt;3&lt;/a&gt;&lt;/sup&gt;, and to
stop worshipping individuals. Valuable work that truly matters comes from regular
people simply doing their job, not from gifted geniuses. Give credit where credit
is due and move on.&lt;/p&gt;
&lt;p&gt;And let's hope &lt;a href="https://en.wikipedia.org/wiki/Ken_Thompson" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Ken Thompson&lt;/a&gt; doesn't kick the bucket on the same day
as Bill Gates.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:genius"&gt;
&lt;p&gt;A figure I already couldn't stand, no matter the field. No single person has
ever been single handedly responsible for any worthwhile invention. Not Jobs,
not Ritchie, no one.&amp;#160;&lt;a class="footnote-backref" href="#fnref:genius" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:bell-labs"&gt;
&lt;p&gt;Technically, Ritchie's work wasn't, which caused quite a mess when his
employer (AT&amp;amp;T) later decided to commercialize &lt;a href="https://livinginternet.com/i/iw_unix_war.htm" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;unix&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But even those shenanigans only happened because the code was initally shared
freely.&amp;#160;&lt;a class="footnote-backref" href="#fnref:bell-labs" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:pioneers"&gt;
&lt;p&gt;Hint: they tend to be too busy working on cool shit to try and sell you crap.&amp;#160;&lt;a class="footnote-backref" href="#fnref:pioneers" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="tech"/></entry><entry><title>Never Surrender</title><link href="https://www.rgaz.fr/blog/never-surrender/" rel="alternate"/><published>2025-11-03T22:30:00+01:00</published><updated>2025-11-03T22:30:00+01:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2025-11-03:/blog/never-surrender/</id><summary type="html">&lt;p&gt;Some quick nerding out over a story about stories.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've had an itch to rewatch &lt;a href="https://en.wikipedia.org/wiki/Galaxy_Quest" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Galaxy Quest&lt;/a&gt; for a while, which I
finally scratched a few days ago. The (perfectly legal, ofc) platform I watched
it on also had the &lt;a href="https://www.imdb.com/title/tt11044122/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Never Surrender&lt;/a&gt; documentary about the
making of the movie and its reception, so I watched that, too.&lt;/p&gt;
&lt;p&gt;I loved the movie just as much as I did when I first saw it ten-ish years ago.
If you haven't seen it, then go watch it. And if, for some weird reason, you'd
rather finish reading this before doing so but still want understand what's going
on, then here's a quick summary:&lt;/p&gt;
&lt;p&gt;An old sci-fi TV series named Galaxy Quest&lt;sup id="fnref:star-trek"&gt;&lt;a class="footnote-ref" href="#fn:star-trek"&gt;1&lt;/a&gt;&lt;/sup&gt; got intercepted by an alien
civilization who mistook it for historical documents about a real crew of space
explorers, which prompts them to come to earth and enlist the cast of actors to
help them against an evil opponent who threatens to invade/anihilate them.&lt;/p&gt;
&lt;p&gt;It's a simple enough premise for some feel-good, light-hearted comedy, but it
also touches on a theme that always resonate pretty strongly with me, which is
the power of storytelling.&lt;/p&gt;
&lt;a href="#richard-iiis-hammer"&gt;&lt;h2 id="richard-iiis-hammer"&gt;Richard III's hammer&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;The documentary talks at length about how important this movie was to trekkies
and fans of other fantasy / sci-fi franchises. It's basically a love letter to
those communitites, poking some gentle fun at their nerdiest aspects without ever
being condescending.&lt;/p&gt;
&lt;p&gt;Everyone is a fan of the show. The cast gets to be their characters in a real,
high stake situation and use actual working magic-tech instead of props. The
Thermians&lt;sup id="fnref:thermians"&gt;&lt;a class="footnote-ref" href="#fn:thermians"&gt;2&lt;/a&gt;&lt;/sup&gt; modelled their entire society after what they could glean
from the old footage, and even the obsessive kids from the convention get to save
the day thanks to their deep knowledge of the fictional ship's innards that no
"sane" person would ever care about.&lt;/p&gt;
&lt;p&gt;The whole plot is people acting out their fantasy, but there's more going on here
than children playing make-believe. Everyone cares deeply about the story they're
a part of, and whatever that story might mean to them, it means &lt;em&gt;something&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Art doesn't have to be grandiose, and it certainly doens't have to fit whatever
standard the snobs have set for themselves. If it moves someone, anyone, no matter
how or why, then it's worth it.&lt;/p&gt;
&lt;p&gt;As Alan Rickman's character will realize, there's no more shame in being inspired
by the Suns of Worvan than by anything Shakespeare might have written.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Dr Lazarus (the show's Spock knockoff) enjoying himself at a promotional trade show" class="full-width" loading="lazy" src="https://www.rgaz.fr/img/galaxy-quest/grabthars-hammer.gif"&gt;&lt;/p&gt;
&lt;a href="#why-stories-matter"&gt;&lt;h2 id="why-stories-matter"&gt;Why stories matter&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;The general love and appreciation for the fans I just described is probably the
one thing most people took from the movie, and is explored at length by both
audience and crew in the documentary that was shot twenty years after the movie's
release.&lt;/p&gt;
&lt;p&gt;But what I trully liked is how it can be taken one small step deeper.&lt;/p&gt;
&lt;p&gt;On the surface level, this story is about fantasies becoming reality. But I tell
myself more and more that stories are real to begin with.&lt;/p&gt;
&lt;p&gt;Not in a litteral way, of course. We all know spaceships and dragons don't
exist. But whether or not we wish they did is beyond the point.&lt;/p&gt;
&lt;p&gt;Stories are fundamantally about people, what happens to them and how they chose
to deal with it. Everything else is window dressing.&lt;sup id="fnref:worldbuilding"&gt;&lt;a class="footnote-ref" href="#fn:worldbuilding"&gt;3&lt;/a&gt;&lt;/sup&gt; And when
something clicks and you connect with a character's predicaments, who's to say
whatever you're feeling is not genuine ?&lt;/p&gt;
&lt;p&gt;None of the stuff that happened in the Galaxy Quest show was ever "real". It was
all actors and cardboard props. And yet the thermians, who do not understand the
very concept of lying, and therefore fiction as a whole, took it all at face
value and built their entire culture out of what the show was embodying.&lt;/p&gt;
&lt;p&gt;When they finally learn the truth, their whole world could crumble. But it
doesn't, because whether or not it was founded on fairy tales, what they built
was strong enough to keep standing on its own.&lt;/p&gt;
&lt;p&gt;This is what stories are. A bunch of lies lumped together that somehow manages
to brush with whatever truth the artist is trying to say. You know, the human
condition and all that jazz. It doens't have to be particularly deep or smart,
as long as it resonates. And when enough people believe in that truth, we end up
with religion.&lt;sup id="fnref:religion"&gt;&lt;a class="footnote-ref" href="#fn:religion"&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;This is why treating them as mere "content" is so infuriating, and why I get
pissed whenever someone dismisses nerdy nitpicking as obsessing over "just a
story".&lt;sup id="fnref:just-a-story"&gt;&lt;a class="footnote-ref" href="#fn:just-a-story"&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;I clumsily tried to touch on this in the conclusion to my &lt;a href="https://www.rgaz.fr/blog/i-dont-care-about-star-wars-anymore/" rel="noopener" target="_blank"&gt;star wars&lt;/a&gt;
article. Hopefully I made my point a bit more clearly this time around.&lt;/p&gt;
&lt;p&gt;Galaxy Quest isn't the first piece of media to touch about what storytelling
is all about, but it's the last one I saw, so it's the one this articles focuses
one. Again, if you haven't seen it, go ahead. You'll have a good time, and what
minor details I covered shouldn't spoil it.&lt;/p&gt;
&lt;p&gt;Sharing stories is what makes us humans. For better or for worse. So let's keep
doing that. Old or new, doesn't matter. The magic is in the telling.&lt;/p&gt;
&lt;p&gt;This is what we should never surrender.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:star-trek"&gt;
&lt;p&gt;They had to use another name for legal reasons, but it's basically Star
Trek.&amp;#160;&lt;a class="footnote-backref" href="#fnref:star-trek" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:thermians"&gt;
&lt;p&gt;That's the name of the alien species who get this whole thing started.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.rgaz.fr/img/galaxy-quest/thermians.jpeg" target="_blank"&gt;
  &lt;img alt="Thermians" loading="lazy" src="https://www.rgaz.fr/img/galaxy-quest/thermians.jpeg"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Don't they look great? (Click for full size)&amp;#160;&lt;a class="footnote-backref" href="#fnref:thermians" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:worldbuilding"&gt;
&lt;p&gt;Not that it's not important. Worldbuilding can get fascinating in its own
right, and there's nothing wrong with getting lost in it for its own sake.&lt;/p&gt;
&lt;p&gt;I'd argue that no one would care about the history of Middle Earth if Frodo's
story hadn't been told right to begin with, though.&amp;#160;&lt;a class="footnote-backref" href="#fnref:worldbuilding" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:religion"&gt;
&lt;p&gt;Some nerds can be the worst zealots. Taking that stuff seriously doesn't
mean sacralizing it, and we could all do with less bonfires.&amp;#160;&lt;a class="footnote-backref" href="#fnref:religion" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:just-a-story"&gt;
&lt;p&gt;Although I'll admit there's a time and place for it. Sometimes I / we might
get a bit carried away. See the previous footnote.&amp;#160;&lt;a class="footnote-backref" href="#fnref:just-a-story" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="general"/></entry><entry><title>Please stop selling me my future</title><link href="https://www.rgaz.fr/blog/please-stop-selling-me-my-future/" rel="alternate"/><published>2026-04-06T20:30:00+02:00</published><updated>2026-04-06T20:30:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2026-04-06:/blog/please-stop-selling-me-my-future/</id><summary type="html">&lt;p&gt;How I stopped caring whether or not people would call me an old fart
so I could keep ranting.&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;I hate to pass for a boomer, but [insert a benign comment about whatever has
  been going on lately]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I heard this phrase about a million times, and it always irks me. If you've got
something to say, just say it. Maybe I'll agree, maybe I won't. The one thing I
can assure you is that I won't give a damn whether or not it makes you sound like
an old fart.&lt;/p&gt;
&lt;p&gt;I get why no one wants to be the proverbial old man yelling at the clouds. That
meme comes from somewhere, and those people do exist. And yes, they can be annoying
as hell and rarely have much of actual interest to contribute to the converstation.&lt;/p&gt;
&lt;p&gt;But claiming that "new" always means "good" is just as deluded, and in my opinion,
also dangerous. Embrace change all you want, but please don't turn off your brain
in the process and let novelty shut down any attempt at criticism.&lt;/p&gt;
&lt;p&gt;The software world seems to be particularly prone to this bias, which is ironic
coming from people who love to call themselves engineers yet can't help themselves
from chasing after the latest &lt;a href="https://dev.to/holasoymalva/why-the-latest-javascript-frameworks-are-a-waste-of-time-52pc" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;framework of the week&lt;/a&gt;,
technical debt be damned.&lt;/p&gt;
&lt;p&gt;This leaves us with an industry that runs on buzzwords. Web 2.0. The Cloud.
Blockchain. Fucking &lt;em&gt;NFTs&lt;/em&gt;. And now the current craze about AI.&lt;sup id="fnref:ai-craze"&gt;&lt;a class="footnote-ref" href="#fn:ai-craze"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The argument is the same every time. The world has changed, progress is
unstopable, and whatever you're being sold is TheFuture&amp;trade;, whether you
like it or not. Adapt or die.&lt;/p&gt;
&lt;p&gt;Which sounds a lot to me like an injunction to blindly follow whatever happens
to be trendy today. If this is what passes for innovation, then I'll gladly change
my name to &lt;a href="https://en.wikipedia.org/wiki/Luddite" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Nedd Ludd&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And you know what ?&lt;/p&gt;
&lt;a href="#its-all-a-lie"&gt;&lt;h2 id="its-all-a-lie"&gt;It's all a lie&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;9 times out of ten, the crap we're being sold ain't even that &lt;em&gt;new&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Remember Zuckerberg's metaverse revolution ? When I saw the adds&lt;sup id="fnref:metaverse-adds"&gt;&lt;a class="footnote-ref" href="#fn:metaverse-adds"&gt;2&lt;/a&gt;&lt;/sup&gt;
for it, all I could think of was that &lt;a href="https://en.wikipedia.org/wiki/Second_Life" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;second life&lt;/a&gt; looked better
back in 2003. And even second life &lt;a href="https://www.shamusyoung.com/twentysidedtale/?p=54283" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;wasn't a new idea&lt;/a&gt;. People were
already dreaming of and experimenting with &lt;a href="https://www.openculture.com/2017/05/the-story-of-habitat.html" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;virtual worlds&lt;/a&gt; as soon as
we figured out how to make computers talk to each other, &lt;a href="https://en.wikipedia.org/wiki/Multi-user_dungeon" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;all the way back to
1980&lt;/a&gt;. Why do you think the genre of cyberpunk emerged around that time ?&lt;/p&gt;
&lt;p&gt;Also, who's still talking about the metaverse 3 years later ?&lt;/p&gt;
&lt;p&gt;We're told that everything in computing is constantly changing, and that the
whole world gets turned upside-down every other day.&lt;/p&gt;
&lt;p&gt;And yet most of the world's infrastructure still runs on C, a language that was
conceived 54 years ago. &lt;a href="https://www.metaintro.com/blog/cobol-developer-shortage-legacy-systems-career-opportunity-2026" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;The banking and financial systems are desperatly hiring
people who still know COBOL&lt;/a&gt;, which is even older. LLMs are mostly based on
&lt;a href="https://xpert.digital/en/origin-of-artificial-intelligence/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;research that was conducted in the 80's&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Even the web, which I would argue was the last truly groundbreaking idea in
IT, is older than today's young adults, but we still treat it as a "new technolgy".
Mostly because we still have no idea how deep its impact on societies really is.&lt;/p&gt;
&lt;p&gt;Code bases don't change at the pace of hype.&lt;sup id="fnref:python-2-3"&gt;&lt;a class="footnote-ref" href="#fn:python-2-3"&gt;3&lt;/a&gt;&lt;/sup&gt; If you think Claude
and Copilot can speed that up, go ahead and try, but don't expect me to care when
you end up with a unmaintainable and bloated mess in six months.&lt;/p&gt;
&lt;a href="#tech-is-not-magic"&gt;&lt;h2 id="tech-is-not-magic"&gt;Tech is not magic&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Real progress is slow and deliberate. Breakthroughs are rare and tend to go
&lt;a href="https://thehustle.co/clifford-stoll-why-the-internet-will-fail" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;unapreciated for a while&lt;/a&gt;.&lt;sup id="fnref:fad"&gt;&lt;a class="footnote-ref" href="#fn:fad"&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;And what that progress brings is new possibilities. Some of them pretty exciting.
But bringing these potentialities into reality doesn't follow magically.&lt;/p&gt;
&lt;p&gt;Take video games. Back in the nineties, small teams of half a dozen people could
deliver a game in about one year, sometimes even less. Pixel artists had to come
up with all kind of crazy tricks to make up for the technological limitations of
the time, but at the end of the day, they only had to draw a copple dozen sprites
for each character.&lt;/p&gt;
&lt;p&gt;Today low-end GPUs are capable of rendering 3d photorealistic environements in
real time, but it takes several hundred experts up to ten years to deliver &lt;a href="https://www.gameslearningsociety.org/why-cyberpunk-2077-failed/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;products
they didn't have time to finish&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Artists now have to model the individual hairs of each character and can't get
away with a simple color swap to fake some variety. And another team needs to come
up with a convincing animation for when said characters stand around, effectively
doing nothing, because what was ok with abstract graphics would just look dumb
with today's level of detail.&lt;/p&gt;
&lt;p&gt;Synchronizing all the new systems resulted in an explosion of complexity, and
no single person can possibly hope to truly understand every aspect of a modern
engine. This is not because the devs have gotten worse at their job (quite the
opposite). This is because actually exploiting the new tech has multiplied the
labor costs by a thousand, if not more.&lt;sup id="fnref:automation"&gt;&lt;a class="footnote-ref" href="#fn:automation"&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;All this so that gamers can bitch about how you failed to make their fancy
hardware shine, failing to understand that just because something is possible or
even common doesn't make it easy. We've come a long way, but the tradeoffs haven't
disapeared. You can't keep obsessing over having the prettiest pixels and at the
same time complain that games are getting smaller and buggier.&lt;/p&gt;
&lt;a href="#progress-uber-alles"&gt;&lt;h2 id="progress-uber-alles"&gt;Progress Uber Alles&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Brace yourself for a sudden change of pace. You know what was pretty hype back
in the thirties ?&lt;/p&gt;
&lt;p&gt;Fascism.&lt;/p&gt;
&lt;p&gt;Mussolinni and his pals had plans for a grand new world, and while they sure had
a peculiar relationhip with the past, they weren't selling the crowds on a return
to the middle-ages. And up until recently, it wasn't controversial to think it
didn't turn out so great.&lt;/p&gt;
&lt;p&gt;Those guys were big on tech too, and would have loved to get their hands on our
current stack. And yet we spent the last 15 years building the tools of mass
surveillance that their successors are now gladly using, convinced that we wouldn't
be dumb enough to let it happen again.&lt;/p&gt;
&lt;p&gt;When the war ended, it was widely understood that the disastrous economic conditions
caused by the crash of 1929 had been a huge factor in the rise of totalitarianism,
and most countries started to build a few makeshift guardrails around capitalism
to try and keep it from blowing up again.&lt;sup id="fnref:social-security"&gt;&lt;a class="footnote-ref" href="#fn:social-security"&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;A mere forty years later, we started dismantling those guardrails, effectively
going back to the ways of the 19th century. But we called it "modern", so how
could it possibly wake up the monsters from a mere generation ago ?&lt;/p&gt;
&lt;p&gt;Add another forty years, poverty and inequality has exploded, and we're shocked to
discover that the same causes produce the same results they did last century.
Turns out collectively chanting "Never again" wasn't sufficient to keep the bad guys
from returning.&lt;/p&gt;
&lt;p&gt;Well, they're back now. All it took was an update to their terms of service for
them to reach a position from which they could unleash world war 3.0. I wonder
if the &lt;a href="https://sandersinstitute.org/technofeudalism-explained-with-yanis-varoufakis" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;feodal structure of the current web&lt;/a&gt; had anything to
do with that situation.&lt;/p&gt;
&lt;p&gt;History wasn't doomed to repeat itself. but the notion that it goes in a straight
line and can't ever reverse directions is part of what put us in the mess we're
in today. Hurray for progress, I guess.&lt;/p&gt;
&lt;a href="#complexity-sucks-deal-with-it"&gt;&lt;h2 id="complexity-sucks-deal-with-it"&gt;Complexity sucks. Deal with it.&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;I'm not calling every tech-enthusiast a potential fascist. And I'm not even
trying to claim that new stuff always suck.&lt;/p&gt;
&lt;p&gt;The world's gonna change no matter what, I get it. And despite its current state,
somehow I still don't think we're doomed. Yet.&lt;/p&gt;
&lt;p&gt;But it's high time we had a conversation about where the hell we're headed and
whether or not we're about to hit a concrete wall. This involves many different
topics, each complex in their own right, and they all intersect and conflict with
each other in a fractal web of convoluted side-effects.&lt;/p&gt;
&lt;p&gt;I'm no expert on any of those fields, but I know they can't be reduced to simple
pro or anti postures. We'll never solve anything if we're not willing to face that
complexity. Call me stubborn, but I refuse to simply live with the times and stop
asking questions.&lt;/p&gt;
&lt;p&gt;It's okay if we don't agree on something, and you're welcome to try and prove
me wrong. If you give me some time, who knows, I might even change my mind.&lt;/p&gt;
&lt;p&gt;I'm getting old enough to recognize some recurring patterns, though. That doesn't
mean my intuitions are always right, far from it. But you're gonna have to try a
little harder to overcome them and convince me of anything. If my skepticism makes
me sound like a nostalgic old geezer who's afraid of change, so be it.&lt;/p&gt;
&lt;p&gt;But please drop the bullshit and make an actual point, instead of rehashing
the slogans you heard from a commercial. It's hard enough to try and think with
all the noise that's going on, so I won't even bother to listen if you start
sounding like a fucking lemming.&lt;/p&gt;
&lt;p&gt;See ya, interwebs. Please stop moving fast and breaking things before there's
no ground left to stand on.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I saw &lt;a href="https://shkspr.mobi/blog/2026/03/im-ok-being-left-behind-thanks/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;this blog post&lt;/a&gt; pop into my feed last week. Shortly before
that, Adam Neely's essay on &lt;a href="https://www.youtube.com/watch?v=U8dcFhF0Dlk&amp;amp;pp=ygUKYWRhbSBuZWVseQ%3D%3D" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;AI generated music&lt;/a&gt; (possibly the best
thing I've seen on the topic yet) had already prompted me to mull over that
"You don't want to be left behind" phrase I'd been hearing so much lately. So I
guess this article was inspired by both of those pieces.&lt;/p&gt;
&lt;p&gt;This started as a quick rant and kept expanding as I typed. As a result, it's
a bit all over the place. I hope I managed to stay somewhat coherent, but if I
didn't, fine. Rambling is what this blog's supposed to be about, after all.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:ai-craze"&gt;
&lt;p&gt;Sadly that one seems to take much better than its predecessors and didn't
keep to the tech world. To the point that fucking &lt;em&gt;armies&lt;/em&gt; openly admit to
using it to &lt;a href="https://www.theguardian.com/news/2026/mar/26/ai-got-the-blame-for-the-iran-school-bombing-the-truth-is-far-more-worrying" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;plan their operations&lt;/a&gt;, all too happy to switch
the blame to a simple, if regrettable bug that will be fixed as the AI gets
better.&lt;/p&gt;
&lt;p&gt;Spoiler alert: it won't.&lt;/p&gt;
&lt;p&gt;If we've really gotten dumb enough to let them get away with this, maybe
it's time to just put the bots in charge of our nuclear arsenals and get this
joke of a civilisation over with.&amp;#160;&lt;a class="footnote-backref" href="#fnref:ai-craze" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:metaverse-adds"&gt;
&lt;p&gt;Which tried to sell us on their product by showing us a virtual... board
meeting ?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This&lt;/em&gt; is what was supposed to get us excited ?&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://dailydot.com/is-mark-zuckerberg-a-human" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;conspiracy theorists&lt;/a&gt; were right. Those people can't be human.&amp;#160;&lt;a class="footnote-backref" href="#fnref:metaverse-adds" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:python-2-3"&gt;
&lt;p&gt;The transition from python 2 to 3 took &lt;em&gt;ten years&lt;/em&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:python-2-3" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:fad"&gt;
&lt;p&gt;The paper's introduction undersells it, but Clifford Stoll is actually a
&lt;a href="https://www.youtube.com/watch?v=4gHNVNRQTJg" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;pretty cool guy&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:fad" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:automation"&gt;
&lt;p&gt;Yes, a lot of that work can and already is automated. But &lt;em&gt;someone&lt;/em&gt; still has
to steer the wheel  and merge all this stuff into a coherent whole.&amp;#160;&lt;a class="footnote-backref" href="#fnref:automation" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:social-security"&gt;
&lt;p&gt;I'm told many countries envy France's social security system. And that's one
of the few thing I can agree we did right.&lt;/p&gt;
&lt;p&gt;Too bad many don't remember that it was part of the &lt;a href="https://en.wikipedia.org/wiki/National_Council_of_the_Resistance#Programme" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;resistance's political
program&lt;/a&gt; and explicitely conceived as a means to prevent fascist rethorics
from exploiting misery again.&amp;#160;&lt;a class="footnote-backref" href="#fnref:social-security" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="general"/></entry><entry><title>Still enjoying the mandolin</title><link href="https://www.rgaz.fr/blog/still-enjoying-the-mandolin/" rel="alternate"/><published>2026-04-13T19:00:00+02:00</published><updated>2026-04-13T19:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2026-04-13:/blog/still-enjoying-the-mandolin/</id><summary type="html">&lt;p&gt;Progress being made. Still a long road to go.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Having fooled around off and on for a little while, it's hard to tell exactly how
long I've been playing the mandolin by now. I seem to remember that I started to
get a bit more serious about it around may of last year, so I guess now is as good
a time as any to reflect a little about it.&lt;/p&gt;
&lt;p&gt;Long story short: I'm still having a blast.&lt;/p&gt;
&lt;p&gt;I kind of switch back and forth between it and the guitar, depending on what's
coming up and needs some work done, so progress is probably slower than it should,
but it's still coming along nicely.&lt;sup id="fnref:background"&gt;&lt;a class="footnote-ref" href="#fn:background"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;I'm now confortable with a bunch of simple chord inversions and can usually try
out different positions on the spot. Some keys still trip me up,&lt;sup id="fnref:hard-keys"&gt;&lt;a class="footnote-ref" href="#fn:hard-keys"&gt;2&lt;/a&gt;&lt;/sup&gt; and
my chop definitely needs some cleaning up (I still tend to overplay when I should
aim for a simple, tight backbeat, and can't always prevent that damn E string from
ringing when it really shouldn't), but I can usually get by without too much of
a thought on a simple progression.&lt;/p&gt;
&lt;a href="#double-stops-are-awesome"&gt;&lt;h2 id="double-stops-are-awesome"&gt;Double stops are awesome&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Lately I've been getting a kick out of double stop harmonies. I know those can
sound great in a lead context, but I've mostly used those when playing backup
so far, and I just love coming up with parts that outline the progression in a
nice and subtle way. Those often don't sound that interesting on their own, but
can add a really nice touch in context with other instruments, and it's an
approach I rarely get to take on accoustic guitar.&lt;/p&gt;
&lt;p&gt;As an example, I've been playing a very simple &lt;a href="https://www.youtube.com/watch?v=NTVvmCAEg3A" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Niagara&lt;/a&gt; song with a
bunch of friends, which is basically 3 chords played over and over.
Here's the progression twice, once with the classic bluegrass chop chords, and
then with more common (and easier) major positions:&lt;sup id="fnref:transposed"&gt;&lt;a class="footnote-ref" href="#fn:transposed"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/mandolin-one-year/niagara-chords.png" /&gt;
&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/mandolin-one-year/chords.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;And here's what I came up with after fooling around with chord tones:&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/mandolin-one-year/niagara-double-stops.png" /&gt;
&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/mandolin-one-year/doublestops.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;Kinda "meh" on its own, but here's how it sounds in "context" (ie with just a
guitar backup and some quick approximation of the melody. Mando deliberatly too
loud in the mix to try and make the part stand out):&lt;/p&gt;
&lt;p&gt;&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/mandolin-one-year/fullex.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;I still don't have a good feel for when that approach is right for the groove,
and I can see how this could get tiresome if overused, but right now I'm having
a blast exploring that kind of lines. I kind of think of them like trombone parts
in a New Orleans Jazz band, even though they're in a much higher register and
therefore have a very different effect on the overall feel.&lt;/p&gt;
&lt;a href="#running-over-thin-ice-kiss-is-hard"&gt;&lt;h2 id="running-over-thin-ice-kiss-is-hard"&gt;Running over thin ice: KISS is hard&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;As far as melody goes, I've mostly kept fooling around and haven't really put
much thought into it beyond getting a few more scales patterns under my fingers.
Theory wise, I'm not doing anything more complex than what I described in
&lt;a href="https://www.rgaz.fr/blog/getting-started-on-the-mandolin/" rel="noopener" target="_blank"&gt;my previous note&lt;/a&gt;. I'll stop and analyze what's going on
when I need to, but I'm trying to let my ears do the driving most of the time.&lt;/p&gt;
&lt;p&gt;Dive head first, see what happens, and laugh it off when it goes horribly wrong.
Which, needless to say, happens pretty often. Sometimes I manage to get back on
my feet, sometimes I don't. Crash and burn, that's how you learn.&lt;sup id="fnref:crash-and-burn"&gt;&lt;a class="footnote-ref" href="#fn:crash-and-burn"&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Technique is clearly the one point that's lagging behind. The new tuning is starting
to make sense in my head, but that won't do as long as the fingers don't internalize
it too. So right now my eyes are still stuck to the fretboard, and I regularly get
confused with some move that would have worked on the guitar, or overshoot a fret
and land on a nasty minor second.&lt;sup id="fnref:jazz"&gt;&lt;a class="footnote-ref" href="#fn:jazz"&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;I tell myself to keep things simple, but I have a hard time forcing the left
hand to stay quiet. It seems like the muscle memory happily kicks in, not
realizing it's in uncharted territory. The brain hears all the mistakes, but the
fingers keep wiggling around like nothing happened. Maybe there's an unconscious
"I can get out of this mess by playing more stuff" thing going on, too.&lt;/p&gt;
&lt;p&gt;So I can tell I'm going to need a bit more discipline in that area.&lt;/p&gt;
&lt;p&gt;One way I'm thinking of fixing this is to force myself to use a lot more of what
I'm calling "pseudo tremolo",&lt;sup id="fnref:tremolo"&gt;&lt;a class="footnote-ref" href="#fn:tremolo"&gt;6&lt;/a&gt;&lt;/sup&gt; which is the same idea as regular tremolo
but keeping the rhythm to regular 8th or 16th notes instead of going for the full
effect.&lt;/p&gt;
&lt;p&gt;Basically doing this:&lt;/p&gt;
&lt;p&gt;&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/mandolin-one-year/pseudotrem.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;instead of this:&lt;/p&gt;
&lt;p&gt;&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/mandolin-one-year/actualtrem.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;It doesn't sound as cool (at least, not as cool as it would if I didn't suck at
it to begin with), but it gets the job done and should give me time to think while
still filling out the space nicely. Also, I should definitely start doing more of
that on guitar. It won't sound quite as full, but I have a hunch it can still be
pretty effective and should make for a nice change of pace.&lt;/p&gt;
&lt;a href="#tone-is-in-the-hands"&gt;&lt;h2 id="tone-is-in-the-hands"&gt;Tone is in the hands&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Technique is also crucial to get a good tone. And while the mechanics are familiar
enough that's it's pretty easy to play &lt;em&gt;something&lt;/em&gt;, making it sound good is another
matter.&lt;/p&gt;
&lt;p&gt;I could tell right away that I wasn't sounding quite right and would need to
adjust a few things to produce something decent. But it seems like I've underestimated
the matter by quite a bit.&lt;/p&gt;
&lt;p&gt;Every instrument is different, and I knew from the get go that getting to know a
new one well enough to truly make it shine was going to take a while. I already
get tripped up when switching to a different guitar, so I wasn't expecting to get
there in a copple of month.&lt;/p&gt;
&lt;p&gt;Well, turns out that even sounding good enough for a quick jam is trickier than I
thought.&lt;/p&gt;
&lt;p&gt;Mandolin technique seems to be far more demanding than guitar, and simply getting
used to the new string tension is not enough. I thought my fretting hand was doing
okay at the whole "play with the very tip of your fingers" thing, but I quickly
found out that I still had quite a lot of room for improvement on that front.&lt;/p&gt;
&lt;p&gt;The good thing is that I know how to improve: slow the hell down and put in the
hours. It's gonna take a while, but only time can fix the habit. I also know
that its better to play simple stuff with good tone than the other way around, so
I don't mind focusing on it and doing my chores, as it should help with the points
I already discussed above.&lt;/p&gt;
&lt;p&gt;It's slowly getting better, and I feel like it's transfering back to my guitar
playing, too. It's pretty subtle, to the point that maybe I'm imagining it. But
I noticed a while ago that some of my &lt;a href="https://www.youtube.com/watch?v=G0mmDLlIxII" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;favourite guitar players&lt;/a&gt;,&lt;sup id="fnref:andy"&gt;&lt;a class="footnote-ref" href="#fn:andy"&gt;7&lt;/a&gt;&lt;/sup&gt;
tonewise, had also played or even got started with the mandolin, and judging from
the fact than it's just harder make the eight-stringer sing, I suspect this is
not a coincidence.&lt;/p&gt;
&lt;p&gt;Is there really something to it ? I dunno. Time will tell, I guess.&lt;/p&gt;
&lt;a href="#nice-gear-is-nice"&gt;&lt;h2 id="nice-gear-is-nice"&gt;Nice gear is nice&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Most of my early playing was done on a &lt;a href="https://www.youtube.com/watch?v=v8LsP_X7pbE" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Gretsch New Yorker&lt;/a&gt; a friend had
lent me. It's pretty nice, but I decided early on that I should get one of my own
if I decided to get serious about it.&lt;/p&gt;
&lt;p&gt;My first impulse was to just grab a Loar, as another friend plays one so I knew
they were descent enough and they don't cost too much. But for some reason I
couldn't find one on any european shop&lt;sup id="fnref:euro-shop"&gt;&lt;a class="footnote-ref" href="#fn:euro-shop"&gt;8&lt;/a&gt;&lt;/sup&gt; when I started looking at the
beginning of last fall.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.sagamusic.com/products/mandolin-family/kentucky/?orderby=price" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Kentucky&lt;/a&gt;&lt;sup id="fnref:kentucky"&gt;&lt;a class="footnote-ref" href="#fn:kentucky"&gt;9&lt;/a&gt;&lt;/sup&gt; and &lt;a href="https://www.eastmanguitars.com/md305" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Eastman&lt;/a&gt; were the two brands that
emerged from my online searches, but again, I couldn't find a good deal on one
for a while. Price wise, the Eastman was clearly out of my budget, but I was
willing to shell out on a used one if nothing else came up.&lt;/p&gt;
&lt;p&gt;Finally found one at &lt;a href="https://theacousticshoppe.com/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;the accoustic shoppe&lt;/a&gt;. It was 200 bucks
off because of a minor ding in the finish, the seller had a pretty good reputation,
and it was located in the netherlands. Seemed like a no-brainer.&lt;/p&gt;
&lt;p&gt;It arrived pretty well packed&lt;sup id="fnref:packed"&gt;&lt;a class="footnote-ref" href="#fn:packed"&gt;10&lt;/a&gt;&lt;/sup&gt; and, more importantly, perfectly set up.
My first few strums had that awfull ring you get when the strings are less than
a few hours old, which tells me they were put on right before sending.&lt;/p&gt;
&lt;p&gt;I really don't know enough yet about this instrument to attempt a full review,
but I'm more than satisfied. I still haven't given my friend his Gretsch back,
so I've had the occasion to compare the two, and while the New Yorker is far
from ridiculous, I can tell it's in a different league.&lt;/p&gt;
&lt;p&gt;So that's cool, as I know I won't feel the need to upgrade for a while (and if
I ever do, hopefully by then I'll have a better idea of what I'm looking for).&lt;/p&gt;
&lt;p&gt;Next step is to get a decent pickup. I'll probably reach for a &lt;a href="https://www.kksound.com/mandolin-twin" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;K&amp;amp;K&lt;/a&gt;, as I
already have a pure mini on my guitar and haven't had to complain so far. And
I'll probably start fooling around with strings pretty soon (I've kept to the
standard D'addario set so far, but I'm very curious to hear how flatwounds behave
on that thing).&lt;/p&gt;
&lt;p&gt;Knowing myself, I'm sure I'll get to try tonerings, arm rests and whatever fancy
gadget I come across at some point, but this can wait. Trying out gear can be fun,
but I'm not quite in that mood these days, and I'd rather wait until I start
knowing what I'm doing before indulging with &lt;abbr title="Gear Acquisition Syndrome"&gt;GAS&lt;/abbr&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="An action figure of Lemmy Killminster standing upon a mandolin.." class="full-width" loading="lazy" src="https://www.rgaz.fr/img/mandolin-one-year/lemmy.jpg" title="Who the hell needs 8 fuckin strings on a bass ?"&gt;&lt;/p&gt;
&lt;a href="#shut-up-and-play"&gt;&lt;h2 id="shut-up-and-play"&gt;Shut up and play&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Allright. Time to wrap this up.&lt;/p&gt;
&lt;p&gt;Mandolin is freaking cool. I'd been tempted to try it for a while now, and I'm
glad I finally got to it.&lt;/p&gt;
&lt;p&gt;It's a much less common sound than guitar,&lt;sup id="fnref:uncommon"&gt;&lt;a class="footnote-ref" href="#fn:uncommon"&gt;11&lt;/a&gt;&lt;/sup&gt; and just like banjo, this
can be enough to stand out, especially in my neck of the woods. I'd be lying if
I pretended I'm not hoping this will land me a few more gigs when I'm a bit more
dependable with it.&lt;/p&gt;
&lt;p&gt;Also, I'm enjoying it way more than banjo.&lt;/p&gt;
&lt;p&gt;But the best part is defnitely getting to troll fiddle players by telling them
you now realize how easy their lines actually are (completely disregarding the
fact that they don't get to cheat with fancy frets, or that I would have no idea
what to do with a bow).&lt;/p&gt;
&lt;p&gt;Bonus points if you back that up by trying to play their parts back at them while
being out of tune. Trust me, they'll love it!&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:background"&gt;
&lt;p&gt;Keep in mind I've been playing guitar for 20+ years, which is helping &lt;em&gt;a lot&lt;/em&gt;.
The process feels like figuring out how to apply things I already know, rather
than learning them from scratch.&lt;/p&gt;
&lt;p&gt;It won't last forever, but this does flatten the initial learning curve by
quite a bit.&amp;#160;&lt;a class="footnote-backref" href="#fnref:background" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:hard-keys"&gt;
&lt;p&gt;I &lt;em&gt;really&lt;/em&gt; should spend more time on minor keys. Also, fuck E flat.&amp;#160;&lt;a class="footnote-backref" href="#fnref:hard-keys" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:transposed"&gt;
&lt;p&gt;I wrote it in A because that's where we play it and it's less of a pain to
notate (also I didn't think to check before writing it all down and can't
be arsed to fix it after the fact), but the original is in A flat.&lt;/p&gt;
&lt;p&gt;Just move everything down one fret if you wanna play along the original. Who
knew avoiding open strings could have its uses ?&amp;#160;&lt;a class="footnote-backref" href="#fnref:transposed" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:crash-and-burn"&gt;
&lt;p&gt;I know this is far, &lt;em&gt;far&lt;/em&gt; easier said that done, and I'm far from being as
confident as my boasting may make me sound. But I do know that the best way
to overcome the fear of failure is to fall flat on your face and realize it's
not as terrible as it sounds.&lt;/p&gt;
&lt;p&gt;Repeatedly.&lt;/p&gt;
&lt;p&gt;Which is why I try and put myself in situations where I'll have no choice
but to jump in and see how it goes.&amp;#160;&lt;a class="footnote-backref" href="#fnref:crash-and-burn" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:jazz"&gt;
&lt;p&gt;Again, laugh it off and call it jazz.&amp;#160;&lt;a class="footnote-backref" href="#fnref:jazz" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:tremolo"&gt;
&lt;p&gt;Actual &lt;a href="https://www.youtube.com/watch?v=V-sNrMyYY_k" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;tremolo&lt;/a&gt; is pretty cool, too, but it's still too hit and miss
for me to rely on it. Yet another neat thing I'll have to consciously avoid
for a while.&amp;#160;&lt;a class="footnote-backref" href="#fnref:tremolo" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:andy"&gt;
&lt;p&gt;I could listen to this guy play "Mary had a little lamb" all day.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=loqgpe1bpbs" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Sierra Hull&lt;/a&gt;'s doing pretty good, too.&amp;#160;&lt;a class="footnote-backref" href="#fnref:andy" title="Jump back to footnote 7 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:euro-shop"&gt;
&lt;p&gt;I don't mind buying from an US dealer on principles, but taxes and shipping
make this a pretty dumb move these days.&lt;/p&gt;
&lt;p&gt;Also, &lt;a href="https://theacousticshoppe.com/a/blog/recording-king-and-alvarez-restoring-into-legendary-brands" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;this&lt;/a&gt; seems to explain why they can't be found right
now. Maybe they'll pop up again.&amp;#160;&lt;a class="footnote-backref" href="#fnref:euro-shop" title="Jump back to footnote 8 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:kentucky"&gt;
&lt;p&gt;Got to try one a few months ago. They're pretty nice!&amp;#160;&lt;a class="footnote-backref" href="#fnref:kentucky" title="Jump back to footnote 9 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:packed"&gt;
&lt;p&gt;The box was big enough to hold three of those and weighed almost nothing,
which prompted the delivery guy to joke that it was probably empty.&amp;#160;&lt;a class="footnote-backref" href="#fnref:packed" title="Jump back to footnote 10 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:uncommon"&gt;
&lt;p&gt;I've already had people asking me what it was, almost every time I played it
in public.&lt;/p&gt;
&lt;p&gt;Still waiting for someone to call it an ukulele.&amp;#160;&lt;a class="footnote-backref" href="#fnref:uncommon" title="Jump back to footnote 11 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="music"/></entry><entry><title>A tune from Canada: L'air mignonne</title><link href="https://www.rgaz.fr/blog/a-tune-from-canada-lair-mignonne/" rel="alternate"/><published>2026-04-20T15:00:00+02:00</published><updated>2026-04-20T15:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2026-04-20:/blog/a-tune-from-canada-lair-mignonne/</id><summary type="html">&lt;p&gt;Here's a cute little tune for y'all.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Wanting to remember how recording&lt;sup id="fnref:nozoom"&gt;&lt;a class="footnote-ref" href="#fn:nozoom"&gt;1&lt;/a&gt;&lt;/sup&gt; even worked, I decided to &lt;a href="https://www.youtube.com/watch?v=DFalXoDhurA&amp;amp;pp=ygUObCdhaXIgbWlnbm9ubmU%3D" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;cover this
canadian tune&lt;/a&gt; at some point during last fall. Took me way longer than I
care to admit to finally come up with something vaguely interesting, and I hated
the sound I was getting, so I shelved the project.&lt;/p&gt;
&lt;p&gt;Had to plug in the microphone again last week for my last &lt;a href="https://www.rgaz.fr/blog/still-enjoying-the-mandolin/" rel="noopener" target="_blank"&gt;mandolin article&lt;/a&gt;,
and I thought I'd try my hand at it again.&lt;/p&gt;
&lt;p&gt;Well, here's what I ended up with:&lt;/p&gt;
&lt;style&gt;
  @media only screen and (min-width: 810px) {
    audio#player { width: 67%; }
  }
&lt;/style&gt;

&lt;p&gt;&lt;audio id="player" controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/mignonne/l'air_mignonne.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;I learned the tune at a local jam session about a year ago, and immediately fell
in love with it. It's a dance piece, the kind where everyone just plays the melody
over and over until everybody gets sick of it. I didn't expect that approach to
work so well with only plucked strings, so I figured I'd turn it into a fiddle
tune and have the intruments take turns improvising over it.&lt;/p&gt;
&lt;p&gt;Which turned out more difficult than I thought. It seems that the simpler the
melody, the more I'll struggle to come up with interesting things while staying
close to it. So that's where I spent most of my time when I first tried it.&lt;/p&gt;
&lt;p&gt;I made a point to improvise each break, so no take was ever the same as the previous
one (although ideas from previous attempts obvisously crept up). In retrospect,
that's a bit silly, and I could have used the opportunity to write down structured
solos. Would have been a good exercise and I probably would have ended up with
something cooler. Must be some stupid pride thing, like I don't want to "cheat"
or something. Oh well.&lt;/p&gt;
&lt;p&gt;Not a huge fan of the mix, but I'm no sound engineer, and that's the best I can
do given my crappy room and crappier skills. I can hear most of what's going on,
but that's because I know what I played, and I still wish things were a bit
clearer.&lt;/p&gt;
&lt;p&gt;The banjo track is from my first attempt back in October or November.&lt;sup id="fnref:tight-banjo"&gt;&lt;a class="footnote-ref" href="#fn:tight-banjo"&gt;2&lt;/a&gt;&lt;/sup&gt;
Everything else was redone over the last few days. I reluctantely did a bit of
editing magic, mostly to redo the guitar break&lt;sup id="fnref:takes"&gt;&lt;a class="footnote-ref" href="#fn:takes"&gt;3&lt;/a&gt;&lt;/sup&gt; and the mandolin ending
(it was fine in the take I'd kept, but sounded like crap for some reason. I'm
guessing I moved in a wrong spot while recording, and I couldn't fix it with EQ).&lt;/p&gt;
&lt;p&gt;Track by track recording is weird, and I know I'll always miss the energy of a
live band, but hey. It's its own kind of fun until perfectionism kicks in and
you get lost in tweaking things forever.&lt;/p&gt;
&lt;p&gt;Hopefully I've learned a thing or two in the process. We'll see when I get to
the next tune.&lt;/p&gt;
&lt;p&gt;Here's a picture of the whole crew, from low to high:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Instruments (a bass, an accoustic guitar, a mandolin and a banjo) sitting on a couch" class="full-width" loading="lazy" src="https://www.rgaz.fr/img/mignonne/plucking_crew.jpg" title="Say hi to the plucking crew!"&gt;&lt;/p&gt;
&lt;p&gt;Purists will have to forgive me for the electric bass. Ain't no way I can fit
an upright in my appartment.&lt;/p&gt;
&lt;p&gt;Oh, and if you don't speak French, the title means something like "The cute air",
which sounds like crap in English. "The cute melody" ? Meh. What matters is that
it's pretty cute indeed.&lt;/p&gt;
&lt;p&gt;Hope you'll like it. See ya when the bug bites again.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:nozoom"&gt;
&lt;p&gt;As in "serious recording", with a &lt;abbr title="Digital Audio Workstation"&gt;DAW&lt;/abbr&gt; and all.&lt;/p&gt;
&lt;p&gt;Setting up the old zoom recorder is simple enough, but it won't do for multi
tracking.&amp;#160;&lt;a class="footnote-backref" href="#fnref:nozoom" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:tight-banjo"&gt;
&lt;p&gt;I know it is slightly off-beat in the first section, but fuck it.&lt;/p&gt;
&lt;p&gt;It won't sound anything like the old take if I try to fix it now, so I'll
have to redo the entire track if I want to fix it, and I just can't be
bothered.&amp;#160;&lt;a class="footnote-backref" href="#fnref:tight-banjo" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:takes"&gt;
&lt;p&gt;That took an embarassing number of takes.&lt;/p&gt;
&lt;p&gt;Beyond the actual playing, it took me &lt;em&gt;ages&lt;/em&gt; before I could get something
that didn't sound like garbage.&lt;/p&gt;
&lt;p&gt;In the end, that's the instrument I like the most, tone wise, but boy, that
took some luck.&amp;#160;&lt;a class="footnote-backref" href="#fnref:takes" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="music"/></entry><entry><title>The quest for quests</title><link href="https://www.rgaz.fr/blog/the-quest-for-quests/" rel="alternate"/><published>2026-05-16T18:00:00+02:00</published><updated>2026-05-16T18:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2026-05-16:/blog/the-quest-for-quests/</id><summary type="html">&lt;p&gt;Game dev is hard, but doing it badly is still pretty fun.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Like many, I got into programming by &lt;a href="https://inventwithpython.com/invent4thed/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;making small games&lt;/a&gt;. Being a fan
of &lt;abbr title="Role Playing Games"&gt;RPGs&lt;/abbr&gt;, I almost immediately wanted to try and make one&lt;sup id="fnref:my-first-game"&gt;&lt;a class="footnote-ref" href="#fn:my-first-game"&gt;1&lt;/a&gt;&lt;/sup&gt;, which
led me to discover the &lt;a href="https://en.wikipedia.org/wiki/Roguelike" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;roguelike&lt;/a&gt; genre. Since I sucked at doing anything
graphical, those were perfect to mess around without having to actually try and
draw stuff. Over the following years, I have started and abandoned about three
roguelike games&lt;sup id="fnref:barbar3"&gt;&lt;a class="footnote-ref" href="#fn:barbar3"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;None of those projects were ever intended to become "true" games, or to ever get
finished for that matter. I found that game design seems to interest me about as
much as visual work. Rather, I was having fun implementing the various systems
and trying to come up with an architecture that made some kind of sense.&lt;/p&gt;
&lt;p&gt;It's been a while since I fooled around with some pseudo-game, but lately I've
been thinking of a few ideas. Trying my hand at networking. Exploring procedural
generation a little more, or trying to run a simple simulation.&lt;/p&gt;
&lt;p&gt;I'm not sure what finally decided me, but one of those ideas seemed simple enough
that I finally got started on something about three weeks ago.&lt;/p&gt;
&lt;p&gt;Well, here's what I've got:&lt;/p&gt;
&lt;a href="#introducing-questing-quest-working-title"&gt;&lt;h2 id="introducing-questing-quest-working-title"&gt;Introducing Questing Quest (working title)&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;&lt;/p&gt;
&lt;canvas class=emscripten id=canvas oncontextmenu=event.preventDefault() tabindex=0&gt;&lt;/canvas&gt;
&lt;p id="output" /&gt;
&lt;script&gt;
    var Module = {
        print: (function() {
            var element = document.getElementById('output');
            if (element) element.value = ''; // clear browser cache
            return function(text) {
                if (arguments.length &gt; 1) text = Array.prototype.slice.call(arguments).join(' ');
                console.log(text);
                if (element) {
                  element.value += text + "\n";
                  element.scrollTop = element.scrollHeight; // focus on bottom
                }
            };
        })(),
        canvas: (function() {
            var canvas = document.getElementById('canvas');
            return canvas;
        })(),
        locateFile: function(f, script_dir) {
          return "/post_static/quest_proto/" + f;
        }
    };
&lt;/script&gt;
&lt;script&gt;
  var canvas = document.querySelector("canvas");
  canvas_keydown = function(e) {
      if (e.keyCode == 9) {
        canvas.blur();
      }
      e.preventDefault();
  }
  canvas.addEventListener("focus", function() {
    window.miniaudio.devices[0].webaudio.resume();
    canvas.addEventListener("keydown", canvas_keydown);
  })
  canvas.addEventListener("blur", function() {
    window.miniaudio.devices[0].webaudio.suspend();
    canvas.removeEventListener("keydown", canvas_keydown);
  })
  // Ogod.
  // So, gmae tries to play audio when loaded, which is blocked by the browser
  // until some event (a "user gesture") demonstrate the user is ready to interact
  // with the page. Fine.
  // What I want is to keep the volume off until the game actually gets focus,
  // but all I can do is *kill* the audio context (via its close method), which
  // loses the audio data so we can't resume it afterwards.
  // Hence the shenanigans of repeateadly trying to suspend it until it finally
  // shuts up on a regular click.
  // I'm sure this will all break in some new, unforeseen and hilarious way before
  // noon. Fuck all this shit.
  var killed = false;
  window.addEventListener("click", function(e) {
    if (e.target != canvas) {
      function killsound() {
        if (killed) return;
        console.log("kill!");
        if (window.miniaudio.devices[0].webaudio.state !== "suspended") {
          window.miniaudio.devices[0].webaudio.suspend();
          killed = true;
        } else {
          setTimeout(killsound, 5);
        }
      }
      killsound();
    }
  }, { capture: true });
&lt;/script&gt;
&lt;script async type="text/javascript" src="https://www.rgaz.fr/post_static/quest_proto/game.js"&gt;&lt;/script&gt;

&lt;ul&gt;
&lt;li&gt;Click on the image above to let the game respond to input.&lt;/li&gt;
&lt;li&gt;Click outside to give back focus to the page and get your regular keybindings
  back.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;escape&lt;/code&gt; while the game has focus to kill it and stop the music.&lt;/li&gt;
&lt;li&gt;Refresh the page to restart the game.&lt;sup id="fnref:overlay"&gt;&lt;a class="footnote-ref" href="#fn:overlay"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's pretty clunky (I'm truly sorry for the awful collision detection) and ugly
as hell but hey, it works. There's no win or lose condition, and frankly no real
gameplay to speak of.&lt;/p&gt;
&lt;p&gt;Oh, and it only responds to keyboard events. So I guess you're out of luck if
you're viewuing this on a tablet or a phone.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;p&gt;I wrote it in C&lt;sup id="fnref:wasm"&gt;&lt;a class="footnote-ref" href="#fn:wasm"&gt;4&lt;/a&gt;&lt;/sup&gt; and stole a bunch of assets from &lt;a href="http://itch.io/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Itch.io&lt;/a&gt;, which
explains why the art style is so inconsistent.&lt;sup id="fnref:vader"&gt;&lt;a class="footnote-ref" href="#fn:vader"&gt;5&lt;/a&gt;&lt;/sup&gt; A friend of mine sent
me unfinished chiptunes he was working on while I was fooling with this thing, so
I shamelessly put them in to test the audio system. I'm not sure they really fit
whatever mood this thing is supposed to have, but I do like them for what they
are. So thanks, Tom!&lt;/p&gt;
&lt;p&gt;The original goal was simply to try and come up with a way to handle quests.
Which led me to implement rudimentary dialog and event systems, so pretty much
everything I never got to try my hand at with my previous roguelike attempts.&lt;/p&gt;
&lt;p&gt;Obviously, I got distracted along the way and messed with a whole lot of other
"gamey" things, to the point that I've barely tested the quest thing even though
that was supposed to be the starting point of all this.&lt;/p&gt;
&lt;p&gt;So that's the "game". Bump into an npc to activate a quest randomly chosen from
a huge pool of... well, 2. Once activated, this quest will spawn either an enemy
or an item in a random zone around the one you start in. Getting the item or
killing the monster will update the quest.&lt;/p&gt;
&lt;p&gt;That's it. Game of the year material, I'm sure.&lt;/p&gt;
&lt;p&gt;By the way, if you think the result above is ugly, know that it started looking
like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ugly screenshot of the game's first look. Mostly white with a few colored squares." loading="lazy" src="https://www.rgaz.fr/img/quests/beginning_gfx.jpg"&gt;&lt;/p&gt;
&lt;p&gt;It might still suck, but it did come a long way, is what I'm getting at.&lt;/p&gt;
&lt;a href="#going-low-level"&gt;&lt;h2 id="going-low-level"&gt;Going low level&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Unimpressive as it may be, this is the biggest thing I ever done in C,&lt;sup id="fnref:loc"&gt;&lt;a class="footnote-ref" href="#fn:loc"&gt;6&lt;/a&gt;&lt;/sup&gt; and
I'm getting a kick out of it. I've been wanting to try my hand at lower level
stuff for a while, and somehow I found I enjoyed writing good old C quite a bit,
despite all its infuriating quirks.&lt;/p&gt;
&lt;p&gt;I dunno. Maybe I just enjoy pretending I'm an old greybeard. But I do think I'm
starting to understand the benefits of simplicity, and C shines on that front.
Also, managing to have it do what I want without segfaulting each time I change
something&lt;sup id="fnref:segfaults"&gt;&lt;a class="footnote-ref" href="#fn:segfaults"&gt;7&lt;/a&gt;&lt;/sup&gt; is pretty gratifying, coming from higher level languages
like python.&lt;/p&gt;
&lt;p&gt;I'm still strugling to truly isolate sub-systems (seems like every module always
need to &lt;code&gt;#include&lt;/code&gt; 12 other files that probably should be left alone), but the
code doesn't quite feel like a ball of mud yet.&lt;sup id="fnref:callback-hell"&gt;&lt;a class="footnote-ref" href="#fn:callback-hell"&gt;8&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Part of that might be due to resisting the urge to try and be clever. Most of the
code is pretty dumb, and therefore quite easy to follow. I didn't try to get
fancy with architecture either: entitites are a single fat struct, and everything
is stored in static arrays (the lib I'm using for hashmaps does some dynamic
allocations, but there's not a single &lt;code&gt;malloc&lt;/code&gt; in my own code).&lt;/p&gt;
&lt;p&gt;No fancy macros either beyond a few simple shortcuts. The fanciest ones I have
are dead simple and still quite useful to simulate varargs functions:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;typedef&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;EventType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;union&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// generic pointer for event that only need one parameter&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;generic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// data for event type T&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// shortcut to create an event&lt;/span&gt;
&lt;span class="cp"&gt;#define Mk_Event(T, ...) (Event){ .type = (T), __VA_ARGS__}&lt;/span&gt;

&lt;span class="c1"&gt;// Actual event-queuing function&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Event_Emit_impl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Actual interface, allowing multiple arguments that will get dispatched among&lt;/span&gt;
&lt;span class="c1"&gt;// the various union members of the Event struct&lt;/span&gt;
&lt;span class="cp"&gt;#define Event_Emit(T, ...) Event_Emit_impl(Mk_Event(T, __VA_ARGS__))&lt;/span&gt;

&lt;span class="c1"&gt;// Now I can fire event with data relevent to their type as easily as:&lt;/span&gt;
&lt;span class="n"&gt;Event_Emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EVENT_TYPE_SOMETHING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;some_data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Event_Emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EVENT_TYPE_T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;666&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Event_Emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EVENT_TYPE_WHATEVER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Oh, and &lt;a href="https://blog.ryanmartin.me/tagged-unions" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;tagged unions&lt;/a&gt; are awesome. I turned almost &lt;em&gt;every&lt;/em&gt; data
structure I needed into one.&lt;/p&gt;
&lt;p&gt;Starting things in the dumbest possible ways means that I inevitably had to rewrite
large parts of the program as I realized I needed to handle things differently,
but those went pretty well overall. I suspect the simplicity of the original code
helped: easier to add complextity to something braindead than to change code
that's already trying to be clever.&lt;/p&gt;
&lt;a href="#whats-next"&gt;&lt;h2 id="whats-next"&gt;What's next ?&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;So I started out with a pretty simple goal and ended up with a pretty bad "game"
that barely exercizes it. And I realize that I'll have to actually try and turn
that game into &lt;em&gt;something&lt;/em&gt; if I want to see if what I've implemented actually
holds out.&lt;/p&gt;
&lt;p&gt;The thing is, I can already feel the interest fleeting away. It's kind of weird.
Usually when the itch starts scratching, I get obsessed and spend all my time on
whatever it is I got into until I get sick of it.&lt;/p&gt;
&lt;p&gt;Not so this time. I happened not to have much to do over the last weeks, so I
kept at it mostly to keep busy, but at a fairly relaxed pace. Who knows, maybe
this will help me hold my interest for  longer that unsual ?&lt;/p&gt;
&lt;p&gt;There's still about a billion things to do before this thing becomes remotely
interesting, but again, I find my fun in implementing systems I'm not familiar
with and have them kind of work, so I don't care if it remains weird and clunky.&lt;/p&gt;
&lt;p&gt;I'll be away at the end of the month and pretty busy in june, so I don't expect
to do a lot on this thing in the near future. But if the bug bites again, I do
have a bunch of ideas to try out (assuming I still can understand a single line
when (and if) I decide to get back to this project)).&lt;/p&gt;
&lt;p&gt;So we'll see if this thing ever gets completed. I know it probably won't ever
amount to much as a game, but hopefully I'll manage to at least try my systems
in a situation closer to a real life scenario. Most of the stuff I want to
fool with is still fairly technical, but who knows, maybe I'll also try to write
a stupid little story to build on as well.&lt;/p&gt;
&lt;p&gt;I may mention this project again if I manage to make some progress on it. Or
maybe I'll just shelve the whole thing and never touch it again. Wait and see,
I guess.&lt;/p&gt;
&lt;p&gt;In case anyone's interested, the current code is &lt;a href="https://git.rgaz.fr/raphi/QuestingQuest" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;So. I dunno if there's much of interest to this post. But it's all I have to
celebrate this blog's first birthday. Let's see if it's still around next year.&lt;/p&gt;
&lt;p&gt;See ya until then, interwebs!&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:my-first-game"&gt;
&lt;p&gt;I never cared about the &lt;abbr title="Massively Multiplaer Online. You know, like WoW."&gt;MMO&lt;/abbr&gt; kind, though. So that's at least one silly
overambitious project I never got into.&amp;#160;&lt;a class="footnote-backref" href="#fnref:my-first-game" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:barbar3"&gt;
&lt;p&gt;The latest in date being &lt;a href="https://github.com/raphigaziano/barbar3" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;that one&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I remember abandoning at the point I had to re-do the inventory system after
about 2 months of obsessing over tha whole project. For some reason, that was
the last straw.&amp;#160;&lt;a class="footnote-backref" href="#fnref:barbar3" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:overlay"&gt;
&lt;p&gt;Compiling to WebAssembly and putting it up on a page is pretty straigthforward,
but interacting with it once it's loaded seems to be another can of worms.
Sorry for the poor integration, I had to hack the generated js wrapper to
try and make it a bit more bearable.&amp;#160;&lt;a class="footnote-backref" href="#fnref:overlay" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:wasm"&gt;
&lt;p&gt;Which I then compiled to &lt;a href="https://webassembly.org/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;WebAssembly&lt;/a&gt; to host it on here.&amp;#160;&lt;a class="footnote-backref" href="#fnref:wasm" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:vader"&gt;
&lt;p&gt;No idea where the Darth Vader sprite comes from. I nicked it from the web
maybe ten years ago and found it back in some old silly thing I wrote back
then.&lt;/p&gt;
&lt;p&gt;Also, be thankful I resisted the temptation of grabbing the Wilhelm scream
for the spider death sound effect.&amp;#160;&lt;a class="footnote-backref" href="#fnref:vader" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:loc"&gt;
&lt;p&gt;It's a bit over 2000 lines of code, so still not &lt;em&gt;huge&lt;/em&gt; or anything.&amp;#160;&lt;a class="footnote-backref" href="#fnref:loc" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:segfaults"&gt;
&lt;p&gt;Or even better, understanding &lt;em&gt;what&lt;/em&gt; causes the segfault under 3 hours.&amp;#160;&lt;a class="footnote-backref" href="#fnref:segfaults" title="Jump back to footnote 7 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:callback-hell"&gt;
&lt;p&gt;Although I can see the event system devolving into callback hell if I'm not
careful.&amp;#160;&lt;a class="footnote-backref" href="#fnref:callback-hell" title="Jump back to footnote 8 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="bits"/></entry><entry><title>The history of the Web</title><link href="https://www.rgaz.fr/blog/the-history-of-the-web/" rel="alternate"/><published>2026-05-24T22:45:00+02:00</published><updated>2026-05-24T22:45:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2026-05-24:/blog/the-history-of-the-web/</id><summary type="html">&lt;p&gt;Sharing a pretty cool resource about how the web took shape.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've been willing to share links to other places a bit more on here for a while,
reflecting that hyperlinks &lt;em&gt;are&lt;/em&gt; the essence of web and that the more of those,
the better.&lt;/p&gt;
&lt;p&gt;Part of doing that involves adding more sources to my &lt;a href="/feedboard/" rel="noopener" target="_blank"&gt;RSS aggregator&lt;/a&gt;,
which I'm slowly doing,&lt;sup id="fnref:ugly"&gt;&lt;a class="footnote-ref" href="#fn:ugly"&gt;1&lt;/a&gt;&lt;/sup&gt; but I figure posting one off links to stuff I happen
to find interesting is fine too.&lt;/p&gt;
&lt;p&gt;I'm not sure whether I should add a dedicated page for this or simply treat those
as regular posts. In the interest of doing what's easiest, I'll go for the second
option for now and introduce a new category.&lt;/p&gt;
&lt;p&gt;And so, I stumbled upon this site chronicling the early days of the web the other
day while researching some facts about the era of the AOL portal, and thought
it'd make for a fine first place to share:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://thehistoryoftheweb.com" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;The History of the Web&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It's both a book in the writing and a blog, and it's pretty neat.&lt;/p&gt;
&lt;p&gt;I've been reading through the archives over the last few days and I've learned a
lot. My favourite tidbit so far is how &lt;a href="https://www.billboard.com/pro/megadeth-created-first-artist-website-30-years-ago-how-it-happened/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Megadeth was apparently the first high
profile band to have a promotional website back in 1994&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I got online around 1999, maybe 2000, and I was too young back then to care about
what was actually happening. To a true early adopter, I was part of the &lt;a href="https://en.wikipedia.org/wiki/Eternal_September" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;latecomers
who started to ruin it all&lt;/a&gt;. But the sense of wonder described
in many of Hoffmann's post was still there, and even though I didn't give it much
thought or realize what it meant, I remember it.&lt;/p&gt;
&lt;p&gt;So I'm feeling some weird nostalgia as I read, as even though I didn't know most
of the sites he describes, I did get to tinker with their direct successors.&lt;/p&gt;
&lt;p&gt;It's interesting to see how fast business came in the picture, too. I knew about
the dot com bubble, but somehow I had the impression that the commercialization
of the web happened a tad later. Maybe I simply get that period confused with
the one before it, when the internet was still ruled by &lt;a href="https://en.wikipedia.org/wiki/Usenet" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Usenet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It also reminds me that the history of technology is both fascinating and important.
And the web and its early promises are part of that history, right on the heels
on the UNIX wars.&lt;/p&gt;
&lt;p&gt;I'm convinced that knowing at least a little bit of that story is one of the keys
if we ever want to take back some kind of control over it, if only to learn to
recognize the bullshit behind the hype cycles of today.&lt;/p&gt;
&lt;p&gt;So hats off to Jay Hoffmann, doing his part to spread the tale. See ya and good
reading.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:ugly"&gt;
&lt;p&gt;I should really try and make it a bit less ugly someday.&amp;#160;&lt;a class="footnote-backref" href="#fnref:ugly" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="links"/></entry><entry><title>Spot the difference</title><link href="https://www.rgaz.fr/blog/spot-the-difference/" rel="alternate"/><published>2026-06-08T20:00:00+02:00</published><updated>2026-06-17T17:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2026-06-08:/blog/spot-the-difference/</id><summary type="html">&lt;p&gt;I don't care if you use AI. I'd appreciate being told if you're gonna use it on me, though.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;link rel="stylesheet" href="/theme/dimbox/css/dimbox.min.css" /&gt;&lt;/p&gt;
&lt;style&gt;
.side-by-side {
  width: 32%;
  display: inline;
}
&lt;/style&gt;

&lt;p&gt;&lt;a href="http://daddysdrunkagain.net" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Daddy's Drunk Again&lt;/a&gt;, my bluegrass duet, has a gig booked in my hometown
at the beginning of next month. The bar where we'll play has already contacted
the local press to announce the concert, and has provided them with a photo they
found on our website.&lt;/p&gt;
&lt;p&gt;So far, so good. Nothing out of the ordinary.&lt;/p&gt;
&lt;p&gt;But the other half of that duet noticed that the picture, as published by some local
news sites, had been edited, undoubtedly by some kind of generative AI.&lt;/p&gt;
&lt;p&gt;Check it out (original photo on the left, altered one on the right, click on the
pictures to get them in full size):&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.rgaz.fr/img/aidda/original.jpg" data-dimbox="img-gallery" data-dimbox-caption="Original"&gt;
  &lt;img alt="Two musicians busking in the street." class="side-by-side" loading="lazy" src="https://www.rgaz.fr/img/aidda/altered.webp"&gt;
&lt;/a&gt;
&lt;a href="https://www.rgaz.fr/img/aidda/altered.webp" data-dimbox="img-gallery" data-dimbox-caption="AI Altered"&gt;
  &lt;img alt="Same as above, but with weird artefacts all over the place." class="side-by-side" loading="lazy" src="https://www.rgaz.fr/img/aidda/altered.webp"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I appreciate how the bot helpfully hid my pinky sticking out (a bad habit of mine
that tends to get captured every time someone reaches for a camera). Too bad said
pinky looks like it's been cut off as a result. Also, it apparently decided I
should be playing an E chord instead of whatever I was doing.&lt;/p&gt;
&lt;p&gt;But beyond laughing at the silly details, my main reaction is to ask &lt;strong&gt;why ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I'm not claiming the original picture was perfect, and I'm sure it could use some
editing. I honestly don't have an eye for that stuff. But I don't see how the
one that got published is any better, even disregarding the various nonsensical
modifications that just make it look fake.&lt;/p&gt;
&lt;p&gt;I suspect someone (I doubt it was the bar that booked us) simply used an automated
editing tool "just in case",&lt;sup id="fnref:autoedit"&gt;&lt;a class="footnote-ref" href="#fn:autoedit"&gt;1&lt;/a&gt;&lt;/sup&gt; without noticing or caring that the tool
integrated with some AI that happily hallucinated random changes no one had
asked for.&lt;/p&gt;
&lt;p&gt;Which makes no sense to me. Using the original file would have been &lt;em&gt;faster&lt;/em&gt; than
messing with it, &lt;em&gt;and&lt;/em&gt; would have looked better.&lt;/p&gt;
&lt;p&gt;The other hyposthesis is that no one even &lt;em&gt;did&lt;/em&gt; anything, and that some piece
of software (an email client, a phone OS, a &lt;abbr title="Content Management System"&gt;CMS&lt;/abbr&gt; platform... who knows) automatically
decided to "enhance" the picture as it passed through it. I know &lt;a href="https://www.bbc.com/future/article/20250822-youtube-is-using-ai-to-edit-videos-without-permission" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;youtube has
done this&lt;/a&gt;, and &lt;a href="https://www.bbc.com/future/article/20260203-the-ai-that-quietly-edits-all-of-your-photos" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;phones have been offering this feature&lt;/a&gt;
for a while now.&lt;/p&gt;
&lt;p&gt;The first option would be disapointing. The second one is terrifying to me.&lt;/p&gt;
&lt;p&gt;I guess that's what they mean when they say you can't escape AI. Whether you like
it or not, &lt;em&gt;someone&lt;/em&gt; is going to force it on you no matter what. And here I am
hoping that that &lt;em&gt;someone&lt;/em&gt; is at least human.&lt;/p&gt;
&lt;p&gt;This particular example is just one out of a billion, but it's the first time it
happens to me and I'm split between getting pissed and not even caring.&lt;/p&gt;
&lt;p&gt;It's not an embarassing or incrinminating deepfake. It's not conveying false
information,&lt;sup id="fnref:false-information"&gt;&lt;a class="footnote-ref" href="#fn:false-information"&gt;2&lt;/a&gt;&lt;/sup&gt; and its reach it gonna stay pretty limited,
so it's really not a huge deal. But still.&lt;/p&gt;
&lt;p&gt;Had we decided to use AI to edit our stuff, then whether or not that was worth
it would be our problem. But we didn't, and now this fake version of us is out
there, potentially making us look like AI endorsers (we both stand pretty firmly
on the "anti" side of this debate).&lt;/p&gt;
&lt;p&gt;All this for no benefit whatsoever to anyone.&lt;/p&gt;
&lt;p&gt;I'll contact the website as soon as I'm done ranting here and ask if the file
can be replaced, as well as whether the alteration was intentional of not. I don't
plan to point my finger or blame anyone for this, as I just don't see what use
that would be. But I would like to know when and where that happened, and which
of the two hypothesis I mentioned above is right.&lt;/p&gt;
&lt;p&gt;We'll see if something comes out of it. I'll edit this post or write a new one
if it's of any interest.&lt;/p&gt;
&lt;p&gt;Until then, I'll keep bitching to myself about how the web is getting more and
more fucked with each passing day.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Post Scriptum:&lt;/p&gt;
&lt;p&gt;So I wanted to link to a specific example of unsollicited AI modifications I
remembered reading about some months, maybe a year ago. I went looking for it and
gave up after almost two hours of finding nothing but adds pointing to stupid
online, AI powered and proud of it editing tools.&lt;/p&gt;
&lt;p&gt;Fuck you, internet.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Edit 2026/17/06:&lt;/p&gt;
&lt;p&gt;After investigating for a day, procrastinating for a week, and then taking on
the case again yesterday, I now know my first hypothesis was the right one. The
bar apologized and admited to using an AI tool to try and make the photo a bit
less blurry, and didn't notice the modifications.&lt;/p&gt;
&lt;p&gt;I get it. I'm always tempted to automate that kind of routine fixes too, and while
I'm sure it would piss off a professional designer, my untrained eyes wouldn't
be able to tell the difference. The real problem here is really that the so called
"tool" decided on its own to mess with random bits of the picture even though
no one ever asked it to.&lt;/p&gt;
&lt;p&gt;Tools aren't supposed to act on their own, by the way.&lt;/p&gt;
&lt;p&gt;We're talking about a small local business that probably has a million other
things to do here, and the scale is pretty small. So all in all this particular
story is not a huge deal.&lt;/p&gt;
&lt;p&gt;But seeing the rest of the world being more and more okay to rely on those things
for anything more serious is just crazy to me.&lt;/p&gt;
&lt;p&gt;Anyway. Problem solved ?&lt;/p&gt;
&lt;p&gt;Not quite.&lt;/p&gt;
&lt;p&gt;The picture was submitted to a "local events" site hosted by a regional newspaper,
which is sourced by various institutional sites. The former was updated this morning.
The latter aren't as I'm writing this.&lt;/p&gt;
&lt;p&gt;Maybe I just have to wait a bit and the data will update on its own. Or maybe
someone needs to trigger a manual refresh. I have no idea.&lt;/p&gt;
&lt;p&gt;I'll wait for a few days and see if I need to ask for that refresh or not.&lt;/p&gt;
&lt;p&gt;Sigh.&lt;/p&gt;
&lt;script src="/theme/dimbox/js/dimbox.min.js"&gt;&lt;/script&gt;

&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:autoedit"&gt;
&lt;p&gt;As I often do, to be honest. I'm hopeless with graphical editing.&lt;/p&gt;
&lt;p&gt;I do stay clear of anything boasting to be AI powered, and I rarely try
anything fancier than cropping, but I guess I should be careful not to fall
in the same trap.&amp;#160;&lt;a class="footnote-backref" href="#fnref:autoedit" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:false-information"&gt;
&lt;p&gt;At least, nothing important. I doubt the bar in the background will care that
its signage is wrong.&lt;/p&gt;
&lt;p&gt;(It's called "L'hermine", by the way. No idea where that "O" comes from.)&amp;#160;&lt;a class="footnote-backref" href="#fnref:false-information" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="general"/></entry><entry><title>Please don't poop on my books</title><link href="https://www.rgaz.fr/blog/please-dont-poop-on-my-books/" rel="alternate"/><published>2026-06-18T15:30:00+02:00</published><updated>2026-06-18T15:30:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2026-06-18:/blog/please-dont-poop-on-my-books/</id><summary type="html">&lt;p&gt;Losing Alexandria all over again.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A while ago, the great library of Alexandria burned to the ground, and most
agreed that it was a crying shame.&lt;/p&gt;
&lt;p&gt;At least, most of the people who could read.&lt;/p&gt;
&lt;p&gt;A few centuries later, a bunch of weirdoes set out to build a new library, much
bigger than the old one, but instead of storing the books inside some dumb
building, they piled them up on the clouds, way up in the sky.&lt;/p&gt;
&lt;p&gt;That new library was accessible from anywhere in the world, and by then, most
people could actually read and benefit from it. The subscription fee was pretty
cheap, and cats ruled the whole place.&lt;/p&gt;
&lt;p&gt;It wasn't perfect, but overall it was pretty neat.&lt;/p&gt;
&lt;p&gt;And then at some point, some folks decided they'd rather eat poop than read books,
and set out to build machines to produce crap in industrial, never seen before
quantities.&lt;/p&gt;
&lt;p&gt;As far as volume, it was impressive indeed, and now Alexandria 2.0 is overflowing
with diarhea. From the floor to the ceiling, shit is everywhere. You can still
get at the old books, but they're buried under thousands of turds.&lt;/p&gt;
&lt;p&gt;I don't mean to kink shame anyone. What people chose to put in their mouths is
none of my business. But I do resent somewhat being told that I'd better learn
to enjoy the taste of feces just because a bunch of assholes decided to take a
dump on my plate.&lt;/p&gt;
&lt;p&gt;And now that the dung is leaking out of the shelves, it's starting to rain
manure, and people who chose to stay on the ground wonder why the drops suddenly
started to smell so bad. I hear the pigeons are going on strike over fears of
losing their jobs.&lt;/p&gt;
&lt;p&gt;The day Alexandria burned was a sad day indeed. But if we're gonna have to lose
all the concentrated knowledge and silly memes of humanity, somehow having it all
swallowed by flames feels more dignified that watching it disapear under a flood
of poop.&lt;/p&gt;</content><category term="tech"/></entry><entry><title>.git/info/exclude is awesome!</title><link href="https://www.rgaz.fr/blog/gitinfoexclude-is-awesome/" rel="alternate"/><published>2026-06-20T12:30:00+02:00</published><updated>2026-06-20T12:30:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2026-06-20:/blog/gitinfoexclude-is-awesome/</id><summary type="html">&lt;p&gt;Let's be enthusiastic about something for a change. And then apologize for a stupîd mistake, because nice things are no fun if you don't mess them up.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I spotted &lt;a href="https://nelson.cloud/.gitignore-isnt-the-only-way-to-ignore-files-in-git/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;this article&lt;/a&gt; a couple days ago, which shows some
alternative places to list files you want to exclude from being tracked in a Git
repository beyond the usual &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I knew about the global &lt;code&gt;~/.config/git/ignore&lt;/code&gt;, but never bothered with it. I
probably should, though. The &lt;code&gt;.DS_Store&lt;/code&gt;&lt;sup id="fnref:ds_store"&gt;&lt;a class="footnote-ref" href="#fn:ds_store"&gt;1&lt;/a&gt;&lt;/sup&gt; example is especially relevant.&lt;/p&gt;
&lt;p&gt;It always irks me to see those files in a local &lt;code&gt;.gitignore&lt;/code&gt;. My tools and the
various files they crap out shouldn't have anything to do with any individual
repo, so why should I have to list them all in there ?&lt;/p&gt;
&lt;p&gt;I can understand listing the most common ones anyway when many people work on
the code, to try and avoid mistakes by someone who didn't set his global config.
But I can still try and prevent &lt;em&gt;myself&lt;/em&gt; from telling the world about whatever
trivial script I decided to use on my machine, and for a small project that only
me will ever see, I just don't see the point having that info up on github.&lt;/p&gt;
&lt;p&gt;But the real gem is &lt;code&gt;.git/info/exclude&lt;/code&gt;. I'm feeling lazy, so I'll just quote
from the source:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The exclude file lives in the .git directory of every Git repository but
changes to it are not checked into Git. It usually has a few comment lines
on a fresh Git repository. This file is useful for ignoring things on a
per-repo basis. For example, you may have a personal notes.txt file in a
repository that you don’t want to check into git but you also don’t want to
add to .gitignore because it’s unique to your workflow. In that case you
would add notes.txt to .git/info/exclude.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had &lt;em&gt;no idea&lt;/em&gt; about that one, and man, it's perfect. I always end up with a
million of those small personal files littering the root of all my repos. Notes,
screenshots, small automation scripts specific to my environment, half assed
code experiments... It's usually quite a mess, and as a result I &lt;em&gt;never&lt;/em&gt; do
&lt;code&gt;git add .&lt;/code&gt; and always stage the files I want to commit manually.&lt;/p&gt;
&lt;p&gt;Not a big deal, but it gets annoying, and this seems like the perfect solution.&lt;sup id="fnref:no-mess"&gt;&lt;a class="footnote-ref" href="#fn:no-mess"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;I like this so much that I added this quick function to my &lt;code&gt;.bashrc&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git_exclude&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# WARNING: use quotes to surround glob patterns (ie prefix_*), as those get&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# expanded by the shell and we end up adding each individual, currently matching&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# file instead of the general pattern we wanted.&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Example:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# $ git_exclude test_*.sh&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# $ cat .git/info/exclude&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# test_foo.sh&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# test_bar.sh&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# VS&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# $ git_exclude &amp;quot;test_*.sh&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# $ cat .git/info/exclude&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# test_*.sh&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;.git/info/exclude
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It's not perfect, though. Sometimes I have files laying around that I don't want
to commit, but don't want to hide either. For instance, the various unfinished
drafts for this blog. So I guess I shouldn't lose the habit of &lt;em&gt;always&lt;/em&gt; checking
the &lt;code&gt;git status&lt;/code&gt; before doing anything, and the magical &lt;code&gt;git add .&lt;/code&gt;, no questions
asked, is still not guaranteed.&lt;/p&gt;
&lt;p&gt;But still. Excluding the rest at least make the status output less cluttered,
so I'll take it.&lt;/p&gt;
&lt;a href="#quick-digression-too-many-shortcuts-considered-harmfull"&gt;&lt;h2 id="quick-digression-too-many-shortcuts-considered-harmfull"&gt;Quick digression: Too many shortcuts considered harmfull&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;Back when I discovered Linux, I loved spending ages tweaking my &lt;code&gt;.dotfiles&lt;/code&gt;,
and I had a million aliases and shortcuts like the one above, most of them collected
from around the web.&lt;/p&gt;
&lt;p&gt;I finally grew weary of the constant fiddling and learned to leave things alone.
I still add a small thing now and then, but it's a lot more rare, and I always
wait for a while before commiting it to my dotfiles repo.&lt;/p&gt;
&lt;p&gt;The kind of tricks I learned to avoid are the ones that mostly serve to avoid
learning the basic unix commands. I remember having a bunch of aliases to
automatically add a bunch of flags to &lt;code&gt;grep&lt;/code&gt;, which were very handy on my machine.&lt;/p&gt;
&lt;p&gt;But as a result, I had no idea how to do a simple search as soon as I was in a
different environment. Which was a lot of fun when I had to search logs on a
remote server to try and understand an urgent bug.&lt;/p&gt;
&lt;p&gt;I still can't be arsed to remember most of the flags to grep, but I did memorize
the two I constantly use&lt;sup id="fnref:grep-flags"&gt;&lt;a class="footnote-ref" href="#fn:grep-flags"&gt;3&lt;/a&gt;&lt;/sup&gt; and force myself to just spell them out
when I look for something. A quick check of the man page can fill in the rest,
and I don't even need that 99% of the time.&lt;/p&gt;
&lt;p&gt;I had similar "helpers" for &lt;code&gt;find&lt;/code&gt; and a bunch of other common commands. It's
fine to be lazy for the more esoteric stuff, especially if you don't  need it
often, but if it ends up crippling your understanding of the basics, it gets
counter-productive. I got rid of most of those shortcuts a few years ago.&lt;/p&gt;
&lt;p&gt;That one feels similar to be honest. I can tell I mostly wrote it to avoid having
to remember the file's location, which is probably not worh it. On the other hand,
my fat fingers love to mess up quotes and angled brackets, and paired with the
shell completion of filenames, I can see that function preventing many stupid
typos. Seems worth a try anyway, time will tell if I keep it around or not.&lt;/p&gt;
&lt;a href="#dont-worry-i-can-still-make-a-fool-of-myself"&gt;&lt;h2 id="dont-worry-i-can-still-make-a-fool-of-myself"&gt;Don't worry, I can still make a fool of myself.&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;This article was supposed to end here, but while playing around with the exclude
file, I noticed I had a few trivial edits on previous articles. So I committed
them and pushed them on the live site.&lt;/p&gt;
&lt;p&gt;Apparently I had forgotten to set this note's status to "draft", so it got published
as well. While it contained nothing but a few lines outlining what I planned to
write, littered with TODOs.&lt;sup id="fnref:todofixme"&gt;&lt;a class="footnote-ref" href="#fn:todofixme"&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;I saw it pop into my feed reader, and sure enough, it had already been picked
up by various aggregators:&lt;/p&gt;
&lt;p&gt;&lt;img alt="A screenshot of the list of recent posts on the trendy aggregator bubbles.town, including the messed up version of this article." class="full-width" loading="lazy" src="https://www.rgaz.fr/img/gitignore/bubbles.png"&gt;&lt;/p&gt;
&lt;p&gt;Oops.&lt;/p&gt;
&lt;p&gt;I'm not proud of that one. I don't mind passing for a fool, but polluting the feeds
of others with objective crap sucks. Information overload is enough of a problem
already not to add to it with stupid goofs. Sorry about that.&lt;/p&gt;
&lt;p&gt;I do appreciate the irony of this happening right when I was talking about my git
process and how it could use some improvements, though.&lt;/p&gt;
&lt;p&gt;Also, let's not mention that this happened right after my bitching about the
&lt;a href="https://www.rgaz.fr/blog/spot-the-difference/" rel="noopener" target="_blank"&gt;uncontrolled proliferation of some AI crap&lt;/a&gt;, which I still have to
try and fix, okay ? At least this time I had nothing to do with it.&lt;/p&gt;
&lt;p&gt;I had thought about setting up some hooks to deploy the site on a push to the
remote but put it off out of lazyness and a general distrust of too much automation
(see above). It definitely could have saved me here, as I only commit the articles
when they're done.&lt;/p&gt;
&lt;p&gt;Oh well. Live and learn. Guess I'll get on this before messing up again.&lt;/p&gt;
&lt;p&gt;Sorry internet. I didn't mean to add to the ever expanding ocean of slop. If that
makes it any better, at least that one drop was 100% human generated.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:ds_store"&gt;
&lt;p&gt;Some configuration file used on macs. No idea what it's for.&amp;#160;&lt;a class="footnote-backref" href="#fnref:ds_store" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:no-mess"&gt;
&lt;p&gt;I guess learning some discipline and &lt;em&gt;not&lt;/em&gt; making a mess in the first place
works too, but where's the fun in that ?&amp;#160;&lt;a class="footnote-backref" href="#fnref:no-mess" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:grep-flags"&gt;
&lt;p&gt;&lt;code&gt;-r&lt;/code&gt; and &lt;code&gt;-n&lt;/code&gt;, respectively for recursively searching (especially handy as
it means I don't have to specify a specific file as long as I'm fine including
the current working directory) and for showing line numbers before the matches.&amp;#160;&lt;a class="footnote-backref" href="#fnref:grep-flags" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:todofixme"&gt;
&lt;p&gt;I giggled while typing the TODO FIXME.&lt;/p&gt;
&lt;p&gt;That was my nickname at work, as I did tend to leave a lot of those around.
I got a bit better at cleaning them up since then, but not by much. On a first
draft I still have no shame abusing them, though. A quick search for them is
part of my publishing ritual.&lt;/p&gt;
&lt;p&gt;Obviously, this doesn't help when the whole thing gets uploaded to prod when
it shouldn't.&amp;#160;&lt;a class="footnote-backref" href="#fnref:todofixme" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="bits"/></entry><entry><title>Doc Watson lick on the mandolin</title><link href="https://www.rgaz.fr/blog/doc-watson-lick-on-the-mandolin/" rel="alternate"/><published>2026-06-22T19:30:00+02:00</published><updated>2026-06-22T19:30:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2026-06-22:/blog/doc-watson-lick-on-the-mandolin/</id><summary type="html">&lt;p&gt;Rambling about music day and stealing from the late Doc Watson.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Yesterday was &lt;a href="https://en.wikipedia.org/wiki/F%C3%AAte_de_la_Musique" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;music day&lt;/a&gt; in France. If you're not from this part
of the world and don't know what music day is, basically it's a national event
where anyone is allowed to play music in the streets.&lt;/p&gt;
&lt;p&gt;It's supposed to celebrate amateur musicians and on paper, I'm all for this.&lt;sup id="fnref:amateur"&gt;&lt;a class="footnote-ref" href="#fn:amateur"&gt;1&lt;/a&gt;&lt;/sup&gt;
In practice though, I tend not to go.&lt;/p&gt;
&lt;p&gt;In big cities such as where I live, it tends to draw huge crowds, and the older
I get the less I tolerate being cramped with a mass of people, no matter the
occasion. It's not phobic or anything, but it does tend to kill any enjoyment I
could otherwise get from what's going on.&lt;/p&gt;
&lt;p&gt;Also, and this might be specific to Nantes, the sheer amount of loudspeakers
blasting away while located not 100 yards from each other tend to produce a wall
of sonic mud that quickly gets tiresome. Call me a snob, but this, in addition
to my previous point, tends to ruin the mood for me.&lt;/p&gt;
&lt;p&gt;If you enjoy partying in the streets, go for it. But if you're like me, then
here's a couple of tips:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In city centers, try and find a spot somewhat isolated from the busier locations.
  You don't have to wander far: a small park, a place, some side street off from
  the main roads... Anything surrounded by walls or trees to cut off the sound.&lt;/p&gt;
&lt;p&gt;Those don't necesserally do much for the crowd, but at least you get to hear
one band at a time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you can, go to a smaller town. You'll see less things, but the overall
  atmosphere tends to be a lot more relaxed.&lt;/p&gt;
&lt;p&gt;Those tend to celebrate music day a day or two before the official June 21st
date, so if you'd like to have the louder experience too, you can enjoy both!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And that's it for the travel tips.&lt;sup id="fnref:travel-tips"&gt;&lt;a class="footnote-ref" href="#fn:travel-tips"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;I had planned to stay home and enjoy a nice conversation with my fan, before
noticing that I was all out of cigarettes. So if I was gonna head downtown
anyway, might as well hang around for a bit.&lt;/p&gt;
&lt;p&gt;Stumbled on a friend who was setting up to play in a decent spot, so I stayed and
enjoyed his set (he did have to fight the surrounding noise, but he managed to
stay on top of it). So overall, it was allright, and reminded me that's it's been
a while since I wrote something about music, so here's a post about my favourite
classic guitar lick and how easy it is to adapt to the mandolin.&lt;/p&gt;
&lt;a href="#the-doc-lick"&gt;&lt;h2 id="the-doc-lick"&gt;The Doc lick&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;If you've listened to bluegrass music for any length of time, then you've heard
this lick. It might be older, but &lt;a href="https://en.wikipedia.org/wiki/Doc_Watson" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Doc Watson&lt;/a&gt; is clearly the one
who popularized it. You'll spot it everywhere in his playing. Which you should
definitely listen to every day, because Doc is Awesome.&lt;/p&gt;
&lt;p&gt;It's based on a very simple move I touched on the last time I wrote about
&lt;a href="https://www.rgaz.fr/blog/so-you-wanna-get-into-bluegrass-lead-guitar/#dirty-3rds" rel="noopener" target="_blank"&gt;bluegrass guitar&lt;/a&gt;, which basically consists of rocking back and forth
between the minor and major third, making sure that the second of those notes
falls on an open string to emphasize the dissonance.&lt;/p&gt;
&lt;p&gt;Surround this with a simple motif from the major scale, and you get this:&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/doc-lick/basic.png" /&gt;
&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/doclicks/basic.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;It's really all about the two highlighted notes. Everything around it is just
idiomatic filler, and there's a million possible variations you could come up
with.&lt;/p&gt;
&lt;p&gt;A very simple one I like to use is to simply turn the first two notes into a
triplet:&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/doc-lick/triplet.png" /&gt;
&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/doclicks/triplet.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;Of course, you can also repeat the dissonant pair. Doc tends to stick to playing
it twice, while &lt;a href="https://www.youtube.com/watch?v=wkUGDYjYgMs" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Billy Strings likes to keep going and get real nasty&lt;/a&gt;
before resolving.&lt;/p&gt;
&lt;p&gt;Personally, I quite like repeating this whole four note motif when it's appropriate:&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/doc-lick/repeat.png" /&gt;
&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/doclicks/repeat.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;It's trickier than it looks and sounds best on faster tunes. I should definitely
work on it to clean it up, but it's a nice way to fill up space without having to
think too much, even though that one could get tiresome if used too often, so
chose your moment wisely.&lt;/p&gt;
&lt;p&gt;The lick is typically played out of the C position, but it works great in G, too
(As Billy demonstrated in the example I linked above):&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/doc-lick/g-variant.png" /&gt;
&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/doclicks/g.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;For some reason, it's much rarer to hear it in this key, even though Doc himself
plays it right in the first measure of &lt;a href="https://www.youtube.com/watch?v=sQVjmpxSDnE" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Beaumont Rag&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/doc-lick/beaumont.png" /&gt;
&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/doclicks/beaumont.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;(Not an exact transposition of his version, but close enough to get the point.)&lt;/p&gt;
&lt;p&gt;Again, this is just the tip of the iceberg. It's one of those licks you could
spend your life exploring, and many have already. And it's certainly one that
creeps up again and again in my own playing.&lt;/p&gt;
&lt;a href="#i-thought-this-post-was-about-mandolin"&gt;&lt;h2 id="i-thought-this-post-was-about-mandolin"&gt;I thought this post was about mandolin&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;The one question I did &lt;em&gt;not&lt;/em&gt; ask myself was how to transpose this lick to the
mandolin.&lt;/p&gt;
&lt;p&gt;Instead, it happened by accident. I just goofed up while fooling around in the
key of C and recognized that classic dirty third color. From there, it wasn't
hard to reproduce the whole lick:&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/doc-lick/mando-version.png" /&gt;
&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/doclicks/mando.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;It looks and feels very similar to the guitar version, so it's quite natural
to pick up despite the different scale layout (the one bit that trips up my
six-stringer brain is the open A, but that's not too bad. I guess I could grab
it on the third string (seventh fret), though. I'll have to experiment and see
which version sounds better&lt;sup id="fnref:which-sounds-better"&gt;&lt;a class="footnote-ref" href="#fn:which-sounds-better"&gt;3&lt;/a&gt;&lt;/sup&gt;).&lt;/p&gt;
&lt;p&gt;I played with it for a while, and then wondered why I couldn't seem to recall
hearing that particular move played on mandolin.&lt;/p&gt;
&lt;p&gt;I could be way off base, here. I haven't really gone fishing for mandolin licks
yet, and mostly kept to exploring the fretboard on my own. Also, my ear isn't
that great, and seems to recognize familiar patterns rather than actual notes
or melodic motifs, so while I enjoy hearing other instruments doing their thing,
I often have a hard time figuring out what they're playing.&lt;/p&gt;
&lt;p&gt;Still, that color is distinctive enough that it feels like I should recognize
it when it happens.&lt;/p&gt;
&lt;p&gt;I'm sure it does crop up and that I'll think of an example right after publishing
this article. But assuming it &lt;em&gt;is&lt;/em&gt; used less often, the reason why is probably
pretty simple.&lt;/p&gt;
&lt;p&gt;Bluegrass guitar player are infamous for using capos and playing &lt;em&gt;everything&lt;/em&gt;
out of G or C, so the Watson lick is always right under our fingers. Also, Doc
was such a huge influence on the genre that you're bound to come across it over
and over, so it's no wonder that it quickly becomes a no-brainer.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=IEZPA1p7tOk" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;Mandolinists tend not to use cheaters so much&lt;/a&gt;,&lt;sup id="fnref:no-cheater"&gt;&lt;a class="footnote-ref" href="#fn:no-cheater"&gt;4&lt;/a&gt;&lt;/sup&gt; though,
and while you could move this lick to a closed position,&lt;sup id="fnref:six-frets-span"&gt;&lt;a class="footnote-ref" href="#fn:six-frets-span"&gt;5&lt;/a&gt;&lt;/sup&gt; it
kind of needs the third to fall on an open string to truly shine, which drastically
limits the number of keys where it's available or convenient.&lt;/p&gt;
&lt;p&gt;The version I notated above is in C, and moving it to the lower strings lands you
in F or in B flat, which are much less common than A or D in Bluegrass or Old Time
music.&lt;/p&gt;
&lt;p&gt;They do happen, though, and they're also a lot more common in jazz, so I hope
I'll think of it next time I end up jamming on a swing tune. Haven't tried it
yet, but I'm pretty sure it'll fit and I would hate to miss the chance to troll
jazzers with some country twang.&lt;/p&gt;
&lt;p&gt;So try it out when you get a chance. Stealing from other instruments is always
fun, and stealing from Doc is even better. There's no reason why guitarists should
be the only ones allowed to do so.&lt;/p&gt;
&lt;p&gt;Here's one more for the road, this time in context (if playing at random and out
of time qualifies as "context"):&lt;/p&gt;
&lt;p&gt;&lt;img class="lilypond-img" src="/img/lilypond/doc-lick/mando-longer.png" /&gt;
&lt;audio controls preload="none"&gt;
  &lt;source src="https://www.rgaz.fr/snd/doclicks/mando-jam.mp3" type="audio/mpeg"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;See ya internet, and keep on picking!&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:amateur"&gt;
&lt;p&gt;Coming from me, "amateur" is not a slur.&lt;/p&gt;
&lt;p&gt;In fact, I'd argue that we should have something like it for all other art
forms. Theater, painting, hula hooping...&lt;/p&gt;
&lt;p&gt;Amateur art is important, and should be encouraged and celebrated, but why
should music be the only discipline to get its national day ?&amp;#160;&lt;a class="footnote-backref" href="#fnref:amateur" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:travel-tips"&gt;
&lt;p&gt;What do you mean, those would have been more useful had them been published
&lt;em&gt;before&lt;/em&gt; music day ?&amp;#160;&lt;a class="footnote-backref" href="#fnref:travel-tips" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:which-sounds-better"&gt;
&lt;p&gt;I suspect they'll both sound fine on their own but have a slightly different
feel that will fit better depending on the situation. That's how those things
usually turn out.&amp;#160;&lt;a class="footnote-backref" href="#fnref:which-sounds-better" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:no-cheater"&gt;
&lt;p&gt;I used to wonder why, but I'm starting to get it. Mandolin, at least in
Bluegrass, tend to rely a lot less on open strings (especially when playing
backup, when you don't want anything ringing), so capos just don't make as
much sense.&lt;/p&gt;
&lt;p&gt;I'll still look for a chance to use one just to piss off the purists, though.&amp;#160;&lt;a class="footnote-backref" href="#fnref:no-cheater" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:six-frets-span"&gt;
&lt;p&gt;A six fret span on the mandolin is only slightly uncomfortable, which sounds
crazy to my guitarist's brain.&amp;#160;&lt;a class="footnote-backref" href="#fnref:six-frets-span" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="music"/></entry><entry><title>A pelican plugin to avoid publishing drafts</title><link href="https://www.rgaz.fr/blog/a-pelican-plugin-to-avoid-publishing-drafts/" rel="alternate"/><published>2026-06-24T14:00:00+02:00</published><updated>2026-06-25T13:00:00+02:00</updated><author><name>raphi</name></author><id>tag:www.rgaz.fr,2026-06-24:/blog/a-pelican-plugin-to-avoid-publishing-drafts/</id><summary type="html">&lt;p&gt;My quick and dirty solution to avoid spamming your feed with crap.&lt;/p&gt;</summary><content type="html">&lt;p&gt;So &lt;a href="https://www.rgaz.fr/blog/gitinfoexclude-is-awesome/#dont-worry-i-can-still-make-a-fool-of-myself" rel="noopener" target="_blank"&gt;I messed up a few days ago and accidentally published a draft that got picked
up by various RSS aggregators and I felt pretty dumb about it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Turns out those aggregators routinely check for dead links and suppress them, so
the entry disapeared on its own after a few hours.&lt;/p&gt;
&lt;p&gt;But still, knowing myself, I'm sure it'll happen again and I'd rather avoid
spamming unfinished crap into people's feeds if I can, so I started thinking
about setting up some guard rails.&lt;/p&gt;
&lt;p&gt;First thing that came to mind was to use git hooks, or maybe Forgejo's equivalent
to Github actions, and basically only deploy the site when articles get pushed
to the remote repository.&lt;/p&gt;
&lt;p&gt;But thinking about it more, I realized that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It's way too hot to read documentation.&lt;/li&gt;
&lt;li&gt;Generating the site on a push means I would have to do it on the server.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The second point is not such a big deal, but right now I'm building the site on
my local machine and uploading the results via a simple &lt;code&gt;rsync&lt;/code&gt;, and I love the
simplicity of this setup.&lt;/p&gt;
&lt;p&gt;That's the whole beauty of static sites.&lt;/p&gt;
&lt;p&gt;So if I ever need something fancier for deployment, I'll get to it, but until
then I'd rather keep my current process.&lt;/p&gt;
&lt;p&gt;Well. Let's turn the problem around. Rather than building the site when content
gets pushed, let's instead check the local repository as we generate the articles.&lt;/p&gt;
&lt;p&gt;Easiest way to do that was to write a pelican plugin, so that's what I did.
Here's what I ended up with if anyone cares:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;logging&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pelican&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;warn_and_skip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;skip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;skip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Skipping article generation&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;articles&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;skip_outta_git&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="c1"&gt;# NOTE: this gets called *after* filtering out articles that pelican already&lt;/span&gt;
    &lt;span class="c1"&gt;# skips (like those with a draft status), so no need to explicitely check&lt;/span&gt;
    &lt;span class="c1"&gt;# for the &amp;quot;published&amp;quot; flag.&lt;/span&gt;

    &lt;span class="c1"&gt;# Bail out if the plugin is disabled&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GIT_CHECK_ENABLED&amp;quot;&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 class="k"&gt;return&lt;/span&gt;

    &lt;span class="n"&gt;skip_ignored&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GIT_SKIP_IGNORED&amp;quot;&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 class="n"&gt;skip_modified&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GIT_SKIP_MODIFIED&amp;quot;&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 class="n"&gt;skip_untracked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GIT_SKIP_UNTRACKED&amp;quot;&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 class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;article&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;articles&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;src_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;source_path&lt;/span&gt;
        &lt;span class="c1"&gt;# Check for ignored files. This may be overkill, but better to err on&lt;/span&gt;
        &lt;span class="c1"&gt;# the side of caution.&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;skip_ignored&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;proc_check_ignore_return_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;git&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;check-ignore&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-q&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;src_path&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;proc_check_ignore_return_code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;warn_and_skip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;src_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is set to published, but is ignored by git.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;skip_ignored&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="c1"&gt;# Check for untracked files or uncommited changes.&lt;/span&gt;
        &lt;span class="n"&gt;proc_check_status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;git&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--porcelain=1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;src_path&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;capture_output&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 class="n"&gt;text&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 class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;proc_check_status&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; M&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;warn_and_skip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;src_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; contains unstaged modification.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;skip_modified&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;??&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;warn_and_skip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;src_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is set to published but is not tracked in git.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;skip_untracked&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c1"&gt;# Log and skip any other output, just to be safe.&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;warn_and_skip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;git status --porcelain=1 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;src_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&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 class="n"&gt;generator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot; Pelican plugin registration. &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;article_generator_pretaxonomy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skip_outta_git&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;So now the blog will simply skip generating an article if its markdown source
file is not tracked by git yet, hopefully ensuring that I won't publish a draft
again.&lt;/p&gt;
&lt;p&gt;I can disable it in my local &lt;code&gt;pelicanconf.py&lt;/code&gt; to check stuff on my machine, and
as long as I override it in &lt;code&gt;publishconf.py&lt;/code&gt;, I should be fine if I decide to
deploy minor edits in the meantime.&lt;/p&gt;
&lt;p&gt;But truly, the real highlight of this afternoon project was that I got to use
the morse (&lt;code&gt;:=&lt;/code&gt;) operator, which always makes me happy.&lt;/p&gt;
&lt;p&gt;So it works, but as I started writing this note, I realized it had one pretty big
flaw: What if I decide to commit a draft ?&lt;/p&gt;
&lt;p&gt;Now that the file is checked in, the current code will let it pass. I'll get a
warning if I make a modification afterwards, but the more likely scenario looks
more like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Commit and push some changes, planning to finish the article later&lt;/li&gt;
&lt;li&gt;Go do something else&lt;/li&gt;
&lt;li&gt;Get back to the site, get distracted and start tweaking something unrelated,
  and decide to publish that tweak, confident that my system has my back.&lt;/li&gt;
&lt;li&gt;Get burned. Again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sure, I'll be fine as long I make sure to check the article's status. But then
I'm back to square one. Catching that very mistake is the whole point of writing
the damned code.&lt;/p&gt;
&lt;p&gt;Up until now, I've always edited my posts on the same machine and haven't felt
the need to track changes until an article is basically done. The only reason I
check them in to begin with is so the repo can serve as a "backup" of what's
been published.&lt;/p&gt;
&lt;p&gt;So this isn't a problem for me right now, but what if I change my mind ?&lt;/p&gt;
&lt;p&gt;Guardrails that only work on specific conditions are effectively useless, and
now that I spotted the problem, this false sense of security is making me nervous.&lt;/p&gt;
&lt;p&gt;Guess I'll have to think of something else.&lt;/p&gt;
&lt;a href="#an-exercise-in-simplification"&gt;&lt;h2 id="an-exercise-in-simplification"&gt;An exercise in simplification&lt;/h2&gt;
&lt;/a&gt;&lt;p&gt;This post is getting long already, so I'll spare you the details of what happened
next.&lt;/p&gt;
&lt;p&gt;I got the idea of checking the live site's RSS feed, and use that to tell if
an article is already public as pelican generates them. It worked, but as I
started cleaning up the code I realized, why bother ?&lt;/p&gt;
&lt;p&gt;I could just keep a list of all published urls in a local file. As the site gets
generated, I can just check for any article not already listed and ask the user
for a confirmation, adding it to the list if it gets approved.&lt;/p&gt;
&lt;p&gt;It's dumb and simple, reliable, and doesn't depend on specific habits that may
or may not fit the situation. No magic, no trying to be clever. Just a quick
explicit prompt to avoid getting caught with my pants down. The published cache
can be checked in version control with everything else, and correcting any mistake
is a simple edit.&lt;/p&gt;
&lt;p&gt;So that's what I went with. Generating the initial list is a bit annoying, as
you have to manually approve every single post that is already live,&lt;sup id="fnref:initial-gen"&gt;&lt;a class="footnote-ref" href="#fn:initial-gen"&gt;1&lt;/a&gt;&lt;/sup&gt;
but once that's done pelican will systematically ask me to confirm whether or not
I want to include any new article whenever I built the site. Here's what it looks
like in practice:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;rgaz&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;raphi@raphi-MS-7821:~/dev/web/rgaz$&lt;span class="w"&gt; &lt;/span&gt;make&lt;span class="w"&gt; &lt;/span&gt;html
&lt;span class="s2"&gt;&amp;quot;pelican&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/home/raphi/dev/web/rgaz/content&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/home/raphi/dev/web/rgaz/output&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/home/raphi/dev/web/rgaz/pelicanconf.py&amp;quot;&lt;/span&gt;
Article&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;test_ignored&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;has&lt;span class="w"&gt; &lt;/span&gt;not&lt;span class="w"&gt; &lt;/span&gt;yet&lt;span class="w"&gt; &lt;/span&gt;been&lt;span class="w"&gt; &lt;/span&gt;published.
Ship&lt;span class="w"&gt; &lt;/span&gt;it&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;y/n&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;n&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt; &lt;/span&gt;nope
Article&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;test_untracked&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;has&lt;span class="w"&gt; &lt;/span&gt;not&lt;span class="w"&gt; &lt;/span&gt;yet&lt;span class="w"&gt; &lt;/span&gt;been&lt;span class="w"&gt; &lt;/span&gt;published.
Ship&lt;span class="w"&gt; &lt;/span&gt;it&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;y/n&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;n&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt; &lt;/span&gt;go&lt;span class="w"&gt; &lt;/span&gt;away
Article&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;A pelican plugin to avoid publishing drafts&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;has&lt;span class="w"&gt; &lt;/span&gt;not&lt;span class="w"&gt; &lt;/span&gt;yet&lt;span class="w"&gt; &lt;/span&gt;been&lt;span class="w"&gt; &lt;/span&gt;published.
Ship&lt;span class="w"&gt; &lt;/span&gt;it&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;y/n&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;n&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt; &lt;/span&gt;yup
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;09&lt;/span&gt;:45:16&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;WARNING&lt;span class="w"&gt;  &lt;/span&gt;Skipping:&lt;span class="w"&gt; &lt;/span&gt;blog/test_ignored/&lt;span class="w"&gt;                                                                   &lt;/span&gt;plugin.py:98
&lt;span class="w"&gt;           &lt;/span&gt;WARNING&lt;span class="w"&gt;  &lt;/span&gt;Skipping:&lt;span class="w"&gt; &lt;/span&gt;blog/test_untracked/&lt;span class="w"&gt;                                                                 &lt;/span&gt;plugin.py:98
Done:&lt;span class="w"&gt; &lt;/span&gt;Processed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;37&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;articles,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;drafts,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;hidden&lt;span class="w"&gt; &lt;/span&gt;articles,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pages,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;hidden&lt;span class="w"&gt; &lt;/span&gt;pages&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;draft&lt;span class="w"&gt; &lt;/span&gt;pages&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.85&lt;span class="w"&gt; &lt;/span&gt;seconds.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It's a bit annoying to use locally, as the devserver loop messes up the input
and basically breaks everything, so I've disabled it in my local &lt;code&gt;pelicanconf.py&lt;/code&gt;,
and make sure to activate it in &lt;code&gt;publishconf.py&lt;/code&gt; so that I get the prompts when
it actually matters.&lt;/p&gt;
&lt;p&gt;Also, the code is a lot simpler than what I had before.&lt;sup id="fnref:shenanigans"&gt;&lt;a class="footnote-ref" href="#fn:shenanigans"&gt;2&lt;/a&gt;&lt;/sup&gt; Sadly the
morse operator is gone, though =(&lt;/p&gt;
&lt;p&gt;Maybe I'll polish it a bit and upload it to &lt;a href="https://pypi.org/" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;pypi&lt;/a&gt;. I tend to avoid doing so,
as most of the stuff I've been hacking together lately is pretty quick and dirty
and is usually tailored to my specific needs, and I'd rather avoit polluting the
official index with code that may very well be useless to anyone but me.&lt;sup id="fnref:useless-libs"&gt;&lt;a class="footnote-ref" href="#fn:useless-libs"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;But this thing seems generic enough that it just might be useful to someone else,
so I dunno. I'll test drive it for a little and see how it goes.&lt;/p&gt;
&lt;p&gt;In the meantime, the &lt;a href="https://git.rgaz.fr/raphi/pelican_shipit" referrerpolicy="no-referrer" rel="noopener noreferrer" target="_blank"&gt;repository is public&lt;/a&gt;, so you can
&lt;code&gt;pip install git+https://git.rgaz.fr/raphi/pelican_shipit&lt;/code&gt; it if you
really want to.&lt;/p&gt;
&lt;p&gt;See ya, Internets. Can't wait to see what my next stupid goof will look like.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Edit 2026/06/25:&lt;/p&gt;
&lt;p&gt;I renamed the plugin from the lame &lt;code&gt;check_published&lt;/code&gt; to &lt;code&gt;shipit&lt;/code&gt;, because I felt
like it. I've updated the repository's url above.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:initial-gen"&gt;
&lt;p&gt;Adding a script to automatically generate it should be easy enough, though.&amp;#160;&lt;a class="footnote-backref" href="#fnref:initial-gen" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:shenanigans"&gt;
&lt;p&gt;I do have to do some shenanigans to ensure the code only runs when I want it
to, but nothing too bad.&amp;#160;&lt;a class="footnote-backref" href="#fnref:shenanigans" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:useless-libs"&gt;
&lt;p&gt;The proliferation of useless libraries is a real problem. Many of them done
by eager beginners that don't realize the problems they're trying to solve
just aren't that interesting, of much of a real problem to begin with.&lt;/p&gt;
&lt;p&gt;Of course I've been that beginner. Hopefully I've learned some restraint since
then.&amp;#160;&lt;a class="footnote-backref" href="#fnref:useless-libs" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="bits"/></entry></feed>