<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Antonin Callard's website</title><link href="https://www.acallard.net/" rel="alternate"></link><link href="https://www.acallard.net/blog/blog.xml" rel="self"></link><id>https://www.acallard.net/</id><updated>2025-06-05T15:52:50+02:00</updated><subtitle>Antonin Callard's personal site and blog. Antonin Callard is a PhD Student studying symbolic dynamics and its links with computability, topology and group theory.</subtitle><entry><title>Soutenance de thèse (fr)</title><link href="https://www.acallard.net/blog/2025-05-15.soutenance-de-these-fr" rel="alternate"></link><published>2025-05-15T13:59:04+02:00</published><updated>2025-06-05T15:52:50+02:00</updated><author><name>Antonin Callard</name></author><id>tag:www.acallard.net,2025-05-15:/blog/2025-05-15.soutenance-de-these-fr</id><summary type="html">&lt;p&gt;
Après beaucoup de labeur, mon manuscrit de thèse (🆕 &lt;a href="https://www.acallard.net/publications/thesis.pdf"&gt;draft disponible&lt;/a&gt; !) a été envoyé aux rapporteurs. J&amp;rsquo;aurais probablement beaucoup de choses à dire sur le processus de rédaction, mais avant tout cela je me dois de récapituler toutes les informations importantes sur la suite des événements : et en particulier, la …&lt;/p&gt;</summary><content type="html">&lt;p&gt;
Après beaucoup de labeur, mon manuscrit de thèse (🆕 &lt;a href="https://www.acallard.net/publications/thesis.pdf"&gt;draft disponible&lt;/a&gt; !) a été envoyé aux rapporteurs. J&amp;rsquo;aurais probablement beaucoup de choses à dire sur le processus de rédaction, mais avant tout cela je me dois de récapituler toutes les informations importantes sur la suite des événements : et en particulier, la fameuse &lt;i&gt;soutenance de thèse&lt;/i&gt; ! 👨‍🎓
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Je vais soutenir ma thèse le mardi 24 juin à Caen&lt;/b&gt;. Si vous êtes intéressé·e pour participer, cette page récapitule l&amp;rsquo;ensemble des informations utiles!
&lt;/p&gt;
&lt;div id="outline-container-org328d7d0" class="outline-2"&gt;
&lt;h2 id="org328d7d0"&gt;Participation&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org328d7d0"&gt;
&lt;p&gt;
Toutes les personnes qui lisent ce message sont invitées ! Vous pouvez venir seul·e ou accompagné·e des personnes de votre choix. Si vous souhaitez participer à la soutenance de thèse, au pot et/ou au repas du soir&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;, vous pouvez vous inscrire (vous et les personnes qui vous accompagnent) sur le lien suivant : &lt;a href="https://framadate.org/vaU6DmN3KxTuALKF"&gt;lien Framadate&lt;/a&gt;. L&amp;rsquo;inscription n&amp;rsquo;est pas obligatoire, mais cela m&amp;rsquo;aidera à planifier les quantités nécessaires pour faire de la place et sustenter tout le monde&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; ! 😁
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org62bcc76" class="outline-2"&gt;
&lt;h2 id="org62bcc76"&gt;Informations pratiques&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org62bcc76"&gt;
&lt;p&gt;
Comment ça va se passer ? Si vous n&amp;rsquo;avez le temps de lire qu&amp;rsquo;un seul paragraphe de cette page :
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;📆 &lt;b&gt;Quand :&lt;/b&gt; le &lt;b&gt;mardi 24 juin&lt;/b&gt;;&lt;/li&gt;
&lt;li&gt;🕝 &lt;b&gt;À quelle heure :&lt;/b&gt; à &lt;b&gt;14h30&lt;/b&gt;;&lt;/li&gt;
&lt;li&gt;🗺️ &lt;b&gt;Où :&lt;/b&gt; bâtiment Sciences 3, &lt;b&gt;Campus 2&lt;/b&gt; de l&amp;rsquo;université de &lt;b&gt;Caen&lt;/b&gt;;&lt;/li&gt;
&lt;li&gt;🧑‍🎓 &lt;b&gt;Soutenance :&lt;/b&gt; amphi S3-045;&lt;/li&gt;
&lt;li&gt;🍴 &lt;b&gt;Pot :&lt;/b&gt; salle S3-351;&lt;/li&gt;
&lt;li&gt;🥳 &lt;b&gt;Festivités :&lt;/b&gt; à l&amp;rsquo;Acadiane, voir &lt;a href="#org29b8064"&gt;ici&lt;/a&gt;&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="outline-container-org0e90b4a" class="outline-3"&gt;
&lt;h3 id="org0e90b4a"&gt;Planning de l&amp;rsquo;après-midi&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org0e90b4a"&gt;
&lt;p&gt;
Si vous êtes curieux d&amp;rsquo;une chronologie approximative de l&amp;rsquo;après-midi, je peux en proposer l&amp;rsquo;estimation suivante&lt;sup&gt;&lt;a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; :
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;14h15 : accueil dans la salle (S3-045)&lt;/li&gt;
&lt;li&gt;14h30 : début de la &lt;a href="#org8c1cdbf"&gt;soutenance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;~15h15 : début des questions&lt;/li&gt;
&lt;li&gt;~16h30 : installation du pot&lt;/li&gt;
&lt;li&gt;~17h : pot de thèse (S3-351)&lt;/li&gt;
&lt;li&gt;~19h30 : départ pour les &lt;a href="#org29b8064"&gt;festivités du soir&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org33cfff1" class="outline-3"&gt;
&lt;h3 id="org33cfff1"&gt;Comment venir&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org33cfff1"&gt;
&lt;p&gt;
Comme annoncé plus haut, la thèse sera soutenue en amphi &lt;b&gt;S3-045&lt;/b&gt; du bâtiment Sciences 3 de l&amp;rsquo;Université de Caen. Fait notable : ce bâtiment se situe sur le &lt;b&gt;Campus 2&lt;/b&gt; de l&amp;rsquo;université&lt;sup&gt;&lt;a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt;.
&lt;/p&gt;

