<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://blog.legires.fr/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.legires.fr/" rel="alternate" type="text/html" /><updated>2026-07-02T14:03:25+00:00</updated><id>https://blog.legires.fr/feed.xml</id><title type="html">suivez le guide</title><subtitle>personal blog</subtitle><author><name>le guide</name></author><entry><title type="html">nouvelle école</title><link href="https://blog.legires.fr/2026/06/19/nouvelle_ecole.html" rel="alternate" type="text/html" title="nouvelle école" /><published>2026-06-19T00:00:00+00:00</published><updated>2026-06-19T00:00:00+00:00</updated><id>https://blog.legires.fr/2026/06/19/nouvelle_ecole</id><content type="html" xml:base="https://blog.legires.fr/2026/06/19/nouvelle_ecole.html"><![CDATA[<p>j’étais tranquille en train de dig sur soundcloud
quand je tombe sur
<a href="https://soundcloud.com/omfgitsmateo/side-hustle-lullaby">un son de fou malade</a>.</p>

<p>écoute un peu.
tête qui bounce,
je mets un like.</p>

<p>et puis… merde non, y’a un truc qui va pas.</p>

<p>j’écoute de plus près : ouais c’est une <strong>musique ia</strong>.
je retire le like, pas déconner.</p>

<p>alors les amis, parlons de la musique ia, parlons suno, parlons futur.</p>

<h2 id="comment-la-repérer-">comment la repérer ?</h2>

<p>(autre qu’avec le visuel ia dégueulasse qui va avec, s’entend)</p>

<p>c’est plus facile s’il y a des paroles.
trois indices :</p>

<p>un, les phrases trop longues.
les paroles s’étirent pour coller sur les temps forts.
ça fait un flow “chewing-gum”,
surtout parce que les mecs qui promptent savent pas chanter i guess.</p>

<p>deux, une inadéquation émotion-paroles.
elle capte pas la logique.
elle va se mettre à gueuler sur une phrase random 
juste parce qu’elle est pré-drop,
ou à chuchoter sur le bridge,
en gros à changer de style alors que les paroles
sont encore dans une suite logique de la phrase précédente.</p>

<p>trois, si la musique est pas en anglais.
c’est massivement entrainé sur des chansons anglaises,
en français ou autre ça bug plus facilement.</p>

<p>si y’a pas de paroles,
alors là c’est plus chaud.
on peut encore trouver en filtrant la musique.
pourquoi ?</p>

<p>va falloir rentrer dans le détail
de comment la saucisse est faite :</p>

<h2 id="la-musique-par-extrusion">la musique par extrusion</h2>

<p>la musique normale se fait par addition.</p>

<p>comme la musique d’orchestre qui résulte des instruments jouant ensemble,
on compose sur l’ordi en créant une ligne de basse, une ligne de clavier,
on ajoute les drums etc, et puis on arrange tout ça.</p>

<p>l’intro on va mettre les claviers, les pads et des effets.
le drop on rajoute kick et bass, bref vous avez l’idée,
le truc à retenir c’est qu’on part du <strong>silence</strong>.</p>

<p><img src="/img/schema_musique.png" alt="schema" /></p>

<p>l’ia générative type suno, c’est l’inverse.
elle part du <strong>bruit</strong>
et arrange ce bruit jusqu’à ressembler au style demandé.
elle prend un bruit blanc
(toutes les fréquences entre 20hz et 20khz jouées à amplitude maximale, comme un static de tv)
puis va le rapprocher d’une
<a href="https://en.wikipedia.org/wiki/Waveform">waveform</a>
pop, jazzy, rap, etc.</p>

<p>ça peut éventuellement le faire plusieurs fois
puis concaténer les pistes,
je sais pas exactement les coulisses,
mais en gros c’est ça.</p>

<p>faut imaginer, c’est comme la génération d’image qui part de ce genre d’image de départ :</p>

<p><img src="/img/white_noise.webp" alt="noise" /></p>

<p>puis explore en changeant des pixels,
avec une récompense quand elle s’approche de “photo de montagne”.</p>

<blockquote>
  <p>ouais bon ok, et ?</p>
</blockquote>

<p>beh en gros c’est trop “plein”.</p>

<p>le son est trop riche, il reste trop de trucs.</p>

<p>quand on fait de la musique en normal (en rajoutant des trucs),
<strong>c’est dur de remplir les trous</strong>.</p>

<p>ça va toujours manquer de punch dans les basses, dans les aigus.
les harmoniques de tel instrument ou tel preset vont pas être assez pleines.
ou alors il joue des notes très écartées, donc ça va créer des trous ça et là…</p>

<p>avec l’ia, jamais.</p>

<p>c’est pour ça que les mixs ia vont toujours sonner “pro”.
c’est dur à dire mais l’ia mix/masterise
mieux que personne au monde.</p>

<p>genre, 
<a href="https://soundcloud.com/omfgitsmateo/shake-zula">écoute cette merde</a>.
le mix est toujours giga plein, malgré la composition compliquée.</p>

<p>et en même temps, écoute bien les aigus,
comment ils sont forts tout le temps.
pas possible de faire ça en vrai.</p>

<p>l’ia ajoute du souffle sur son instrument qui sont pas là,
bref c’est compliqué à expliquer,
mais en gros, 
<em>si c’est plein, c’est pas humain</em>.</p>

<p>(on peut faire pareil avec les images ia il paraît,
retrouver les traces du bruit blanc de base
en analysant les fréquences)</p>

<p>donc bon ok.
ça fait de la meilleure musique que nous.
on fait quoi ?</p>

<h2 id="à-bout-de-souffle">à bout de souffle</h2>

<p>déjà “meilleure”, faut doser.</p>

<p>oui sur le plan sonique pur, mais :</p>

<p>sur le plan des paroles,
ça écrit que de la d.</p>

<p>sur le plan de l’originalité,
ça peut mais ça peut pas être radicalement radical
(je me comprends).</p>

<p>et sur le plan de l’inspi ?
c’est compliqué…</p>

<p>ça envoie fort dans l’intro.
j’imagine que c’est la méta,
envoyer la purée dans les 30 premières secondes
pour que ça compte comme un stream,
mais en gros quand t’as écouté le début t’as compris le reste.</p>

<p>pas de fortes évolutions,
de longues progressions,
de changement de clé ou de tempo.
t’as écouté le début t’as compris le reste.
et le reste est un ventre mou.</p>

<p>sauf que parfois, si on lui tire les vers du nez,
si on force l’ia à continuer, continuer, continuer
de générer la musique,
elle va arriver 
<strong>à bout de souffle</strong>.</p>

<p>plus d’idée, et pourtant il <strong>faut</strong> qu’elle sorte un truc.
et là ça peut être <em>vraiment</em> beau.
en voilà
<a href="https://soundcloud.com/omfgitsmateo/severed">un exemple</a>,
vous reconnaitrez sans problème.</p>

<p>l’ia c’est comme un train nazi,
c’est beau que quand ça déraille.</p>

<h2 id="le-futur">le futur</h2>

<p>résumons :
l’ia fait une musique trop parfaite,
pas inspirée mais inspirante.</p>

<p>j’adore “digger” les morceaux ia,
en skimmant le début et les endroits bizarres de la waveform.</p>

<p>mais le grand public ?</p>

<p>bah tout le monde va y aller.
désolé mais y’a rien à voir,
la musique va sortir au kilomètre que tu le veuilles ou non.</p>

<p>oui les paroles sont dégzer,
mais des vrais gens vont juste poser dessus
et ça va truster des tops spotify 
(ou autre plate-forme, ça dépend combien de temps on pourra ban efficacement mais ça durera pas)
et bon c’est la vie.</p>

<p>pour les beatmakers,
miskine ton type beat
quand on sort
<a href="https://soundcloud.com/omfgitsmateo/front-page">ce genre d’instru</a>
facile,
ça fait de la peine.
une fois de plus c’est la vie faut évoluer.</p>

<p>les conséquences les plus marrantes
vont venir du
<strong>nouveau son</strong>.</p>

<p>tout le monde va s’aligner au moins sur le mix.
la nouvelle école sera saturée,
pleine de fréquences parasites
et bien trop aiguë.
et tout le monde trouvera ça très bien.</p>

<p>ça va faire mal aux oreilles.</p>]]></content><author><name>le guide</name></author><summary type="html"><![CDATA[j’étais tranquille en train de dig sur soundcloud quand je tombe sur un son de fou malade.]]></summary></entry><entry><title type="html">job rejections</title><link href="https://blog.legires.fr/2026/06/18/job_rejections.html" rel="alternate" type="text/html" title="job rejections" /><published>2026-06-18T00:00:00+00:00</published><updated>2026-06-18T00:00:00+00:00</updated><id>https://blog.legires.fr/2026/06/18/job_rejections</id><content type="html" xml:base="https://blog.legires.fr/2026/06/18/job_rejections.html"><![CDATA[<p>my job sucks balls.<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup></p>

