<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>English on Jerome.Flesch.info</title>
    <link>/blog/categories/english/</link>
    <description>Recent content in English on Jerome.Flesch.info</description>
    <generator>Hugo</generator>
    <language>fr-fr</language>
    <copyright>WTFPL 2.0</copyright>
    <lastBuildDate>Fri, 15 May 2026 17:04:00 +0200</lastBuildDate>
    <atom:link href="/blog/categories/english/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Self-hosting your AIs</title>
      <link>/blog/posts/20260515-selfhosting-llm/</link>
      <pubDate>Fri, 15 May 2026 17:04:00 +0200</pubDate>
      <guid>/blog/posts/20260515-selfhosting-llm/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://linuxfr.org/users/jflesch/journaux/auto-heberger-ses-ia&#34;&gt;French version available on LinuxFr.org&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;If you believe LinkedIn gurus, AI is the new technological revolution, the new gold rush, and so on. Soon, software engineers will no longer be needed!&lt;/p&gt;
&lt;p&gt;And if you believe my YouTube recommendations, AI is the latest trendy scam, an unprecedented economic bubble inflating, and an ecological disaster ¯\&lt;em&gt;(ツ)&lt;/em&gt;/¯.&lt;/p&gt;
&lt;p&gt;In any case, in IT professions, the subject has become difficult to avoid.&lt;/p&gt;
&lt;p&gt;For my part, after examining the problem, I reached the following personal conclusion:
It&amp;rsquo;s a new tool, nothing more, nothing less. The challenge is to find how to best use it.
And as an old communist bearded penguin, that means finding the most open-source tools possible and figuring out how to self-host the beast.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxmox &#43; Nvidia &#43; LXC &#43; Docker &#43; Xorg &#43; Steam</title>
      <link>/blog/posts/20230503-proxmox-lxc-docker-xorg-steam/</link>
      <pubDate>Wed, 03 May 2023 17:04:00 +0200</pubDate>
      <guid>/blog/posts/20230503-proxmox-lxc-docker-xorg-steam/</guid>
      <description>&lt;h1 id=&#34;context&#34;&gt;Context&lt;/h1&gt;
&lt;p&gt;Summer is coming. Summer is hot. Gaming on desktop computer makes my office
hotter. My laptop on the other hand doesn&amp;rsquo;t make it that much hotter.&lt;/p&gt;
&lt;p&gt;My basement is cold. Therefore my Proxmox server is cold, and it doesn&amp;rsquo;t make
my office hotter.&lt;/p&gt;
&lt;h1 id=&#34;idea&#34;&gt;Idea&lt;/h1&gt;
&lt;p&gt;Put my video card in my Proxmox server and play remotely using Steam Remote
Play.&lt;/p&gt;
&lt;p&gt;Putting everything in a LXC container allows to keep things nice, tidy and
separate from the host system as much as possible. The main goal for me is
&lt;strong&gt;not&lt;/strong&gt; security (you have to give the container access to a &lt;strong&gt;lot&lt;/strong&gt; of things),
but simply handling backups in a generic manner. It also allow me to snapshot
the container easily before trying some dumb idea on it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Monitoring students on an SSH server</title>
      <link>/blog/posts/20220629-monitoring-students-on-an-ssh-server/</link>
      <pubDate>Wed, 29 Jun 2022 01:00:01 +0100</pubDate>
      <guid>/blog/posts/20220629-monitoring-students-on-an-ssh-server/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;I currently have to teach someone how to use the Linux shell (bash). I have to
do it remotely.&lt;/p&gt;
&lt;p&gt;The obvious first step is to create a sandbox virtual machine running Linux
and create accounts for them on it. I have a backup of the VM so they can
freely make a mess if they want to.&lt;/p&gt;
&lt;p&gt;But to guide them, I need to have a way to see what they are inputting and what
they did input. I could use videoconferencing with screen sharing. But I like
letting them do most of the work, so they spend a lot of time looking for info
and thinking hard by themselves. So videoconferencing with them all the time
would be a waste of my time. Also videoconferencing doesn&amp;rsquo;t allow me to see
what they previously inputted.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Collaborative web IDE for job interviews</title>
      <link>/blog/posts/20220608-collaborative-web-ide-for-job-interview/</link>
      <pubDate>Wed, 08 Jun 2022 01:58:26 +0100</pubDate>
      <guid>/blog/posts/20220608-collaborative-web-ide-for-job-interview/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://jupyterlab.readthedocs.io/en/stable/_images/shared_cursors.png&#34;&gt;&lt;img alt=&#34;JupyterLab for the win&#34; loading=&#34;lazy&#34; src=&#34;https://jupyterlab.readthedocs.io/en/stable/_images/shared_cursors.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;I&amp;rsquo;m a programmer by trade and I&amp;rsquo;ve been helping my manager recruiting for quite
