<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Julien Enselme personal blog</title><link>https://www.jujens.eu/</link><description/><atom:link href="https://www.jujens.eu/feeds/all.rss.xml" rel="self"/><lastBuildDate>Sat, 20 Jun 2026 00:00:00 +0200</lastBuildDate><item><title>ZSH autocomplete issues in containers</title><link>https://www.jujens.eu/posts/en/2026/Jun/20/zsh-autocomplete-issues-containers/</link><description>&lt;p&gt;When I use ZSH with a custom theme or with &lt;a class="reference external" href="https://starship.rs"&gt;starship&lt;/a&gt; in a container, sometimes completion is broken:
I type some characters (let’s say &lt;tt class="docutils literal"&gt;ts&lt;/tt&gt;) then TAB for autocompletion and I’ll get the characters I typed and then the completion (in my example, &lt;tt class="docutils literal"&gt;tstsc&lt;/tt&gt; for &lt;tt class="docutils literal"&gt;tsc&lt;/tt&gt;).
This doesn …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Sat, 20 Jun 2026 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2026-06-20:/posts/en/2026/Jun/20/zsh-autocomplete-issues-containers/</guid><category>Trucs et astuces</category><category>ZSH</category><category>Docker</category><category>containers</category><category>Shell</category></item><item><title>Jouer sous Linux</title><link>https://www.jujens.eu/posts/2025/Dec/20/jouer-sous-linux/</link><description>&lt;p&gt;Après plusieurs tests infructueux l’année dernière, j’ai décidé de retester le jeu sous Linux en avril 2025 avec une nouvelle config.
Et je dois admettre que ça fonctionne vraiment très bien.
Je n’ai presque pas de problèmes et un seul jeu aurait nécessité de repasser sous Windows …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Sat, 20 Dec 2025 00:00:00 +0100</pubDate><guid>tag:www.jujens.eu,2025-12-20:/posts/2025/Dec/20/jouer-sous-linux/</guid><category>Blog</category></item><item><title>Gaming on Linux</title><link>https://www.jujens.eu/posts/en/2025/Dec/20/jouer-sous-linux/</link><description>&lt;p&gt;After several unsuccessful tests last year, I decided to retest gaming on Linux in April 2025 with a new setup.
And I have to admit that it works really well.
I had almost no problems and only one game would have required switching back to Windows while waiting or a …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Sat, 20 Dec 2025 00:00:00 +0100</pubDate><guid>tag:www.jujens.eu,2025-12-20:/posts/en/2025/Dec/20/jouer-sous-linux/</guid><category>Blog</category></item><item><title>My shell config</title><link>https://www.jujens.eu/posts/en/2025/Sep/14/my-shell-config/</link><description>&lt;p&gt;I discovered a lot of tools this year, most of them I now rely on daily.
So I thought it would be a nice time to share them with various custom configs I wrote.&lt;/p&gt;
&lt;p&gt;TL;DR: install &lt;tt class="docutils literal"&gt;zoxide&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;direnv&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;starship&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;atuin&lt;/tt&gt; and have this in your &lt;tt class="docutils literal"&gt;.zshrc&lt;/tt&gt; (or &lt;tt class="docutils literal"&gt;.bashrc …&lt;/tt&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Sun, 14 Sep 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-09-14:/posts/en/2025/Sep/14/my-shell-config/</guid><category>Programmation</category><category>Linux</category><category>Shell</category><category>Bash</category><category>Zsh</category></item><item><title>À propos de mon blog</title><link>https://www.jujens.eu/posts/2025/Sep/05/a-propos-blog/</link><description>&lt;p&gt;Après plus de dix ans, voici mon 200e article de blog !
J’ai décidé que ce serait un bon moment pour faire un point sur ces années et envisager le futur.&lt;/p&gt;
&lt;p&gt;J’ai démarré ce blogue en 2013 alors que j’étais encore étudiant à Centrale Marseille.
Il était alors …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Fri, 05 Sep 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-09-05:/posts/2025/Sep/05/a-propos-blog/</guid><category>Blog</category></item><item><title>About my blog</title><link>https://www.jujens.eu/posts/en/2025/Sep/05/a-propos-blog/</link><description>&lt;p&gt;After more than ten years, this is my 200th blog post!
Well technically, the French version is the 200th post and this one the 201st because of how Pelican counts them.
I decided it would be a good time to take a look back and one ahead.&lt;/p&gt;
&lt;p&gt;I started this …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Fri, 05 Sep 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-09-05:/posts/en/2025/Sep/05/a-propos-blog/</guid><category>Blog</category></item><item><title>My opinion on Django Ninja</title><link>https://www.jujens.eu/posts/en/2025/Jul/06/django-ninja/</link><description>&lt;p&gt;If you’re using &lt;a class="reference external" href="https://www.djangoproject.com"&gt;the Django web framework (DRF)&lt;/a&gt; and are building APIs, you probably know about &lt;a class="reference external" href="https://www.django-rest-framework.org"&gt;the Django Rest Framework&lt;/a&gt; a toolkit to build APIs in Django since more than a decade (the first 3.x version was released in 2014).
It’s great and I’ve used it …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Sun, 06 Jul 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-07-06:/posts/en/2025/Jul/06/django-ninja/</guid><category>Programmation</category><category>Python</category><category>Django</category><category>Web</category></item><item><title>Some tips on observables</title><link>https://www.jujens.eu/posts/en/2025/Jun/29/some-tips-on-observables/</link><description>
&lt;p&gt;You can &lt;a class="reference external" href="https://www.jujens.eu/static/some-notes-observables/Observables.ipynb"&gt;download …&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Sun, 29 Jun 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-06-29:/posts/en/2025/Jun/29/some-tips-on-observables/</guid><category>Trucs et astuces</category><category>JavaScript</category></item><item><title>My opinions on HTMX</title><link>https://www.jujens.eu/posts/en/2025/Jun/24/htmx/</link><description>&lt;p&gt;&lt;a class="reference external" href="https://htmx.org/"&gt;HTMX&lt;/a&gt; is a JavaScript library designed to add interactivity to your web pages.
With it, you don’t build a single page application, you use standard templates (written in Django, Jinja) rendered in your backend, add attributes to your HTML elements and let HTMX add the appropriate interactivity.
From what …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Tue, 24 Jun 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-06-24:/posts/en/2025/Jun/24/htmx/</guid><category>Programmation</category><category>Python</category><category>Django</category><category>Web</category><category>JavaScript</category></item><item><title>Simply how licenses are applied to your project with SPDX and reuse</title><link>https://www.jujens.eu/posts/en/2025/Jun/22/reuse-licenses/</link><description>&lt;p&gt;&lt;a class="reference external" href="https://spdx.dev"&gt;SPDX (Software Package Data Exchange)&lt;/a&gt; is a project managed by the Linux Foundation created to standardize how licenses are identified in a human and machine-readable way.
In a nutshell, instead of adding a big header to your files to identify the applicable license, you apply a copyright text and a …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Sun, 22 Jun 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-06-22:/posts/en/2025/Jun/22/reuse-licenses/</guid><category>Programmation</category></item><item><title>Using super to reuse method with inheritance in Python</title><link>https://www.jujens.eu/posts/en/2025/Jun/09/using-super-to-reuse-method/</link><description>&lt;p&gt;If you use Python, you probably already know of &lt;tt class="docutils literal"&gt;super&lt;/tt&gt; to call a method from the base class.
You probably also know you can use a function as a method if it takes the instance as 1st parameter.
What you cannot do is call &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;super().my_method()&lt;/span&gt;&lt;/tt&gt; directly in such a …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Mon, 09 Jun 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-06-09:/posts/en/2025/Jun/09/using-super-to-reuse-method/</guid><category>Trucs et astuces</category><category>Python</category></item><item><title>Promise returned by async functions</title><link>https://www.jujens.eu/posts/en/2025/May/24/promise-async-functions/</link><description>&lt;p&gt;Recently at work, I encountered a problem with a function that should have returned a custom promise subclass.
The goal of this subclass is to be able to call a &lt;tt class="docutils literal"&gt;cancel&lt;/tt&gt; method to cancel some pending action done within the promise and then reject it.
It looks like this:&lt;/p&gt;
&lt;pre class="code JavaScript literal-block"&gt;
&lt;span class="kd"&gt;class …&lt;/span&gt;&lt;/pre&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Sat, 24 May 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-05-24:/posts/en/2025/May/24/promise-async-functions/</guid><category>Programmation</category><category>JavaScript</category><category>TypeScript</category></item><item><title>Using JavaScript and TypeScript in jupyter notebook</title><link>https://www.jujens.eu/posts/en/2025/May/23/jupyter-notebook-javascript/</link><description>&lt;p&gt;While wondering how to run some tests with JavaScript, I discovered that &lt;a class="reference external" href="https://deno.com/"&gt;deno&lt;/a&gt;, a JavaScript runtime like NodeJS, has support for jupyter notebooks thanks to &lt;a class="reference external" href="https://blog.jupyter.org/bringing-modern-javascript-to-the-jupyter-notebook-fc998095081e"&gt;this article&lt;/a&gt;.
It works perfectly.
Install &lt;tt class="docutils literal"&gt;deno&lt;/tt&gt; (probably available in your distribution repositories), run &lt;tt class="docutils literal"&gt;deno jupyter &lt;span class="pre"&gt;--install&lt;/span&gt;&lt;/tt&gt; and you are good to go!&lt;/p&gt;
&lt;p&gt;To get …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Fri, 23 May 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-05-23:/posts/en/2025/May/23/jupyter-notebook-javascript/</guid><category>Trucs et astuces</category><category>Python</category><category>JavaScript</category><category>TypeScript</category></item><item><title>Using Pydantic models within enums</title><link>https://www.jujens.eu/posts/en/2025/Apr/26/pydantic-enums/</link><description>&lt;p&gt;In previous articles, I provided &lt;a class="reference external" href="https://www.jujens.eu/posts/en/2025/Apr/12/python-enums/"&gt;some tips on enums&lt;/a&gt; and explained
&lt;a class="reference external" href="https://www.jujens.eu/posts/en/2025/Apr/19/using-custom-classes-pydantic/"&gt;how to use a custom class with Pydantic&lt;/a&gt;. Now, I’ll dig into all
kinds of enum usages with Pydantic, including enums whose members are
Pydantic models themselves! Let’s dive right in!&lt;/p&gt;
&lt;p&gt;Just like before, you can access …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Sat, 26 Apr 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-04-26:/posts/en/2025/Apr/26/pydantic-enums/</guid><category>Programmation</category><category>Python</category><category>Pydantic</category></item><item><title>Reusing Pydantic validators and serializers</title><link>https://www.jujens.eu/posts/en/2025/Apr/21/reusing-pydantic-validators-serializers/</link><description>&lt;p&gt;I’ll give some tips to reuse field and model validators and serializers.
All my examples will use validators, but it works exactly the same for serializers.&lt;/p&gt;
&lt;div class="section" id="field-validators"&gt;
&lt;h2&gt;Field validators&lt;/h2&gt;
&lt;p&gt;Assign the validator to a variable like so:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_is_above_ten&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&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="w"&gt;
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&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="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&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;value …&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Mon, 21 Apr 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-04-21:/posts/en/2025/Apr/21/reusing-pydantic-validators-serializers/</guid><category>Trucs et astuces</category><category>Python</category><category>Pydantic</category></item><item><title>Using Pydantic with custom classes</title><link>https://www.jujens.eu/posts/en/2025/Apr/19/using-custom-classes-pydantic/</link><description>&lt;p&gt;&lt;a class="reference external" href="https://docs.pydantic.dev/latest/"&gt;Pydantic&lt;/a&gt; is an awesome data
validation library for Python. It’s getting very popular these days
because it’s fast, has lots of features and is pleasant to use. I’m
using it at work and in personal projects. It’s one of the strong points
of &lt;a class="reference external" href="https://fastapi.tiangolo.com"&gt;FastAPI&lt;/a&gt;, the new …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Sat, 19 Apr 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-04-19:/posts/en/2025/Apr/19/using-custom-classes-pydantic/</guid><category>Programmation</category><category>Python</category><category>Pydantic</category></item><item><title>Converting jupyter notebooks</title><link>https://www.jujens.eu/posts/en/2025/Apr/17/converting-jupyter-notebooks/</link><description>&lt;p&gt;You can export a notebook directly from the interface under &lt;em&gt;File &amp;gt; Save and Export Notebook As&lt;/em&gt;.
You can also do it in CLI with:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
jupyter nbconvert --execute --to &amp;lt;FORMAT&amp;gt; my_notebook.ipynb
&lt;/pre&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--execute&lt;/span&gt;&lt;/tt&gt; will execute the notebook to make sure all output cells are up to date.
Many export formats …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Thu, 17 Apr 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-04-17:/posts/en/2025/Apr/17/converting-jupyter-notebooks/</guid><category>Trucs et astuces</category><category>Python</category></item><item><title>Sending all nginx logs to journald</title><link>https://www.jujens.eu/posts/en/2025/Apr/13/nginx-journald/</link><description>&lt;p&gt;As part of my work to uniformize my server setup around &lt;tt class="docutils literal"&gt;systemd&lt;/tt&gt;, I decided to make &lt;tt class="docutils literal"&gt;nginx&lt;/tt&gt; log everything with &lt;tt class="docutils literal"&gt;journald&lt;/tt&gt;.
By default, it logs accesses and errors in log files under &lt;tt class="docutils literal"&gt;/var/log/nginx&lt;/tt&gt;.
I already had one log file per vhost.&lt;/p&gt;
&lt;p&gt;To do the change, I changed my …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Sun, 13 Apr 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-04-13:/posts/en/2025/Apr/13/nginx-journald/</guid><category>Trucs et astuces</category><category>systemctl</category><category>Linux</category></item><item><title>Some tips on Python’s enums</title><link>https://www.jujens.eu/posts/en/2025/Apr/12/python-enums/</link><description>&lt;p&gt;I’d like to share a few tips I recently (re)discovered about Python’s enums.
While interesting on its own, this article is also paving the way for a more advanced article I hope to write soon.
Let’s dive right in!&lt;/p&gt;
&lt;div class="section" id="auto"&gt;
&lt;h2&gt;&lt;tt class="docutils literal"&gt;auto&lt;/tt&gt;&lt;/h2&gt;
&lt;p&gt;By using the function &lt;tt class="docutils literal"&gt;enum.auto …&lt;/tt&gt;&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Sat, 12 Apr 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-04-12:/posts/en/2025/Apr/12/python-enums/</guid><category>Programmation</category><category>Python</category></item><item><title>PostgreSQL using ANY instead of IN</title><link>https://www.jujens.eu/posts/en/2025/Mar/31/postgresql-any/</link><description>&lt;p&gt;I recently learned while reading &lt;a class="reference external" href="https://www.psycopg.org/psycopg3/docs/basic/adapt.html#lists-adaptation"&gt;psycopg’s documentation&lt;/a&gt; (a Python driver for PostgreSQL),
that you should use &lt;tt class="docutils literal"&gt;WHERE id = &lt;span class="pre"&gt;ANY(:values)&lt;/span&gt;&lt;/tt&gt; instead of &lt;tt class="docutils literal"&gt;WHERE id IN :values&lt;/tt&gt; when filtering over lists.
That’s because the &lt;tt class="docutils literal"&gt;ANY&lt;/tt&gt; operator works with empty lists while &lt;tt class="docutils literal"&gt;IN&lt;/tt&gt; doesn’t.
Psycopg will also correctly adapt …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Enselme</dc:creator><pubDate>Mon, 31 Mar 2025 00:00:00 +0200</pubDate><guid>tag:www.jujens.eu,2025-03-31:/posts/en/2025/Mar/31/postgresql-any/</guid><category>Trucs et astuces</category><category>PostgreSQL</category><category>Database</category></item></channel></rss>