<p>i’ve been searching for a job 
since i was out of school 6 years ago
(which was during covid, ok not the best time to job hunt).</p>

<p>i figured i’d list
every place i was rejected from.</p>

<p>for every job, i did a tailored cv
(and short motivation letter if needed).
did the interviews (phone, teams, coding…),
went in person if needed…</p>

<p>this might not be exhaustive,
i just searched “candidature” on my mail box.</p>

<p>here we go:</p>

<p>march 26
/ sekoia
/ backend engineer</p>

<p>march 26
/ sandfox
/ system designer</p>

<p>february 26
/ free
/ cyber risk analyst</p>

<p>october 25
/ thales
/ strategic designer</p>

<p>march 25
/ digitemis
/ can’t remember</p>

<p>february 25
/ wavestone
/ cyber consultant</p>

<p>september 24
/ exa
/ strategy consultant</p>

<p>april 24
/ squad
/ cyber consultant</p>

<p>april 24
/ amaris
/ cyber consultant</p>

<p>march 24
/ exotec
/ cyber engineer</p>

<p>march 24
/ metsys
/ cyber engineer</p>

<p>march 24
/ niji
/ cyber engineer</p>

<p>august 22
/ akka
/ cyber engineer</p>

<p>january 22
/ internet of trust
/ cyber engineer</p>

<p>january 22
/ sncf
/ mobility consultant</p>

<p>january 22
/ compethance
/ project leader</p>

<p>january 22
/ daphni
/ join incubator</p>

<p>older stuff 2021/2020 (i was getting tired):</p>

<ul>
  <li>greenworking</li>
  <li>luos</li>
  <li>makesens</li>
  <li>backmarket</li>
  <li>capgemini</li>
  <li>ubisoft</li>
  <li>apside</li>
  <li>musicworldmedia</li>
  <li>alten</li>
  <li>dassault</li>
  <li>sec2s</li>
  <li>thales again</li>
  <li>kp consulting</li>
  <li>mobydish</li>
  <li>orange</li>
  <li>aircall</li>
  <li>padok</li>
  <li>qonto</li>
  <li>kushim</li>
  <li>solary</li>
  <li>
    <p>payfit</p>
  </li>
  <li>a bunch of shit
through linkedin, welcome or angel list
(but it doesn’t show up in the mail)</li>
</ul>

<p>i’ve also been rejected from “normal” jobs back in the day:
for example a clothing store
(she asked me to fold something and tell me which material it was and that was that lol)
but i don’t mind that.
this is a post to say my degree’s fucking worthless man.</p>

<p>or maybe i have shit network.
i asked friends sometimes but hey…
will work for food is what i meant.</p>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>it does not suck ass <em>per se</em>, it’s just that it is evil. unapologetically evil. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>le guide</name></author><summary type="html"><![CDATA[my job sucks balls.1 it does not suck ass per se, it’s just that it is evil. unapologetically evil. &#8617;]]></summary></entry><entry><title type="html">i love pyglet</title><link href="https://blog.legires.fr/2026/06/05/pyglet.html" rel="alternate" type="text/html" title="i love pyglet" /><published>2026-06-05T00:00:00+00:00</published><updated>2026-06-05T00:00:00+00:00</updated><id>https://blog.legires.fr/2026/06/05/pyglet</id><content type="html" xml:base="https://blog.legires.fr/2026/06/05/pyglet.html"><![CDATA[<h2 id="introduction">introduction</h2>

<p>i had a challenge.</p>

<p>i wanted to make an animated sun bounce around my screen.</p>

<p>(and by the end of this article, you will know how to make yours too!)</p>

<p>something like <strong>this</strong>:</p>

<video width="100%" controls="" muted="" style="filter: invert(1)">
  <source src="/mp4/pyglet0.mp4" type="video/mp4" />
  Your browser does not support the video tag.
</video>

<p>with some added constraints:</p>
<ul>
  <li>i wanted to spawn/despawn suns</li>
  <li>i wanted the suns to be animated</li>
  <li>i could place some elements and suns would bounce off them</li>
</ul>

<p>why?
well i do youtube videos,
twitch streaming,
and you know how the kids are,
easily distracted unless you have a 
steady supply of dopamine.</p>

<p>did it work? hell yeah, look at that!</p>

<video width="100%" controls="" muted="" style="filter: invert(1)">
  <source src="/mp4/pyglet1.mp4" type="video/mp4" />
  Your browser does not support the video tag.
</video>

<p>now, to make this happen,
i would need a piece of software that could:</p>
<ul>
  <li>handle input</li>
  <li>advance state</li>
  <li>draw stuff</li>
</ul>

<p>we usually call these things
<strong>“game engines”</strong>.
the name is fairly transparent.</p>

<p>i have some experience with pygame
(and watch da fluffy potato’s videos),
but before diving in i made a quick google search
and found <strong>pyglet</strong>.</p>

<p>it seemed less cumbersome than pygame,
and after dev’ing with it i can say it is.</p>

<p>mostly because:</p>
<ul>
  <li>no external dependencies</li>
  <li>nice writing style, doesn’t feel “bloated”</li>
  <li>lot of simple optimizations out-of-the-box (batching, animations)</li>
  <li>the event system is versatile (simple defaults for controls or window, but can be easily extended)</li>
</ul>

<p>i could go on, but code is worth a thousand word.</p>

<p>let’s go!</p>

<h2 id="how-to-make-funny-suns">how to make funny suns</h2>

<p>the trick here
is to use a blue screen
(just like in marvel movies).</p>

<p>you draw your stuff on a blue background,
capture the window with obs,
then use the 
“alpha key” 
feature of obs to remove the blue.</p>

<p>it’s kinda heavy on the processor.
there’s a better way to do it, maybe?</p>

<p>anyway, let’s go and draw a background.
the way we <em>connoisseurs</em> of the art do it
is we draw a big fat rectangle on the screen:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">pyglet</span>


<span class="n">WINDOW_W</span> <span class="o">=</span> <span class="mi">1920</span>
<span class="n">WINDOW_H</span> <span class="o">=</span> <span class="mi">1080</span>


<span class="n">window</span> <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">window</span><span class="p">.</span><span class="n">Window</span><span class="p">(</span><span class="n">WINDOW_W</span><span class="p">,</span> <span class="n">WINDOW_H</span><span class="p">,</span> <span class="n">fullscreen</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

<span class="n">background</span> <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">shapes</span><span class="p">.</span><span class="n">Rectangle</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">WINDOW_W</span><span class="p">,</span> <span class="n">WINDOW_H</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">))</span>

<span class="o">@</span><span class="n">window</span><span class="p">.</span><span class="n">event</span>
<span class="k">def</span> <span class="nf">on_draw</span><span class="p">():</span>
    <span class="n">window</span><span class="p">.</span><span class="n">clear</span><span class="p">()</span>
    <span class="n">background</span><span class="p">.</span><span class="n">draw</span><span class="p">()</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
    <span class="n">pyglet</span><span class="p">.</span><span class="n">app</span><span class="p">.</span><span class="n">run</span><span class="p">()</span>
</code></pre></div></div>

<p>i just love that i don’t have to explain anything.
pyglet “hello world” is very self-explanatory,
especially if you’re familiar with decorators and event systems
(for example if you did some webdev).</p>

<p>if it doesn’t click, just stare at it a bit longer,
i promise it will.</p>

<p>“rectangle” is not the only cool helper you get,
you have all them shapes + text too:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="n">count_label</span> <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">text</span><span class="p">.</span><span class="n">Label</span><span class="p">(</span>
    <span class="s">"louis sunshine"</span><span class="p">,</span>
    <span class="n">font_name</span><span class="o">=</span><span class="s">"Arial"</span><span class="p">,</span>
    <span class="n">font_size</span><span class="o">=</span><span class="mi">16</span><span class="p">,</span>
    <span class="n">x</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span>
    <span class="n">y</span><span class="o">=</span><span class="n">WINDOW_H</span> <span class="o">-</span> <span class="mi">34</span><span class="p">,</span>
    <span class="n">anchor_x</span><span class="o">=</span><span class="s">"left"</span><span class="p">,</span>
    <span class="n">anchor_y</span><span class="o">=</span><span class="s">"top"</span><span class="p">,</span>
    <span class="n">color</span><span class="o">=</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">),</span>
<span class="p">)</span>

<span class="c1"># later...
</span>
<span class="o">@</span><span class="n">window</span><span class="p">.</span><span class="n">event</span>
<span class="k">def</span> <span class="nf">on_draw</span><span class="p">():</span>
    <span class="n">window</span><span class="p">.</span><span class="n">clear</span><span class="p">()</span>
    <span class="n">background</span><span class="p">.</span><span class="n">draw</span><span class="p">()</span>
    <span class="n">count_label</span><span class="p">.</span><span class="n">draw</span><span class="p">()</span>
</code></pre></div></div>

<p>notice how anchor
(the “reference” point of the element)
can be nicely set up with shorthands.</p>

<p>okay, that’s nice and jazzy,
but what about the suns?</p>

<p>well, we’re going to use this spritesheet:</p>

<p><img src="/img/sun2.png" alt="sun" /></p>

<p>like this:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># this tells pyglet that folder "resources" is where we dump our assets
</span><span class="n">pyglet</span><span class="p">.</span><span class="n">resource</span><span class="p">.</span><span class="n">path</span> <span class="o">=</span> <span class="p">[</span><span class="s">"resources"</span><span class="p">]</span>
<span class="n">pyglet</span><span class="p">.</span><span class="n">resource</span><span class="p">.</span><span class="n">reindex</span><span class="p">()</span>

<span class="c1"># we load the image and indicate the grid size
</span><span class="n">sun_image</span> <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">resource</span><span class="p">.</span><span class="n">image</span><span class="p">(</span><span class="s">"sun2.png"</span><span class="p">)</span>
<span class="n">sun_grid</span>  <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">image</span><span class="p">.</span><span class="n">ImageGrid</span><span class="p">(</span><span class="n">sun_image</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>

<span class="c1"># center the anchor
</span><span class="k">for</span> <span class="n">frame</span> <span class="ow">in</span> <span class="n">sun_grid</span><span class="p">:</span>
    <span class="n">frame</span><span class="p">.</span><span class="n">anchor_x</span> <span class="o">=</span> <span class="n">frame</span><span class="p">.</span><span class="n">width</span>  <span class="o">//</span> <span class="mi">2</span>
    <span class="n">frame</span><span class="p">.</span><span class="n">anchor_y</span> <span class="o">=</span> <span class="n">frame</span><span class="p">.</span><span class="n">height</span> <span class="o">//</span> <span class="mi">2</span>

<span class="c1"># turn the frames into a looping animation (0.1 s per frame)
</span><span class="n">sun_animation</span> <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">image</span><span class="p">.</span><span class="n">animation</span><span class="p">.</span><span class="n">Animation</span><span class="p">.</span><span class="n">from_image_sequence</span><span class="p">(</span>
    <span class="n">sun_grid</span><span class="p">,</span> <span class="n">duration</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span> <span class="n">loop</span><span class="o">=</span><span class="bp">True</span>
<span class="p">)</span>