some times. By helping recruiting, I mean separating good applicants from bad
ones by having a technical interview with them.&lt;/p&gt;
&lt;p&gt;Resumes are often full of approximations and flat-out lies. The idea here is
to figure out what their actual programming skills are.&lt;/p&gt;
&lt;p&gt;And I needed a tool to do that efficiently and remotely.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Markdown documentation</title>
      <link>/blog/posts/20220404-markdown-documentation/</link>
      <pubDate>Mon, 04 Apr 2022 11:58:26 +0100</pubDate>
      <guid>/blog/posts/20220404-markdown-documentation/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Documentation should live with the code. Therefore a common problem is to keep
your code documentation beside your source code, in a Git-friendly manner,
while also being able to transform it later in a user-friendly format. In other
words, you want to keep your documentation written in easy-to-read and
easy-to-modify text files while also being able to generate PDF files from it
(or HTML).&lt;/p&gt;
&lt;p&gt;You may want also to be able to include nice diagrams in your
documentation, while also being able to version them in a Git-friendly manner.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python: packaging data and translation files</title>
      <link>/blog/posts/20220404-python-data-and-translation-files/</link>
      <pubDate>Mon, 04 Apr 2022 10:58:26 +0100</pubDate>
      <guid>/blog/posts/20220404-python-data-and-translation-files/</guid>
      <description>&lt;h1 id=&#34;data-files-in-your-python-package&#34;&gt;Data files in your Python package&lt;/h1&gt;
&lt;p&gt;The cleanest way I&amp;rsquo;ve found has 3 steps.&lt;/p&gt;
&lt;h2 id=&#34;manifestin&#34;&gt;&lt;code&gt;MANIFEST.in&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Your &lt;code&gt;MANIFEST.in&lt;/code&gt; must include the files you want in the package.
For example, to include all .mo files:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;recursive-include multisense_processes *.py *.mo
recursive-include tests *
include *.md
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;__init__py&#34;&gt;&lt;code&gt;__init__.py&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;All the directories containing data files must be Python modules, even if they
don&amp;rsquo;t actually contain any actual code. In other words, they must all have files
called &lt;code&gt;__init__.py&lt;/code&gt;. For instance:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Debian/Ubuntu, zsh and liquidprompt</title>
      <link>/blog/posts/20210424-debian-ubuntu-zsh-liquidprompt/</link>
      <pubDate>Sat, 24 Apr 2021 22:58:26 +0100</pubDate>
      <guid>/blog/posts/20210424-debian-ubuntu-zsh-liquidprompt/</guid>
      <description>&lt;p&gt;On Debian 10 (buster) and Ubuntu 20.04, switching to zsh and liquidprompt,
the quick and easy way:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install zsh liquidprompt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chsh -s /usr/bin/zsh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# restart your session&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;liquidprompt_activate
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# close your shell and re-open it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
    </item>
    <item>
      <title>Kivy Recipe For Yocto</title>
      <link>/blog/posts/20210129-kivy-recipe-for-yocto/</link>
      <pubDate>Fri, 29 Jan 2021 22:58:26 +0100</pubDate>
      <guid>/blog/posts/20210129-kivy-recipe-for-yocto/</guid>
      <description>&lt;p&gt;Here is the recipe I&amp;rsquo;ve made recently to integrate Kivy 2.0.0 in Yocto
(dunfell).&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s probably far from perfect, but I guess it can help other Yocto+Kivy users
like me. Note that I had to patch the &lt;code&gt;setup.py&lt;/code&gt; of Kivy to work around a bug.
&lt;a href=&#34;https://github.com/kivy/kivy/pull/7257&#34;&gt;This bug  has been fixed&lt;/a&gt; now, so
this patch won&amp;rsquo;t be useful for future versions.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SUMMARY = &amp;#34;Recipe to embedded the Python PiP Package Kivy&amp;#34;
HOMEPAGE = &amp;#34;https://kivy.org/&amp;#34;
LICENSE = &amp;#34;MIT&amp;#34;

LIC_FILES_CHKSUM = &amp;#34;file://LICENSE;md5=f0c851d60495c7e27225a819e179208a&amp;#34;

PYPI_PACKAGE = &amp;#34;Kivy&amp;#34;

USE_WAYLAND = &amp;#34;1&amp;#34;
export USE_WAYLAND

inherit dos2unix pypi setuptools3

SRC_URI += &amp;#34; \
	file://0001-setup.py-Fix-get_modulename_from_file.patch \
&amp;#34;
SRC_URI[md5sum] = &amp;#34;410d3968c7f45171285bcac76bbad265&amp;#34;
SRC_URI[sha256sum] = &amp;#34;d25e44eb44e43762b2fd0c5874e51954e0f1181fd9800d8a6756be6d084812d8&amp;#34;

