blog.notmyidea.org/feeds/code.atom.xml

380 lines
No EOL
88 KiB
XML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Alexis Métaireau - code</title><link href="https://blog.notmyidea.org/" rel="alternate"></link><link href="https://blog.notmyidea.org/feeds/code.atom.xml" rel="self"></link><id>https://blog.notmyidea.org/</id><updated>2023-09-22T00:00:00+02:00</updated><entry><title>How to run the vigogne model locally</title><link href="https://blog.notmyidea.org/how-to-run-the-vigogne-model-locally.html" rel="alternate"></link><published>2023-09-22T00:00:00+02:00</published><updated>2023-09-22T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2023-09-22:/how-to-run-the-vigogne-model-locally.html</id><summary type="html">
&lt;p&gt;&lt;a href="https://github.com/bofenghuang/vigogne"&gt;Vigogne&lt;/a&gt; is a &lt;span class="caps"&gt;LLM&lt;/span&gt; model based on &lt;span class="caps"&gt;LLAMA2&lt;/span&gt;, but trained with french data. As I&amp;#8217;m working mostly in french, it might be useful. The current models that I can get locally are in&amp;nbsp;english.&lt;/p&gt;
&lt;p&gt;The information I&amp;#8217;ve found online are scarse and not so easy to follow, so …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;a href="https://github.com/bofenghuang/vigogne"&gt;Vigogne&lt;/a&gt; is a &lt;span class="caps"&gt;LLM&lt;/span&gt; model based on &lt;span class="caps"&gt;LLAMA2&lt;/span&gt;, but trained with french data. As I&amp;#8217;m working mostly in french, it might be useful. The current models that I can get locally are in&amp;nbsp;english.&lt;/p&gt;
&lt;p&gt;The information I&amp;#8217;ve found online are scarse and not so easy to follow, so here is a step by step tutorial you can follow. I&amp;#8217;m using &lt;a href="https://pipenv.pypa.io/en/latest/"&gt;pipenv&lt;/a&gt; almost everywhere now, it&amp;#8217;s so easy&amp;nbsp;:-)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;llm&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-U&lt;span class="w"&gt; &lt;/span&gt;llm-llama-cpp
wget&lt;span class="w"&gt; &lt;/span&gt;https://huggingface.co/TheBloke/Vigogne-2-7B-Chat-GGUF/resolve/main/vigogne-2-7b-chat.Q4_K_M.gguf
llm&lt;span class="w"&gt; &lt;/span&gt;llama-cpp&lt;span class="w"&gt; &lt;/span&gt;add-model&lt;span class="w"&gt; &lt;/span&gt;vigogne-2-7b-chat.Q4_K_M.gguf&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;vigogne
llm&lt;span class="w"&gt; &lt;/span&gt;models&lt;span class="w"&gt; &lt;/span&gt;default&lt;span class="w"&gt; &lt;/span&gt;vigogne
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="code"></category><category term="llm"></category></entry><entry><title>Creating a simple command line to post snippets on Gitlab</title><link href="https://blog.notmyidea.org/creating-a-simple-command-line-to-post-snippets-on-gitlab.html" rel="alternate"></link><published>2023-09-18T00:00:00+02:00</published><updated>2023-09-18T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2023-09-18:/creating-a-simple-command-line-to-post-snippets-on-gitlab.html</id><summary type="html">
&lt;p&gt;I&amp;#8217;m trying to get away from Github, and one thing that I find useful is the &lt;a href="https://gist.github.com"&gt;gist&lt;/a&gt; utility they&amp;#8217;re providing. Seems that gitlab provides a similar&amp;nbsp;tool.&lt;/p&gt;
&lt;p&gt;You can use it using &lt;a href="https://python-gitlab.readthedocs.io/"&gt;python-gitlab&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pipx&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;python-gitlab
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And then&amp;nbsp;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gitlab&lt;span class="w"&gt; &lt;/span&gt;snippet&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;--title&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;youpi&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--file-name&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;snip.py&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--content&lt;span class="w"&gt; &lt;/span&gt;snip …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">
&lt;p&gt;I&amp;#8217;m trying to get away from Github, and one thing that I find useful is the &lt;a href="https://gist.github.com"&gt;gist&lt;/a&gt; utility they&amp;#8217;re providing. Seems that gitlab provides a similar&amp;nbsp;tool.&lt;/p&gt;
&lt;p&gt;You can use it using &lt;a href="https://python-gitlab.readthedocs.io/"&gt;python-gitlab&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pipx&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;python-gitlab
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And then&amp;nbsp;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gitlab&lt;span class="w"&gt; &lt;/span&gt;snippet&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;--title&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;youpi&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--file-name&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;snip.py&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--content&lt;span class="w"&gt; &lt;/span&gt;snip.py&lt;span class="w"&gt; &lt;/span&gt;--visibility&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;public&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I now wanted a small bash script which will just get the name of the file and infer all the parameters. I asked &lt;span class="caps"&gt;GPT&lt;/span&gt;-4, and iterated on its&amp;nbsp;answer.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the resulting bash&amp;nbsp;script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-z&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Please provide a filename&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;base&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;basename&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$base&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;visibility&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;public&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;# Use `cat` to fetch the content of the file&lt;/span&gt;
&lt;span class="nv"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;gitlab&lt;span class="w"&gt; &lt;/span&gt;snippet&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;--title&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$title&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--file-name&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$title&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--content&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$content&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--visibility&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$visibility&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/id: / { print $2 }&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://gitlab.com/-/snippets/&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I can now do &lt;code&gt;snip README.md&lt;/code&gt; and that will create the snippet for me&amp;nbsp;:-)&lt;/p&gt;</content><category term="code"></category></entry><entry><title>Creating an online space to share markdown files</title><link href="https://blog.notmyidea.org/creating-an-online-space-to-share-markdown-files.html" rel="alternate"></link><published>2023-09-17T00:00:00+02:00</published><updated>2023-09-17T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2023-09-17:/creating-an-online-space-to-share-markdown-files.html</id><summary type="html">
&lt;p&gt;I wanted to create a space on my server where I can upload markdown files and have them rendered directly, for them to be shared with other&amp;nbsp;people.&lt;/p&gt;
&lt;p&gt;I stumbled on &lt;a href="https://github.com/ukarim/ngx_markdown_filter_module"&gt;the markdown module for nginx&lt;/a&gt; which does exactly what I want, but seemed to ask for compilation of nginx …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;I wanted to create a space on my server where I can upload markdown files and have them rendered directly, for them to be shared with other&amp;nbsp;people.&lt;/p&gt;
&lt;p&gt;I stumbled on &lt;a href="https://github.com/ukarim/ngx_markdown_filter_module"&gt;the markdown module for nginx&lt;/a&gt; which does exactly what I want, but seemed to ask for compilation of nginx, which wasn&amp;#8217;t exactly what I wanted in terms of maintainability (it would make it complicated to update&amp;nbsp;it)&lt;/p&gt;
&lt;p&gt;I then thought that the &lt;a href="https://caddyserver.com/"&gt;Caddy&lt;/a&gt; server does that by default, and so I&amp;#8217;ve tested it out. Turns out it&amp;#8217;s not, but it offers ways to do this thanks to its template&amp;nbsp;mecanism.&lt;/p&gt;
&lt;p&gt;It also, &lt;a href="https://caddyserver.com/docs/automatic-https"&gt;setups automatically and transparently &lt;span class="caps"&gt;SSL&lt;/span&gt; certificates&lt;/a&gt; for you (using Let&amp;#8217;s Encrypt!), so I wanted to have a&amp;nbsp;look.&lt;/p&gt;
&lt;p&gt;Here is the Caddy configuration file I&amp;#8217;m now using&amp;nbsp;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;md.notmyidea.org {
root * /home/caddy/md.notmyidea.org
rewrite * /index.html
file_server
templates
encode zstd gzip
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And the&amp;nbsp;template:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;{{$pathParts := splitList &amp;quot;/&amp;quot; .OriginalReq.URL.Path}}
{{$markdownFilename := default &amp;quot;index&amp;quot; (slice $pathParts 1 | join &amp;quot;/&amp;quot;)}}
{{if not (fileExists $markdownFilename)}}
{{httpError 404}}
{{end}}
{{$markdownFile := (include $markdownFilename | splitFrontMatter)}}
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;{{ $markdownFilename }}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
{{ markdown $markdownFile.Body }}
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is a minimalistic version, but it works&amp;nbsp;:-)&lt;/p&gt;</content><category term="code"></category></entry><entry><title>Conversion dun fichier svg en favicon.ico</title><link href="https://blog.notmyidea.org/conversion-dun-fichier-svg-en-faviconico.html" rel="alternate"></link><published>2023-09-13T00:00:00+02:00</published><updated>2023-09-13T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2023-09-13:/conversion-dun-fichier-svg-en-faviconico.html</id><summary type="html">
&lt;p&gt;Il y a plusieurs sites qui permettent de faire ça automatiquement, mais j&amp;#8217;aime bien faire les choses depuis mon terminal, voici donc une commande qui permet de faire ça simplement, en utilisant &lt;a href="https://imagemagick.org/"&gt;ImageMagick&lt;/a&gt;. Merci à &lt;a href="https://gist.github.com/azam/3b6995a29b9f079282f3"&gt;ce&amp;nbsp;gist&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;convert&lt;span class="w"&gt; &lt;/span&gt;-density&lt;span class="w"&gt; &lt;/span&gt;256x256&lt;span class="w"&gt; &lt;/span&gt;-background&lt;span class="w"&gt; &lt;/span&gt;transparent&lt;span class="w"&gt; &lt;/span&gt;favicon.svg&lt;span class="w"&gt; &lt;/span&gt;-define&lt;span class="w"&gt; &lt;/span&gt;icon:auto-resize&lt;span class="w"&gt; &lt;/span&gt;-colors&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;256 …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">
&lt;p&gt;Il y a plusieurs sites qui permettent de faire ça automatiquement, mais j&amp;#8217;aime bien faire les choses depuis mon terminal, voici donc une commande qui permet de faire ça simplement, en utilisant &lt;a href="https://imagemagick.org/"&gt;ImageMagick&lt;/a&gt;. Merci à &lt;a href="https://gist.github.com/azam/3b6995a29b9f079282f3"&gt;ce&amp;nbsp;gist&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;convert&lt;span class="w"&gt; &lt;/span&gt;-density&lt;span class="w"&gt; &lt;/span&gt;256x256&lt;span class="w"&gt; &lt;/span&gt;-background&lt;span class="w"&gt; &lt;/span&gt;transparent&lt;span class="w"&gt; &lt;/span&gt;favicon.svg&lt;span class="w"&gt; &lt;/span&gt;-define&lt;span class="w"&gt; &lt;/span&gt;icon:auto-resize&lt;span class="w"&gt; &lt;/span&gt;-colors&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;256&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;favicon.ico
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="code"></category></entry><entry><title>Découverte de nouveaux outils pour le développement: LLM, Helix et plus</title><link href="https://blog.notmyidea.org/decouverte-de-nouveaux-outils-pour-le-developpement-llm-helix-et-plus.html" rel="alternate"></link><published>2023-09-12T00:00:00+02:00</published><updated>2023-09-12T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2023-09-12:/decouverte-de-nouveaux-outils-pour-le-developpement-llm-helix-et-plus.html</id><summary type="html">
&lt;h2 id="llm"&gt;&lt;span class="caps"&gt;LLM&lt;/span&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://localai.io/model-compatibility/"&gt;LocalAI&lt;/a&gt; permet de faire tourner des modèles en local avec la même &lt;span class="caps"&gt;API&lt;/span&gt; &lt;span class="caps"&gt;HTTP&lt;/span&gt; que celle&amp;nbsp;d&amp;#8217;OpenAI&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bofenghuang/vigogne"&gt;Le modèle Vigogne&lt;/a&gt; est un modèle entrainé (&lt;em&gt;fine-tuned&lt;/em&gt;) avec des données en Français. Notamment &lt;a href="https://huggingface.co/bofenghuang/vigogne-2-7b-chat/tree/v1.0"&gt;ce modèle&lt;/a&gt;qui prends &lt;span class="caps"&gt;LLAMA2&lt;/span&gt; en&amp;nbsp;entrée.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://python.langchain.com/docs/get_started/introduction.html"&gt;LangChain&lt;/a&gt; semble être un framework pour travailler avec les différents …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">
&lt;h2 id="llm"&gt;&lt;span class="caps"&gt;LLM&lt;/span&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://localai.io/model-compatibility/"&gt;LocalAI&lt;/a&gt; permet de faire tourner des modèles en local avec la même &lt;span class="caps"&gt;API&lt;/span&gt; &lt;span class="caps"&gt;HTTP&lt;/span&gt; que celle&amp;nbsp;d&amp;#8217;OpenAI&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bofenghuang/vigogne"&gt;Le modèle Vigogne&lt;/a&gt; est un modèle entrainé (&lt;em&gt;fine-tuned&lt;/em&gt;) avec des données en Français. Notamment &lt;a href="https://huggingface.co/bofenghuang/vigogne-2-7b-chat/tree/v1.0"&gt;ce modèle&lt;/a&gt;qui prends &lt;span class="caps"&gt;LLAMA2&lt;/span&gt; en&amp;nbsp;entrée.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://python.langchain.com/docs/get_started/introduction.html"&gt;LangChain&lt;/a&gt; semble être un framework pour travailler avec les différents concepts utiles. A&amp;nbsp;voir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour la première fois, j&amp;#8217;ai commencé à utiliser un peu plus l&amp;#8217;outil &lt;a href="https://llm.datasette.io"&gt;llm&lt;/a&gt; pour m&amp;#8217;aider dans les tâches de&amp;nbsp;programmation. &lt;/p&gt;
&lt;p&gt;!! warning
J&amp;#8217;utilise actuellement par défaut le modèle en ligne d&amp;#8217;OpenAI &amp;#8220;&lt;span class="caps"&gt;GTP4&lt;/span&gt;&amp;#8221;, à travers leur &lt;span class="caps"&gt;API&lt;/span&gt;. Cela me pose des problèmes éthiques, mais mon approche est pour le moment de voir le type de résultats que j&amp;#8217;obtiens pour ensuite comparer avec des modèles locaux type &lt;span class="caps"&gt;LLAMA2&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Deux choses que j&amp;#8217;ai trouvées utiles&amp;nbsp;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;diff&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;llm&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;write me a commit message&amp;quot;&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;diff&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;llm&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;find a branch name&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Qui peuvent faciliter la vie plutôt que de chercher à décrire des choses manuellement (le &amp;#8220;branch-name&amp;#8221;, je le trouve particulièrement&amp;nbsp;utile)&lt;/p&gt;
&lt;p&gt;J&amp;#8217;ai aussi trouvé l&amp;#8217;idée intéressante d&amp;#8217;automatiser l&amp;#8217;écrite de tests, avec pytest. Bien sur ça ne fait pas tout, mais ça donne un template de départ qui est intéressant&amp;nbsp;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cat&lt;span class="w"&gt; &lt;/span&gt;code/test_file.py&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;llm&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;write tests for this, using pytest&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;J&amp;#8217;ai par exemple demandé à llm de me lister 20 titres pour cet article&amp;nbsp;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cat&lt;span class="w"&gt; &lt;/span&gt;~/dev/til.notmyidea.org/content/&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;+%F&lt;span class="k"&gt;)&lt;/span&gt;.md&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;llm&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Liste moi 20 titres pour cet article. Quelque chose de simple&amp;quot;&lt;/span&gt;
&lt;span class="m"&gt;1&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Découverte de nouveaux outils pour le développement: LLM, Helix et plus&amp;quot;&lt;/span&gt;
&lt;span class="m"&gt;2&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Explorer les modèles LLM pour la génération de code&amp;quot;&lt;/span&gt;
&lt;span class="m"&gt;3&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;L&amp;#39;amélioration du développement grâce à LLM et Helix&amp;quot;&lt;/span&gt;
&lt;span class="m"&gt;4&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Introduction à l&amp;#39;éditeur Helix et à LLM&amp;quot;&lt;/span&gt;
&lt;span class="m"&gt;5&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Boostez votre productivité de développement avec LLM et Helix&amp;quot;&lt;/span&gt;
&lt;span class="m"&gt;6&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Comment j&amp;#39;intègre LLM et Helix dans mon flux de travail de développement&amp;quot;&lt;/span&gt;
&lt;span class="m"&gt;7&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Les avantages de l&amp;#39;utilisation de LLM pour la programmation&amp;quot;&lt;/span&gt;
&lt;span class="m"&gt;8&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Approches innovantes pour le développement de code avec LLM&amp;quot;&lt;/span&gt;
&lt;span class="m"&gt;9&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;L&amp;#39;avenir du développement de code avec LLM et Helix&amp;quot;&lt;/span&gt;
&lt;span class="m"&gt;10&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Optimisation des tâches de programmation avec LLM&amp;quot;&lt;/span&gt;
&lt;span class="m"&gt;11&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Ouvrir de nouvelles possibilités de codage avec LLM et Helix&amp;quot;&lt;/span&gt;
&lt;span class="m"&gt;12&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Utiliser des modèles LLM pour améliorer la qualité du code&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="helix"&gt;Helix&lt;/h2&gt;
&lt;p&gt;Je me mets à tester un peu plus l&amp;#8217;éditeur Helix. Je suis un habitué de Vim pour toutes les petites modifications que je fais depuis mon terminal, et Helix semble&amp;nbsp;intéressant.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt;pour sélectionner une ligne (&lt;code&gt;xd&lt;/code&gt; pour sélectionner et&amp;nbsp;supprimer)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ma&lt;/code&gt; pour sélectionner &amp;#8220;around&amp;#8221; quelque chose. &lt;code&gt;maw&lt;/code&gt; pour sélectionner le&amp;nbsp;mot&lt;/li&gt;
&lt;li&gt;&lt;code&gt;c&lt;/code&gt; pour effacer la sélection et passer en mode&amp;nbsp;insertion.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="divers"&gt;Divers&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Jai fait confiance, jai appris.
&lt;a href="https://d%C3%A9tour.studio"&gt;Thomas&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;J&amp;#8217;aime beaucoup ce que ça dit. Faire confiance est peut-être nécessaire, même si on est déçu au final, on aura au moins appris. Ça me&amp;nbsp;touche.&lt;/p&gt;</content><category term="code"></category></entry><entry><title>Running the Gitlab CI locally</title><link href="https://blog.notmyidea.org/running-the-gitlab-ci-locally.html" rel="alternate"></link><published>2023-08-19T00:00:00+02:00</published><updated>2023-08-19T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2023-08-19:/running-the-gitlab-ci-locally.html</id><summary type="html">
&lt;p&gt;Sometimes, I need to change how the continuous integration is setup, and I find
myself pushing to a branch to test if my changes are working. Oftentimes, it
takes me multiple commits to find the correct configuration, which is…&amp;nbsp;suboptimal.&lt;/p&gt;
&lt;p&gt;I discovered today &lt;a href="https://github.com/firecow/gitlab-ci-local"&gt;Gitlab &lt;span class="caps"&gt;CI&lt;/span&gt;
local&lt;/a&gt; which makes it possible …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Sometimes, I need to change how the continuous integration is setup, and I find
myself pushing to a branch to test if my changes are working. Oftentimes, it
takes me multiple commits to find the correct configuration, which is…&amp;nbsp;suboptimal.&lt;/p&gt;
&lt;p&gt;I discovered today &lt;a href="https://github.com/firecow/gitlab-ci-local"&gt;Gitlab &lt;span class="caps"&gt;CI&lt;/span&gt;
local&lt;/a&gt; which makes it possible to
run the &lt;span class="caps"&gt;CI&lt;/span&gt; actions locally, without having to push to the remote &lt;span class="caps"&gt;CI&lt;/span&gt;. The same
thing exists for &lt;a href="https://github.com/nektos/act"&gt;Microsoft Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Under the hood, it&amp;#8217;s using Docker, so you need to have it running on your
system, but once it&amp;#8217;s done, you just have to issue a simple command to see the
results. Very helpful&amp;nbsp;:-)&lt;/p&gt;
&lt;p&gt;Here is an example&amp;nbsp;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;gitlab-ci-local&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;
parsing&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;downloads&lt;span class="w"&gt; &lt;/span&gt;finished&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;41&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ms
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;starting&lt;span class="w"&gt; &lt;/span&gt;python:3.8-alpine&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;copied&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;docker&lt;span class="w"&gt; &lt;/span&gt;volumes&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.05&lt;span class="w"&gt; &lt;/span&gt;s
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;apk&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apk&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;make&lt;span class="w"&gt; &lt;/span&gt;libsass&lt;span class="w"&gt; &lt;/span&gt;gcc&lt;span class="w"&gt; &lt;/span&gt;musl-dev&lt;span class="w"&gt; &lt;/span&gt;g++
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;fetch&lt;span class="w"&gt; &lt;/span&gt;https://dl-cdn.alpinelinux.org/alpine/v3.18/main/aarch64/APKINDEX.tar.gz
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;fetch&lt;span class="w"&gt; &lt;/span&gt;https://dl-cdn.alpinelinux.org/alpine/v3.18/community/aarch64/APKINDEX.tar.gz
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;v3.18.3-55-g2ee93b9273a&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;https://dl-cdn.alpinelinux.org/alpine/v3.18/main&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;v3.18.3-56-g4a3b0382caa&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;https://dl-cdn.alpinelinux.org/alpine/v3.18/community&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;OK:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;19939&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;distinct&lt;span class="w"&gt; &lt;/span&gt;packages&lt;span class="w"&gt; &lt;/span&gt;available
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;libgcc&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;.2.1_git20220924-r10&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;libstdc++&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;.2.1_git20220924-r10&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;libstdc++-dev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;.2.1_git20220924-r10&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;zstd-libs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.5.5-r4&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;binutils&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.40-r7&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;libgomp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;.2.1_git20220924-r10&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;libatomic&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;.2.1_git20220924-r10&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;gmp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.2.1-r3&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;isl26&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.26-r1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;mpfr4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.2.0_p12-r0&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;mpc1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.3.1-r1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;gcc&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;.2.1_git20220924-r10&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;musl-dev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.2.4-r1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;libc-dev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.7.2-r5&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;g++&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;.2.1_git20220924-r10&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;16&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;libsass&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.6.5-r0&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;17&lt;/span&gt;/17&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;make&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.4.1-r1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Executing&lt;span class="w"&gt; &lt;/span&gt;busybox-1.36.1-r2.trigger
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;OK:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;246&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;MiB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;55&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;packages
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;requirements.txt
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;pelican
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;pelican-4.8.0-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.4&lt;span class="w"&gt; &lt;/span&gt;MB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.4/1.4&lt;span class="w"&gt; &lt;/span&gt;MB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;539&lt;/span&gt;.9&lt;span class="w"&gt; &lt;/span&gt;kB/s&lt;span class="w"&gt; &lt;/span&gt;eta&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00:00
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;markdown
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;Markdown-3.4.4-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;94&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;94&lt;/span&gt;.2/94.2&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;540&lt;/span&gt;.1&lt;span class="w"&gt; &lt;/span&gt;kB/s&lt;span class="w"&gt; &lt;/span&gt;eta&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00:00
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;typogrify
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;typogrify-2.0.7.tar.gz&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Preparing&lt;span class="w"&gt; &lt;/span&gt;metadata&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;setup.py&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;started
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Preparing&lt;span class="w"&gt; &lt;/span&gt;metadata&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;setup.py&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;finished&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;status&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;done&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;pelican-search
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;pelican_search-1.1.0-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.6&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;pelican-neighbors
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;pelican_neighbors-1.2.0-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;pelican-webassets
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;pelican_webassets-2.0.0-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.8&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;libsass
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;libsass-0.22.0.tar.gz&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;316&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;316&lt;/span&gt;.3/316.3&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;552&lt;/span&gt;.1&lt;span class="w"&gt; &lt;/span&gt;kB/s&lt;span class="w"&gt; &lt;/span&gt;eta&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00:00
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Preparing&lt;span class="w"&gt; &lt;/span&gt;metadata&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;setup.py&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;started
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Preparing&lt;span class="w"&gt; &lt;/span&gt;metadata&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;setup.py&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;finished&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;status&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;done&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;docutils&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.16
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;docutils-0.20.1-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;572&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;572&lt;/span&gt;.7/572.7&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;549&lt;/span&gt;.2&lt;span class="w"&gt; &lt;/span&gt;kB/s&lt;span class="w"&gt; &lt;/span&gt;eta&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00:00
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;rich&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.1
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;rich-13.5.2-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;239&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;239&lt;/span&gt;.7/239.7&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;485&lt;/span&gt;.3&lt;span class="w"&gt; &lt;/span&gt;kB/s&lt;span class="w"&gt; &lt;/span&gt;eta&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00:00
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;jinja2&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.7
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;Jinja2-3.1.2-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;133&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;133&lt;/span&gt;.1/133.1&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;342&lt;/span&gt;.6&lt;span class="w"&gt; &lt;/span&gt;kB/s&lt;span class="w"&gt; &lt;/span&gt;eta&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00:00
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;pytz&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2020&lt;/span&gt;.1
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;pytz-2023.3-py2.py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;502&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;502&lt;/span&gt;.3/502.3&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;547&lt;/span&gt;.3&lt;span class="w"&gt; &lt;/span&gt;kB/s&lt;span class="w"&gt; &lt;/span&gt;eta&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00:00
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;pygments&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.6
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;Pygments-2.16.1-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.2&lt;span class="w"&gt; &lt;/span&gt;MB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.2/1.2&lt;span class="w"&gt; &lt;/span&gt;MB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;551&lt;/span&gt;.4&lt;span class="w"&gt; &lt;/span&gt;kB/s&lt;span class="w"&gt; &lt;/span&gt;eta&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00:00
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;unidecode&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.1
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;Unidecode-1.3.6-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;235&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;235&lt;/span&gt;.9/235.9&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;554&lt;/span&gt;.2&lt;span class="w"&gt; &lt;/span&gt;kB/s&lt;span class="w"&gt; &lt;/span&gt;eta&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00:00
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;blinker&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.4
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;blinker-1.6.2-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;python-dateutil&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.8
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;python_dateutil-2.8.2-py2.py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;247&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;247&lt;/span&gt;.7/247.7&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;235&lt;/span&gt;.7&lt;span class="w"&gt; &lt;/span&gt;kB/s&lt;span class="w"&gt; &lt;/span&gt;eta&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00:00
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;feedgenerator&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.9
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;feedgenerator-2.1.0-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;importlib-metadata&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.4
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;importlib_metadata-6.8.0-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;smartypants&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.8.3
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;smartypants-2.0.1-py2.py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;.9&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;rtoml&amp;lt;&lt;span class="m"&gt;0&lt;/span&gt;.10.0,&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.9.0
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;rtoml-0.9.0-cp38-cp38-musllinux_1_1_aarch64.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;846&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;846&lt;/span&gt;.2/846.2&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;503&lt;/span&gt;.7&lt;span class="w"&gt; &lt;/span&gt;kB/s&lt;span class="w"&gt; &lt;/span&gt;eta&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00:00
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;webassets&amp;lt;&lt;span class="m"&gt;3&lt;/span&gt;.0,&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.0
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;webassets-2.0-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;142&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;142&lt;/span&gt;.9/142.9&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;551&lt;/span&gt;.8&lt;span class="w"&gt; &lt;/span&gt;kB/s&lt;span class="w"&gt; &lt;/span&gt;eta&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00:00
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;zipp&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.5
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;zipp-3.16.2-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;.2&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;MarkupSafe&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.0
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;six&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.5
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;six-1.16.0-py2.py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;markdown-it-py&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.2.0
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;markdown_it_py-3.0.0-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;87&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;87&lt;/span&gt;.5/87.5&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;561&lt;/span&gt;.7&lt;span class="w"&gt; &lt;/span&gt;kB/s&lt;span class="w"&gt; &lt;/span&gt;eta&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00:00
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;typing-extensions&amp;lt;&lt;span class="m"&gt;5&lt;/span&gt;.0,&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.0.0
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;typing_extensions-4.7.1-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;33&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Collecting&lt;span class="w"&gt; &lt;/span&gt;mdurl~&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.1
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Downloading&lt;span class="w"&gt; &lt;/span&gt;mdurl-0.1.2-py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.0&lt;span class="w"&gt; &lt;/span&gt;kB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Building&lt;span class="w"&gt; &lt;/span&gt;wheels&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;collected&lt;span class="w"&gt; &lt;/span&gt;packages:&lt;span class="w"&gt; &lt;/span&gt;typogrify,&lt;span class="w"&gt; &lt;/span&gt;libsass
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Building&lt;span class="w"&gt; &lt;/span&gt;wheel&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;typogrify&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;setup.py&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;started
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Building&lt;span class="w"&gt; &lt;/span&gt;wheel&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;typogrify&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;setup.py&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;finished&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;status&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;done&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Created&lt;span class="w"&gt; &lt;/span&gt;wheel&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;typogrify:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;typogrify-2.0.7-py2.py3-none-any.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;13452&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sha256&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4ce329903e807671102eab7fd2bc49765b6efc3a4ae68c82053318b62789083c
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Stored&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;directory:&lt;span class="w"&gt; &lt;/span&gt;/root/.cache/pip/wheels/0b/e9/98/c888501e8dd2166da059e4f8418694de9b50b48a7192712be9
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Building&lt;span class="w"&gt; &lt;/span&gt;wheel&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;libsass&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;setup.py&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;started
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Building&lt;span class="w"&gt; &lt;/span&gt;wheel&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;libsass&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;setup.py&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;still&lt;span class="w"&gt; &lt;/span&gt;running...
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Building&lt;span class="w"&gt; &lt;/span&gt;wheel&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;libsass&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;setup.py&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;finished&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;status&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;done&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Created&lt;span class="w"&gt; &lt;/span&gt;wheel&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;libsass:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;libsass-0.22.0-cp38-abi3-linux_aarch64.whl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;13710320&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sha256&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3dcb4ce97c1aafc179a6343e0f312c17df88e56c4eb647ab54b09ead5ee00b92
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Stored&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;directory:&lt;span class="w"&gt; &lt;/span&gt;/root/.cache/pip/wheels/95/64/fa/47638d5037df216387cdc168e9871d5d9851fc995d636bd108
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Successfully&lt;span class="w"&gt; &lt;/span&gt;built&lt;span class="w"&gt; &lt;/span&gt;typogrify&lt;span class="w"&gt; &lt;/span&gt;libsass
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;collected&lt;span class="w"&gt; &lt;/span&gt;packages:&lt;span class="w"&gt; &lt;/span&gt;webassets,&lt;span class="w"&gt; &lt;/span&gt;smartypants,&lt;span class="w"&gt; &lt;/span&gt;pytz,&lt;span class="w"&gt; &lt;/span&gt;zipp,&lt;span class="w"&gt; &lt;/span&gt;unidecode,&lt;span class="w"&gt; &lt;/span&gt;typogrify,&lt;span class="w"&gt; &lt;/span&gt;typing-extensions,&lt;span class="w"&gt; &lt;/span&gt;six,&lt;span class="w"&gt; &lt;/span&gt;rtoml,&lt;span class="w"&gt; &lt;/span&gt;pygments,&lt;span class="w"&gt; &lt;/span&gt;mdurl,&lt;span class="w"&gt; &lt;/span&gt;MarkupSafe,&lt;span class="w"&gt; &lt;/span&gt;libsass,&lt;span class="w"&gt; &lt;/span&gt;feedgenerator,&lt;span class="w"&gt; &lt;/span&gt;docutils,&lt;span class="w"&gt; &lt;/span&gt;blinker,&lt;span class="w"&gt; &lt;/span&gt;python-dateutil,&lt;span class="w"&gt; &lt;/span&gt;markdown-it-py,&lt;span class="w"&gt; &lt;/span&gt;jinja2,&lt;span class="w"&gt; &lt;/span&gt;importlib-metadata,&lt;span class="w"&gt; &lt;/span&gt;rich,&lt;span class="w"&gt; &lt;/span&gt;markdown,&lt;span class="w"&gt; &lt;/span&gt;pelican,&lt;span class="w"&gt; &lt;/span&gt;pelican-webassets,&lt;span class="w"&gt; &lt;/span&gt;pelican-search,&lt;span class="w"&gt; &lt;/span&gt;pelican-neighbors
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Successfully&lt;span class="w"&gt; &lt;/span&gt;installed&lt;span class="w"&gt; &lt;/span&gt;MarkupSafe-2.1.3&lt;span class="w"&gt; &lt;/span&gt;blinker-1.6.2&lt;span class="w"&gt; &lt;/span&gt;docutils-0.20.1&lt;span class="w"&gt; &lt;/span&gt;feedgenerator-2.1.0&lt;span class="w"&gt; &lt;/span&gt;importlib-metadata-6.8.0&lt;span class="w"&gt; &lt;/span&gt;jinja2-3.1.2&lt;span class="w"&gt; &lt;/span&gt;libsass-0.22.0&lt;span class="w"&gt; &lt;/span&gt;markdown-3.4.4&lt;span class="w"&gt; &lt;/span&gt;markdown-it-py-3.0.0&lt;span class="w"&gt; &lt;/span&gt;mdurl-0.1.2&lt;span class="w"&gt; &lt;/span&gt;pelican-4.8.0&lt;span class="w"&gt; &lt;/span&gt;pelican-neighbors-1.2.0&lt;span class="w"&gt; &lt;/span&gt;pelican-search-1.1.0&lt;span class="w"&gt; &lt;/span&gt;pelican-webassets-2.0.0&lt;span class="w"&gt; &lt;/span&gt;pygments-2.16.1&lt;span class="w"&gt; &lt;/span&gt;python-dateutil-2.8.2&lt;span class="w"&gt; &lt;/span&gt;pytz-2023.3&lt;span class="w"&gt; &lt;/span&gt;rich-13.5.2&lt;span class="w"&gt; &lt;/span&gt;rtoml-0.9.0&lt;span class="w"&gt; &lt;/span&gt;six-1.16.0&lt;span class="w"&gt; &lt;/span&gt;smartypants-2.0.1&lt;span class="w"&gt; &lt;/span&gt;typing-extensions-4.7.1&lt;span class="w"&gt; &lt;/span&gt;typogrify-2.0.7&lt;span class="w"&gt; &lt;/span&gt;unidecode-1.3.6&lt;span class="w"&gt; &lt;/span&gt;webassets-2.0&lt;span class="w"&gt; &lt;/span&gt;zipp-3.16.2
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;WARNING:&lt;span class="w"&gt; &lt;/span&gt;Running&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;root&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;user&lt;span class="w"&gt; &lt;/span&gt;can&lt;span class="w"&gt; &lt;/span&gt;result&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;broken&lt;span class="w"&gt; &lt;/span&gt;permissions&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;conflicting&lt;span class="w"&gt; &lt;/span&gt;behaviour&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;system&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt; &lt;/span&gt;manager.&lt;span class="w"&gt; &lt;/span&gt;It&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;recommended&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;use&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;virtual&lt;span class="w"&gt; &lt;/span&gt;environment&lt;span class="w"&gt; &lt;/span&gt;instead:&lt;span class="w"&gt; &lt;/span&gt;https://pip.pypa.io/warnings/venv
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;notice&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;A&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;release&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;available:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;23&lt;/span&gt;.0.1&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;23&lt;/span&gt;.2.1
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;notice&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;To&lt;span class="w"&gt; &lt;/span&gt;update,&lt;span class="w"&gt; &lt;/span&gt;run:&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--upgrade&lt;span class="w"&gt; &lt;/span&gt;pip
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;make&lt;span class="w"&gt; &lt;/span&gt;publish
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pelican&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/gcl-builds/content&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/gcl-builds/public&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/gcl-builds/publishconf.py&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Done:&lt;span class="w"&gt; &lt;/span&gt;Processed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;articles,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;drafts,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;hidden&lt;span class="w"&gt; &lt;/span&gt;articles,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pages,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;hidden&lt;span class="w"&gt; &lt;/span&gt;pages
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;draft&lt;span class="w"&gt; &lt;/span&gt;pages&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.50&lt;span class="w"&gt; &lt;/span&gt;seconds.
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;finished&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;min
PASS&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="code"></category><category term="gitlab"></category><category term="docker"></category></entry><entry><title>ArchLinux et mise à jour du keyring</title><link href="https://blog.notmyidea.org/archlinux-et-mise-a-jour-du-keyring.html" rel="alternate"></link><published>2023-08-18T00:00:00+02:00</published><updated>2023-08-18T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2023-08-18:/archlinux-et-mise-a-jour-du-keyring.html</id><summary type="html">
&lt;p&gt;Pour les mises à jour Arch, j&amp;#8217;utilise &lt;a href="https://github.com/Jguer/yay"&gt;yay&lt;/a&gt;. Je
ne fais les mises à jour que de manière semi-régulière, et parfois après une
longue période je me retrouve avec des soucis de clé qui ne sont plus à jour ou&amp;nbsp;manquantes.&lt;/p&gt;
&lt;p&gt;Avec une utilisation fréquente du système, aucun problème …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Pour les mises à jour Arch, j&amp;#8217;utilise &lt;a href="https://github.com/Jguer/yay"&gt;yay&lt;/a&gt;. Je
ne fais les mises à jour que de manière semi-régulière, et parfois après une
longue période je me retrouve avec des soucis de clé qui ne sont plus à jour ou&amp;nbsp;manquantes.&lt;/p&gt;
&lt;p&gt;Avec une utilisation fréquente du système, aucun problème ne se pose car un
service s&amp;#8217;occupe de faire la mise à jour des clés de manière&amp;nbsp;automatique.&lt;/p&gt;
&lt;p&gt;Pour résoudre le souci, il suffit de mettre à jour le paquet
&lt;code&gt;archlinux-keyring&lt;/code&gt;, comme décrit &lt;a href="https://wiki.archlinux.org/title/Pacman/Package_signing"&gt;dans la page Wiki qui va
bien&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo pacman -S archlinux-keyring
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="code"></category><category term="arch-linux"></category></entry><entry><title>Python packaging with Hatch, pipx and Zsh environment variables</title><link href="https://blog.notmyidea.org/python-packaging-with-hatch-pipx-and-zsh-environment-variables.html" rel="alternate"></link><published>2023-08-17T00:00:00+02:00</published><updated>2023-08-17T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2023-08-17:/python-packaging-with-hatch-pipx-and-zsh-environment-variables.html</id><summary type="html">
&lt;p&gt;It&amp;#8217;s been a while I didn&amp;#8217;t packaged something new. I recently remembered an old
package of mine that needed some attention :
&lt;a href="https://gitlab.com/almet/debts"&gt;debts&lt;/a&gt;. It&amp;#8217;s now time to package it, so I
discovered &lt;a href="https://hatch.pypa.io/"&gt;hatch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;hatch new&amp;nbsp;&amp;#8212;init&lt;/p&gt;
&lt;p&gt;This does the heavy-lifting for you, actually porting the &lt;code&gt;setup.py&lt;/code&gt; files …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;It&amp;#8217;s been a while I didn&amp;#8217;t packaged something new. I recently remembered an old
package of mine that needed some attention :
&lt;a href="https://gitlab.com/almet/debts"&gt;debts&lt;/a&gt;. It&amp;#8217;s now time to package it, so I
discovered &lt;a href="https://hatch.pypa.io/"&gt;hatch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;hatch new&amp;nbsp;&amp;#8212;init&lt;/p&gt;
&lt;p&gt;This does the heavy-lifting for you, actually porting the &lt;code&gt;setup.py&lt;/code&gt; files to the
new way of packaging with python (with a &lt;code&gt;pyproject.toml&lt;/code&gt; file)&lt;/p&gt;
&lt;p&gt;Then &lt;code&gt;hatch shell&lt;/code&gt; will create a development environment, install dependencies,
check the &lt;code&gt;pyproject.toml&lt;/code&gt; file in one command, and give you a shell to test
whatever you need to&amp;nbsp;test.&lt;/p&gt;
&lt;h2 id="isolating-system-packages"&gt;Isolating system&amp;nbsp;packages&lt;/h2&gt;
&lt;p&gt;I discovered that &lt;a href="https://github.com/pypa/pipx"&gt;pipx&lt;/a&gt; is a convenient way to
install user-facing applications on my system. I use multiple virtual
environments for my different projects, but not for the install that are used&amp;nbsp;system-wide.&lt;/p&gt;
&lt;p&gt;pipx seems to solve this, and avoid using &lt;code&gt;sudo pip install x&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="manipulating-env-variables-with-zsh"&gt;Manipulating env variables with&amp;nbsp;Zsh&lt;/h2&gt;
&lt;p&gt;I use &lt;a href="https://www.zsh.org/"&gt;Zsh&lt;/a&gt; as my main shell for years, and I just
discovered that it&amp;#8217;s possible to manipulate environment variables in an easy&amp;nbsp;way.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re like me, you never remember how to add something to your path. You
can actually use &lt;code&gt;+=&lt;/code&gt;, like&amp;nbsp;this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="o"&gt;+=(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/Users/alexis/.local/bin&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;PATH
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="code"></category><category term="python"></category><category term="packaging"></category><category term="zsh"></category></entry><entry><title>Profiling and speeding up Django and Pytest</title><link href="https://blog.notmyidea.org/profiling-and-speeding-up-django-and-pytest.html" rel="alternate"></link><published>2023-08-16T00:00:00+02:00</published><updated>2023-08-16T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2023-08-16:/profiling-and-speeding-up-django-and-pytest.html</id><summary type="html">
&lt;p&gt;&lt;a href="https://yaal.coop/"&gt;Éloi&lt;/a&gt; made &lt;a href="https://github.com/spiral-project/ihatemoney/issues/1214"&gt;a pull request on
IHateMoney&lt;/a&gt; to
speedup the tests, with some great tooling for pytest that I wasn&amp;#8217;t aware&amp;nbsp;of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/pytest-xdist/"&gt;pytest-xdist&lt;/a&gt; allows to run tests in
parallel, using &lt;code&gt;-n auto&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/pytest-profiling/"&gt;pytest-profiling&lt;/a&gt; makes it easy
to get the call stack and time the function calls that take most …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">
&lt;p&gt;&lt;a href="https://yaal.coop/"&gt;Éloi&lt;/a&gt; made &lt;a href="https://github.com/spiral-project/ihatemoney/issues/1214"&gt;a pull request on
IHateMoney&lt;/a&gt; to
speedup the tests, with some great tooling for pytest that I wasn&amp;#8217;t aware&amp;nbsp;of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/pytest-xdist/"&gt;pytest-xdist&lt;/a&gt; allows to run tests in
parallel, using &lt;code&gt;-n auto&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/pytest-profiling/"&gt;pytest-profiling&lt;/a&gt; makes it easy
to get the call stack and time the function calls that take most of the&amp;nbsp;time.&lt;/li&gt;
&lt;li&gt;You can them analyse the &lt;code&gt;.prof&lt;/code&gt; files with
&lt;a href="https://pypi.org/project/snakeviz/"&gt;Snakeviz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, I spent some time using these on the tests for &lt;a href="https://chariotte.fr"&gt;La
Chariotte&lt;/a&gt;, because they were&amp;nbsp;slow.&lt;/p&gt;
&lt;p&gt;I found two things&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Login calls are costly in the test, and it&amp;#8217;s possible to speed things up&amp;nbsp;;&lt;/li&gt;
&lt;li&gt;On my machine, calls to resolve my hostname were slow, using 5s during the
tests for a lookup that wasn&amp;#8217;t even&amp;nbsp;useful.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="changing-the-hashing-algorithm-to-speedup-tests"&gt;Changing the hashing algorithm to speedup&amp;nbsp;tests&lt;/h2&gt;
&lt;p&gt;By default, Django uses a slow (but secure !) hashing mechanism for checking
the user credentials. In the tests, we don&amp;#8217;t need this security, but we need
the&amp;nbsp;speed.&lt;/p&gt;
&lt;p&gt;Changing them to use &lt;span class="caps"&gt;MD5&lt;/span&gt; turns out to be a way to greatly speed them up! Here
is how to do it with a pytest fixture&amp;nbsp;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nd"&gt;@pytest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fixture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;autouse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;password_hasher_setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="c1"&gt;# Use a weaker password hasher during tests, for speed&lt;/span&gt;
&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PASSWORD_HASHERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;django.contrib.auth.hashers.MD5PasswordHasher&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="speeding-dns-lookups"&gt;Speeding &lt;span class="caps"&gt;DNS&lt;/span&gt;&amp;nbsp;lookups&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;m currently using a MacOSX machine, and for for whatever reason, the local
lookup was not configured properly on my machine. I don&amp;#8217;t think I did anything
specific to get this wrong, so it might be your case too. Calls to resolve the
local domain were tooking&amp;nbsp;5s.&lt;/p&gt;
&lt;p&gt;If the answer to &lt;code&gt;scutil --get LocalHostName&lt;/code&gt;, &lt;code&gt;hostname&lt;/code&gt; and &lt;code&gt;scutil --get
HostName&lt;/code&gt; differ, then you might be in this case. Here is the fix&amp;nbsp;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;scutil&lt;span class="w"&gt; &lt;/span&gt;--set&lt;span class="w"&gt; &lt;/span&gt;HostName&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;YourHostName&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="code"></category><category term="django"></category><category term="pytest"></category></entry></feed>