<span class="c1"># there you have it
# and you'll use the animation like this:
</span><span class="n">sprite</span> <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">sprite</span><span class="p">.</span><span class="n">Sprite</span><span class="p">(</span><span class="n">sun_animation</span><span class="p">,</span> <span class="n">batch</span><span class="o">=</span><span class="n">batch</span><span class="p">)</span>
</code></pre></div></div>

<p>hold on, what is that “batch” thing?</p>

<p>remember how we drew the background first,
<strong>then</strong> the text?
this was for the background not to be over the text.</p>

<p>batch mostly means 
“these things, i don’t care if they overlap, draw them in one go”
and it speeds the rendering by quite a lot.</p>

<p>now let’s make the suns move around!</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># let's pretend we have a function update_sun
# which takes dt (amount of time passed) as an argument
</span><span class="k">def</span> <span class="nf">update_sun</span><span class="p">(</span><span class="n">sun</span><span class="p">,</span> <span class="n">dt</span><span class="p">):</span>
    <span class="p">...</span>
    <span class="c1"># here, we compute the new position of the sun
</span>    <span class="c1"># based on its initial position, velocity
</span>    <span class="c1"># and, importantly, dt!
</span>
<span class="c1"># we then only have to attach this function to a clock
# so the function is called every dt
</span><span class="n">pyglet</span><span class="p">.</span><span class="n">clock</span><span class="p">.</span><span class="n">schedule_interval</span><span class="p">(</span><span class="n">update</span><span class="p">,</span> <span class="mi">1</span> <span class="o">/</span> <span class="mf">60.0</span><span class="p">)</span>
</code></pre></div></div>

<p>the last thing we need to do is to handle inputs.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="o">@</span><span class="n">window</span><span class="p">.</span><span class="n">event</span>
<span class="k">def</span> <span class="nf">on_key_press</span><span class="p">(</span><span class="n">symbol</span><span class="p">,</span> <span class="n">modifiers</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">symbol</span> <span class="o">==</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">window</span><span class="p">.</span><span class="n">key</span><span class="p">.</span><span class="n">SPACE</span><span class="p">:</span>
        <span class="n">spawn_sun</span><span class="p">()</span>
    <span class="k">elif</span> <span class="n">symbol</span> <span class="o">==</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">window</span><span class="p">.</span><span class="n">key</span><span class="p">.</span><span class="n">BACKSPACE</span><span class="p">:</span>
        <span class="n">remove_last_sun</span><span class="p">()</span>
</code></pre></div></div>

<p>once again, very straightforward
with pyglet’s good defaults.</p>

<hr />

<p>okay, thanks for sticking with me for so long.</p>

<p>this was not exactly a tutorial,
what i wanted was to show you the small building blocks.</p>

<p>these small “lego” blocks are all you need.
now it’s time to put them together,
i will show you the big structure.
don’t be scared by the collision code
(it’s bad anyway)</p>

<p>here is the full code:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">math</span>
<span class="kn">import</span> <span class="nn">random</span>
<span class="kn">import</span> <span class="nn">time</span>

<span class="kn">import</span> <span class="nn">pyglet</span>


<span class="c1"># SETTINGS 
</span>
<span class="n">pyglet</span><span class="p">.</span><span class="n">resource</span><span class="p">.</span><span class="n">path</span> <span class="o">=</span> <span class="p">[</span><span class="s">"resources"</span><span class="p">]</span>
<span class="n">pyglet</span><span class="p">.</span><span class="n">resource</span><span class="p">.</span><span class="n">reindex</span><span class="p">()</span>

<span class="n">WINDOW_W</span> <span class="o">=</span> <span class="mi">1920</span>
<span class="n">WINDOW_H</span> <span class="o">=</span> <span class="mi">1080</span>

<span class="c1"># in pixels per second
</span><span class="n">SUN_SPEED</span> <span class="o">=</span> <span class="mi">150</span>          
<span class="c1"># seconds between automatic spawns
</span><span class="n">AUTO_SPAWN_SUN</span> <span class="o">=</span> <span class="mf">0.01</span>   

<span class="c1"># streamer box
</span><span class="n">BOX_W</span> <span class="o">=</span> <span class="mi">460</span>
<span class="n">BOX_H</span> <span class="o">=</span> <span class="mi">340</span>
<span class="n">BOX_X</span> <span class="o">=</span> <span class="n">WINDOW_W</span> <span class="o">-</span> <span class="n">BOX_W</span>
<span class="n">BOX_Y</span> <span class="o">=</span> <span class="mi">0</span>


<span class="c1"># WINDOW 
</span>
<span class="n">window</span> <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">window</span><span class="p">.</span><span class="n">Window</span><span class="p">(</span><span class="n">WINDOW_W</span><span class="p">,</span> <span class="n">WINDOW_H</span><span class="p">,</span> <span class="n">fullscreen</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

<span class="c1"># SHAPES
</span>
<span class="n">background</span> <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">shapes</span><span class="p">.</span><span class="n">Rectangle</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">WINDOW_W</span><span class="p">,</span> <span class="n">WINDOW_H</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">))</span>
<span class="n">red_box</span> <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">shapes</span><span class="p">.</span><span class="n">Rectangle</span><span class="p">(</span><span class="n">BOX_X</span><span class="p">,</span> <span class="n">BOX_Y</span><span class="p">,</span> <span class="n">BOX_W</span><span class="p">,</span> <span class="n">BOX_H</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">))</span>

<span class="c1"># TEXT 
</span>
<span class="n">fps_display</span> <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">window</span><span class="p">.</span><span class="n">FPSDisplay</span><span class="p">(</span><span class="n">window</span><span class="p">)</span>
<span class="n">count_label</span> <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">text</span><span class="p">.</span><span class="n">Label</span><span class="p">(</span>
    <span class="s">""</span><span class="p">,</span>
    <span class="n">font_name</span><span class="o">=</span><span class="s">"Arial"</span><span class="p">,</span>
    <span class="n">font_size</span><span class="o">=</span><span class="mi">16</span><span class="p">,</span>
    <span class="n">x</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span>
    <span class="n">y</span><span class="o">=</span><span class="n">WINDOW_H</span> <span class="o">-</span> <span class="mi">34</span><span class="p">,</span>
    <span class="n">anchor_x</span><span class="o">=</span><span class="s">"left"</span><span class="p">,</span>
    <span class="n">anchor_y</span><span class="o">=</span><span class="s">"top"</span><span class="p">,</span>
    <span class="n">color</span><span class="o">=</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">),</span>
<span class="p">)</span>