&lt;p&gt;
Pour venir :
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;📍 Addresse exacte : &lt;a href="https://www.openstreetmap.org/way/155629634"&gt;Bâtiment Sciences 3, 6 Boulevard Maréchal Juin, 14000 Caen&lt;/a&gt; (/​/​/&lt;a href="https://w3w.co/r%C3%B4tir.varions.retardons"&gt;rôtir.varions.retardons&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;🚊 En tram : depuis la gare de Caen, prendre le tram &lt;img alt="Ligne T2" height="16px" width="auto" src="https://www.acallard.net/blog/static/2025-01_0008_t2.png" style="display: inline-block;vertical-align: middle;"&gt; depuis &lt;a href="https://www.openstreetmap.org/node/6007968267"&gt;Gare - Rives de l&amp;rsquo;Orne&lt;/a&gt; jusqu&amp;rsquo;au terminus &lt;a href="https://www.openstreetmap.org/node/5314526174"&gt;Campus 2&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;🚗 En voiture : le parking du Campus 2 est ouvert toute la journée.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org29b8064" class="outline-3"&gt;
&lt;h3 id="org29b8064"&gt;Festivités&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org29b8064"&gt;
&lt;p&gt;
La soutenance de thèse sera suivie d&amp;rsquo;un pot, qui se déroulera dans la salle &lt;b&gt;S3-351&lt;/b&gt; du même bâtiment (Science 3, au Campus 2). Lorsque le soir arrivera, je proposerai aux convives de se déplacer à l&amp;rsquo;Acadiane pour continuer les réjouissances autour d&amp;rsquo;un bon repas 🍽️, d&amp;rsquo;un verre ou deux 🥂 et d&amp;rsquo;une (probable&lt;sup&gt;&lt;a id="fnr.6" class="footref" href="#fn.6" role="doc-backlink"&gt;6&lt;/a&gt;&lt;/sup&gt;) ambiance musicale. 🎷
&lt;/p&gt;

&lt;p&gt;
Si vous nous rejoignez à ce moment-là, voici les infos pour venir:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;📍 Addresse exacte : &lt;a href="https://www.openstreetmap.org/node/5414383684"&gt;la Table de l&amp;rsquo;Acadiane, 20 avenue d&amp;rsquo;Edimbourg, 14000 Caen&lt;/a&gt; (/​/​/​&lt;a href="https://what3words.com/arr%C3%AAtons.m%C3%A9t%C3%A9o.bichette"&gt;arrêtons.météo.bichette&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;🚊 En tram : descendre à la station &lt;a href="https://www.openstreetmap.org/node/27323913"&gt;Université&lt;/a&gt; et remonter la voie de tram à pieds sur deux cent mètres;&lt;/li&gt;
&lt;li&gt;🚗 En voiture : bon courage pour vous garer ! 😆&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgcfef5b9" class="outline-2"&gt;
&lt;h2 id="orgcfef5b9"&gt;À propos de la thèse&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgcfef5b9"&gt;
&lt;p&gt;
Je vais officiellement présenter mes travaux sur la &lt;i&gt;soficité des espaces de pavages multidimensionnels&lt;/i&gt;. Un brouillon du manuscrit (en anglais) est disponible &lt;a href="https://www.acallard.net/publications/thesis.pdf"&gt;ici&lt;/a&gt;.  Pour les personnes qui connaissent déjà les mots du titre, ma thèse se découpe en deux moitiés : l&amp;rsquo;étude des ensembles d&amp;rsquo;extensions des espaces de pavages, qui sont essentiellement à comprendre comme une traduction de la congruence de Nérode (&lt;i&gt;i.e.&lt;/i&gt; « compter les contextes ») dans le cadre des espaces de pavages (classiquement, cette congruence permet &amp;#x2013; via le théorème de Myhill-Nérode &amp;#x2013; de démontrer la régularité d&amp;rsquo;un language de mots finis) ; et les liens entre soficité et complexité de communication, avec une construction qui démontre la soficité d&amp;rsquo;une large classe d&amp;rsquo;espaces de pavages en quantifiant l&amp;rsquo;information échangée par les motifs de leurs configurations.
&lt;/p&gt;

&lt;p&gt;
Si vous ne connaissez pas les mots du titre mais que vous avez fait un peu de maths dans votre vie, vous pourrez probablement apprendre quelques trucs rigolos sur des langages où les mots ont été remplacés par de jolis coloriages infinis de \(\Z^d\), et ce qu&amp;rsquo;on peut calculer dessus. Et sinon… je vous promets de projeter de jolis dessins dans mes diapos, et d&amp;rsquo;agiter les mains en sautillant partout au moins autant que lors de mes présentations habituelles !
&lt;/p&gt;
&lt;/div&gt;
&lt;div id="outline-container-org8c1cdbf" class="outline-3"&gt;
&lt;h3 id="org8c1cdbf"&gt;Comment ça se passe, une soutenance de thèse ?&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org8c1cdbf"&gt;
&lt;p&gt;
Une soutenance de thèse est un examen universitaire. En particulier, il s&amp;rsquo;agit d&amp;rsquo;une occasion unique pour l&amp;rsquo;anthropologue curieux·euse de m&amp;rsquo;observer dans mon milieu naturel, et en compagnie de mes congénères &lt;i&gt;homo academicus&lt;/i&gt;, pendant que je performe notre rite de passage à l&amp;rsquo;âge adulte. Ce rite se décompose en deux temps :
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Tout d&amp;rsquo;abord, à 14h30 (tapantes !), je présenterai mes travaux de thèse pendant 45 minutes. C&amp;rsquo;est le moment plutôt rigolo pour le profane, parce que cette (re)présentation ressemble par bien des aspects à un spectacle : je vais parler beaucoup, longtemps, en agitant beaucoup les mains, d&amp;rsquo;une belle voix théâtrale et (je l&amp;rsquo;espère !) assez convaincante ;&lt;/li&gt;
&lt;li&gt;À partir de 15h15 (approximatives), je répondrai aux questions des membres du jury. C&amp;rsquo;est la partie sensiblement moins amusante pour le béotien : les questions seront techniques, je n&amp;rsquo;aurai plus de jolis dessins pour aider les maths à passer, et mes réponses seront probablement moins claires que mes paroles précédentes. Si le jury est gentil, il laissera aux gens qui le souhaitent la possibilité de quitter de la salle avant de commencer les questions : n&amp;rsquo;hésitez pas à prévoir un livre ou à aller prendre l&amp;rsquo;air, je serai ravi de vous retrouver au pot ensuite. 😉&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="footnote" id="footnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Je ne sais pas encore quelles seront les modalités dudit repas du soir, parce que je suis bien évidemment une personne prévoyante qui démontre sa fine anticipation des événements à venir, et pas du tout, du tout, &lt;i&gt;du tout&lt;/i&gt; à l&amp;rsquo;arrache ! 😂
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Donc SVP soyez sympas !
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Cette page sera mise à jour lorsque l&amp;rsquo;organisation se précisera. N&amp;rsquo;hésitez pas à la consulter à nouveau quelques jours avant le grand événement !
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
La durée des questions et des délibérations dépendra de la volonté du jury, donc la timeline entre les questions et le pot est assez approximative.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Pour celles et ceux qui ne le savent pas, les universités ont tendance à se découper en plusieurs campus thématiques dont la répartition est assez inégalitaire. Les gens de lettres ont souvent droit à de beaux bâtiments en plein centre ville, et les maths, physiques et autres biologies sont renvoyés de l&amp;rsquo;autre côté du périphérique. Concrètement, qu&amp;rsquo;est-ce que cela veut dire ? Si le jour J vous êtes perdu·e mais avez le Château de Caen dans votre champ de vision, c&amp;rsquo;est que vous n&amp;rsquo;êtes certainement pas au bon endroit ; visez plutôt le centre commercial et la zone industrielle du nord de la ville !
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.6" class="footnum" href="#fnr.6" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
cf. &lt;sup&gt;&lt;a id="fnr.1.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;. Mais je crois savoir que Julien voudra organiser quelque-chose à ce sujet ! 🕺
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;


&lt;/ol&gt;
&lt;/div&gt;</content><category term="life"></category></entry><entry><title>Multivariate subadditive lemma</title><link href="https://www.acallard.net/blog/2024-11-23.multivariate-subadditive-lemma" rel="alternate"></link><published>2024-11-23T15:50:28+01:00</published><updated>2024-11-23T15:50:28+01:00</updated><author><name>Antonin Callard</name></author><id>tag:www.acallard.net,2024-11-23:/blog/2024-11-23.multivariate-subadditive-lemma</id><summary type="html">&lt;p&gt;
One of the first notion I was taught about subshifts is the &lt;i&gt;topological entropy&lt;/i&gt;: intuitively, in a subshift \(X \subseteq \mathcal{A}^{\Z^d}\), the topological entropy counts the asymptotic growth rate of the number of patterns that appear in the configurations \(x \in X\). More formally, the topological entropy …&lt;/p&gt;</summary><content type="html">&lt;p&gt;
One of the first notion I was taught about subshifts is the &lt;i&gt;topological entropy&lt;/i&gt;: intuitively, in a subshift \(X \subseteq \mathcal{A}^{\Z^d}\), the topological entropy counts the asymptotic growth rate of the number of patterns that appear in the configurations \(x \in X\). More formally, the topological entropy of \(X\) is defined as:
\[ h(X) = \lim_{n \to +\infty} \frac{\log N_X(n)}{n^d},\]
where \(N_X(n)\) is the number of patterns of size \(\llbracket 0,n \rrbracket^d\) that appear in \(X\).
&lt;/p&gt;

&lt;p&gt;
The perceptive reader may notice that the topological entropy is defined as a limit, and wonder why it is well-defined. Assuming that $d=1$, the answer is straightforward: the function \(n \mapsto N_X(n)\) is submultiplicative (indeed, the map \(w \in \mathcal{A}^{n+m} \mapsto w|_{\llbracket 0,n-1 \rrbracket} \cdot w|_{\llbracket n,n+m-1 \rrbracket} \in \mathcal{A}^n \times \mathcal{A}^m\) is injective), and we conclude by the classical &lt;i&gt;subadditive lemma&lt;/i&gt;:
&lt;/p&gt;

&lt;div data-type="Lemma" class="theorem" id="orgb7d62cc"&gt;
&lt;p&gt;
Let \((a_n)_{n \in \N}\) be a subadditive sequence of real numbers (&lt;i&gt;i.e.&lt;/i&gt; \(a_{n+m} \leq a_{n} + a_{m}\) for \(n,m \in \N\)). Then:
\[ \frac{a_n}{n} \xrightarrow[n \to +\infty]{} \inf_{k \in \N} \frac{a_k}{k}.\]
&lt;/p&gt;

&lt;/div&gt;

&lt;p&gt;
(Here is its &lt;a href="https://en.wikipedia.org/wiki/Subadditivity"&gt;Wikipedia page&lt;/a&gt;). The classical proof (&lt;a href="https://proofwiki.org/wiki/Fekete%27s_Subadditive_Lemma"&gt;see here&lt;/a&gt;) is a very cool exercise: to prove that the limit superior is smaller than any \(a_k/k\), one uses the euclidean division of any \(n\) by \(k\) and applies subadditivity (so that \( a_{kq+r} \leq q\cdot a_k + a_r\)).
&lt;/p&gt;

&lt;p&gt;
In higher dimension, the existence of topological entropy becomes messier. One could use the &lt;a href="https://planetmath.org/ornsteinweisslemma"&gt;Ornstein-Weiss lemma&lt;/a&gt; to prove that the limit exists (and that, in fact, it is independent on the choice of the Følner sequence: taking the limit over any growing shape, instead of hypercubes, leads to the same value \(h(X)\)). Yet, in order to prove the existence of the topological entropy on \(\Z^d\) with basic combinatorics  (without involving theorems whose statements include the words &amp;ldquo;amenable groups&amp;rdquo;), I always thought that I had, one way or another, to rely on the subadditive lemma above&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;.
&lt;/p&gt;
&lt;div id="outline-container-org0ae46f0" class="outline-2"&gt;
&lt;h2 id="org0ae46f0"&gt;Multivariate subadditive lemma&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org0ae46f0"&gt;
&lt;p&gt;
Let me provide some context for the rest of the story. One of my many passions in life is looking at entropies&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt;: if you have a sequence that roughly behaves like \(2^{x \cdot n^2}\), I want to know what \(x\) is&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; (and call it an entropy while I&amp;rsquo;m at it!). In particular, when working with Léo Paviet-Salomon and Pascal Vanier on extender entropies (my latest favorite entropy&lt;sup&gt;&lt;a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt;), we had a rather inelegant way of proving their existence.
&lt;/p&gt;

&lt;p&gt;
The article was submitted&lt;sup&gt;&lt;a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt;, a state articles often evolve into once written. When the reviews came back this week, one reviewer had a very simple question: why did we not use a multivariate version of the subadditive lemma (&lt;i&gt;e.g.&lt;/i&gt; &lt;a href="https://dmtcs.episciences.org/442"&gt;[Capobianco, 2010&lt;/a&gt;])? Essentially, the statement is the following: for any multivariate function \( f : \N^d \to \R \) that is subadditive in each of its variables, the function \(f(x_1,\dots,x_d)/(x_1 \cdots x_d)\) admits a limit when the \(x_i\)&amp;rsquo;s grow to infinity, and this limit does not depend on the chosen sequence of hyperrectangles. The proof is essentially the same as the classical subadditive lemma: you apply the euclidean division on each variable, and then hope for the best.
&lt;/p&gt;

&lt;p&gt;
So, why did we not use the perfect statement that we needed in our paper, with its perfectly natural proof? Well, it is because I had never heard about it before, that is why! In fact, here is my main take-home message: if you work on subshifts&lt;sup&gt;&lt;a id="fnr.6" class="footref" href="#fn.6" role="doc-backlink"&gt;6&lt;/a&gt;&lt;/sup&gt;, the subadditive lemma has a multivariate version and it is amazingly useful! 😁
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org120b44e" class="outline-2"&gt;
&lt;h2 id="org120b44e"&gt;Still learning&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org120b44e"&gt;
&lt;p&gt;
I only have one question left before wrapping up… How did I manage to never hear about this before?! It is quite something: I have been working on subshifts for years, I thought that by now I would have learned most of the basic folklore that you sometimes realize everybody knows (except you, of course, that is the point!). And yet, here I am, learning about this lemma many years after I think I should have first heard of it.
&lt;/p&gt;

&lt;p&gt;
I am not even angry, nor frustrated: I am very thankful to the anonymous reviewer, and quite amazed that it still happens today. If I find a job and manage to keep doing math for the next forty-or-so years, will I still be discovering theorems older than me that would have been useful many years prior? &lt;i&gt;This&lt;/i&gt; is a fascinating question!
&lt;/p&gt;

&lt;p&gt;
Yet, being fascinated is all nice and fun but I have a thesis to write&lt;sup&gt;&lt;a id="fnr.7" class="footref" href="#fn.7" role="doc-backlink"&gt;7&lt;/a&gt;&lt;/sup&gt;. Antonin out!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="footnote" id="footnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Which is a bit tricky, because we need to prove that the function \(\log N_X(n)/n^{d-1}\) is subadditive, &lt;i&gt;i.e.&lt;/i&gt; the function \(N_X(n)^{1/n^{d-1}}\) is submultiplicative.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Said no one ever! 😂
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
I don&amp;rsquo;t mean it litteraly, but when looking at my previous work I cannot help but &lt;a href="https://drops.dagstuhl.de/entities/document/10.4230/LIPIcs.ICALP.2021.122"&gt;notice&lt;/a&gt; &lt;a href="https://arxiv.org/abs/2401.07549"&gt;a trend&lt;/a&gt;!
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
(&lt;i&gt;&amp;lowast; Taking an old TV advertising voice 📺 &amp;lowast;&lt;/i&gt;) You can learn all about it in &lt;i&gt;Computability of extender sets in multidimensional subshifts&lt;/i&gt; &lt;a href="https://arxiv.org/abs/2401.07549"&gt;arXiv:2401.07549&lt;/a&gt;! 🤡
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Actually, it has been submitted way too many times: but alas, such is the academic life!
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.6" class="footnum" href="#fnr.6" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Given that I mostly share this website with mathematicians that are either actual or potential collaborators, this definitely has a quite high probability!
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.7" class="footnum" href="#fnr.7" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Writing a thesis harder than I thought it would be, despite having some experience writing theses and papers. Maybe I should have started earlier (instead of developing my own LaTeX class over the summer). On the positive side, let me tell you: it looks &lt;i&gt;amazing&lt;/i&gt; ✨!
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;


&lt;/ol&gt;
&lt;/div&gt;</content><category term="math"></category><category term="multivariate"></category><category term="subadditive lemma"></category><category term="Fekete's lemma"></category><category term="subshifts"></category></entry><entry><title>A new blog update: Org-mode processing in Pelican</title><link href="https://www.acallard.net/blog/2024-04-23.a-new-blog-update-org-mode-processing-in-pelican" rel="alternate"></link><published>2024-04-23T23:27:02+02:00</published><updated>2024-04-23T23:27:02+02:00</updated><author><name>Antonin Callard</name></author><id>tag:www.acallard.net,2024-04-23:/blog/2024-04-23.a-new-blog-update-org-mode-processing-in-pelican</id><summary type="html">&lt;p&gt;
This website just received its first big upgrade, and this post contains some technical explanations of what changed, how… along with the story behind it all! This update should, apart from some very minor changes to &lt;abbr title="Cascading Style Sheets"&gt;CSS&lt;/abbr&gt;, remain completely imperceptible to the end user&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;; however, on the writing side …&lt;/p&gt;</summary><content type="html">&lt;p&gt;
This website just received its first big upgrade, and this post contains some technical explanations of what changed, how… along with the story behind it all! This update should, apart from some very minor changes to &lt;abbr title="Cascading Style Sheets"&gt;CSS&lt;/abbr&gt;, remain completely imperceptible to the end user&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;; however, on the writing side of the website (i.e. me), the processing pipeline changed quite a lot: while Pelican used to compile Markdown files into a website, I am very happy to say that I completely got rid of the Markdown format to transition to another one… Org-mode!
&lt;/p&gt;
&lt;div id="outline-container-orgc2578b4" class="outline-2"&gt;
&lt;h2 id="orgc2578b4"&gt;Some context&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgc2578b4"&gt;
&lt;/div&gt;
&lt;div id="outline-container-org925681f" class="outline-3"&gt;
&lt;h3 id="org925681f"&gt;How did this happen?&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org925681f"&gt;
&lt;p&gt;
This is all Léo&amp;rsquo;s fault&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt;! 😂
&lt;/p&gt;

&lt;p&gt;
To understand where this is coming from, you need to consider what happens on a regular basis in a computer science lab: some people definitely enjoy spending &lt;i&gt;a lot of time&lt;/i&gt; dabbling and tinkering with their &lt;abbr title="Operating System"&gt;OS&lt;/abbr&gt; (paradoxically, most of these specimen appear in the theoretically-focused teams), and even though they are not a majority, they can sometimes be quite vocal about it. Their computer can have a somewhat obscure Linux distribution (Pascal, my PhD advisor, is the one who introduced me to Void Linux a few years ago, before I even began my PhD with him), or they can be obsessed with some unusual programming languages. For example, I may be a bit of an OCaml fanatic (though relatively to the amount of code I produce, which isn&amp;rsquo;t much): I like using OCaml because it is a fantastic programming language, it contains mostly everything I need, it is quite fast, and functional programming languages are a soft spot of mine (they&amp;rsquo;re just so cool! 🤩). I often like to joke&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; that we should (for once) get ahead of &lt;abbr title="Massachusetts Institute of Technology"&gt;MIT&lt;/abbr&gt;, decide by ourselves the programming languages we teach to bachelor&amp;rsquo;s students, and definitely remove Python, Java and co altogether from the students&amp;rsquo; curriculum to replace them with OCaml. Wouldn&amp;rsquo;t they be thankful for enjoying the awesomeness of functional programming, elegant language designs, and every other benefits that come with it? Realistically, though, I have to concede that my declarations of love for OCaml are often met with tired shared looks by my colleagues, along the lines of &amp;ldquo;oh, here he goes again…&amp;rdquo;. But because I know they expect me to say something when conversations about programming languages come up, I have to perform said conversation and not disappoint!
&lt;/p&gt;

&lt;p&gt;
Anyway, these computer-fiddling people are to be expected in a computer science lab. It&amp;rsquo;s completely okay to be in the lab and not enjoy these topics for daily chattering, but one should probably expect some people there to be into these kinds of things. And to be honest, being quite fond of OCaml is really not the most exotic opinion you could find. In terms of originality, I may be the only one putting up with a Wayland setup on my machine, but many people could do it if they actually wanted to. Other opinions about computers usually include a variety of Linux distributions/pieces of software, one of which being of particular importance in our line of work: the choice of a text editor. Nowadays, the &lt;a href="https://xkcd.com/1823/"&gt;text editor&lt;/a&gt; &lt;a href="https://xkcd.com/378/"&gt;war&lt;/a&gt; has been over for quite some time, and people now live in peace and harmony using Vim, Emacs or Codium depending on their personal opinions. And then, there&amp;rsquo;s Léo. If I had to mention one computer-related thing to know about him, I&amp;rsquo;d probably have to say the following: Léo &lt;i&gt;really&lt;/i&gt; loves Emacs.
&lt;/p&gt;

&lt;p&gt;
To be completely honest: he&amp;rsquo;s really good at it. When you know enough about Lisp (and Elisp) to add any functionality you want to Emacs, I am under the impression that you can pretty much do anything: the ability to access and edit Emacs internals seems incredibly powerful, and helps a lot into personalizing it according to your own tastes. It also makes the thing powerful enough that people in the Emacs community semi-seriously (or semi-humorously?) call it an &lt;abbr title="Operating System"&gt;OS&lt;/abbr&gt; in itself: emails, navigating the filesystem, editing files, git… if you want to stay within Emacs and its (quite efficient) buffer system without ever relying on another piece of software, you probably can.
&lt;/p&gt;

&lt;p&gt;
Anyway, Emacs being this awesome and Léo being good at it meant two things. The first of them: when he learned that I was using Emacs for text-editing&lt;sup&gt;&lt;a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; while being completely ignorant about how one is supposed to set it up, he helped me change my &lt;code&gt;init.el&lt;/code&gt; configuration file as to make Emacs more practical. Now, I have an awesome auto-complete system, a shell with utop integration inside my OCaml file editor, a terrific documentation, and I didn&amp;rsquo;t know I needed any of these before I actually got them (and now, I wouldn&amp;rsquo;t give these up for anything). I am still awful at Lisp (half of the time, I have no idea what I am doing when I am editing configuration files), but at least I have a text editor and a file manager that I am very happy about. The other thing Léo did  was that, when he learned that I was using Markdown files for my website, he looked at me with &lt;i&gt;genuine surprise&lt;/i&gt;&lt;sup&gt;&lt;a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt; and asked: &amp;ldquo;but why do you use Markdown for text formatting when there is something better in every single aspect?&amp;rdquo;
&lt;/p&gt;

&lt;p&gt;
This was my first introduction to Org-mode!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org68aa5ca" class="outline-3"&gt;
&lt;h3 id="org68aa5ca"&gt;What is Org-mode?&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org68aa5ca"&gt;
&lt;p&gt;
According to the &lt;a href="https://orgmode.org/features.html"&gt;official website&lt;/a&gt;&lt;sup&gt;&lt;a id="fnr.7" class="footref" href="#fn.7" role="doc-backlink"&gt;7&lt;/a&gt;&lt;/sup&gt;, Org mode is a markup language for note taking (pretty much like Markdown) that (unlike Markdown) integrated many different features. To name a few:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;the syntax for tables is very similar to Markdown, except that the editing system supports many different keybindings&lt;sup&gt;&lt;a id="fnr.8" class="footref" href="#fn.8" role="doc-backlink"&gt;8&lt;/a&gt;&lt;/sup&gt; which make your life infinitely more practical: insert a column, align a column, move a column, automatic filling…&lt;/li&gt;
&lt;li&gt;Org files can be exported to other formats, like Tex of &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt;. I will talk a bit more about this below, but everything can be personalized for export. Plugging in your favorite LaTeX class/your own &lt;abbr title="Cascading Style Sheets"&gt;CSS&lt;/abbr&gt;, this means you can generate pretty much any document you want.&lt;/li&gt;
&lt;li&gt;Org mode supports extensive linking functionalities: for each type of link (and, of course, you can declare your own types/syntaxes), you can program what happens when you click on it (what file/&lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt; should be opened, with which program…), how you export it (what is the &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; wrapping around this link?), etc… This is particularly useful for my Pelican setup, so I will talk a bit more about this below.&lt;/li&gt;
&lt;li&gt;One of the main uses of Org mode is also task management, making it easy to manage scattered tasks written while taking notes. A calendar system is also integrated in Org-mode, and agendas can be automatically generated from an &lt;code&gt;.org&lt;/code&gt; file&amp;rsquo;s content.&lt;/li&gt;
&lt;li&gt;Finally, since code in pretty much any language can be integrated directly into an Org file, to be either executed or just appear verbatim, you get some kind of coding notebook system (like Jupyter).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
So, Org mode sounds a lot like Markdown, and in terms of plain text file there probably isn&amp;rsquo;t much more to it; but since it has been developed to be part of Emacs, its integration within Emacs leads to a ton of additional features that no other text editor can compete with. Since Emacs is increasingly likely to become my favorite text editor, I am slowly learning more about the Emacs ecosystem and all the features that come with it&lt;sup&gt;&lt;a id="fnr.9" class="footref" href="#fn.9" role="doc-backlink"&gt;9&lt;/a&gt;&lt;/sup&gt;; and even though the &lt;a href="https://www.acallard.net/blog/static/2024-04_0006-learning-curve.jpg"&gt;learning curve&lt;/a&gt; is a bit hectic, the steps taken to become proficient in Emacs are actually worth it when you realize this knowledge can apply to pretty much anything you need, since you can do everything in Emacs if you are experienced enough. So, if I am to integrate all my usual activities within Emacs, why not integrate blogging into it as well?
&lt;/p&gt;

&lt;p&gt;
Furthermore, the &lt;i&gt;export system&lt;/i&gt; of Org-mode is marvelous to use, especially for managing the compilation pipeline of a website. Basically, Org mode relies on &lt;i&gt;backends&lt;/i&gt; to export to other formats: an Org file is just a structured file (i.e. a tree) that contains blocks, and a backend is a long list of functions that tell how each block will be exported to a given format. What is amazing is that it is incredibly easy to override some specific functions of a given backend, as to change its output; or just to copy a given backend and change it into a new one. Since the syntax of Org mode is already quite permissive, you get a very flexible system that easily adapts to one&amp;rsquo;s needs.
&lt;/p&gt;

&lt;p&gt;
It so happens that I had wanted for some time already to declare a new type of blocks in my blog. In Markdown, there is no easy way that I was aware of to pull this off, at least not without learning about a whole Markdown plugin machinery for Python-Markdown, whose inner workings are somewhat obscure to me. So what I did until now was to put plain &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; into my Markdown files: it worked, but this is very ugly and I did not like it. On the other hand, it is very easy to find that Org-mode&amp;rsquo;s code for &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; exporting is contained in the file &lt;code&gt;ox-html.el.gz&lt;/code&gt;, which is basically a very long list of functions defining which &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; tags should be used to wrap the content of each block. Overriding these local functions/creating new ones is then extremely easy (you can just tell Emacs to replace each call to the original function by a call to the new one instead), so that I can chose whichever &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; tags and code will appear in the end. This is all a matter of Lisp coding, and in the end I get the &amp;ldquo;exact &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; I desire&amp;rdquo; (up to my own coding abilities, of course: I still know very little about Lisp, but I won&amp;rsquo;t let this slight annoyance stop me!).
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org96d3c75" class="outline-2"&gt;
&lt;h2 id="org96d3c75"&gt;My current Pelican pipeline&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org96d3c75"&gt;
&lt;p&gt;
So, how do I integrate all this Org mode awesomeness into my website? First of all, as I already mentioned &lt;a href="https://www.acallard.net/blog/2023-08-23.starting-this-blog"&gt;in this post&lt;/a&gt;, my website is powered by the static website generator &lt;a href="https://getpelican.com/"&gt;Pelican&lt;/a&gt;. The way it works is quite straightforward:
&lt;/p&gt;
&lt;ol class="org-ol"&gt;
&lt;li&gt;For each &lt;code&gt;.md&lt;/code&gt; file, collect all the mandatory and optional metadata (title, date…) and call Python-Markdown to process the body of the file into an &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; export.&lt;/li&gt;
&lt;li&gt;Create a big Python dictionary containing all the articles and their metadata, and do some processing: automatically generate the index of all articles, replace links using Pelican&amp;rsquo;s internal linking syntax with the correct &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; links…&lt;/li&gt;
&lt;li&gt;Export the website into &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; files using &lt;a href="https://jinja.palletsprojects.com/"&gt;Jinja&lt;/a&gt;, a templating system (so that one can chose the structure of an exported &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; file, call the right &lt;abbr title="Cascading Style Sheets"&gt;CSS&lt;/abbr&gt;/Javascript files, etc…).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
For this update, I only had to replace the first step entirely by:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;For each &lt;code&gt;.org&lt;/code&gt; file, collect all the mandatory and optional metadata (title, date…). This step was heavily inspired by the &lt;code&gt;org_python_reader&lt;/code&gt; plugin from the &lt;a href="https://github.com/getpelican/pelican-plugins"&gt;Pelican plugin repository&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;For each &lt;code&gt;.org&lt;/code&gt; file, call Emacs and run the &lt;code&gt;org-export-as&lt;/code&gt; function to export the body of each article into &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; code. This step was pretty much entirely copied from the &lt;code&gt;org_reader&lt;/code&gt; plugin from the same repository.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I was expecting everything to break apart at the first occasion, but somehow it worked really, really well: there is little to no difference between the original Markdown exports and their newer Org mode counterparts, and apart from two minor things (namely, Pelican&amp;rsquo;s linking system and and footnotes), I only did minor adjustments to Org-mode&amp;rsquo;s &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; exporting system to get my new Org-based blog generator to be at least as functional as its Markdown ancestor.
&lt;/p&gt;
&lt;/div&gt;
&lt;div id="outline-container-org7d7a955" class="outline-3"&gt;
&lt;h3 id="org7d7a955"&gt;Some details I want to share to fellow Pelican users&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org7d7a955"&gt;
&lt;p&gt;
As mentioned above, while the system was mostly functional from the start, there were a few moments where I needed to rewrite some functions of the Org-mode &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; exporting backend (say hello to my new friend  &lt;code&gt;ox-html.el.gz&lt;/code&gt;! 👋) to suit my needs. I will list them here for the interested reader, but said hypothetical reader probably needs to know at least a little bit about Pelican for it to be either interesting or understandable.
&lt;/p&gt;
&lt;/div&gt;
&lt;div id="outline-container-orga35d6c4" class="outline-4"&gt;
&lt;h4 id="orga35d6c4"&gt;The Pelican linking system (mandatory)&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-orga35d6c4"&gt;
&lt;p&gt;
As mentioned in the &lt;a href="https://docs.getpelican.com/en/latest/content.html#linking-to-internal-content"&gt;official documentation&lt;/a&gt;, Pelican developed a very useful internal linking system. The idea is to track links from &lt;i&gt;the source content&lt;/i&gt; to the &lt;i&gt;generated content&lt;/i&gt;: when writing articles and pages on my computer, I edit &lt;code&gt;.org&lt;/code&gt; files (or &lt;code&gt;.md&lt;/code&gt; if you didn&amp;rsquo;t switch to Org mode) that form what is called the &lt;i&gt;source content&lt;/i&gt;; after Pelican processes them into &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; and generates the final exported website, the organization and hierarchy of the website forms the &lt;i&gt;generated content&lt;/i&gt;. Here is the point: there is no reason for the &lt;abbr title="Uniform Resource Locator"&gt;URLs&lt;/abbr&gt; of the final &lt;i&gt;exported&lt;/i&gt; website to match with the organization of the &lt;code&gt;.org&lt;/code&gt; source files on my computer. And this is very useful: one can change the &lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt; structure of a website (say, if I wanted to move my &lt;abbr title="Uniform Resource Locator"&gt;URLs&lt;/abbr&gt; from &lt;code&gt;/blog/{article-name}.html&lt;/code&gt; to &lt;code&gt;blog/{category}/{date}_{article-name}&lt;/code&gt;) without effectively having to rename all of the source files by hand; second, I do not have to keep up with some internal file organization and I can instead put all of them into the same directory&lt;sup&gt;&lt;a id="fnr.11" class="footref" href="#fn.11" role="doc-backlink"&gt;11&lt;/a&gt;&lt;/sup&gt;, since the exporting system will take care of the organizing for me.
&lt;/p&gt;

&lt;p&gt;
Concretely, assume that I want to create a link to another blog post in the new entry I am currently writing (which I did a few paragraphs ago when I mentioned &lt;a href="https://www.acallard.net/blog/2023-08-23.starting-this-blog"&gt;this post&lt;/a&gt;). Instead of having to find what the final &lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt; of the post is (and take the risk that, if I were to change my &lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt; schemes, all links on the website would end up broken), I can instead link to the &lt;i&gt;source file&lt;/i&gt; of the post thanks to Pelican&amp;rsquo;s linking syntax &lt;code&gt;{filename}/path/to/file&lt;/code&gt;, and Pelican will sort things out during the processing and export! Since Pelican does this rewriting step (changing links using Pelican&amp;rsquo;s internal linking system to the final &lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt;) on article bodies that have already been transformed into &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt;, the only thing to do here when transitioning to &lt;code&gt;.org&lt;/code&gt; compilation is to ensure that links to &lt;code&gt;{filename}/path/to/file&lt;/code&gt; are correctly exported into &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; as &lt;code&gt;&amp;lt;a href\="{filename}/path/to/file"&amp;gt;&lt;/code&gt;, and Pelican will take care of the rest.
&lt;/p&gt;

&lt;p&gt;
Unfortunately, Org mode is too smart for me. The markup syntax for links &lt;code&gt;[[url-of-my-link][replacement-text]]&lt;/code&gt; is actually tied to a lot of very useful functionalities, one of which in particular being an automatic check on whether the given link is dead or not. This even works on files: the link &lt;code&gt;[[/path/to/file.org][replacement-text]]&lt;/code&gt; checks whether the file &lt;code&gt;file.org&lt;/code&gt; really exists or not on the designated path. If not, Org mode raises an error and refuses to export the link. The problem here is that &lt;code&gt;{filename}/path/to/file.org&lt;/code&gt; is obviously not a valid path on my filesystem, so Emacs was not happy and refused to export articles containing such links, even though Pelican would have been very happy to replace the source link with the generated link in the final export. 😢
&lt;/p&gt;

&lt;p&gt;
My solution to this predicament involved using Org mode linking functionalities to declare a new &lt;i&gt;type of link&lt;/i&gt;, as mentioned in &lt;a href="https://orgmode.org/manual/Adding-Hyperlink-Types.html"&gt;the documentation&lt;/a&gt;. Using &lt;code&gt;org-link-set-parameters&lt;/code&gt; in &lt;code&gt;org-link-set-parameters "pelican" :export #'pelican/export-pelican-link&lt;/code&gt;, I could declare a new syntax for links of Pelican, namely &lt;code&gt;pelican:my-link&lt;/code&gt;, so that &lt;code&gt;[[pelican:{filename}/path/to/file.org][replacement-text]]&lt;/code&gt; will correctly be exported to &lt;code&gt;&amp;lt;a href\="{filename}/path/to/file"&amp;gt;replacement-text&amp;lt;/a&amp;gt;&lt;/code&gt; by the function &lt;code&gt;pelican/export-pelican-link&lt;/code&gt;, and later Pelican will rewrite the link to its corresponding &lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt; accordingly during the final publishing. For now, this &lt;code&gt;pelican:&lt;/code&gt; type of links is very basic, but I will (someday, when I understand Lisp a bit better) declare a &lt;code&gt;:follow&lt;/code&gt; attribute to define what Emacs should do when trying to open links of this type. In particular, I could probably get the best of both worlds&lt;sup&gt;&lt;a id="fnr.12" class="footref" href="#fn.12" role="doc-backlink"&gt;12&lt;/a&gt;&lt;/sup&gt;: keep the checks for dead links, while working with Pelican&amp;rsquo;s internal linking syntax!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgba7dd16" class="outline-4"&gt;
&lt;h4 id="orgba7dd16"&gt;Abbreviations&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-orgba7dd16"&gt;
&lt;p&gt;
One functionality that doesn&amp;rsquo;t exist in Org mode is a way to manage abbreviations. In &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt;, for example, there exists an &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; tag that can be used to denote whenever something is an abbreviation (and, in which case, what is being abbreviated). Since an example is worth a thousand words, here is a self-explanatory illustration: &lt;code&gt;&amp;lt;abbr title="GNU is Not Unix"&amp;gt;GNU&amp;lt;/abbr&amp;gt;&lt;/code&gt;. On this website, a &lt;a href="https://python-markdown.github.io/reference/markdown/extensions/abbr/"&gt;Python-Markdown extension&lt;/a&gt; used to handle the marking of abbreviations as such, but I found nothing for Org-mode, unfortunately.
&lt;/p&gt;

&lt;p&gt;
However, Emacs is awesome, so this was the occasion to rely on another component of Emacs sorcery: &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Hooks.html"&gt;hooks&lt;/a&gt;! Basically, a hook is a collection of functions that are called on specific occasions. The trick is that one can easily add new functions to some already defined hooks, which enables to run additional functions at said specific moments. For example, there are &lt;i&gt;tons&lt;/i&gt; of hooks in Emacs (for every single moment, from pressing/releasing keys to charging new files, searching in a list…); I think my &lt;code&gt;init.el&lt;/code&gt; configuration file mostly consists in setting global variables and adding functions to hooks. In the context of adding abbreviations to Org mode, the hook that interests us is &lt;code&gt;'org-export-before-parsing-hook&lt;/code&gt; (it is run, as the name nicely tells, whenever Org mode begins to export a file to another format).
&lt;/p&gt;

&lt;p&gt;
The way abbreviations work in my setup is the following: whenever the hook &lt;code&gt;'org-export-before-parsing-hook&lt;/code&gt; is run, a bit of code looks at a list of abbreviations that were defined in the source file that is to be exported (the syntax for defining an abbreviation is &lt;code&gt;#+ABBR: [GNU] GNU is Not Unix&lt;/code&gt;, which seems practical enough!), and each occurrence of the word &lt;code&gt;GNU&lt;/code&gt; in the body of the file is replaced by its &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; counterpart &lt;code&gt;&amp;lt;abbr title="GNU is Not Unix"&amp;gt;GNU&amp;lt;/abbr&amp;gt;&lt;/code&gt;. The export of the file then resumes as usual, and this is how I get abbreviations like &lt;abbr title="Operating System"&gt;OS&lt;/abbr&gt; to display nicely in a web browser!
&lt;/p&gt;

&lt;p&gt;
To be perfectly honest, though, I had no idea how to pull off such a feat on my own; so Léo, being the very kind Elisp magician that he is, just sent me a bunch of code doing it! 🧙
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org95f9902" class="outline-4"&gt;
&lt;h4 id="org95f9902"&gt;Minor modifications&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org95f9902"&gt;
&lt;p&gt;
There are a few other slight alterations that I added to Org mode exports, mostly for my own comfort&lt;sup&gt;&lt;a id="fnr.13" class="footref" href="#fn.13" role="doc-backlink"&gt;13&lt;/a&gt;&lt;/sup&gt;. The funny thing is that these minor modifications are probably the ones that took most of the time to implement, because I was trying to copy and modify a bunch of Org mode functions (written in Elisp, which I do not know), and I only succeeded through long trial and error!
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Org mode supports syntax highlighting for code blocks in a very low-level way: since Org mode is used in Emacs, and that Emacs supports syntax highlighting, Org mode just checks what color is currently used in the buffer that is displaying said code, and hardcodes this color in the &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; export. It gets the job done, but I wanted to do something different instead. Indeed, back when I was using Markdown, syntax highlighting was handled by Pygments, whose &lt;abbr title="Cascading Style Sheets"&gt;CSS&lt;/abbr&gt; files I still had (and was in fact hoping to reuse).&lt;br&gt;
So, as suggested &lt;a href="https://linevi.ch/en/org-pygments.html"&gt;here&lt;/a&gt;, I replaced the original Org mode code that handles the export of &lt;code&gt;src-blocks&lt;/code&gt; (blocks that contain code) by a call to &lt;code&gt;pygmentize&lt;/code&gt;. (Did I already mention how cool it is to be able to override calls to Emacs internals by your own functions?)&lt;/li&gt;
&lt;li&gt;In case you didn&amp;rsquo;t notice, &lt;i&gt;I really like footnotes&lt;/i&gt;. I use them everywhere, half of the time for insightful and apropos remarks, half of the time for silly jokes (mostly at my own expense!) or silly comments that completely break the reading flow of the blog entry&lt;sup&gt;&lt;a id="fnr.14" class="footref" href="#fn.14" role="doc-backlink"&gt;14&lt;/a&gt;&lt;/sup&gt;. However, I did not like how footnotes were exported by Org mode: it was not working with my previous &lt;abbr title="Cascading Style Sheets"&gt;CSS&lt;/abbr&gt;, and the &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; &lt;code&gt;div&lt;/code&gt; organization was different. So I overrode &lt;code&gt;org-html-footnotes-section&lt;/code&gt; and &lt;code&gt;org-html-footnote-section&lt;/code&gt; to change them to whatever I preferred. Right now, it mostly looks like what I wanted it to; but one day, I will get proficient enough in Lisp to display footnotes at the end of each section, rather than grouping all of them at the end of the page. I already wanted to implement this idea when I began writing this blog, but never got around it in Markdown. In Elisp this definitely seems achievable, but it seems to require extensive modifications to the current &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; rendering backend and I am not quite there yet!&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgc014d12" class="outline-2"&gt;
&lt;h2 id="orgc014d12"&gt;Final word&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgc014d12"&gt;
&lt;p&gt;
So, gather around people, the moment hath come: this website, powered by Pelican, is entirely written in Org mode! 🎉
&lt;/p&gt;

&lt;p&gt;
Was it necessary? Definitely not. Was is useful? Most doubtfully. However, it was a nice holiday project that kept me busy for two days, and I enjoyed it very much! Plus, my blog gets an additional level in nerdiness! I could say that this will motivate me to write more often, but we all know that this would be complete bonkers (Markdown wasn&amp;rsquo;t slowing my writing down). Yet, transitioning to Org mode brought me closer than ever to rely on Emacs for everything, and I am very content with this!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="footnote" id="footnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Provided that they do, at least, read the website in a somewhat functional web browser. If anyone is reading the website as a text file in pure &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt;, they will immediately notice that every paragraph now has an &lt;code&gt;id&lt;/code&gt;, whose name gives it away.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
First of all, Léo is the other PhD student of Pascal Vanier, and we study the same kinds of topics (subshifts). Second: I am sorry Léo, that was uncalled for! You have been really helpful since the beginning of my Emacs tribulations, and I am actually very grateful! ❤️
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Or am I? There is only one reason I do this kind of jokes: they&amp;rsquo;re funny, because they&amp;rsquo;re true!
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Okay, you got me: for OCaml development! 😁 Tuareg and Merlin are two awesome tools for an OCaml setup, and there is nothing like them in any other text editor that I know of!
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
There is something incredibly humbling in being able to manifest this kind of genuine surprise when learning that people do not use your obscure piece of software&lt;sup&gt;&lt;a id="fnr.5bis" class="footref" href="#fn.5bis" role="doc-backlink"&gt;6&lt;/a&gt;&lt;/sup&gt;. I have nothing but respect for Léo to manage it.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.6" class="footnum" href="#fnr.6" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Okay, it is highly possible that calling Org-mode an &amp;ldquo;obscure piece of software&amp;rdquo; is quite an exaggeration. It is in fact very well-known (I just had never heard of it before).
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.7" class="footnum" href="#fnr.7" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
If you get into Emacs, God help you, you will probably need to get used to reading the official website and the documentation. Half of the things I understood probably came from reading the documentation. The other half was Léo quoting parts of the documentation that I probably should have found by myself!
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.8" class="footnum" href="#fnr.8" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
This is the Emacs way: if you don&amp;rsquo;t end up with wrist pain at the end of the day, you are doing something very wrong!
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.9" class="footnum" href="#fnr.9" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
You have &lt;i&gt;no idea&lt;/i&gt; how wild this rabbit hole is. None! 😂 Did you know that Emacs contains a few hundred lines of code to compute sunrise and sunset hours at any point on the globe for the next eight hundred years? It is sourced to a few astronomical almanacs from the 80s. The very same thing exists for the lunar phases. There are also functions to convert dates from one calendar to another, including (but not exhaustively): the Maya calendar, the Coptic calendar, the French Revolutionary calendar&lt;sup&gt;&lt;a id="fnr.10" class="footref" href="#fn.10" role="doc-backlink"&gt;10&lt;/a&gt;&lt;/sup&gt;…
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.10" class="footnum" href="#fnr.10" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
I was so impressed with the latter that I envisioned, just for a few seconds, to replace the &lt;code&gt;date&lt;/code&gt; program on my computer (and, of course, the display on my website) with this floral decimal calendar system. I was immediately discouraged by opponents of the revolution, taunting me with some comments along the lines of &amp;ldquo;it won&amp;rsquo;t be easy to schedule an event with friends&amp;rdquo;; but I did not entirely give up on the idea nevertheless.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.11" class="footnum" href="#fnr.11" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Keeping up with a consistent organization system is a bit of work, whereas I do not need that anymore since there are wonderful pieces of software (Emacs, fzf for zsh…) with functionally-rich search features that make it possible to manage files in very busy directories.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.12" class="footnum" href="#fnr.12" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Here is a completely unrelated fun fact: when I say something, I &lt;i&gt;very often&lt;/i&gt; think of a song that contains the final part of the sentence I just said. When working on the fixpoint construction for my PhD (a subshift-related math topic), in which some macro-tiles are called &amp;ldquo;parents&amp;rdquo; and &amp;ldquo;siblings&amp;rdquo;, I had thousands of songs constantly popping in my head (like &lt;a href="https://youtu.be/vGy2JjWYKvQ?feature=shared&amp;amp;t=31"&gt;this one&lt;/a&gt;), and I think some people were very disappointed in me for singing them and not keeping it shut. (I am very sad about this: it takes a lot of efforts to think of silly things to say and silly songs to sing!) Anyway, all this rambling to actually say: after the sentence that started this footnote, I have to sing &lt;a href="https://www.youtube.com/watch?v=Xw23EVCSqOY"&gt;this song&lt;/a&gt; too!
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.13" class="footnum" href="#fnr.13" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
But isn&amp;rsquo;t my own comfort the whole point of this update?
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.14" class="footnum" href="#fnr.14" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Okay, I feel like this deserves a lot more attention: and what is more meta than a footnote about footnotes?!
&lt;/p&gt;

&lt;p class="footpara"&gt;
So, why do I add irrelevant footnotes all over the place, if they break the natural flow of reading? While they may be more or less unconnected with what they refer to in the main text, they may actually be relevant to what I was also thinking about when writing said main text. They give context about me, the author, while the main text hopefully pertains more to what I think. What do these footnotes tell about what happens in my mind, though? Well, whatever it is, it is probably all over the place; but I like providing bits of contexts, trivia or disconcerting thoughts I had while writing an otherwise hopefully structured speech.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;


&lt;/ol&gt;
&lt;/div&gt;</content><category term="this-blog"></category><category term="pelican"></category><category term="org mode"></category><category term="website"></category><category term="update"></category></entry><entry><title>Computational characterization of computable languages in multidimensional SFTs</title><link href="https://www.acallard.net/blog/2024-02-20.computational-characterization-of-computable-languages-in-multidimensional-sfts" rel="alternate"></link><published>2024-02-20T12:22:00+01:00</published><updated>2024-02-20T12:22:00+01:00</updated><author><name>Antonin Callard</name></author><id>tag:www.acallard.net,2024-02-20:/blog/2024-02-20.computational-characterization-of-computable-languages-in-multidimensional-sfts</id><summary type="html">&lt;p&gt;
While at CIRM during this &lt;a href="https://conferences.cirm-math.fr/3007.html"&gt;thematic month&lt;/a&gt;, I discussed with Emmanuel Rauzy about computability on (finitely or recursively presented) groups. In particular, he brought to my attention that the Higman-Clapham-Valiev embedding theorem (namely: any recursively presented group \(H\) embeds into a finitely presented group \(G\) that has solvable word problem …&lt;/p&gt;</summary><content type="html">&lt;p&gt;
While at CIRM during this &lt;a href="https://conferences.cirm-math.fr/3007.html"&gt;thematic month&lt;/a&gt;, I discussed with Emmanuel Rauzy about computability on (finitely or recursively presented) groups. In particular, he brought to my attention that the Higman-Clapham-Valiev embedding theorem (namely: any recursively presented group \(H\) embeds into a finitely presented group \(G\) that has solvable word problem if and only if \(H\) does) implies that the following decision problem is \(\Sigma^0_3\)-complete:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;b&gt;Input:&lt;/b&gt; A finite presentation \(\langle S \mid R \rangle\) of a group \(G\).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Output:&lt;/b&gt; Does \(G\) have solvable word problem?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Of course, since I am interested in the analogies between group theory and subshifts, I wondered if the equivalent problem in subshifts would also be \(\Sigma^0_3\)-complete. Of course, it is, and here&amp;rsquo;s another short note proving so.
&lt;/p&gt;

&lt;p&gt;
First, I have a few people to thank: first of all, Emmanuel Rauzy for giving me an interesting question; and second, Léo Paviet Salomon for making this proof with me.
&lt;/p&gt;
&lt;div id="outline-container-orgd57ebad" class="outline-2"&gt;
&lt;h2 id="orgd57ebad"&gt;Preliminaries&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgd57ebad"&gt;
&lt;p&gt;
In this note, I prove a computational characterization of the computability of the language of multidimensional subshifts: it is \(\Sigma^0_3\)-complete to decide whether a given subshift (either &lt;abbr title="Subshift of Finite Type"&gt;SFT&lt;/abbr&gt;, sofic or effective) has a computable language. 
&lt;/p&gt;

&lt;p&gt;
I didn&amp;rsquo;t see this anywhere, and in the words of Emmanuel Jeandel &amp;ldquo;if we didn&amp;rsquo;t do it with Pascal (Vanier) during his PhD, then it&amp;rsquo;s probably not written anywhere&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;&amp;rdquo;. I don&amp;rsquo;t claim that the problem is very difficult, quite the opposite in fact; but more than the proof, the result by itself looks interesting to me. I have been investigating (recursively presented) groups as a model of computation as of late, and it was interesting to me to transpose computational results from group theory to subshifts&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt;.
&lt;/p&gt;

&lt;p&gt;
Now that it&amp;rsquo;s proved, we can consider this result as &amp;ldquo;folklore&amp;rdquo; and hopefully at some point somebody will write this kind of stuff somewhere (in a book, for example). I know for a fact that some very famous person (who now happens to do math, I guess) is writing a survey about decision problems on subshifts, and will probably post it on the arXiv soon when she gets the time. I&amp;rsquo;ll post a link to it when it&amp;rsquo;s done, but in the meantime, here is a short note containing the proof.
&lt;/p&gt;
&lt;/div&gt;
&lt;div id="outline-container-org6ee12d2" class="outline-3"&gt;
&lt;h3 id="org6ee12d2"&gt;Definitions&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org6ee12d2"&gt;
&lt;p&gt;
For (crash course) definitions about subshifts and the arithmetical hierarchy, I refer to my &lt;a href="https://www.acallard.net/blog/2023-09-20.computational-characterization-of-minimality-in-multidimensional-sfts"&gt;previous note&lt;/a&gt; which very briefly covered the required notions.
&lt;/p&gt;

&lt;p&gt;
In this note, I am interested in the computability of the language of a subshift. Given a subshift \(X \subseteq A^{\Z^d}\), we denote by \(\mathcal{L}_{D}(X) = \{w \in A^D \mid \exists x \in X, w \sqsubseteq x\}\) the set of patterns of finite domain \(D \subseteq_f \Z^d\) that appear in \(X\). The &lt;i&gt;language&lt;/i&gt; of \(X\) is then defined as \(\mathcal{L}(X) = \bigcup_{D \subseteq_f \Z^d} \mathcal{L}_{D}(X)\).
&lt;/p&gt;

&lt;p&gt;
Finally, we say that \(X\) has a &lt;i&gt;computable language&lt;/i&gt; if \(\mathcal{L}(X)\) is a computable set, i.e. if there exists a total Turing machine that recognizes it.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org5a8db0c" class="outline-2"&gt;
&lt;h2 id="org5a8db0c"&gt;The result&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org5a8db0c"&gt;
&lt;p&gt;
Let us define the following decision problem &lt;b&gt;Computability&lt;/b&gt;:
&lt;/p&gt;
&lt;div data-type="Definition" class="theorem" id="orge0e979e"&gt;
&lt;p&gt;
The decision problem &lt;b&gt;Computability&lt;/b&gt; is defined as follows:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;b&gt;Input&lt;/b&gt;: A family of forbidden patterns \(\mathcal{F}\);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Output:&lt;/b&gt; Is \(\mathcal{L}(X_{\mathcal{F}})\) computable?&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;p&gt;
As mentioned in the introduction of this post, here is what we proved:
&lt;/p&gt;
&lt;div data-type="Theorem" data-numbered="1" class="theorem" id="orgf4422f7"&gt;
&lt;p&gt;
In dimension \(d \geq 2\), &lt;b&gt;Computability&lt;/b&gt; is \(\Sigma^0_3\)-complete on &lt;abbr title="Subshift of Finite Type"&gt;SFTs&lt;/abbr&gt; and effective subshifts.
&lt;/p&gt;

&lt;/div&gt;

&lt;p&gt;
The fact that &lt;b&gt;Computability&lt;/b&gt; belongs in \(\Sigma^0_3\) for effective subshifts is straightforward: the exercise consists in writing the quantifiers in the right order&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt;. In the rest of this note, I focus on the converse: proving that &lt;b&gt;Computability&lt;/b&gt; is a \(\Sigma^0_3\)-hard problem on &lt;abbr title="Subshift of Finite Type"&gt;SFTs&lt;/abbr&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;div id="outline-container-orga2e14e3" class="outline-3"&gt;
&lt;h3 id="orga2e14e3"&gt;Hardness in dimension \(d=1\)&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orga2e14e3"&gt;
&lt;p&gt;
Let us prove an intermediary result:
&lt;/p&gt;
&lt;div data-type="Lemma" class="theorem" id="orgfe75f41"&gt;
&lt;p&gt;
The following decision problem is \(\Sigma^0_3\)-complete:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;b&gt;Input&lt;/b&gt;: a computably enumerable family of one-dimensional forbidden patterns \(\mathcal{F}\);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Output&lt;/b&gt;: Is \(\mathcal{L}(X)\) computable?&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;div class="proof" id="org631c7f3"&gt;
&lt;p&gt;
We focus on \(\Sigma^0_3\)-hardness, and reduce to the problem &lt;b&gt;&lt;b&gt;coFin&lt;/b&gt;&lt;/b&gt;: given a Turing machine \(\mathcal{M}\), does it halt on all but finitely many inputs?
&lt;/p&gt;

&lt;p&gt;
Define \(X\) a \(\Z\) effective subshift on the alphabet \(\{\#,0,1\}\) of configurations that, if they contain at least two symbols \(\#\) separated by distance, say, \(p\), are then \(p\)-periodic; and, denoting by \((M_n)_{n \in \N}\) an enumeration of Turing machines, we add the following two families of forbidden patterns:
&lt;/p&gt;

&lt;p&gt;
\[ \begin{align*}
\mathcal{F}_1 &amp; = \{ \# b_1 b_2 \dots b_n \# \mid b_i \in \{0,1\},\, b_i = 1 \text{ and } M_i \text{ halts on the empty word \(\varepsilon\)}\, \} \\
\mathcal{F}_2 &amp; = \{ \# b_1 b_2 \dots b_n \# \mid b_i \in \{0,1\},\, \mathcal{M}(n) \text{ halts}\,\}
\end{align*} \]
&lt;/p&gt;

&lt;p&gt;
If \(\mathcal{M}\) halts on all but finitely many inputs, there are finitely many words of the form \(\# u \#\) in \(\mathcal{L}(X)\) because of \(\mathcal{F}_2\), so that \(\mathcal{L}(X)\) is computable. On the other hand, if there are infinitely many inputs on which \(\mathcal{M}\) does not halt, then there are arbitrary long words of the form \(\# u \#\) in \(\mathcal{L}(X)\) for \(u \in \{0,1\}^*\). As these words encode arbitrary long sequences of a \(\Sigma^0_1\) oracle (the halting problem), \(\mathcal{L}(X)\) is not computable.
&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgbad46f3" class="outline-3"&gt;
&lt;h3 id="orgbad46f3"&gt;Hardness in dimension \(d \geq 2\)&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orgbad46f3"&gt;
&lt;p&gt;
Let me recall a simulation theorem from [&lt;a href="https://doi.org/10.1016/j.jcss.2011.11.001"&gt;Durand, Romashchenko &amp;amp; Shen (2012)&lt;/a&gt;; Theorem 10] and [&lt;a href="https://link.springer.com/article/10.1007/s10440-013-9808-5"&gt;Aubrun &amp;amp; Sablik (2013)&lt;/a&gt;; Theorem 3.1]:
&lt;/p&gt;

&lt;div data-type="Theorem" class="theorem" id="orgfe70389"&gt;
&lt;p&gt;
Given an effective \(\Z\) subshift \(X_1\), there exists a \(\Z^2\) &lt;abbr title="Subshift of Finite Type"&gt;SFT&lt;/abbr&gt; \(X_2\) such that:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Denoting \(X_1^\uparrow = \{ x \in A^{\Z^2} \mid \exists y \in X_1, \forall i,j \in \Z, x_{i,j} = y_j \}\) the vertical extension of \(X_1\), then \(X_1^\uparrow\) is a factor of \(X_2\);&lt;/li&gt;
&lt;li&gt;If \(X_1\) has computable language, then \(X_2\) also has computable language.&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;p&gt;
Basically, this theorem is a computable version of the fixpoint-based construction. We can then complete the proof of our theorem:
&lt;/p&gt;

&lt;div data-title="Theorem 1" class="proof" id="org2364062"&gt;
&lt;p&gt;
By the theorem above, we obtain that &lt;b&gt;Computability&lt;/b&gt; of &lt;abbr title="Subshift of Finite Type"&gt;SFTs&lt;/abbr&gt; in dimension \(d \geq 2\) reduces to the computability problem for \(\Z\) effective subshifts, which is \(\Sigma^0_3\)-hard. This concludes the proof.
&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="footnote" id="footnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Of course, were he to be wrong, please feel free to tell me!
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
For some reason, it is way easier for me to get good ideas from groups and tranpose them to subshifts, than the other way around. Groups are mean.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Which, in itself, might be a non-trivial matter. I always tend to confuse these things.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;


&lt;/ol&gt;
&lt;/div&gt;</content><category term="math"></category><category term="computability"></category><category term="language"></category><category term="SFT"></category><category term="subshifts"></category><category term="arithmetical hierarchy"></category></entry><entry><title>Happy new year!</title><link href="https://www.acallard.net/blog/2024-01-02.happy-new-year" rel="alternate"></link><published>2024-01-02T12:42:26+01:00</published><updated>2024-01-03T09:06:04+01:00</updated><author><name>Antonin Callard</name></author><id>tag:www.acallard.net,2024-01-02:/blog/2024-01-02.happy-new-year</id><summary type="html">&lt;div id="outline-container-org0d96656" class="outline-2"&gt;
&lt;h2 id="org0d96656"&gt;It&amp;rsquo;s been a while&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org0d96656"&gt;
&lt;p&gt;
I haven&amp;rsquo;t published on this blog for quite a while… there obviously are many reasons for that, a few of which I can mention. As I already wrote in the very first entry of this blog, I am terrible at keeping up with …&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div id="outline-container-org0d96656" class="outline-2"&gt;
&lt;h2 id="org0d96656"&gt;It&amp;rsquo;s been a while&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org0d96656"&gt;
&lt;p&gt;
I haven&amp;rsquo;t published on this blog for quite a while… there obviously are many reasons for that, a few of which I can mention. As I already wrote in the very first entry of this blog, I am terrible at keeping up with a self-imposed schedule, and I am actually very sorry about that! I also spent a lot of time preparing my teachings, in particular planning my first lectures and writing the teaching material accordingly; and while I thought I had taken a very generous estimate of how much time I would need for that, I eventually had to give it three of four times the estimated amount, which was a lesson in humility regarding my planning talents. 
&lt;/p&gt;

&lt;p&gt;
As I enjoy overthinking and banging my head at impossible questions as much as everyone else (i.e. quite a disproportionate amount), I also spent a lot of time considering what teaching means to me, and how I can make my lectures engaging for students while making the skills and knowledge taught worth their time. In fact, I spent so much time on it that I decided to write about it and I started writing a blog entry reflecting on my first lectures. As the ingenious reader can obviously notice, the non-existence of said entry online means that things did not go as planned: I restarted the whole undertaking three or four times, but each time it becomes a behemoth that both starts and goes nowhere, and I get either dissatisfied or bored with it (or both) and don&amp;rsquo;t publish it. Maybe someday I will write something I will be happy with and it will appear here? It&amp;rsquo;s on my (very long and very rarely completed) to-do list, among with a lot of other ideas of posts for this blog (like a very on-the-nose relevant entry about &amp;ldquo;Why does writing a blog entry in English is so damn much harder than chatting up the topic with friends?&amp;rdquo;&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt;).
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org0380e74" class="outline-2"&gt;
&lt;h2 id="org0380e74"&gt;New year and resolutions&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org0380e74"&gt;
&lt;p&gt;
Anyway! I am back here and it is time for celebrations once again: &lt;b&gt;happy new year everyone&lt;/b&gt;! I still have a few days of holidays at home, after the (not much resting but definitely very socializing) holidays with family and friends. Then I&amp;rsquo;ll once more turn to working on my &lt;del&gt;infuriating&lt;/del&gt; slightly difficult math problem at the lab, but let&amp;rsquo;s not talk about that now, shall we? 😄
&lt;/p&gt;

&lt;p&gt;
As the custom dictates, it is the time of the year at which people obey the unforgiving tradition of writing down a list of resolutions. I am not one to usually do so, since not taking these resolutions helps me avoid the unpleasant contrition of not upholding my end of the self-imposed bargain. Yet, this year I&amp;rsquo;m changing that&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt;: let me announce, here and now, that I will attempt to write more constantly on this blog in the future.
&lt;/p&gt;

&lt;p&gt;
Why break my non-pledging habits&lt;sup&gt;&lt;a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt;? I see two reasons for that. First, I really take pleasure in writing here (even though I&amp;rsquo;ve been somewhat suboptimal at keeping up with it). The writing process is particularly effective as a way to think things through, lay thoughts down and organize them properly; and it is quite convenient to have a place where I can consult these thoughts later on. Also, for anyone interested, it hints at how I like to think, and I always find observing somebody&amp;rsquo;s thought process quite fascinating. Writing a blog in English is also efficient training for my English skills, taking the proper time to look for grammar rules and specific vocabulary&lt;sup&gt;&lt;a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt;. Second, I already have two drafts of posts that I started weeks ago but that are still far from being complete: I am still unhappy with their current states, so I keep coming back at them, adding whole sections and removing others, changing the whole outline… and I still don&amp;rsquo;t know how to get them done. As January should be a calmer month than the two previous ones, I will hopefully get them out of the door in the weeks to come. At this point, I completely fall in the sunk cost fallacy: too much time has been spent on these drafts for me not to complete them! Finally, the third and most important reason (who said I knew how to count?): because I feel like it!
&lt;/p&gt;

&lt;p&gt;
There wasn&amp;rsquo;t much direction for this entry, except babbling for a little while, so I&amp;rsquo;ll end it there. Incidentally, it was the first entry for a very long while; hopefully, the first of many more! Happy new year!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="footnote" id="footnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
🎶 I shouldn&amp;rsquo;t have kept you waiting… But I&amp;rsquo;m here now! 🎶
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
In case this topic interests you but, at the time you&amp;rsquo;re reading this, I haven&amp;rsquo;t figured out the final writing yet, the answer is probably contained in the question. What are the issues, then? Two clues: English, and writing. 😁
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
I do expect &lt;i&gt;sixteen and a half minutes of uninterrupted thunderous ovation, as flames illuminate my tear-stained face&lt;/i&gt; for this. 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
I definitely am a man of habits.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
I would very much like &lt;i&gt;not&lt;/i&gt; to talk like a five-year-old, but it is much more complicated than one may think!
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;


&lt;/ol&gt;
&lt;/div&gt;</content><category term="miscellaneous"></category></entry><entry><title>Computational characterization of minimality in multidimensional SFTs</title><link href="https://www.acallard.net/blog/2023-09-20.computational-characterization-of-minimality-in-multidimensional-sfts" rel="alternate"></link><published>2023-09-20T23:39:16+02:00</published><updated>2023-09-20T23:39:16+02:00</updated><author><name>Antonin Callard</name></author><id>tag:www.acallard.net,2023-09-20:/blog/2023-09-20.computational-characterization-of-minimality-in-multidimensional-sfts</id><summary type="html">&lt;p&gt;
Today, I met up with a new kind of problem: I got a result which was easy enough so that posting it on arXiv would have been preposterous, yet I knew quite a few people who didn&amp;rsquo;t have any answer to it (for their defense, they didn&amp;rsquo;t spend …&lt;/p&gt;</summary><content type="html">&lt;p&gt;
Today, I met up with a new kind of problem: I got a result which was easy enough so that posting it on arXiv would have been preposterous, yet I knew quite a few people who didn&amp;rsquo;t have any answer to it (for their defense, they didn&amp;rsquo;t spend much time thinking about it). A quick search didn&amp;rsquo;t show me anything, and I&amp;rsquo;m quite convinced that nobody has ever written it down.
&lt;/p&gt;

&lt;p&gt;
What do you do with an easy solution to a not very profound question? I could have asked the question on MathOverflow before, but doing so now would be very silly since I already got the answer! I don&amp;rsquo;t want to post it on arXiv, because I&amp;rsquo;m not sure the arXiv really consists in hosting &lt;abbr title="Portable Document Format"&gt;PDFs&lt;/abbr&gt; that essentially boil down to &amp;ldquo;a short note that could have been an exercise&amp;rdquo;.
&lt;/p&gt;

&lt;p&gt;
So, what did I choose? To post it on my blog, obviously!
&lt;/p&gt;

&lt;p&gt;
Here are a few acknowledgements for this specific note: all my thanks to Ville Salo for the very useful emails, to Léo Paviet Salomon for banging his head with me while trying to crack this thing, and to everybody from the RNDJCEDSAPSDCEGSY (in particular Benjamin) for the very nice discussions!
&lt;/p&gt;
&lt;div id="outline-container-org52bc5ee" class="outline-2"&gt;
&lt;h2 id="org52bc5ee"&gt;Preliminaries&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org52bc5ee"&gt;
&lt;p&gt;
In this post, I prove a computational characterization of the minimality of subshifts: deciding minimality is a \(\Pi^0_2\)-complete decision problem.  At first, I thought that such a question would obviously have already been solved by somebody, but I couldn&amp;rsquo;t find such a thing anywhere, so maybe it hasn&amp;rsquo;t? In any case, I spent a bit of time over the last few days trying to prove \(\Pi^0_2\)-hardness: so, in case anybody&amp;rsquo;s wondering, here&amp;rsquo;s how I did it!
&lt;/p&gt;

&lt;p&gt;
I obviously have no claim on this result whatsoever, and I don&amp;rsquo;t think it would be very wise to cite me or this blog post as a bibliographic reference. Were I to need it in the future I would probably mention it as &amp;ldquo;folklore&amp;rdquo;; and hopefully there will come a day when somebody will take pen to paper, write a book containing a proof and give us a proper reference.
&lt;/p&gt;

&lt;p&gt;
Anyway. For the purpose of this post, let me provide a few definitions in case you stumbled upon this page without knowing what it was about. Though let me be honest: these are very succinct, and are in no way a proper introduction to computability on subshifts.
&lt;/p&gt;
&lt;/div&gt;
&lt;div id="outline-container-org2b3ffe5" class="outline-3"&gt;
&lt;h3 id="org2b3ffe5"&gt;Subshifts&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org2b3ffe5"&gt;
&lt;p&gt;
Given \(\Z^d\) the discrete space of dimension \(d\), and \(A\) a finite alphabet, a &lt;i&gt;configuration&lt;/i&gt; is a coloring \(x : \Z^d \to A\) that colors each position of \(\Z^d\) with a symbol of \(A\). A &lt;i&gt;pattern&lt;/i&gt; is a coloring \(w : D \to A\) of a finite domain \(D \subseteq \Z^d\). Abusing notations, we denote \(A^* = \{w : D \to A \mid D \subseteq_f \Z^d \}\) the set of all finite patterns. We say that a pattern \(w : D \to A\) &lt;i&gt;appears&lt;/i&gt; in a configuration \(x \in A^{\Z^d}\) (denoted \(w \sqsubseteq x\)) if there exists a position \(i \in \Z^d\) such that \(x|_{i+D} = w\).
&lt;/p&gt;

&lt;p&gt;
In this context, a family (potentially infinite) of forbidden patterns \(\mathcal{F}\) defines a &lt;i&gt;subshift&lt;/i&gt;, i.e. a set of colorings of the plane
&lt;/p&gt;

&lt;p&gt;
\[ X_\mathcal{F} = \{ x \in A^{\Z^d} \mid \forall w \in \mathcal{F}, w \not \sqsubseteq x \}. \]
&lt;/p&gt;

&lt;p&gt;
Given a subshift \(X \subseteq A^{\Z^d}\), the set of finite patterns that appear in \(X\) defines the &lt;i&gt;language&lt;/i&gt; \(\mathcal{L}(X)\) of the subshift: \(\mathcal{L}(X) = \{ w \in A^* \mid \exists x \in X, w \sqsubseteq x \}\).
A subshift \(X \subseteq A^{\Z^d}\) is said to be &lt;i&gt;of finite type&lt;/i&gt; (SFT) if there exists a finite family \(\mathcal{F}\) such that \(X = X_\mathcal{F}\). It is said to be &lt;i&gt;effective&lt;/i&gt; if there exists a recursively computable family \(\mathcal{F}\) such that \(X = X_\mathcal{F}\).
&lt;/p&gt;

&lt;p&gt;
In what follows, I am interested in the minimality of subshifts. A subshift \(X_\mathcal{F}\) is said to be &lt;i&gt;minimal&lt;/i&gt; if it contains no proper non-empty subshift, i.e. if for every \(w \in \mathcal{L}(X_\mathcal{F})\), \(X_{\mathcal{F} \cup \{w\}} = \emptyset\).
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgf43fac9" class="outline-3"&gt;
&lt;h3 id="orgf43fac9"&gt;The arithmetical hierarchy&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orgf43fac9"&gt;
&lt;p&gt;
A &lt;i&gt;decision problem&lt;/i&gt; is a function \(f : \N \to \{ True, False \}\) that maps inputs of an encoded problem to a boolean answer. The class of decision problems can be classified into \(\Sigma^0_n\), \(\Pi^0_n\) and \(\Delta^0_n\), of which I define here the first levels.
&lt;/p&gt;

&lt;p&gt;
\(\Delta^0_0\) is the class of &lt;i&gt;decidable&lt;/i&gt; decision problems, i.e. problems for which there exists a computable function that answers it (typically: is an integer given as input a prime number?). Then:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;\(\Sigma^0_1\) is the class of computably enumerable problems, i.e. problems \(f\) for which there exists a computable function \(g\) such that \(f(n) = True \iff \exists m \in \N,\ g(m,n) = True\).&lt;/li&gt;
&lt;li&gt;\(\Pi^0_1\) is the class of co-computably enumerable problems, i.e. problems \(f\) for which there exists a computable function \(g\) such that \(f(n) = True \iff \forall m \in \N,\ g(m,n) = True\).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
And of course, this hierarchy can be defined recursively. In particular, this post focuses on the class \(\Pi^0_2\) of problems \(f\) for which there exists a computable function \(g\) such that:
&lt;/p&gt;

&lt;p&gt;
\[ f(n) = True \iff \forall p, \exists q,\ g(p,q,n) = True \]
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org9990815" class="outline-2"&gt;
&lt;h2 id="org9990815"&gt;The result&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org9990815"&gt;
&lt;p&gt;
Let us define the following decision problem &lt;b&gt;Minimality&lt;/b&gt;:
&lt;/p&gt;
&lt;div data-type="Definition" class="theorem" id="org335f8fa"&gt;
&lt;p&gt;
The decision problem &lt;b&gt;&lt;b&gt;Minimality&lt;/b&gt;&lt;/b&gt; is defined as follows:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;b&gt;Input&lt;/b&gt;: A finite family of forbidden patterns \(\mathcal{F}\);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Output:&lt;/b&gt; Is the subshift \(X_\mathcal{F}\) minimal?&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;p&gt;
We can now state the main result of this blog entry:
&lt;/p&gt;
&lt;div data-type="Theorem" data-numbered="1" class="theorem" id="org23f4747"&gt;
&lt;p&gt;
In dimension \(d \geq 2\), &lt;b&gt;Minimality&lt;/b&gt; is \(\Pi^0_2\)-complete.
&lt;/p&gt;

&lt;/div&gt;

&lt;p&gt;
The fact that &lt;b&gt;Minimality&lt;/b&gt; belongs in \(\Pi^0_2\) is straightforward. In the rest of this post, we focus on the converse: proving that &lt;b&gt;Minimality&lt;/b&gt; is \(\Pi^0_2\)-hard.
&lt;/p&gt;
&lt;/div&gt;
&lt;div id="outline-container-orga19a675" class="outline-3"&gt;
&lt;h3 id="orga19a675"&gt;Hardness in dimension \(d=1\)&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orga19a675"&gt;
&lt;p&gt;
Let us prove an intermediary result:
&lt;/p&gt;
&lt;div data-type="Lemma" class="theorem" id="org6d6d5e4"&gt;
&lt;p&gt;
The following decision problem is \(\Pi_2^0\)-complete:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;b&gt;Input&lt;/b&gt;: a computably enumerable family of one-dimensional forbidden patterns \(\mathcal{F}\);&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Output&lt;/b&gt;: is the \(\Z\) effective subshift \(X_\mathcal{F}\) minimal?&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;div class="proof" id="org96cdbc8"&gt;
&lt;p&gt;
We focus on \(\Pi^0_2\)-hardness, and reduce to the following problem: given as input a deterministic Turing machine \(\mathcal{M}\) that outputs at every steps &amp;ldquo;clicks&amp;rdquo; and &amp;ldquo;clacks&amp;rdquo;, does the machine output infinitely many &amp;ldquo;clicks&amp;rdquo; on the empty word?
&lt;/p&gt;

&lt;p&gt;
Let \(\mathcal{M}\) be such a machine; without loss of generality, assume that \(\mathcal{M}\) outputs &amp;ldquo;clack&amp;rdquo; infinitely often: if it does not, replace \(\mathcal{M}\) by the machine \(\mathcal{M}&amp;rsquo;\) that does one step of computation of \(\mathcal{M}\) every two steps, and outputs &amp;ldquo;clack&amp;rdquo; every other two. To \(\mathcal{M}\), we associate an effective \(\Z\) subshift \(X\) that will be minimal if and only if \(\mathcal{M}\) outputs &amp;ldquo;click&amp;rdquo; infinitely many times.
&lt;/p&gt;

&lt;p&gt;
Let \(s \in \{click, clack\}^\N\) be the sequence of clicks and clacks that \(\mathcal{M}\) outputs on the empty word. Note that the sequence \(s\) is computable. To this sequence, we associate the following subshift \(X\) (said to be Toeplitz):
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;First, define \( \dots * s_0 * s_0 * s_0 * s_0 * s_0 * \dots\) the bi-infinite words in which one position out of two is \(s_0\), the first output of the machine \(\mathcal{M}\). We then proceed recursively.&lt;/li&gt;
&lt;li&gt;Replace the symbols \(*\) in the previous words in the following way: one position out of two, write \(s_1\), the second output of the machine \(\mathcal{M}\); and leave \(*\) symbols every other one. So you get bi-infinite words of the form \(\dots s_1 s_0 * s_0 s_1 s_0 * s_0 s_1 s_0 * s_0 s_1 s_0 * \dots\).&lt;/li&gt;
&lt;li&gt;And iterate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
In other words, considering the bi-infinite &lt;a href="https://oeis.org/A001511"&gt;ruler sequence&lt;/a&gt;, replace every integer \(n\) by the corresponding value \(s_n\). This set of words defines an effective subshift \(X\). There is a slight difference, though: in the bi-infinite Toeplitz configurations of \(X\), there may exist (at most once per configuration) a position of infinite level; and for such positions, both configurations in which this position is colored &amp;ldquo;click&amp;rdquo; and &amp;ldquo;clack&amp;rdquo; exist.
&lt;/p&gt;

&lt;p&gt;
As the machine outputs &amp;ldquo;clack&amp;rdquo; infinitely often, configurations having &amp;ldquo;clack&amp;rdquo; at a position of infinite level belong in the orbit closure of every other configuration.
Then:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;If \(\mathcal{M}\) outputs &amp;ldquo;click&amp;rdquo; infinitely many times, then a configuration having &amp;ldquo;click&amp;rdquo; at the position of infinite level belongs in the orbit closure of all the others, and the subshift \(X\) is minimal.&lt;/li&gt;
&lt;li&gt;If \(\mathcal{M}\) outputs &amp;ldquo;click&amp;rdquo; finitely many times, there exists a time \(N\) after which &amp;ldquo;click&amp;rdquo; no longer appears in \(s\). Then, by forbidding the finite patterns allowing positions of level \(\geq N\) to be colored &amp;ldquo;click&amp;rdquo; in the subshift \(X\), we obtain a strict subshift of \(X\) (as configurations that contain &amp;ldquo;click&amp;rdquo; at a position of infinite level are now forbidden) that is non-empty.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
All in all, \(X\) is minimal if and only if \(\mathcal{M}\) outputs &amp;ldquo;click&amp;rdquo; infinitely many times. This concludes the proof.
&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org97e6094" class="outline-3"&gt;
&lt;h3 id="org97e6094"&gt;Hardness in dimension \(d \geq 2\)&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org97e6094"&gt;
&lt;p&gt;
Let me recall a simulation theorem from [&lt;a href="https://doi.org/10.1017/etds.2019.112"&gt;Durand &amp;amp; Romashchenko, 2020&lt;/a&gt;, Theorem 7]:
&lt;/p&gt;

&lt;div data-type="Theorem" class="theorem" id="org4f4d050"&gt;
&lt;p&gt;
Given an effective \(\Z\) subshift \(X_1\), there exists a \(\Z^2\) SFT \(X_2\) such that:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Denoting \(X_1^\uparrow = \{ x \in A^{\Z^2} \mid \exists y \in X_1, \forall i,j \in \Z, x_{i,j} = y_j \}\) the vertical extension of \(X_1\), then \(X_1^\uparrow\) is a factor of \(X_2\);&lt;/li&gt;
&lt;li&gt;\(X_2\) is minimal if and only if \(X_1\) is minimal.&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;p&gt;
Basically, this theorem is a minimal version of the fixpoint-based construction. We can then complete the proof of our theorem:
&lt;/p&gt;

&lt;div data-title="Theorem 1" class="proof" id="org53f66a8"&gt;
&lt;p&gt;
By [&lt;a href="https://doi.org/10.1017/etds.2019.112"&gt;Durand &amp;amp; Romashchenko, 2020&lt;/a&gt;, Theorem 7], we obtain that &lt;b&gt;Minimality&lt;/b&gt; of SFTs in dimension \(d \geq 2\) reduces to the minimality problem for \(\Z\) effective subshifts, which is \(\Pi^0_2\)-hard. This concludes the proof.
&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="math"></category><category term="minimal"></category><category term="minimality"></category><category term="SFT"></category><category term="subshifts"></category><category term="arithmetical hierarchy"></category><category term="decidability"></category></entry><entry><title>Troubles with .htaccess</title><link href="https://www.acallard.net/blog/2023-09-06.troubles-with-htaccess" rel="alternate"></link><published>2023-09-06T23:07:20+02:00</published><updated>2023-09-06T23:07:20+02:00</updated><author><name>Antonin Callard</name></author><id>tag:www.acallard.net,2023-09-06:/blog/2023-09-06.troubles-with-htaccess</id><summary type="html">&lt;p&gt;
The recent update of this website (mentioned &lt;a href="https://www.acallard.net/blog/2023-08-23.starting-this-blog"&gt;here&lt;/a&gt;) caused many pages of the previous version to disappear (I renamed a few things and reorganized most of the information on display, which broke many old links that referred to content that had been moved somewhere else). However, having been recently influenced …&lt;/p&gt;</summary><content type="html">&lt;p&gt;
The recent update of this website (mentioned &lt;a href="https://www.acallard.net/blog/2023-08-23.starting-this-blog"&gt;here&lt;/a&gt;) caused many pages of the previous version to disappear (I renamed a few things and reorganized most of the information on display, which broke many old links that referred to content that had been moved somewhere else). However, having been recently influenced by some discussions about the preservation of information on the Internet (see &lt;a href="http://www.madore.org/~david/weblog/d.2023-05-12.2750.kopimism.html#d.2023-05-12.2750"&gt;this blog post by David Madore (in French)&lt;/a&gt;), I decided to task myself with implementing redirections from old dead links to their corresponding shiny new pages. 
&lt;/p&gt;

&lt;p&gt;
To be fair, I didn&amp;rsquo;t really believe that anyone had ever saved any of my pages to their bookmarks: so, if I had had to guess, I probably would have bet that no one would have needed or noticed these redirections in the first place. But, just in case, my principles required me to make them; and, being mindful of &lt;abbr title="Search engine optimization"&gt;SEO&lt;/abbr&gt;&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;, it was obvious that Google prefers redirections to 404 errors. All in all, providing some kind of continuity between the old and the new website seemed like a good idea, and one that wouldn&amp;rsquo;t be too hard to implement: it was just a matter of writing some substitutions with regex&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt;, so nothing could go wrong… could it?
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
&amp;ldquo;Oh, sweet summer child.&amp;rdquo;&lt;br&gt;
&amp;#x2013; Me, to my past self.
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
Let&amp;rsquo;s just that that everything did &lt;i&gt;not&lt;/i&gt; go according to plan: in the end, I spent four or five hours trying to get these redirections working with a &lt;code&gt;.htaccess&lt;/code&gt; file. 
&lt;/p&gt;
&lt;div id="outline-container-org60f2962" class="outline-2"&gt;
&lt;h2 id="org60f2962"&gt;First mistakes&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org60f2962"&gt;
&lt;p&gt;
Some mistakes could have easily been avoided and definitely were on me. This is, of course, despite me trying my best to be a model student: for example, before uploading my &lt;code&gt;.htaccess&lt;/code&gt; file, I locally simulated resolutions of &lt;abbr title="Uniform Resource Locators"&gt;URLs&lt;/abbr&gt;, and doing so enabled me to discover some silly typos in my regex. After I had fixed them all, I was sure that my substitutions were correct; and naively, I had hoped that it would be sufficient testing and that everything would work smoothly on the first try after the update: &amp;ldquo;Oh, sweet summer child&amp;rdquo; (&lt;i&gt;bis repetita&lt;/i&gt;). Let&amp;rsquo;s just say that &lt;i&gt;it did not&lt;/i&gt;.
&lt;/p&gt;

&lt;p&gt;
Indeed, in the beautiful world of computer tinkering, it so happens that the very same &lt;code&gt;.htaccess&lt;/code&gt; file on two different websites can lead to two different behaviors, which is something my kind of testing had failed to take into account. Let me provide an example of that: in this day and age, the modern custom wanted me to remove &lt;code&gt;.html&lt;/code&gt; extensions from &lt;abbr title="Uniform Resource Locators"&gt;URLs&lt;/abbr&gt; so that the reader can go to &lt;code&gt;acallard.net/about-me&lt;/code&gt; to learn about my childhood, instead of having to type &lt;code&gt;acallard.net/about-me.html&lt;/code&gt; in their address bar. But there was a slight deficiency in my very narrow knowledge of Apache configuration files: I did &lt;i&gt;not&lt;/i&gt; know that Apache automatically adds a trailing &lt;code&gt;/&lt;/code&gt; to any &lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt; that points to something that resolves to a directory.
&lt;/p&gt;

&lt;p&gt;
The trouble is that I have a &lt;code&gt;talks&lt;/code&gt; webpage (redirecting to &lt;code&gt;talks.html&lt;/code&gt;), which contains a (somewhat incomplete and partial) list of the academic talks I have given somewhere and sometime in my life; and that I also have a &lt;code&gt;talks/&lt;/code&gt; directory, that contains the slides of said talks. So, when typing &lt;code&gt;acallard.net/talks&lt;/code&gt;, Apache would redirect to &lt;code&gt;acallard.net/talks/&lt;/code&gt; and display the &lt;code&gt;talks/&lt;/code&gt; directory instead of the nice homonymous &lt;code&gt;talks.html&lt;/code&gt; page that I had spent so much time and craft preparing: one may find this very funny, but somehow at 10pm the humor of the situation eluded me.
&lt;/p&gt;

&lt;p&gt;
This problem was quickly solved by (googling) adding &lt;code&gt;DirectorySlash Off&lt;/code&gt; in the root &lt;code&gt;.htaccess&lt;/code&gt; file. No biggie. Yet, the impact on my morale was not completely negligible: the first problems I had met with my &lt;code&gt;.htaccess&lt;/code&gt; configuration were not even about the redirections that I mentioned above in my introduction (and which, I assure you and despite seemingly opposite appearances, are the topic of this entry), but rather about some obscure details of my basic &lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt; rewriting. As a consequence, my hopes that my wonderfully prepared update would be doing wonders on the first try were somewhat lessened. Or, to be blunt: I knew by then that the easy update that I had planned would turn into a nightmare&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgf6fea1c" class="outline-2"&gt;
&lt;h2 id="orgf6fea1c"&gt;Weird problem&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgf6fea1c"&gt;
&lt;/div&gt;
&lt;div id="outline-container-org8d53f6e" class="outline-3"&gt;
&lt;h3 id="org8d53f6e"&gt;Trouble in paradise&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org8d53f6e"&gt;
&lt;p&gt;
After the initial (and probably predictable) troubles (that I had failed to foresee in my (by then long dead) stubborn optimism), it was now time to see how well my redirections (from the old &lt;abbr title="Uniform Resource Locators"&gt;URLs&lt;/abbr&gt; of the previous website to the new ones) were performing. And… They were not working at all! 😭
&lt;/p&gt;

&lt;p&gt;
Let me explain what these redirections are. Before the last update, I had a dedicated page for each of my publications (so I had &lt;code&gt;publications/first-paper.html&lt;/code&gt;, &lt;code&gt;publications/second-paper.html&lt;/code&gt;, etc…). When developing the new website, I decided that this was one click too many to do for the reader, and I settled for having a single &lt;code&gt;publications.html&lt;/code&gt; page that would contain all of them. So I wrote in my &lt;code&gt;.htaccess&lt;/code&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;RewriteRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;^publications/.*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/publications&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;[L,R=301]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
to redirect any &lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt; beginning with &lt;code&gt;publications/[insert anything here]&lt;/code&gt; to &lt;code&gt;publications.html&lt;/code&gt; itself. And guess what? It &lt;i&gt;failed miserably&lt;/i&gt;: when typing &lt;code&gt;acallard.net/publications/whatever&lt;/code&gt;, Apache was keeping the url intact (instead of redirecting to &lt;code&gt;publications.html&lt;/code&gt;) and the website was then nicely answering with a 404 error (as it was supposed to, since &lt;code&gt;publications/whatever&lt;/code&gt; no longer pointed to any actual &lt;abbr title="Hyper Text Markup Language"&gt;HTML&lt;/abbr&gt; page). 
&lt;/p&gt;

&lt;p&gt;
I took a long breath: it was definitely strange, but I had been editing the &lt;code&gt;.htaccess&lt;/code&gt; file at the last possible moment (which means: it was late), so this was probably just a silly typo. I temporarily rolled everything back, and then started to do some sanity checks on my redirection rules. Here&amp;rsquo;s the thing: I couldn&amp;rsquo;t see any mistake in my configuration, and local simulations said that these redirections were rewriting &lt;abbr title="Uniform Resource Locators"&gt;URLs&lt;/abbr&gt; as expected. Another breath: this was getting weird. I tried a bunch of various different ideas, and then the funniest thing happened: I realized that the rule above would work &lt;i&gt;with the previous version of the website&lt;/i&gt; (so, the old &lt;abbr title="Hyper Text Markup Language"&gt;HTML&lt;/abbr&gt; files), but &lt;i&gt;not with the newer one&lt;/i&gt;.
&lt;/p&gt;

&lt;p&gt;
⁉️
&lt;/p&gt;

&lt;p&gt;
Let me be perfectly clear: with the same &lt;code&gt;.htaccess&lt;/code&gt; file in both cases, my redirections worked perfectly fine if my root folder contained the old &lt;abbr title="Hyper Text Markup Language"&gt;HTML&lt;/abbr&gt; files; but as soon as I deleted them to put the new &lt;abbr title="Hyper Text Markup Language"&gt;HTML&lt;/abbr&gt; files instead, the redirections stopped working. Rolling back: redirections worked. Updating again: they no longer did.
&lt;/p&gt;

&lt;p&gt;
⁉️ ⁉️ ⁉️
&lt;/p&gt;

&lt;p&gt;
THIS WAS &lt;i&gt;NOT&lt;/i&gt; WHAT WAS SUPPOSED TO BE HAPPENING.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org7379824" class="outline-3"&gt;
&lt;h3 id="org7379824"&gt;What happened&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org7379824"&gt;
&lt;p&gt;
Let&amp;rsquo;s skip to the end of the story (this post is becoming too long anyway): here is my understanding of what happened. Assume that, for some reasons, I want to redirect everything in the directory &lt;code&gt;/a/b/&lt;/code&gt; to &lt;code&gt;index.html&lt;/code&gt; (or any other page, really, even one that does not exist: &lt;code&gt;index.html&lt;/code&gt; has no role in this whatsoever). Then I (frustratingly) write (at 1am):
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;RewriteRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;^a/b/.*&lt;span class="w"&gt; &lt;/span&gt;index.html&lt;span class="w"&gt; &lt;/span&gt;[L,R=301]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
It turns out that this RewriteRule works if and only if… the directory &lt;code&gt;a/&lt;/code&gt; exists in the root directory!
&lt;/p&gt;

&lt;p&gt;
I don&amp;rsquo;t know how to explain how utterly stupid I think this is, for so many reasons I don&amp;rsquo;t even know where to begin! This is about &lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt; rewriting, which really is just a special case of text rewriting: why should rewriting on some text depend on what is actually stored on my drive? Even then, assume that for some reasons &lt;code&gt;RewriteRule&lt;/code&gt; &amp;ldquo;checks&amp;rdquo; the existence of the source (which kind of defeats its point, but whatever) before rewriting anything: in this case, can anybody explain to me why the existence of the directory &lt;code&gt;b/&lt;/code&gt; in &lt;code&gt;a/&lt;/code&gt; has no influence whatsoever on the redirections? For all that matters, &lt;code&gt;a/&lt;/code&gt; can be empty. It boils down to this: if &lt;code&gt;a/&lt;/code&gt; exists, then &lt;code&gt;/a/b/[anything]&lt;/code&gt; redirects to &lt;code&gt;index.html&lt;/code&gt;. If &lt;code&gt;a/&lt;/code&gt; does not exist, then the &lt;code&gt;RewriteRule&lt;/code&gt; doesn&amp;rsquo;t do anything at all.
&lt;/p&gt;

&lt;p&gt;
Even though I did not enjoy in the slightest bit where my conclusions were taking me, my honed detective skills left me with only one explanation: directories in the root folder have a special role in redirections. 
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org7bcbec8" class="outline-3"&gt;
&lt;h3 id="org7bcbec8"&gt;An explanation&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org7bcbec8"&gt;
&lt;p&gt;
By then, I had gotten a few hours of sleep and I had started annoying people during coffee breaks at work the next morning. As the reactions of said colleagues were more along the lines of &amp;ldquo;why do you even bother with this stuff?&amp;rdquo; instead of &amp;ldquo;of course, let me help you here&amp;rdquo;, I looked up online and I found the following post on serverfault: &lt;a href="https://serverfault.com/questions/472085/rewriterule-only-works-if-folder-does-not-exist"&gt;&amp;ldquo;RewriteRule only works if folder does not exist&amp;rdquo;&lt;/a&gt; (let&amp;rsquo;s note that this is the exact opposite of the problem I had, but at this point I was ready to read anything remotely related to my issue). This post refers to a paragraph of the Apache documentation that I had completely missed:
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
Note that &lt;code&gt;mod_rewrite&lt;/code&gt; tries to guess whether you have specified a file-system path or a &lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt;-path by checking to see if the first segment of the path exists at the root of the file-system. For example, if you specify a Substitution string of &lt;code&gt;/www/file.html&lt;/code&gt;, then this will be treated as a &lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt;-path unless a directory named &lt;code&gt;www&lt;/code&gt; exists at the root of your file-system […].
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
Now, &lt;i&gt;that&lt;/i&gt; explains things. Well… at least it&amp;rsquo;s something. Calling it an explanation may be a bit of a stretch: it seems weird that there&amp;rsquo;s no way to pass a flag forcing Apache to recognize a path as filesystem instead of &lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt; (or the other way around), so that it can only fall back on guessing the author&amp;rsquo;s intention based on a seemingly questionable heuristic (checking whether the first segment of the path exists on your drive does not look like a good idea to my ignorant mind). Why this choice? It was unavoidable that, eventually, somebody (like me) would stumble upon this issue without having read the proper documentation: they would then waste a couple of hours not understanding why their very good configuration files don&amp;rsquo;t work as expected, and get very, very frustrated.
&lt;/p&gt;

&lt;p&gt;
As I was complaining&lt;sup&gt;&lt;a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; to some colleague, they said that there probably was a very good reason at the time for people to settle on this solution: that is probably very true, though I have no idea what such a motive could be; and despite some googling, I did not find any answer to my question. In fact, the issue is very rarely mentioned on the web at all. Once you know of it, of course, it becomes easy to see that it is mentioned in the &amp;ldquo;Substitution&amp;rdquo; paragraph of the &amp;ldquo;RewriteRule Directive&amp;rdquo; section. But I guess that this kind of configuration files has the same pitfall that also plagues poor souls trying to get through their first merge errors in git: it is very easy to search their documentation if you already know what you&amp;rsquo;re looking for; but if not, good luck.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org2273a56" class="outline-3"&gt;
&lt;h3 id="org2273a56"&gt;What do I do now?&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org2273a56"&gt;
&lt;p&gt;
Obviously, I solved the problem by creating an empty directory &lt;code&gt;publications/&lt;/code&gt; which magicked the issue away! I should be happy… But nah. I&amp;rsquo;m mostly frustrated.
&lt;/p&gt;

&lt;p&gt;
I mean, for starters, I don&amp;rsquo;t even know why my rewriting rule &lt;code&gt;RewriteRule ^publications/.* /publications [L,R=301]&lt;/code&gt; only works if Apache interprets it in terms of filesystem paths and not as &lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt; paths; and I find not knowing to be very disappointing. I also don&amp;rsquo;t know what the rule would be if I wanted it to work with &lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt; paths instead. I don&amp;rsquo;t even know if there is any way to force Apache to read my RewriteRule as a filesystem path and not a &lt;abbr title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt; one (I mean, any way that doesn&amp;rsquo;t consist in creating the empty directory &lt;code&gt;publications/&lt;/code&gt;: I already did that).
&lt;/p&gt;

&lt;p&gt;
If anyone has any input to provide about this, I&amp;rsquo;d be happy to hear it: call it sunken cost fallacy or misplaced curiosity if you want, but I lost a couple of hours of my time to a weird edge case that nobody is talking about, so for my own peace of mind I&amp;rsquo;d really like to know!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgbdced63" class="outline-3"&gt;
&lt;h3 id="orgbdced63"&gt;Why is my computer so mean to me? 😭&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orgbdced63"&gt;
&lt;p&gt;
No comment.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="footnote" id="footnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
To be perfectly clear: when I talk about &lt;abbr title="Search engine optimization"&gt;SEO&lt;/abbr&gt; here, it is more a matter of principles (I don&amp;rsquo;t like Google pointing to some dead links, it&amp;rsquo;s not nice to the people browsing it) than a matter of rank: I don&amp;rsquo;t care about online ranking at all. I already don&amp;rsquo;t have any claim to celebrity with my work, it would be ridiculous to have some with this blog! 😆
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
I should probably mention that I will be teaching regex (among other things) this year: that may have given me a somewhat unwarranted boost of confidence in my &lt;code&gt;.htaccess&lt;/code&gt; abilities. 😅
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
I was done with the &lt;abbr title="Hyper Text Markup Language"&gt;HTML&lt;/abbr&gt;+&lt;abbr title="Cascading Style Sheets"&gt;CSS&lt;/abbr&gt; roughly at 10pm in the evening, so I thought I could publish everything online then and then go to bed. Well, I rather spent three hours trying to get my redirections to a working state while testing &amp;ldquo;in production&amp;rdquo;, I gave up around 1am, and I completely rewrote my &lt;code&gt;.htaccess&lt;/code&gt; file the next morning.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
: In case this post didn&amp;rsquo;t help the realization dawning on you: I&amp;rsquo;m &lt;i&gt;very good&lt;/i&gt; at complaining!
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;


&lt;/ol&gt;
&lt;/div&gt;</content><category term="this-blog"></category><category term="htaccess"></category><category term="redirect"></category></entry><entry><title>Starting this blog</title><link href="https://www.acallard.net/blog/2023-08-23.starting-this-blog" rel="alternate"></link><published>2023-08-23T22:19:46+02:00</published><updated>2023-08-24T11:39:35+02:00</updated><author><name>Antonin Callard</name></author><id>tag:www.acallard.net,2023-08-23:/blog/2023-08-23.starting-this-blog</id><summary type="html">&lt;p&gt;
Well, here I am, writing a blog post. I don&amp;rsquo;t really know what I will do with a blog yet, but it happened that I had some scientific papers to read for my PhD this summer. So instead of doing that, which would have been reasonable (but what does …&lt;/p&gt;</summary><content type="html">&lt;p&gt;
Well, here I am, writing a blog post. I don&amp;rsquo;t really know what I will do with a blog yet, but it happened that I had some scientific papers to read for my PhD this summer. So instead of doing that, which would have been reasonable (but what does it mean to be reasonable anyway?), I did the exact opposite: I spent a lot of time having fun while coding this website (Pascal, I beg you, you never read this!).
&lt;/p&gt;
&lt;div id="outline-container-org52f7366" class="outline-2"&gt;
&lt;h2 id="org52f7366"&gt;Why?&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org52f7366"&gt;
&lt;p&gt;
This is actually an attempt to revive my website, which had laid dormant and had been slowly forgotten in the weird limbos of not being exactly completely dead, but having suffered a sustained lack of updates over a really long time. My CV was clearly outdated (I am no longer a master&amp;rsquo;s student: that was two years ago), I hadn&amp;rsquo;t posted the preprint of an article that has now been under review for roughly a year, etc…
&lt;/p&gt;

&lt;p&gt;
There are many reasons for this sad state of affairs. The main one is probably that I lack the self-discipline to maintain the website up-to-date with regular small modifications, although it would have been easier to sustain than having to modify everything all at once. Another reason is that, when I developed the (now previous) template of this website, I lacked a quality that clear-headed people call &amp;ldquo;lucidity&amp;rdquo;: indeed, I thought that having pictures on top of every entry on the website (be it an article, a publication or a talk) would make a good impression on the viewer (as it does on every website on the internet). Of course, it hadn&amp;rsquo;t crossed my mind at the time that these websites are maintained by professional journalists, and not by procrastinating students: I quickly grew bored with having to draw images for everything that I wanted to publish, and rather than addressing the issue at hand, i.e. removing image banners, I just stopped writing altogether.
&lt;/p&gt;

&lt;p&gt;
So, with this entry comes a new template for the website: it&amp;rsquo;s new and shiny, and more importantly it won&amp;rsquo;t require me to put as much work into each blog entry that I want to write, or each CV update that I want to do. Hopefully, this means that I will write more regularly from now, and that I won&amp;rsquo;t let my CV become out-of-date again. Yet, I won&amp;rsquo;t commit to anything about this blog: I have other things to do, like a thesis to write, and apparently I&amp;rsquo;m the only one that can make it happen! On a more serious note, this is also the first time that I entertain the idea of having a blog online, so I have yet to see how well I manage this new hobby.
&lt;/p&gt;

&lt;p&gt;
As the reader is very perceptive, they may have noticed that this blog is hosted on my professional website. Indeed, while I don&amp;rsquo;t plan to only blog about my professional activities (i.e. research and teaching), I won&amp;rsquo;t be blogging much about me either. What does that leave me with? I expect to write about computer science, computers in general (as many Linux enthusiasts, I tend to frequently
profess my love for my favorite distribution&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;) and maybe sometimes a bit about under-the-hood machinery (like, for example, the inner workings of this website).
&lt;/p&gt;

&lt;p&gt;
Finally, I want to express two words of caution. First, most of the writing here will express my own opinions in a somewhat informal fashion, so I would appreciate the reader to be prudent in their judgment of the researcher/teacher that I am at the light of this blog. Yet, maybe paradoxically to the previous point, at the moment of writing each entry, I did not deem them irrelevant to this website: as such, many personal aspects of my life will remain unknown to the reader, so I would like them to be cautious in their opinion of me as a person as well.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgcf803ba" class="outline-2"&gt;
&lt;h2 id="orgcf803ba"&gt;How does it work?&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgcf803ba"&gt;
&lt;p&gt;
To decide on which platform I would build this website, I had to think about what it would be used for. First and foremost, it exists as a way for my fellow academics to find me when they look up my name online: these people are mostly interested in quickly obtaining my email address, or potentially knowing the kind of research that I&amp;rsquo;m doing. This means that the platform used to build the website would not require any kind of input from its visitors. Second, I might occasionally use it to write more regular content than just occasional CV updates: for example, I could talk about topics that I enjoy on a personal blog. But I would still remain the sole author of every page, blog entry and update that would ever be displayed here. 
&lt;/p&gt;

&lt;p&gt;
Conclusion: I do not need a database or server-side computations, so a completely static website is sufficient. Furthermore, this website is mostly plain &lt;abbr title="Hyper Text Markup Language"&gt;HTML&lt;/abbr&gt;+&lt;abbr title="Cascading Style Sheets"&gt;CSS&lt;/abbr&gt; (there are a few bits of javascript to display math formulas and obfuscate my email address, but only that). Obviously, this choice limits
interactivity with the user and prevents, for example, the existence of a comment section (as opposed to pretty much every other online blog ever). I don&amp;rsquo;t believe I am in need of one, though maybe this will change in the future; for now, I rather encourage you can write me emails to which I would gladly
reply!
&lt;/p&gt;


&lt;p&gt;
As explained in the footer, this website is built using &lt;a href="https://getpelican.com/"&gt;Pelican&lt;/a&gt;, a static website generator. It processes Markdown files into an internal representation of the yet-to-be website (basically, a Python dictionary that I can modify at will with scripts), and then it exports everything into &lt;abbr title="Hyper Text Markup Language"&gt;HTML&lt;/abbr&gt; pages with a templating engine called &lt;a href="https://jinja.palletsprojects.com/en/"&gt;Jinja&lt;/a&gt;. It can also conveniently embed files and keep track of the links between pages without having to guess what their final &lt;abbr title=": Uniform Resource Locators"&gt;URLs&lt;/abbr&gt; will be, it automatically builds categories and also keeps the blog index up to date.
&lt;/p&gt;

&lt;p&gt;
Most pages of this website are transformed Markdown files, though there are two exceptions: the list of my scientific writing and the list of my talks. These two are stored in &lt;abbr title="JavaScript Object Notation"&gt;JSON&lt;/abbr&gt;, and are processed by Pelican thanks to a small Python script that I wrote (along with a bit of Jinja code for the &lt;abbr title="Hyper Text Markup Language"&gt;HTML&lt;/abbr&gt; export). I don&amp;rsquo;t consider the script clean enough to make it a proper plugin&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; (by Pelican&amp;rsquo;s terminology), but I can share it to whomever would like to take a look at it.
&lt;/p&gt;

&lt;p&gt;
Finally, a word about the appearance of the website: some themes already exist for Pelican (here is the &lt;a href="https://pelicanthemes.com/"&gt;official list&lt;/a&gt;), but I chose to develop my own. I tried my best to make it clean, &lt;abbr title="World Wide Web Consortium"&gt;W3C&lt;/abbr&gt; compliant, but I am no professional webmaster and I make mistakes, so I would gladly receive reports of errors were the reader to find any&lt;sup&gt;&lt;a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt;. This website looks like a terminal, which may deter some people from reading it. But considering my potential audience, they are as likely to be annoyed as they are to be amused by this choice, so I will take my chance! Of course, the look and feel may evolve over time, partially because of the inevitable mistakes I made while coding it, partially because I may get bored with it. But, according to one of my favorite quotes,
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
&amp;ldquo;University websites are like distant stars, when you look at them you see scientists as they used to be many years ago.&amp;rdquo;&lt;br&gt;
&amp;#x2013; &lt;a href="https://twitter.com/OdedRechavi/status/1377373326432108545"&gt;@OdedRechavi&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
it may still look the same in an eon or two.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgcfed395" class="outline-2"&gt;
&lt;h2 id="orgcfed395"&gt;Final word&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgcfed395"&gt;
&lt;p&gt;
If you are reading this, it means that everything works and the new version of the website has been deployed! One problem is that some pages no longer exist in this version of the website: I accordingly modified my &lt;code&gt;.htaccess&lt;/code&gt; to provide some redirection and prevent broken links, but I&amp;rsquo;m no expert in those things, so we&amp;rsquo;ll see how well this update goes.
&lt;/p&gt;

&lt;p&gt;
Anyway, I guess there is a limit to what procrastination can achieve. Now that the website is functional, I no longer have any excuse: I probably should go back to working on my PhD now, shouldn&amp;rsquo;t I?
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="footnote" id="footnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
I&amp;rsquo;ve been using Void Linux for the last two years, and I really enjoy it! (Though miscreants would tell that I had issues with external monitors, I assure you that Void Linux had nothing to do with it&lt;sup&gt;&lt;a id="fnr.1bis" class="footref" href="#fn.1bis" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt;!)
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
It was an obscure issue between wlroots, the Linux kernel and Mesa.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
The creation of Pelican plugins would require entire dedicated posts, and not just a few lines in the first entry of this blog. I spent a bit of time scratching my head trying to understand how Pelican supports additional scripts, and I feel obliged to mention a few resources that helped me (like &lt;a href="https://blog.geographer.fr/pelican-plugins"&gt;this post&lt;/a&gt; or &lt;a href="http://adamcot.com/posts/2018/02/building-pelican-plugins-i/"&gt;this series&lt;/a&gt;, along with the &lt;a href="https://docs.getpelican.com/en/stable/index.html"&gt;official documentation&lt;/a&gt;.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;div class="footdef"&gt;&lt;a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink"&gt;↩&lt;/a&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
So please, have fun trying to break everything here! However, I really do not have the time (nor the will) to maintain support of very old or non-standard-compliant Web browsers. In case you&amp;rsquo;re wondering: no, I did not even try Internet Explorer. It&amp;rsquo;s evil. And also, you should use Linux, obviously.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;


&lt;/ol&gt;
&lt;/div&gt;</content><category term="this-blog"></category><category term="pelican"></category><category term="website"></category><category term="update"></category></entry></feed>