DEPENDS += &amp;#34; \
	gstreamer1.0 \
	gstreamer1.0-python \
	libsdl2 \
	libsdl2-image \
	libsdl2-mixer \
	libsdl2-ttf \
	pango \
	python3-cython-native \
&amp;#34;

RDEPENDS_${PN} = &amp;#34; \
	gstreamer1.0 \
	gstreamer1.0-python \
	libsdl2 \
	libsdl2-image \
	libsdl2-mixer \
	libsdl2-ttf \
	pango \
	python3-docutils \
	python3-fcntl \
	python3-image \
	python3-kivy-garden \
	python3-pillow \
	python3-pygments \
&amp;#34;

do_install_append() {
	# drop the examples
	# XXX(Jflesch): by default they shouldn&amp;#39;t have been built by
	# Kivy&amp;#39;s setup.py. Therefore they shouldn&amp;#39;t have been installed
	# either. Yet somehow here they are.
	rm -rf ${D}/usr/share
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Kivy-garden is also required by Kivy, so I also had to make a recipe for it.
You can download the complete recipes and patches for Kivy and Kivy-garden
here: &lt;a href=&#34;/blog/20210129-kivy-recipe-for-yocto/yocto_recipe_kivy.tar.gz&#34;&gt;yocto_recipe_kivy.tar.gz&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Raspberry Pi 4 &#43; K3s &#43; Rook &#43; Ceph</title>
      <link>/blog/posts/20200909-raspberry-pi4-k3s-rook-ceph/</link>
      <pubDate>Wed, 09 Sep 2020 22:58:26 +0100</pubDate>
      <guid>/blog/posts/20200909-raspberry-pi4-k3s-rook-ceph/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Use &lt;a href=&#34;https://ubuntu.com/download/raspberry-pi&#34;&gt;Ubuntu 20.04.1&lt;/a&gt; (Raspbian is only available as armhf images ; we need arm64).&lt;/li&gt;
&lt;li&gt;In /etc/modules, add libceph and rbd&lt;/li&gt;
&lt;li&gt;Install K3s&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/rook/rook/blob/master/Documentation/ceph-teardown.md#zapping-devices&#34;&gt;Clear the disks you want to use as Ceph storages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;As root:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install ceph-common
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/rook/rook.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; rook
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Switch to the raspbernetes images instead of the default ones. Currently the
default ones are not all built as multi-arch yet and therefore don&amp;rsquo;t all work
on arm64.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Segway Kickscooter Ninebot ES2 trials</title>
      <link>/blog/posts/20200718-segway-kickscooter-ninebot-es2-trials/</link>
      <pubDate>Sat, 18 Jul 2020 22:58:26 +0100</pubDate>
      <guid>/blog/posts/20200718-segway-kickscooter-ninebot-es2-trials/</guid>
      <description>&lt;p&gt;My girlfriend and me have bought the very same electric kick scooter, the
Segway Kickscooter Ninebot ES-2. We have done the very same trip at the same
time. Both scooters are brand new. This showcase very nicely the importance of
weight regarding electric kick-scooter autonomy.&lt;/p&gt;
&lt;p&gt;Beware: This electric kick-scooter requires you to install an application on
your phone. On Android, the application is available on Aptoide and works
without Google services. However this application is 100% proprietary, poor
quality, and clearly from China. It will publish the distance you travel
somewhere without asking you first.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git Dumb Protocol</title>
      <link>/blog/posts/20160124-git-dumb-protocol/</link>
      <pubDate>Sat, 05 Oct 2013 22:58:26 +0100</pubDate>
      <guid>/blog/posts/20160124-git-dumb-protocol/</guid>
      <description>&lt;p&gt;Git supports various protocols. One of them is called the &amp;ldquo;dumb&amp;rdquo; protocol.&lt;/p&gt;
&lt;p&gt;This dumb protocol is based on HTTP+Webdav. There is also a smart protocol,
but this one is not really HTTP compliant (it starts as HTTP for an handshake,
but then switches to a custom protocol).&lt;/p&gt;
&lt;p&gt;The dumb protocol is really handy in scenarios where you can only expose a Git
repository through standard HTTP+WebDav. For instance, if you have a firewall
in front of your webserver. Or if you want to implement a &amp;ldquo;fake&amp;rdquo; Git repository
using a standard web framework (Django for instance).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Contact</title>
      <link>/blog/posts/00000000-contact/</link>
      <pubDate>Fri, 01 Jan 1971 10:58:26 +0100</pubDate>
      <guid>/blog/posts/00000000-contact/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;mailto:jerome@flesch.info&#34;&gt;jerome@flesch.info&lt;/a&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