<span class="c1">#  SUN
</span>
<span class="n">sun_image</span> <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">resource</span><span class="p">.</span><span class="n">image</span><span class="p">(</span><span class="s">"sun2.png"</span><span class="p">)</span>
<span class="n">sun_grid</span>  <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">image</span><span class="p">.</span><span class="n">ImageGrid</span><span class="p">(</span><span class="n">sun_image</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>

<span class="k">for</span> <span class="n">frame</span> <span class="ow">in</span> <span class="n">sun_grid</span><span class="p">:</span>
    <span class="n">frame</span><span class="p">.</span><span class="n">anchor_x</span> <span class="o">=</span> <span class="n">frame</span><span class="p">.</span><span class="n">width</span>  <span class="o">//</span> <span class="mi">2</span>
    <span class="n">frame</span><span class="p">.</span><span class="n">anchor_y</span> <span class="o">=</span> <span class="n">frame</span><span class="p">.</span><span class="n">height</span> <span class="o">//</span> <span class="mi">2</span>

<span class="n">sun_animation</span> <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">image</span><span class="p">.</span><span class="n">animation</span><span class="p">.</span><span class="n">Animation</span><span class="p">.</span><span class="n">from_image_sequence</span><span class="p">(</span>
    <span class="n">sun_grid</span><span class="p">,</span> <span class="n">duration</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span> <span class="n">loop</span><span class="o">=</span><span class="bp">True</span>
<span class="p">)</span>


<span class="c1">#  SUNS 
</span>
<span class="n">suns</span> <span class="o">=</span> <span class="p">[]</span>  <span class="c1"># list of sun dicts
</span>
<span class="n">batch</span> <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">graphics</span><span class="p">.</span><span class="n">Batch</span><span class="p">()</span>

<span class="k">def</span> <span class="nf">make_sun</span><span class="p">():</span>
    <span class="n">x</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="n">WINDOW_W</span> <span class="o">-</span> <span class="n">BOX_W</span> <span class="o">-</span> <span class="mi">100</span><span class="p">)</span>
    <span class="n">y</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="n">WINDOW_H</span> <span class="o">-</span> <span class="n">BOX_H</span> <span class="o">-</span> <span class="mi">100</span><span class="p">)</span>

    <span class="n">sprite</span> <span class="o">=</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">sprite</span><span class="p">.</span><span class="n">Sprite</span><span class="p">(</span><span class="n">sun_animation</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">y</span><span class="p">,</span> <span class="n">batch</span><span class="o">=</span><span class="n">batch</span><span class="p">)</span>

    <span class="n">angle</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">math</span><span class="p">.</span><span class="n">pi</span><span class="p">)</span>
    <span class="n">vx</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="n">cos</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span> <span class="o">*</span> <span class="n">SUN_SPEED</span>
    <span class="n">vy</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="n">sin</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span> <span class="o">*</span> <span class="n">SUN_SPEED</span>
    <span class="n">phase</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">234</span><span class="p">)</span> <span class="c1"># wobble offset
</span>
    <span class="k">return</span> <span class="p">{</span><span class="s">"sprite"</span><span class="p">:</span> <span class="n">sprite</span><span class="p">,</span> <span class="s">"vx"</span><span class="p">:</span> <span class="n">vx</span><span class="p">,</span> <span class="s">"vy"</span><span class="p">:</span> <span class="n">vy</span><span class="p">,</span> <span class="s">"phase"</span><span class="p">:</span> <span class="n">phase</span><span class="p">}</span>


<span class="c1"># we'll call it on a clock so dt has to be provided
# we attribute it to none to please the linter
</span><span class="k">def</span> <span class="nf">spawn_sun</span><span class="p">(</span><span class="n">dt</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
    <span class="n">suns</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">make_sun</span><span class="p">())</span>


<span class="k">def</span> <span class="nf">remove_last_sun</span><span class="p">():</span>
    <span class="k">if</span> <span class="n">suns</span><span class="p">:</span>
        <span class="n">suns</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s">"sprite"</span><span class="p">].</span><span class="n">delete</span><span class="p">()</span>  <span class="c1"># free the sprite from video memory
</span>        <span class="n">suns</span><span class="p">.</span><span class="n">pop</span><span class="p">()</span>


<span class="c1">#  UPDATE 
</span>
<span class="k">def</span> <span class="nf">update_sun</span><span class="p">(</span><span class="n">sun</span><span class="p">,</span> <span class="n">dt</span><span class="p">):</span>
    <span class="n">sprite</span> <span class="o">=</span> <span class="n">sun</span><span class="p">[</span><span class="s">"sprite"</span><span class="p">]</span>

    <span class="n">nx</span> <span class="o">=</span> <span class="n">sprite</span><span class="p">.</span><span class="n">x</span> <span class="o">+</span> <span class="n">sun</span><span class="p">[</span><span class="s">"vx"</span><span class="p">]</span> <span class="o">*</span> <span class="n">dt</span>
    <span class="n">ny</span> <span class="o">=</span> <span class="n">sprite</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">sun</span><span class="p">[</span><span class="s">"vy"</span><span class="p">]</span> <span class="o">*</span> <span class="n">dt</span>

    <span class="c1"># Start of terrible collision code
</span>    <span class="k">if</span> <span class="n">nx</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
        <span class="n">sun</span><span class="p">[</span><span class="s">"vx"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">sun</span><span class="p">[</span><span class="s">"vx"</span><span class="p">])</span>      <span class="c1"># push right
</span>    <span class="k">elif</span> <span class="n">nx</span> <span class="o">&gt;</span> <span class="n">WINDOW_W</span><span class="p">:</span>
        <span class="n">sun</span><span class="p">[</span><span class="s">"vx"</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="nb">abs</span><span class="p">(</span><span class="n">sun</span><span class="p">[</span><span class="s">"vx"</span><span class="p">])</span>     <span class="c1"># push left
</span>
    <span class="k">if</span> <span class="n">ny</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
        <span class="n">sun</span><span class="p">[</span><span class="s">"vy"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">sun</span><span class="p">[</span><span class="s">"vy"</span><span class="p">])</span>      <span class="c1"># push up
</span>    <span class="k">elif</span> <span class="n">ny</span> <span class="o">&gt;</span> <span class="n">WINDOW_H</span><span class="p">:</span>
        <span class="n">sun</span><span class="p">[</span><span class="s">"vy"</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="nb">abs</span><span class="p">(</span><span class="n">sun</span><span class="p">[</span><span class="s">"vy"</span><span class="p">])</span>     <span class="c1"># push down
</span>
    <span class="n">hits_box</span> <span class="o">=</span> <span class="p">(</span>
        <span class="n">nx</span> <span class="o">&gt;</span> <span class="n">BOX_X</span>           <span class="ow">and</span>
        <span class="n">nx</span> <span class="o">&lt;</span> <span class="n">BOX_X</span> <span class="o">+</span> <span class="n">BOX_W</span>   <span class="ow">and</span>
        <span class="n">ny</span> <span class="o">&gt;</span> <span class="n">BOX_Y</span>           <span class="ow">and</span>
        <span class="n">ny</span> <span class="o">&lt;</span> <span class="n">BOX_Y</span> <span class="o">+</span> <span class="n">BOX_H</span>
    <span class="p">)</span>
    <span class="k">if</span> <span class="n">hits_box</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">BOX_Y</span> <span class="o">&lt;</span> <span class="n">sun</span><span class="p">[</span><span class="s">"sprite"</span><span class="p">].</span><span class="n">y</span> <span class="o">&lt;</span> <span class="n">BOX_Y</span> <span class="o">+</span> <span class="n">BOX_H</span><span class="p">:</span>
            <span class="n">sun</span><span class="p">[</span><span class="s">"vx"</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="n">sun</span><span class="p">[</span><span class="s">"vx"</span><span class="p">]</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">sun</span><span class="p">[</span><span class="s">"vy"</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="n">sun</span><span class="p">[</span><span class="s">"vy"</span><span class="p">]</span>
    <span class="c1"># End of terrible collision code
</span>
    <span class="n">sprite</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">nx</span>
    <span class="n">sprite</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">ny</span>

    <span class="c1"># wobble effect oscillates between 0.8 and 1.2
</span>    <span class="c1"># with added random phase offset
</span>    <span class="n">sprite</span><span class="p">.</span><span class="n">scale</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">+</span> <span class="mf">0.2</span> <span class="o">*</span> <span class="n">math</span><span class="p">.</span><span class="n">cos</span><span class="p">(</span><span class="n">time</span><span class="p">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">sun</span><span class="p">[</span><span class="s">"phase"</span><span class="p">])</span>


<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="n">dt</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">sun</span> <span class="ow">in</span> <span class="n">suns</span><span class="p">:</span>
        <span class="n">update_sun</span><span class="p">(</span><span class="n">sun</span><span class="p">,</span> <span class="n">dt</span><span class="p">)</span>
    <span class="n">count_label</span><span class="p">.</span><span class="n">text</span> <span class="o">=</span> <span class="sa">f</span><span class="s">"Suns: </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">suns</span><span class="p">)</span><span class="si">}</span><span class="s">"</span>


<span class="c1">#  CLOCKS 
</span>
<span class="n">pyglet</span><span class="p">.</span><span class="n">clock</span><span class="p">.</span><span class="n">schedule_interval</span><span class="p">(</span><span class="n">update</span><span class="p">,</span> <span class="mi">1</span> <span class="o">/</span> <span class="mf">60.0</span><span class="p">)</span>

<span class="c1"># auto-spawn a sun every now and then
</span><span class="n">pyglet</span><span class="p">.</span><span class="n">clock</span><span class="p">.</span><span class="n">schedule_interval</span><span class="p">(</span><span class="n">spawn_sun</span><span class="p">,</span> <span class="n">AUTO_SPAWN_SUN</span><span class="p">)</span>

<span class="c1">#  INPUT
</span>
<span class="o">@</span><span class="n">window</span><span class="p">.</span><span class="n">event</span>
<span class="k">def</span> <span class="nf">on_key_press</span><span class="p">(</span><span class="n">symbol</span><span class="p">,</span> <span class="n">modifiers</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">symbol</span> <span class="o">==</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">window</span><span class="p">.</span><span class="n">key</span><span class="p">.</span><span class="n">SPACE</span><span class="p">:</span>
        <span class="n">spawn_sun</span><span class="p">()</span>
    <span class="k">elif</span> <span class="n">symbol</span> <span class="o">==</span> <span class="n">pyglet</span><span class="p">.</span><span class="n">window</span><span class="p">.</span><span class="n">key</span><span class="p">.</span><span class="n">BACKSPACE</span><span class="p">:</span>
        <span class="n">remove_last_sun</span><span class="p">()</span>

<span class="c1">#  DRAW 
</span>
<span class="o">@</span><span class="n">window</span><span class="p">.</span><span class="n">event</span>
<span class="k">def</span> <span class="nf">on_draw</span><span class="p">():</span>
    <span class="n">window</span><span class="p">.</span><span class="n">clear</span><span class="p">()</span>
    <span class="n">background</span><span class="p">.</span><span class="n">draw</span><span class="p">()</span>
    <span class="n">red_box</span><span class="p">.</span><span class="n">draw</span><span class="p">()</span>
    <span class="n">batch</span><span class="p">.</span><span class="n">draw</span><span class="p">()</span>       <span class="c1"># draws all sun sprites at once
</span>    <span class="n">fps_display</span><span class="p">.</span><span class="n">draw</span><span class="p">()</span>
    <span class="n">count_label</span><span class="p">.</span><span class="n">draw</span><span class="p">()</span>


<span class="c1">#  RUN
</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
    <span class="n">pyglet</span><span class="p">.</span><span class="n">app</span><span class="p">.</span><span class="n">run</span><span class="p">()</span>
    
</code></pre></div></div>

<h2 id="hold-on-a-second">hold on a second</h2>

<p>okay, you like pyglet but why should <strong>i</strong> use it?</p>

<p>especially when i could use a real(tm) video game editor
like unity or stuff like that?</p>

<p>good spot. it’s because i think there is
<strong>a secret superpower</strong> to using pyglet…
but that’s for a next post ;)</p>

<p>stay tuned in!</p>]]></content><author><name>le guide</name></author><summary type="html"><![CDATA[introduction]]></summary></entry><entry><title type="html">paid to read</title><link href="https://blog.legires.fr/2026/05/26/paid_to_read.html" rel="alternate" type="text/html" title="paid to read" /><published>2026-05-26T00:00:00+00:00</published><updated>2026-05-26T00:00:00+00:00</updated><id>https://blog.legires.fr/2026/05/26/paid_to_read</id><content type="html" xml:base="https://blog.legires.fr/2026/05/26/paid_to_read.html"><![CDATA[<p>how i wish i was paid to read.
i don’t have anything to do. i read stuff instead.</p>

<p>anyway, here are
some cool blogs
i found.</p>

<p>found on hn, <a href="https://minifeed.net/welcome">minifeed</a> was the starting point.
it’s a cool mix between a rss reader and a webring.</p>

<p>from there, i found
<a href="https://veronicaexplains.net/">veronica explains</a>,
and thought i should do more with my videos,
like learn the effects of kdenlive,
write scripts before filming
and doing the captioning by hand…
god it’s so much work</p>

<p><a href="https://lmnt.me/">lmnt.me</a> was super cool.
immaculate vibes (as the kids say),
love the retroweb pixel banners.</p>

<p><a href="https://alexwlchan.net/articles/">alexwlchan.net</a>
is a cracked one.
python and webdev, me like.
i learned about the calendar python library.</p>

<p><a href="https://rakhim.org/">rakhim.org</a>
is cracked too
(you learn to recognize them from afar).
he’s selling books,
which might be a good idea…
if i wrote some…
god it’s so much work</p>

<p>another article i liked recently was
<a href="https://rivalvoices.substack.com/p/smile-vs-poop">smile vs poop</a>
for the cool don’t “try to be happy” koan
(he phrased it opposite but hey).
it’s like t1 (i rewatched worlds recap):
they don’t try to win, they just win.</p>

<p>together as 1.</p>

<hr />

<p>let’s do one more pass on <a href="https://longform.asmartbear.com/">asmartbear.com</a></p>

<p>he had bangers i still think about a lot,
like “carol” and “is there a problem”</p>

<p>from what i see,
he’s still using the old
“pick a funny cartoon and wing a business theory from it”,
which works suprisingly well.
ask jodorowsky.</p>

<p>i wonder what my go-to cartoon would be.
people usually enjoy calvin &amp; hobbes (i love it too),
xkcd is another great classic.
french people used to go crazy with “shadoks”.
i used to be an avid smbc fan,
but recently i found a random
“achille talon” board and i giggled like hell.
cartoons are rad.</p>

<p>strategic choices is correct from gut feeling,
but the examples are lacking.</p>

<p>“focus” (creating space) is a great recap,
that’s always what my dad says all the time.</p>

<p>target market is just another riff on carol,
and max mrr is just mental gymnastics.</p>

<p>good read.</p>

<hr />

<p>someone was
<a href="https://news.ycombinator.com/item?id=48250144">building a writing device</a>,
which is something i’d like to have too.
i should try the remote keyboard (logitech pop they say)
on the phone. it’s an iphone so no tmux.
people in the comments recognize true yak shaving lol.</p>

<p>i try to type. just type.
just make tip tip noise on the keyboard.
i liked the asus a lot for that. soothing keys.</p>

<p>writing was cool as well. with lamy pen.
russian glyphs. sharp strokes.</p>

<p>my own blog: tidy.
not fun to read (for long-form technical)
but ok for my poetry
which is what i prefer.
i should add more to my anthology
to learn them when outside.</p>

<p>how i wish i could switch back to french.
i feel alienated from my people,
and i do anglicisms all the time when i speak.
yet i don’t feel like i lost my wit in french. weird.</p>

<p>the thing about my blog is: poetry is just the only thing i re-read.
because it’s the only thing i deem worth reading.
i don’t rewatch my own videos.
this blog post could have been called f*ck me.</p>

<p>there’s stuff i store to later link to other people. records.
but i don’t re-read them.</p>

<p>the other article (about quitting cigs)
should be called f*ck you.
same with “adhd”, i’ll dope so i can speed
to fulfill your petty wants?
i’d rather see you starve, bitch.</p>]]></content><author><name>le guide</name></author><summary type="html"><![CDATA[how i wish i was paid to read. i don’t have anything to do. i read stuff instead.]]></summary></entry><entry><title type="html">double tap</title><link href="https://blog.legires.fr/2026/05/23/double_tap.html" rel="alternate" type="text/html" title="double tap" /><published>2026-05-23T00:00:00+00:00</published><updated>2026-05-23T00:00:00+00:00</updated><id>https://blog.legires.fr/2026/05/23/double_tap</id><content type="html" xml:base="https://blog.legires.fr/2026/05/23/double_tap.html"><![CDATA[<p>i’ve been reading
<em>“the adventures of sherlock holmes”</em>
by sir arthur conan doyle.</p>

<p>i’ve noticed a technique i like.
i call it
<strong>double tap</strong>.</p>

<p>here is the purest example:</p>

<blockquote>
  <p>“this dress does implicate miss flora millar”
“and how?”
“in the dress is a pocket.
in the pocket is a card-case.
in the card-case is a note.
and here is the very note.”</p>
</blockquote>

<p>this could have been
<em>“in the dress is a pocket, in it a card-case, in it…”</em>
or even
<em>“in the dress is a pocket, a card-case, a note, here it is”</em>…</p>

<p>another example:</p>

<blockquote>
  <p>at last, however, the bumping of the road
was exchanged for the crisp smoothness of a gravel drive
and the carriage came to a stand.
colonel lysander stark
sprang out, and, as i followed after him,
pulled me swiftly into a porch which gaped in front of us.
we stepped, as it were, right out the carriage and into the hall,
so that i failed to catch the most fleeting glance
of the front of the house.
the instant that i crossed the threshold the door slammed heavily
behind us, and i heard faintly the rattle of the wheels
as the carriage drove away.</p>
</blockquote>

<p>double tap would be: 
stating something in a sentence,
and rephrasing it immediately after
as the first part of a 2-step sentence.</p>

<p>might feel redundant,
but i feel it
grounds the setting while still conveying motion.</p>

<hr />

<p>“double tap” was very clear to me when reading the book,
but i don’t know if i’m explaining correctly.</p>

<p>even if i’m blundering my explanations,
i hope that you will read some holmes,
for the victorian writing is exquisite
and holmes is a fascinating character.</p>

<p>it’s not so much the <em>deductive</em> power of holmes
(nb: holmes is more about deductions than observation,
though he does carry a magnifying glass),
but he’s got an indescribably devilish quality,
a laugh and a morgue…</p>

<p>present, aware, yet in another plane.
adhd final boss.</p>

<blockquote>
  <p>“an eley’s no. 2 is an excellent argument
with gentlemen who can twist steel pokers into knots.
that and a tooth-brush are, i think, all that we need.”</p>
</blockquote>

<p>and the joy of this hound!
never a doomer,
a clever hunter with manners.</p>

<blockquote>
  <p>“well,” said our engineer ruefully,
as we took our seats to return to london,
“it has been a pretty business for me!
i have lost my thumb, and i have lost a fifty-guinea fee,
and what have i gained?”</p>
</blockquote>

<blockquote>
  <p>“experience,” said holmes laughing.
“indirectly it may be of value, you know;
you only have to put it into words
to gain the reputation of being excellent company
for the remainder of your existence.”</p>
</blockquote>

<hr />

<p>well, this double tap thing is not very interesting.</p>

<p>…</p>

<p>sorry.</p>

<p>i just wanted to write something because i loved reading this book.</p>

<p>truth be told, it’s about the style and vocabulary.</p>

<p>i love english poetry,
fine words.
fresh water after
the worn ashen globish
this world is made of.</p>]]></content><author><name>le guide</name></author><summary type="html"><![CDATA[i’ve been reading “the adventures of sherlock holmes” by sir arthur conan doyle.]]></summary></entry><entry><title type="html">séries mania 2026</title><link href="https://blog.legires.fr/2026/05/22/series_mania_2.html" rel="alternate" type="text/html" title="séries mania 2026" /><published>2026-05-22T00:00:00+00:00</published><updated>2026-05-22T00:00:00+00:00</updated><id>https://blog.legires.fr/2026/05/22/series_mania_2</id><content type="html" xml:base="https://blog.legires.fr/2026/05/22/series_mania_2.html"><![CDATA[<p>le monde merveilleux des séries,
c’est reparti.</p>

<p><img src="/img/sm/bourse.jpeg" alt="bourse" /></p>

<p>une semaine plein rythme :
des séries des 4 coins du monde,
les 2 premiers épisodes au cinéma,
tout gratos,
et souvent y’a l’équipe.</p>

<p>que demande le peuple.</p>

<p>pour rappel, le post de
<a href="https://blog.legires.fr/2025/03/29/series-mania.html">l’édition 2025</a></p>

<hr />

<p>cette année on a pris le pass
“full méga complet salade tomate oignons”,
on s’est envoyé une quinzaine de séries.</p>

<p><img src="/img/sm/file.jpeg" alt="file" /></p>

<p>ça fatigue mais c’est cool,
aucun problème,
le festival est super bien organisé.</p>

<hr />

<p>notre coup de coeur cette année
a été fait par ce fou-là :</p>

<p><img src="/img/sm/crook.jpeg" alt="crook" /></p>

<p>elle s’appelle :</p>

<p><strong>small prophets</strong></p>

<p><img src="/img/sm/small.jpeg" alt="small" /></p>

<p>quand c’est bon c’est bon.
quand c’est drôle c’est drôle.
quand c’est touchant c’est touchant.
la série a les trois.</p>

<p>un joyau.</p>

<p><img src="/img/sm/lauren.jpeg" alt="lauren" /></p>

<p>la série est dispo sur la bbc.</p>

<hr />

<p>notre meilleure série française :</p>

<p><strong>camarades</strong></p>

<p><img src="/img/sm/manon.jpeg" alt="manon" /></p>

<p>la french theory en pleine incubation,
l’intérieur de l’oeuf dans une fac éphémère
dans un 69 bouillonnant…</p>

<p>1969 bien sûr.</p>

<p>mais surtout un travail monstre
pour utiliser 
(vraiment au sens d’<em>outil</em>)
l’esthétique
de godard (et son armée).</p>

<p>c’est intelligent et ça marche très bien.
c’est très intelligent et ça marche bien.
c’est dispo bientôt sur arte.</p>

<hr />

<p>autres mentions françaises honorables :</p>

<ul>
  <li><strong>l’été 36</strong> : on l’a pas vu mais on la rattrape en ce moment sur tf1. une enquête à la agatha christie, sans chichis mais soignée, on en retire tout le plaisir du genre.</li>
  <li><strong>eldorado</strong> : ça donne envie de connaître la fin. si vous connaissez pas l’affaire des avions renifleurs, c’est un must, c’est arrivé près de chez vous.</li>
</ul>

<p>mentions internationales honorables :</p>

<ul>
  <li><strong>the legend of the kitchen soldier</strong> : une bizarrerie coréenne qui fait bien marrer. solo leveling x food wars. parfait pour se vider la tête.</li>
  <li><strong>anatomia de un instante</strong> : passionnant et virtuose. l’histoire du coup d’état franquiste. valse de style et de personnages.</li>
  <li><strong>dear killer nannies</strong> : l’histoire vraie du fils de… pablo escobar. voilà. très bien reconstitué.</li>
</ul>

<p>en parlant de pablo, pablo mira était bien cringe,
mais moins que burki.
les cérémonies sont de vraies singeries.</p>

<p><img src="/img/sm/pablo.jpeg" alt="pablo" /></p>

<p>bref je disais quoi.</p>

<p>j’ai pas aimé the audacity, le nouveau lucky luke,
queen of mars, manko, et the testaments non plus.</p>

<p><strong>bienvenue à kingston falls</strong>,
moi j’ai envie de savoir la fin,
mais lili a pas aimé du tout.</p>

<p>vivement l’année prochaine qu’on y retourne.</p>]]></content><author><name>le guide</name></author><summary type="html"><![CDATA[le monde merveilleux des séries, c’est reparti.]]></summary></entry><entry><title type="html">mal de dos</title><link href="https://blog.legires.fr/2026/04/21/mal_dos.html" rel="alternate" type="text/html" title="mal de dos" /><published>2026-04-21T00:00:00+00:00</published><updated>2026-04-21T00:00:00+00:00</updated><id>https://blog.legires.fr/2026/04/21/mal_dos</id><content type="html" xml:base="https://blog.legires.fr/2026/04/21/mal_dos.html"><![CDATA[<p>je suis tombé sur un bouquin un jour.</p>

<p>ça disait en gros :</p>

<blockquote>
  <p>le mal de dos, c’est dans la tête</p>
</blockquote>

<p>que le mal de dos,
ça serait un mécanisme “freudien”
de la part de ton cerveau,
en utilisant la douleur physique pour t’empêcher
de penser aux trucs au fond de ta tête.</p>

<hr />

<p>il appelle ça le <strong>tms</strong>
et il le décrit en 12 phrases :</p>

<p><em>(j’ai remplacé “tms” dans le texte original par “mal de dos”)</em></p>

<ul>
  <li>la douleur est due au mal de dos, et non à une anomalie structurelle.</li>
  <li>la cause directe de la douleur est une légère privation d’oxygène.</li>
  <li>le mal de dos est une affection sans gravité, causée par mes émotions refoulées.</li>
  <li>l’émotion principale est ma colère refoulée.</li>
  <li>la douleur au dos n’existe que pour détourner mon attention de mes émotions.</li>
  <li>puisque mon dos est fondamentalement normal, il n’y a rien à craindre.</li>
  <li>par conséquent, l’activité physique n’est pas dangereuse.</li>
  <li>et je dois reprendre toutes mes activités physiques normales.</li>
  <li>je ne me laisserai pas préoccuper ou intimider par la douleur.</li>
  <li>je vais déplacer mon attention de la douleur vers les questions émotionnelles.</li>
  <li>j’ai l’intention d’être maître de moi-même, et non mon subconscient.</li>
  <li>je dois penser en termes psychologiques à tout moment, et non physiques.</li>
</ul>]]></content><author><name>le guide</name></author><summary type="html"><![CDATA[je suis tombé sur un bouquin un jour.]]></summary></entry><entry><title type="html">a good class - part 4</title><link href="https://blog.legires.fr/2026/03/27/good_class_4.html" rel="alternate" type="text/html" title="a good class - part 4" /><published>2026-03-27T00:00:00+00:00</published><updated>2026-03-27T00:00:00+00:00</updated><id>https://blog.legires.fr/2026/03/27/good_class_4</id><content type="html" xml:base="https://blog.legires.fr/2026/03/27/good_class_4.html"><![CDATA[<p><strong>note:</strong> this is part 4 in a series of posts about oop.</p>
<ul>
  <li><a href="https://blog.legires.fr/2025/11/15/good_class.html">part 1</a>,</li>
  <li><a href="https://blog.legires.fr/2025/11/18/good_class_2.html">part 2</a>.</li>
  <li><a href="https://blog.legires.fr/2025/11/29/good_class_3.html">part 3</a>.</li>
</ul>

<hr />

<p>back at it.</p>

<p>this series is moving slow, because i went back to double check on things.</p>

<p>today, two things:
<strong>more array stuff</strong> and <strong>enums</strong>.</p>

<hr />

<p>first, here’s the update on the array table:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center"><strong>Code</strong></th>
      <th style="text-align: center"><strong>Range</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">B</td>
      <td style="text-align: center">[0, 255]</td>
    </tr>
    <tr>
      <td style="text-align: center">H</td>
      <td style="text-align: center">[0, 65535]</td>
    </tr>
    <tr>
      <td style="text-align: center">I</td>
      <td style="text-align: center">[0, 4 BILLION]</td>
    </tr>
    <tr>
      <td style="text-align: center">L</td>
      <td style="text-align: center">a 20-digit number</td>
    </tr>
  </tbody>
</table>

<p>don’t use anything else.</p>

<p>now, why did the letters change?</p>

<p>because the numbers may vary.
<em>it’s your operating system that chooses.</em></p>

<blockquote>
  <p>python arrays only guarantee a <em>minimal</em> length.</p>
</blockquote>

<p>you can check the actual length with this code:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">array</span>

<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">array</span><span class="p">.</span><span class="n">typecodes</span><span class="p">:</span>
    <span class="n">a</span> <span class="o">=</span> <span class="n">array</span><span class="p">.</span><span class="n">array</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="p">[])</span>
    <span class="k">print</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">a</span><span class="p">.</span><span class="n">itemsize</span><span class="p">)</span>
</code></pre></div></div>

<p>which will output something like:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>array<span class="o">(</span><span class="s1">'b'</span><span class="o">)</span> 1
array<span class="o">(</span><span class="s1">'B'</span><span class="o">)</span> 1
/home/le/tmp/temp.py:121: DeprecationWarning: The <span class="s1">'u'</span> <span class="nb">type </span>code is deprecated and will be removed <span class="k">in </span>Python 3.16
  a <span class="o">=</span> array.array<span class="o">(</span>t, <span class="o">[])</span>
array<span class="o">(</span><span class="s1">'u'</span><span class="o">)</span> 4
array<span class="o">(</span><span class="s1">'w'</span><span class="o">)</span> 4
array<span class="o">(</span><span class="s1">'h'</span><span class="o">)</span> 2
array<span class="o">(</span><span class="s1">'H'</span><span class="o">)</span> 2
array<span class="o">(</span><span class="s1">'i'</span><span class="o">)</span> 4
array<span class="o">(</span><span class="s1">'I'</span><span class="o">)</span> 4
array<span class="o">(</span><span class="s1">'l'</span><span class="o">)</span> 8
array<span class="o">(</span><span class="s1">'L'</span><span class="o">)</span> 8
array<span class="o">(</span><span class="s1">'q'</span><span class="o">)</span> 8
array<span class="o">(</span><span class="s1">'Q'</span><span class="o">)</span> 8
array<span class="o">(</span><span class="s1">'f'</span><span class="o">)</span> 4
array<span class="o">(</span><span class="s1">'d'</span><span class="o">)</span> 8
</code></pre></div></div>

<p>since it’s calling the underlying c infrastructure,
i’ll stick with:</p>
<ul>
  <li>B: <em>binary</em></li>
  <li>H: <em>short</em></li>
  <li>I: <em>integer</em></li>
  <li>L: <em>long</em></li>
</ul>

<p>the other thing i wanted to talk about is how long is <em>long</em>.</p>

<blockquote>
  <p>long is really long.</p>
</blockquote>

<p>if you incremented the value of a long 100 times per second
(for example the timer of your game running at 100fps),
it would take <strong>600 million years</strong> to fill up.</p>

<p>it’s bonkers.</p>

<p>now, is it enough for a secret?</p>

<p><code class="language-plaintext highlighter-rouge">uuid4()</code> in python outputs 16 bytes,
so it needs two L slots.</p>

<p>can we try 8? 
after all, i still think the collision risk is low enough with 8.</p>

<p>if you do:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">secrets</span>

<span class="n">s</span> <span class="o">=</span> <span class="n">secrets</span><span class="p">.</span><span class="n">token_bytes</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
<span class="n">u5</span> <span class="o">=</span> <span class="n">array</span><span class="p">(</span><span class="s">"L"</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
</code></pre></div></div>

<p>as a password, it would take around 25 million years to guess
(I is not enough, 6 days to guess).
for an id, you could use <code class="language-plaintext highlighter-rouge">random.randbytes(8)</code>.</p>

<p>good enough?</p>

<p>maybe. <strong>i don’t think that’s the issue.</strong></p>

<p>the issue is that i don’t need a user_id.
nor do i need to bulk process passwords.</p>

<blockquote>
  <p>in ecs, the index is the id.</p>
</blockquote>

<p>what’s the id of the entity living in the third column of my database?</p>

<p>it’s 3. just 3.</p>

<p>(well 2 because of 0-indexing but you get what i mean.)</p>

<p>larger elements like passwords or ids exist only at the boundary level.
so it’s fine to have them in some <code class="language-plaintext highlighter-rouge">user_id_to_index = {}</code> hashmap.</p>

<p>and this is the perfect segue to my point number 2, <strong>design patterns</strong>.</p>

<hr />

<p>i found out that arrays are a good “canary in the coal mine”.</p>

<blockquote>
  <p>if you wrestle with arrays, you’re very close to shooting yourself in the foot.</p>
</blockquote>

<p>for example, strings can only exist in two places:</p>

<ul>
  <li>at the frontier (user input or display)</li>
  <li>as <code class="language-plaintext highlighter-rouge">enum</code> members</li>
</ul>

<p>(<code class="language-plaintext highlighter-rouge">array(w)</code> is for storing characters, and i rarely need that)</p>

<p>the first place, i already told you about.
it’s fine if you have a list of document names,
or a hash map with different localized text,
just don’t put them in the hot path, please.</p>

<p>(i even think they’re a great way to signal we’re still on the cold path)</p>

<p>but <strong>we need to talk about enums</strong>.</p>

<blockquote>
  <p>enums are a fantastic way to say “this value means that”.</p>
</blockquote>

<p>look how beautiful this is:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">enum</span> <span class="kn">import</span> <span class="n">IntEnum</span>
<span class="kn">from</span> <span class="nn">array</span> <span class="kn">import</span> <span class="n">array</span>


<span class="k">class</span> <span class="nc">Entity</span><span class="p">(</span><span class="n">IntEnum</span><span class="p">):</span>
    <span class="n">PLAYER</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># no auto!
</span>    <span class="n">GHOUL</span> <span class="o">=</span> <span class="mi">1</span>
    <span class="n">GHOST</span> <span class="o">=</span> <span class="mi">2</span> 


<span class="n">health</span> <span class="o">=</span> <span class="n">array</span><span class="p">(</span><span class="s">'B'</span><span class="p">,</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">40</span><span class="p">])</span>
<span class="k">print</span><span class="p">(</span><span class="n">health</span><span class="p">[</span><span class="n">Entity</span><span class="p">.</span><span class="n">GHOUL</span><span class="p">])</span>
</code></pre></div></div>

<p>no, for real, <code class="language-plaintext highlighter-rouge">health[Entity.GHOUL]</code>,
what a pleasure.
there’s something so zen about this code,
“i will represent my ghoul by the values at index 1”,
well here you go pal.</p>

<p>one important thing to note: no use of <code class="language-plaintext highlighter-rouge">auto()</code>,
because it starts at 1,
which is inconvenient for indexes.</p>

<p>(why? c-related stuff i guess.
i didn’t find more info in the <a href="https://peps.python.org/pep-0435/">pep</a>)</p>

<p>i don’t mind not using auto,
explicit is better than implicit anyways,
except maybe for flags.</p>

<p>so… let’s add a flag!</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">enum</span> <span class="kn">import</span> <span class="n">IntEnum</span><span class="p">,</span> <span class="n">IntFlag</span><span class="p">,</span> <span class="n">auto</span>
<span class="kn">from</span> <span class="nn">array</span> <span class="kn">import</span> <span class="n">array</span>


<span class="k">class</span> <span class="nc">Entity</span><span class="p">(</span><span class="n">IntEnum</span><span class="p">):</span>
    <span class="n">PLAYER</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">GHOUL</span> <span class="o">=</span> <span class="mi">1</span>
    <span class="n">GHOST</span> <span class="o">=</span> <span class="mi">2</span> 

<span class="k">class</span> <span class="nc">Status</span><span class="p">(</span><span class="n">IntFlag</span><span class="p">):</span>
    <span class="n">BURNING</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
    <span class="n">FROZEN</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>


<span class="n">health</span> <span class="o">=</span> <span class="n">array</span><span class="p">(</span><span class="s">'B'</span><span class="p">,</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">40</span><span class="p">])</span>
<span class="n">attack</span> <span class="o">=</span> <span class="n">array</span><span class="p">(</span><span class="s">'B'</span><span class="p">,</span> <span class="p">[</span><span class="mi">15</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">])</span>
<span class="n">status</span> <span class="o">=</span> <span class="n">array</span><span class="p">(</span><span class="s">'B'</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span>

<span class="n">damage_mult</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">status</span><span class="p">[</span><span class="n">Entity</span><span class="p">.</span><span class="n">GHOUL</span><span class="p">]</span> <span class="o">==</span> <span class="p">(</span><span class="n">Status</span><span class="p">.</span><span class="n">FROZEN</span> <span class="o">|</span> <span class="n">Status</span><span class="p">.</span><span class="n">BURNING</span><span class="p">):</span>
    <span class="n">damage_mult</span> <span class="o">=</span> <span class="mi">2</span>

<span class="n">health</span><span class="p">[</span><span class="n">Entity</span><span class="p">.</span><span class="n">GHOUL</span><span class="p">]</span> <span class="o">-=</span> <span class="n">damage_mult</span> <span class="o">*</span> <span class="n">attack</span><span class="p">[</span><span class="n">Entity</span><span class="p">.</span><span class="n">PLAYER</span><span class="p">]</span>
<span class="k">print</span><span class="p">(</span><span class="n">health</span><span class="p">[</span><span class="n">Entity</span><span class="p">.</span><span class="n">GHOUL</span><span class="p">])</span> <span class="c1"># 10
</span></code></pre></div></div>

<p>oh yeah sorry, an <code class="language-plaintext highlighter-rouge">IntFlag</code>.
well, int or no int,
it’s just for not having to call <code class="language-plaintext highlighter-rouge">value</code> at the end.
i much prefer it.</p>

<p>so here we have it,
a combat calculation where the player damages a ghoul,
dealing extra damage if the ghoul has two status effects.</p>

<p>but i didn’t need to tell you that.
it’s obvious just by looking at the code.
and it’s a joy to come back to.</p>

<hr />

<p>well, we finally have an answer to shakespeare’s age-old question:</p>

<blockquote>
  <p>what’s in a name?</p>
</blockquote>

<p>a number.</p>

<p>next episode, we try to implement a sparse set
while not losing it.</p>]]></content><author><name>le guide</name></author><summary type="html"><![CDATA[note: this is part 4 in a series of posts about oop. part 1, part 2. part 3.]]></summary></entry><entry><title type="html">scam altman</title><link href="https://blog.legires.fr/2026/03/24/scam_altman.html" rel="alternate" type="text/html" title="scam altman" /><published>2026-03-24T00:00:00+00:00</published><updated>2026-03-24T00:00:00+00:00</updated><id>https://blog.legires.fr/2026/03/24/scam_altman</id><content type="html" xml:base="https://blog.legires.fr/2026/03/24/scam_altman.html"><![CDATA[<p>did you know?</p>

<p>crocodiles have tremendous power to <strong>close</strong>
their jaws,
but very little to open it.</p>

<p><img src="/img/sam/croc1.png" alt="croc1" class="ioda" /></p>

<p>a kid putting its hands on both sides of a crocodile’s jaw
would be enough to keep the beast tame.</p>

<p>heck, a rubber band would be enough.</p>

<hr />

<p>oh, right, sam altman.</p>

<p>well, it was kind of a metaphor you see
(if you don’t know what a metaphor is, ask chat gpt).</p>

<p>open ai is the crocodile. the markets are the rubber band.</p>

<p>open ai is opening its mouth wider and wider.
a <em>billion trillion wide</em>.</p>

<p>when it bites, oh it’s gonna be “agi” for sure!</p>

<p>for sure…</p>

<p>in the meantime, it’s kind of a shame
that we chose to brew the next financial disaster
in this reptilian’s mouth,
which is getting a little dry
from all this yapping.</p>

<p>i was there in 2008 for fuck’s sake,
give the poor creature something to drink.</p>

<blockquote>
  <p>so what’s it gonna be?
the kool-aid or the rubber band?</p>
</blockquote>

<p>kool-aid would be nice.</p>

<p>we would just have to acknowledge that:</p>
<ul>
  <li>ai still sucks at code</li>
  <li>ai still sucks at poetry</li>
  <li>ai still sucks at jokes</li>
</ul>

<p>which means that <strong>state-of-the-art llms are very very shit</strong>.</p>

<p>or, if we take a look at the bright side of things:</p>
<ul>
  <li>a random word machine can be fun for shit’n’giggles</li>
  <li>we have a working universal translator, yay!</li>
  <li>we have a working universal spellcheck, yay!</li>
  <li>an emergency health voice bot may be useful</li>
</ul>

<p>the rest is moot unfortunately.</p>

<p>and that might be too sugary a drink,
even for donald.</p>

<p>so i’m afraid it’s gonna be the rubber bands little croc.</p>

<p><img src="/img/sam/croc2.png" alt="croc2" class="ioda" /></p>

<hr />

<p>i’ve stopped using ai.</p>

<p>it was nice for a while, but that’s because i don’t have friends to talk to.
i’ll focus on that instead.
seems like the right thing to do.</p>

<p>i think sam likes polos.</p>

<p>he should wear some lacoste while he can.</p>

<p>i just hope he likes orange jumpsuits too.</p>]]></content><author><name>le guide</name></author><summary type="html"><![CDATA[did you know?]]></summary></entry><entry><title type="html">dear vsb</title><link href="https://blog.legires.fr/2026/03/20/dear_vsb.html" rel="alternate" type="text/html" title="dear vsb" /><published>2026-03-20T00:00:00+00:00</published><updated>2026-03-20T00:00:00+00:00</updated><id>https://blog.legires.fr/2026/03/20/dear_vsb</id><content type="html" xml:base="https://blog.legires.fr/2026/03/20/dear_vsb.html"><![CDATA[<p>dear vsb12,</p>

<p>when i said i’ll blast your sound, you said:</p>

<blockquote>
  <p>not the first time i hear this</p>
</blockquote>

<p>trust me, i understand.</p>

<p>i too heard this a dozen times.
trying to get my music played,
trying to collab with people,
who would give up or ghost me.</p>

<p>who would have thought that it would be
on a peruvian yodeling forum that i would find
my first remixer!</p>

<p>as churchill said,
<em>“success is stumbling from failure to failure with no loss of enthusiasm”</em>.
thank you for this great gift,
i was jumping with joy.</p>

<hr />

<p>but after this first joy came a second one,
having found a exceptional musician.</p>

<p>what a smart track.</p>

<p>“endless” is a very difficult construct,
with an odd time signature and construction,
and yet you crushed it.</p>

<p>you managed to impose and break a dub rhythm,
the sheer intelligence of using a
double bass pattern to answer the original,
the saturated strings to echo the voice-mimicking resonance,
the perfect hold of the drop,
the bass statement at the end…</p>

<p>(i am writing this by head, i’ve been listening to it on loop lol)</p>

<p>it shows such a deep musical understanding
of the sound, i was so impressed.</p>

<p>and the production quality!</p>

<p>from your screen, it seems you work on lmms.
not the easiest daw!
i’ve tried it 
<a href="https://soundcloud.com/djphronk/inherdreams">once</a>
so i understand the struggle lol.</p>

<hr />

<p>it’s my turn now.</p>

<p>i’ve been trying to remix “cellz” for months,
and suddenly everything unstuck.</p>

<p>i did put my soul into it,
and i think it is one of my best works,
along with “atoyot” or “hi mr white”.</p>

<p>i’ll try to make a video clip for it
(trying some blender + python),
but i wanted to thank you first.</p>

<p>and i also wanted you the be the first one to hear it,
you deserved it.</p>

<p>so, without further ado:</p>

<p><a href="/wav/CELLZ.wav">VSB12 - CELLZ (MM MIX)</a></p>]]></content><author><name>le guide</name></author><summary type="html"><![CDATA[dear vsb12,]]></summary></entry></feed>